写点什么

人机交互系统(2,linux 基础教程第二版课后答案

作者:MySQL神话
  • 2021 年 11 月 28 日
  • 本文字数:4074 字

    阅读完需:约 13 分钟

3.1 N-Gram 模型作用

N-Gram 模型(有时也称为 N 元模型)是自然语言处理中一个非常重要的概念,通常在 NLP 中,人们基于一定的语料库,可以利用 N-Gram 来预计或者评估一个句子是否合理。另外一方面,N-Gram 的另外一个作用是用来评估两个字符串之间的差异程度。这是模糊匹配中常用的一种手段。


假设有一个字符串 s,那么该字符串的N-Gram就表示按长度 N 切分原词得到的词段,也就是 ss 中所有长度为 N 的子字符串。设想如果有两个字符串,然后分别求它们的 N-Gram,那么就可以从它们的共有子串的数量这个角度去定义两个字符串间的 N-Gram 距离。但是仅仅是简单地对共有子串进行计数显然也存在不足,这种方案显然忽略了两个字符串长度差异可能导致的问题。比如字符串 girlgirlfriend,二者所拥有的公共子串数量显然与 girl 和其自身所拥有的公共子串数量相等,但是我们并不能据此认为 girlgirlfriend 是两个等同的匹配。


为了解决该问题,有学者便提出以非重复的 N-Gram 分词为基础来定义 N-Gram 距离这一概念,可以用下面的公式来表述:


|GN(s)|+|GN(t)|?2×|GN(s)∩GN(t)|


此处,|GN(s)| 是字符串 s 的 N-Gram 集合,N 值一般取 2 或者 3。以 N = 2 为例对字符串GorbachevGorbechyov进行分段,可得如下结果(我们用下画线标出了其中的公共子串)。



结合上面的公式,即可算得两个字符串之间的距离是8 + 9 ? 2 × 4 = 9。显然,字符串之间的距离越小,它们就越接近。当两个字符串完全相等的时候,它们之间的距离就是 0。


常见的如bigram模型(N=2)和trigram模型(N=3)。事实上,由于模型复杂度和预测精度的限制,我们很少会考虑 N>3 的模型

3.2 缺陷

  • 参数爆炸式增长

  • 没有考虑词与词之间的联系性

3.3 应用


  • S=w1,w2,…,wT

  • 它的概率可以表示为:


P(S) = P(w1,w2,w3,…,wt)


  • 公式的含义:“我们”这个词出现后接下来出现的词的概率,即计算P(都),P(不),P(长),P(的)...

  • 由于其巨大的参数空间,这样一个原始的模型在实际中并没有什么用。我们更多的是采用其简化版本——Ngram 模型:


p(wt|w1,w2,…,wt?1)≈p(wt|wt?n+1,…,wt?1)


四、分布式语义表达(Distributed representation)




Ngram 本质上是将词当做一个个孤立的原子单元(atomic unit)去处理的。这种处理方式对应到数学上的形式是一个个离散的one-hot向量(除了一个词典索引的下标对应的方向上是 1 ,其余方向上都是 0)。


例如,对于一个大小为 5 的词典:{“I”, “love”, “nature”, “luaguage”, “processing”},“nature”对应的 one-hot 向量为:[0,0,1,0,0] 。显然,one-hot向量的维度等于词典的大小。这在动辄上万甚至百万词典的实际应用中,面临着巨大的维度灾难问题(The Curse of Dimensionality


能否用一个连续的稠密向量去刻画一个word的特征呢?


这样,我们不仅可以直接刻画词与词之间的相似度,还可以建立一个从向量到概率的平滑函数模型,使得相似


《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享


的词向量可以映射到相近的概率空间上。这个稠密连续向量也被称为worddistributed representation


Distributed representation可以解决One hot representation的问题,它的思路是通过训练,将每个词都映射到一个较短的词向量上来。


所有的这些词向量就构成了向量空间,进而可以用普通的统计学的方法来研究词与词之间的关系。这个较短的词向量维度是多大呢?这个一般需要我们在训练时自己来指定。可以用 n 个维度来表示。



有了用 Distributed Representation 表示的较短的词向量,我们就可以较容易的分析词之间的关系了,比如我们将词的维度降维到 2 维,有一个有趣的研究表明,用下图的词向量表示我们的词时,我们可以发现:




可见我们只要得到了词汇表里所有词对应的词向量,那么我们就可以做很多有趣的事情了。不过,怎么训练得到合适的词向量呢?一个很常见的方法是使用神经网络语言模型。

五、Neural Network Language Model

鉴于 Ngram 等模型的不足,2003 年,Bengio 等人发表了一篇开创性的文章:A neural probabilistic language model[4]。在这篇文章里,他们总结出了一套用神经网络建立统计语言模型的框架(Neural Network Language Model,以下简称 NNLM),并首次提出了 word embedding 的概念(虽然没有叫这个名字),从而奠定了包括 word2vec 在内后续研究 word representation learning 的基础。


NNLM[5]模型的基本思想可以概括如下:


  • 假定词表中的每一个 word 都对应着一个连续的特征向量;

  • 假定一个连续平滑的概率模型,输入一段词向量的序列,可以输出这段序列的联合概率;同时学习词向量的权重和概率模型里的参数。



首先是一个线性的 Embedding 层。它将输入的 N?1 个 one-hot 词向量,通过一个共享的 D×V 的矩阵 C,映射为 N?1 个分布式的词向量(distributed vector)。其中,V 是词典的大小,D 是 Embedding 向量的维度(一个先验参数)。C 矩阵里存储了要学习的 word vector。


其次是一个简单的前向反馈神经网络 g。它由一个 tanh 隐层和一个 softmax 输出层组成。通过将 Embedding 层输出的 N?1 个词向量映射为一个长度为 V 的概率分布向量,从而对词典中的 word 在输入 context 下的条件概率做出预估。


六、CBOW 与 Skip-Gram 用于神经网络语言模型




NNLM 模型的训练其实可以拆分成两个步骤:


  • 用一个简单模型训练出连续的词向量

  • 基于词向量的表达,训练一个连续的 Ngram 神经网络模型


问题:


  • 只能处理定长的序列

  • 训练慢


如果只是想得到 word 的连续特征向量,可以对第二步里的神经网络模型进行简化。于是 Mikolov 在 2013 年一口气推出了两篇 paper,并开源了一款计算词向量的工具——至此,word2vec横空出世,主角闪亮登场。


对原始的 NNLM 模型做如下改造:


  • 移除前向反馈神经网络中非线性的 hidden layer,直接将中间层的 Embedding layer 与输出层的 softmax layer 连接;

  • 忽略上下文环境的序列信息:输入的所有词向量均汇总到同一个 Embedding layer;

  • 将 Future words 纳入上下文环境


得到的模型称之为 CBOW 模型(Continuous Bag-of-Words Model),也是 word2vec 算法的第一个模型:



从数学上看,CBOW 模型等价于一个词袋模型的向量乘以一个 Embedding 矩阵,从而得到一个连续的 embedding 向量。这也是 CBOW 模型名称的由来。


  • 在 word2vec 出现之前,已经有用神经网络 DNN 来用训练词向量进而处理词与词之间的关系了。采用的方法一般是一个三层的神经网络结构(当然也可以多层),分为输入层,隐藏层和输出层(softmax 层)。

  • 这个模型是如何定义数据的输入和输出呢?一般分为 CBOW(Continuous Bag-of-Words 与 Skip-Gram 两种模型。

  • CBOW 模型的训练输入是某一个特征词的上下文相关的词对应的词向量,而输出就是这特定的一个词的词向量。比如下面这段话,我们的上下文大小取值为 4,特定的这个词是"Learning",也就是我们需要的输出词向量,上下文对应的词有 8 个,前后各 4 个,这 8 个词是我们模型的输入。由于 CBOW 使用的是词袋模型,因此这 8 个词都是平等的,也就是不考虑他们和我们关注的词之间的距离大小,只要在我们上下文之内即可。



这样我们这个 CBOW 的例子里,我们的输入是 8 个词向量,输出是所有词的 softmax 概率(训练的目标是期望训练样本特定词对应的 softmax 概率最大),对应的 CBOW 神经网络模型输入层有 8 个神经元,输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过 DNN 的反向传播算法,我们可以求出 DNN 模型的参数,同时得到所有的词对应的词向量。这样当我们有新的需求,要求出某 8 个词对应的最可能的输出中心词时,我们可以通过一次 DNN 前向传播算法并通过 softmax 激活函数找到概率最大的词对应的神经元即可。


Skip-Gram 模型和 CBOW 的思路是反着来的,即输入是特定的一个词的词向量,而输出是特定词对应的上下文词向量。还是上面的例子,我们的上下文大小取值为 4, 特定的这个词"Learning"是我们的输入,而这 8 个上下文词是我们的输出。



这样我们这个 Skip-Gram 的例子里,我们的输入是特定词, 输出是 softmax 概率排前 8 的 8 个词,对应的 Skip-Gram 神经网络模型输入层有 1 个神经元,输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过 DNN 的反向传播算法,我们可以求出 DNN 模型的参数,同时得到所有的词对应的词向量。这样当我们有新的需求,要求出某 1 个词对应的最可能的 8 个上下文词时,我们可以通过一次 DNN 前向传播算法得到概率大小排前 8 的 softmax 概率对应的神经元所对应的词即可。


七、层次 Softmax(Hierarchical Softmax)




然而,直接对词典里的 V 个词计算相似度并归一化,显然是一件极其耗时的 impossible mission。为此,Mikolov 引入了两种优化算法:层次 Softmax(Hierarchical Softmax)和负采样(Negative Sampling)。


层次 Softmax 的方法最早由 Bengio 在 05 年引入到语言模型中。它的基本思想是将复杂的归一化概率分解为一系列条件概率乘积的形式:



其中,每一层条件概率对应一个二分类问题,可以通过一个简单的逻辑回归函数去拟合。这样,我们将对 V 个词的概率归一化问题,转化成了对 logV 个词的概率拟合问题。


八、Negative Sampling




比如我们有一个训练样本,中心词是 w,它周围上下文共有 2c 个词,记为 context(w)。由于这个中心词 w 的确和 context(w) 相关存在,因此它是一个真实的正例。

最后

一次偶然,从朋友那里得到一份“java 高分面试指南”,里面涵盖了 25 个分类的面试题以及详细的解析:JavaOOP、Java 集合/泛型、Java 中的 IO 与 NIO、Java 反射、Java 序列化、Java 注解、多线程 &并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、Spring Boot、Spring Cloud、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、数据结构、算法、Elasticsearch 、Kafka 、微服务、Linux。


这不,马上就要到招聘季了,很多朋友又开始准备“金三银四”的春招啦,那我想这份“java 高分面试指南”应该起到不小的作用,所以今天想给大家分享一下。



请注意:关于这份“java 高分面试指南”,每一个方向专题(25 个)的题目这里几乎都会列举,在不看答案的情况下,大家可以自行测试一下水平 且由于篇幅原因,这边无法展示所有完整的答案解析


本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

用户头像

MySQL神话

关注

还未添加个人签名 2021.11.12 加入

还未添加个人简介

评论

发布
暂无评论
人机交互系统(2,linux基础教程第二版课后答案