深度学习——NLP中词的表示方法&word embedding&word2vec

一直有点没明白标题中三者的关系,在此记录下来自己查阅之后的看法,有不对的地方,请大家指正,谢谢!

关于NLP中,有各种不同的表达,如: 词向量、word embedding、分布式表示、word2vec、glove等等,这一锅粥的名词术语分别代表什么,他们具体的关系是什么,他们是否处于平级关系?

希望写完这篇文章后,自己能清楚地理清他们之间的关系。

http://www.javashuo.com/article/p-svlbbzyy-py.html  

一、NLP中词的表示方法

word representation方式:

  • 传统方法Knowledge-based representation
  • 词的独热表示one-hot representation
  • 词的分布式表示distributed representation

1、传统方法Knowledge-based representation:

Knowledge-based representation根据语言学家们制定的 WordNet ,其中包含了字与字之间的关联。来对文字进行表示。

  • 调用方法

from nltk.corpus import wordnet

  • 局限性
  1. 文字会不断地发展
  2. 主观性较强,不同的人之间有不同的理解
  3. 工作量比较大
  4. 字与字之间的相似性很难定义

2、词的独热表示one-hot representation

One-Hot编码,又称为一位有效编码,独热编码,将所有需计算的文字组成一个向量,给出一个文字,它在向量中的位置标为1,其余都为0。

  • 限制:无法捕捉两个word之间的关系,也就是没有办法捕捉语义信息

例如:car和motorcycle,无论怎样计算相似度都为0。

  • 期望:用另一种方式捕捉真正有关字义的部分。
  • 方法:当car与motorcycle以及它们相邻的单词(neighbor)存在某些关系时,可以认为这两个单词之间具有相关性。即Neighbors,如何确定neighbor的范围呢?
  1. 方式1,full document 。full document可以认为在同一篇文章中出现过,文章中的文字之间可以根据文章确定一个相关的主题。
  2. 方式2,windows 。windows限定在某个窗口内,可以是几句话或者几个单词之内范围,这种方式可以获得词性等信息。

词袋模型中,每个单词向量化之后对应维度上的值,还可以用一个权重表示,这个权重由TF-IDF计算得到,用来反映这个词在整篇文档中的重要性程度;而不仅仅是用上图中所示的词频后者直接不考虑词频。

这种one-hot不能捕获词和词之间的关系,因此有了接下来的  分布式表示distributed representation

3、分布式表示distributed representation

1. 基于矩阵的分布表示

    基于矩阵的分布表示通常又称为分布语义模型,在这种表示下,矩阵中的一行,就成为了对应词的表示,这种表示描述了该词的上下文的分布。由于分布假说认为上下文相似的词,其语义也相似,因此在这种表示下,两个词的语义相似度可以直接转化为两个向量的空间距离。

常见到的Global Vector 模型( GloVe模型)是一种对“词-词”矩阵进行分解从而得到词表示的方法,属于基于矩阵的分布表示。

1.1  High-dimensional sparse word vector

  • 思想

        基于neighbour,设置Co-occurrence Matrix共现矩阵

  • 限制
  1. 随着文章字数增加矩阵的大小也会迅速增加;
  2. 计算量会迅速增加。之前one-hot形式,由于只有一列存在非0数字,所以维度即使再大,计算量也不会增加太多。而现在则不同,每列都有可能有数个非0数字;
  3. 大部分的有效信息,集中在少数区域。没有有效地“散开”,所以robustness会比较差
  4. 当增加一个word的时候整个矩阵都要更新
  • 期望

       找到一个低维向量

1.2  Low-dimensional sparse word vector

  • 思想

       降维dimension reduction,例如通过SVD等,从k维降为r维

        

  • 限制
  1. 计算量比较大
  2. 新增文字后,需要重建矩阵并重新计算矩阵和降维
  • 期望

       直接学习出低维向量,而不是从资料中学习到高维矩阵再进行降维

       由此引出了word embedding

2. 基于聚类的分布表示
3. 基于神经网络的分布表示,词嵌入( word embedding)

    基于神经网络的分布表示一般称为词向量、词嵌入( word embedding)或分布式表示( distributed representation)

  • 思想

        directly learn low-dimensional word vectors

  • 两种方法

       word2vec (Mikolov et al. 2013)

              skip-gram

              CBOW

        Glove (Pennington et al., 2014)

              CBOW中,在做语言模型任务的时候,我把要预测的单词抠掉,然后根据它的上文 Context-Before 和下文 Context-after 去预测单词。以“我爱北京天安门”这句话为例。假设我们现在关注的词是“爱”,C=2时它的上下文分别是“我”,“北京天安门”。CBOW模型就是把“我” “北京天安门” 的one hot表示方式作为输入,也就是C个1xV的向量,分别跟同一个VxN的大小的系数矩阵W1相乘得到C个1xN的隐藏层hidden layer,然后C个取平均所以只算一个隐藏层。这个过程也被称为线性激活函数(这也算激活函数?分明就是没有激活函数了)。然后再跟另一个NxV大小的系数矩阵W2相乘得到1xV的输出层,这个输出层每个元素代表的就是词库里每个词的事后概率。输出层需要跟ground truth也就是“爱”的one hot形式做比较计算loss。这里需要注意的就是V通常是一个很大的数比如几百万,计算起来相当费时间,除了“爱”那个位置的元素肯定要算在loss里面,word2vec就用基于huffman编码的Hierarchical softmax筛选掉了一部分不可能的词,然后又用nagetive samping再去掉了一些负样本的词所以时间复杂度就从O(V)变成了O(logV)。Skip gram训练过程类似,只不过输入输出刚好相反。

  • 优点
  1. 任意两个词语之间的相似性很容易计算
  2. 可以使用在任何NLP监督任务上作为input,vector包含了语义信息
  3. 可以利用NN通过训练更新word representation(word embedding不是固定的,可以根据task微调)

神经网络词向量表示技术通过神经网络技术对上下文,以及上下文与目标词之间的关系进行建模。由于神经网络较为灵活,这类方法的最大优势在于可以表示复杂的上下文。在前面基于矩阵的分布表示方法中,最常用的上下文是词。如果使用包含词序信息的 n-gram 作为上下文,当 n 增加时, n-gram 的总数会呈指数级增长,此时会遇到维数灾难问题。而神经网络在表示 n-gram 时,可以通过一些组合方式对 n 个词进行组合,参数个数仅以线性速度增长。有了这一优势,神经网络模型可以对更复杂的上下文进行建模,在词向量中包含更丰富的语义信息。
这一节请阅读:https://www.jianshu.com/p/48b58ddeffa2  个人觉得其中关于Co-occurrence MatrixWord2vec以及Glove写的很详细清楚。以上内容也参考了。同时:讲解了word2vec中的负采样,以及word embedding中得到的权重矩阵怎么理解的问题

https://zhuanlan.zhihu.com/p/37477611  cbow 与 skip-gram的比较

https://blog.csdn.net/lyc_yongcai/article/details/73274767  cbow 、 skip-gram 与Huffman结构(hierarchical softmax)

http://www.javashuo.com/article/p-azcxxcok-cz.html   不带加速的cbow和skip-gram。感觉和上面的基于Huffman树的很不一样。。。。

word2vec、glove和 fasttext 的比较   https://blog.csdn.net/sun_brother/article/details/80327070

word2vec中的负采样到底是怎么进行的??

解答:https://www.jianshu.com/p/48b58ddeffa2

https://www.jianshu.com/p/56554a63410f

http://www.javashuo.com/article/p-pnxwarnk-ek.html    【含公式和伪代码!】

发现 hierarchical softmax 和 negative sampling 的策略都将计算softmax变成了计算二分类logistic 回归了。。。。

对于一个样本,基于 hierarchical softmax训练的时候,会更新到达这个单词的哈夫曼树经过的节点对应的所有的参数,基于negative sampling的时候,更新的是正确的词对应的那个二分类器的参数和随机采样得到的负样本对应的logistic回归分类器的参数。

使用霍夫曼树来代替传统的神经网络,可以提高模型训练的效率。但是如果我们的训练样本里的中心词w是一个很生僻的词,那么就得在霍夫曼树中辛苦的向下走很久了。

注意,不管是 hierarchical softmax 和 negative sampling 的CBOW还是skip-gram模型,更新的时候都会更新窗口中的2c个单词对应的词向量!!CBOW对窗口中的2c个单词的词向量更新的幅度是一样的,和预测模式有关,因为CBOW对于窗口中的上下文是求和或去平均只有得到一个向量输入到模型中进行训练的。但是skip-gram窗口中的2c个单词的词向量每次单词更新的是不同的!!skip-gram对于当前关注的单词来说,会和窗口中的每个单词组成一对,进行不同的预测,所以可以得到不同的误差和梯度。

看 http://www.javashuo.com/article/p-pnxwarnk-ek.html    【含公式和伪代码!】 这个系列中的讲解就可以看到了。但是这并不违反  https://zhuanlan.zhihu.com/p/37477611 这个说明的内容!!!

这两个矩阵(w和w')都含有V个词向量,也就是说同一个词有两个词向量,哪个作为最终的、提供给其他应用使用的embeddings呢?有两种策略,要么加起来,要么拼接起来。W中的向量叫input vector,W'中的向量叫output vector。

 

二、关于GloVe   

通过单词共现的概率,的比例(即后面会讲到的ratio),而不是概率本身去学习词向量

GloVe的全称叫Global Vectors for Word Representation,它是一个基于全局词频统计(count-based & overall statistics)的词表征(word representation)工具,它可以把一个单词表达成一个由实数组成的向量这些向量捕捉到了单词之间一些语义特性,比如相似性(similarity)、类比性(analogy)等。我们通过对向量的运算,比如欧几里得距离或者cosine相似度,可以计算出两个单词之间的语义相似性。

co-occurrence probability,意思是一个word ​ w_{i}  出现时,另一个word   ​w_{j}   也出现的概率。公式如下,其中 ​X表示出现的次数。

现在假设 w_{i} 和   ​w_{j}  都与 word ​ x有关系,可以计算出 

将这两个结果相除

就得到了ratio。

通过下面的例子可以看出,这个公式结果具有一些明显的规律。当w_{i} 和   ​w_{j}  含义比较接近时,他们的ratio就接近1。当含义不接近时,ratio就会较大或较小。

所以想要了解两个word ​w_{i} 和   ​w_{j}  之间的关系,可以通过它们共有的另一个word  w_{k}  ,经过计算得到ratio值,从而判断 ​ w_{i} 和   ​w_{j}  之间的关联。

F 其实就表示​ ​ w_{i} 和   ​w_{j}  之间的差异关系,所以也可以表示为

将它们转化成向量表示

如果​ w_{i} 和   ​w_{j}  比较接近,则结果趋向于1,否则会偏大或者偏小,正好可以通过exp ​的公式可以进行转换

两边取 ​log 后,进行整理。把​

当成一个常数项,整理进公式。同样也给 ​ ​w_{j}  ​添加一个常数项。

整理后的损失函数中还添加了权重函数

就相当与把统计相关的数据也添加进来进行优化在比较小的数据集中,也有较好的表现效果。

GloVe相当于有监督学习,其用来“监督”的函数为:

  这个公式是通过单词共现的概率的比例ratio推导得到的。

由此可以得到GloVe模型的目标函数(损失函数):

X_{ij}表示单词j出现在单词i的上下文中的次数;X_{ij}可以通过我们得到的单词的co-occurrence矩阵得到。这便是我们构造co-occurrence矩阵的意义,以及他在神经网络训练中的作用。

然后通过神经网络训练不断降低这个损失函数。

以上公式中的​ w_{i} 和   ​w_{j} ,是指的​ w_{i} 和   ​w_{j} 的词向量。!

关于GloVe详细实现过程和训练请参考:http://www.fanyeong.com/2018/02/19/glove-in-detail/

word2vec最大的缺点则是没有充分利用所有的语料

前者以基于SVD分解技术的LSA模型为代表,通过构建一个共现矩阵得到隐层的语义向量,充分利用了全局的统计信息。然而这类模型得到的语义向量往往很难把握词与词之间的线性关系(例如著名的King、Queen、Man、Woman等式)。后者则以基于神经网络的Skip-gram模型为代表,通过预测一个词出现在上下文里的概率得到embedding词向量。这类模型的缺陷在于其对统计信息的利用不充分,训练时间与语料大小息息相关。不过,其得到的词向量能够较好地把握词与词之间的线性关系,因此在很多任务上的表现都要略优于SVD模型。

既然两种模型各有优劣,那么能不能二者各取其长,构造一个更强大的词向量模型呢?这就是接下来要介绍的GloVe模型。

在GloVe的原始论文里,作者首先分析了Skip-gram模型能够挖掘出词与词之间线性关系的背后成因,然后通过在共现矩阵上构造相似的条件,得到一个基于全局信息的词向量模型——GloVe模型。

构造了什么条件使得GloVe模型得到的词向量可以拥有线性关系呢?理解https://blog.csdn.net/csdn_inside/article/details/86507697 中GloVe模型损失函数的构造。

GloVe模型没有使用神经网络。

 

三、从Word Embedding到Bert模型

BERT:全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder,BERT的模型架构基于多层双向转换解码,因为decoder是不能获要预测的信息的,模型的主要创新点都在pre-traing方法上,即用了Masked LM(遮蔽语言模型)Next Sentence Prediction两种方法分别捕捉词语句子级别的representation

其中“双向”表示模型在处理某一个词时,它能同时利用前面的词和后面的词两部分信息,这种“双向”的来源在于BERT与传统语言模型不同,它不是在给你所有前面词的条件下预测最可能的当前词,而是随机遮掩一些词,并利用所有没被遮掩的词进行预测。

bert的输入部分是个线性序列,两个句子通过分隔符分割,最前面和最后增加两个标识符号。

每个单词有三个embedding:

  1. 单词embedding,这个就是我们之前一直提到的单词embedding;可以用于之后的分类任务
  2. 句子embedding,因为前面提到训练数据都是由两个句子构成的,那么每个句子有个句子整体的embedding项对应给每个单词。由Next Sentence Prediction这个任务得到。
  3. 位置信息embedding,这是因为NLP中单词顺序是很重要的特征,需要在这里对位置信息进行编码;位置编码是 Transformer 架构本身决定的,因为基于完全注意力的方法并不能像 CNN 或 RNN 那样编码词与词之间的位置关系,但是正因为这种属性才能无视距离长短建模两个词之间的关系。因此为了令 Transformer 感知词与词之间的位置关系,我们需要使用位置编码给每个词加上位置信息。

把单词对应的三个embedding叠加,就形成了Bert的输入。
Bert 最关键两点,一点是特征抽取器采用 Transformer;第二点是预训练的时候采用双向语言模型。

对于 Transformer 来说,怎么才能在这个结构上做双向语言模型任务呢?
它的核心思想是:在做语言模型任务的时候,我把要预测的单词抠掉,然后根据它的上文 Context-Before 和下文 Context-after 去预测单词。【和word2vector中的CBOW模型是一样的思想】

Masked 双向语言模型向上图展示这么做:随机选择语料中 15% 的单词,把它抠掉,也就是用 [Mask] 掩码代替原始单词,然后要求模型去正确预测被抠掉的单词。但是这里有个问题:训练过程大量看到 [mask] 标记,但是真正后面用的时候是不会有这个标记的,这会引导模型认为输出是针对 [mask] 这个标记的,但是实际使用又见不到这个标记,这自然会有问题。

为了避免这个问题,Bert 改造了一下,15% 的被上天选中要执行 [mask] 替身这项光荣任务的单词中,只有 80% 真正被替换成 [mask] 标记,10% 被狸猫换太子随机替换成另外一个单词,10% 情况这个单词还待在原地不做改动。这就是 Masked 双向语音模型的具体做法。

至于说“Next Sentence Prediction”,指的是做语言模型预训练的时候,分两种情况选择两个句子,一种是选择语料中真正顺序相连的两个句子;另外一种是第二个句子从语料库中抛色子,随机选择一个拼到第一个句子后面。我们要求模型除了做上述的 Masked 语言模型任务外,附带再做个句子关系预测,判断第二个句子是不是真的是第一个句子的后续句子。

之所以这么做,是考虑到很多 NLP 任务是句子关系判断任务,单词预测粒度的训练到不了句子关系这个层级,增加这个任务有助于下游句子关系判断任务。所以可以看到,它的预训练是个多任务过程。这也是 Bert 的一个创新。

归纳一下这些进展就是:

  • 首先是两阶段模型,第一阶段双向语言模型预训练,这里注意要用双向而不是单向,第二阶段采用具体任务 Fine-tuning 或者做特征集成;
  • 第二是特征抽取要用 Transformer 作为特征提取器而不是 RNN 或者 CNN;
  • 第三,双向语言模型可以采取 CBOW 的方法去做(当然我觉得这个是个细节问题,不算太关键,前两个因素比较关键)。

Bert 最大的亮点在于效果好及普适性强,几乎所有 NLP 任务都可以套用 Bert 这种两阶段解决思路,而且效果应该会有明显提升。可以预见的是,未来一段时间在 NLP 应用领域,Transformer 将占据主导地位,而且这种两阶段预训练方法也会主导各种应用。

以上内容来源:

https://mp.weixin.qq.com/s?__biz=MzI0ODcxODk5OA==&mid=2247499341&idx=2&sn=31a806928f2d94d2904e1c2f857c2580&chksm=e99ecdb4dee944a25f63829aba6a3a89efc4486711c885abd88c6c76c1106afa672271718bd9&mpshare=1&scene=1&srcid=1120W36CQl5pUvgxMl1B8GP7&key=0494a4e70b25a2a9a6a61aadee8b0c31edccaee10fd31b93133801bbb2c4b9abea2d40487dcbdd5d252c816ee24081ab0dcb4152e26edce00d946740d725a763f92ea95a04225e85fd78c2e7a69b3718&ascene=1&uin=MjQ5MDE1MzczNA%3D%3D&devicetype=Windows+10&version=62060728&lang=zh_CN&pass_ticket=abXi3V1Z6uHr3upLH9TkLYSUFF6f3ZAJ1PeAPgx4V6puzF%2FBcLAm3WpxGOvC3uvi

BERT贡献

a.BERT利用masked model实现了语言模型的双向性,证明了双向性对语言表示预训练的重要性。如下图,传统的方法如OpenAI GPT是单向语言模型,每个词只能用到该词左边的词信息进行学习(RNN时间序列模型);ELMo是利用双向LSTM,将一层left-to-right 和right-to-left两个单独的LSTM进行结合;而BERT模型是真正意义上的双向语言模型,每个词可以同时利用该词的上下文信息。

b.BERT是第一个微调模型在sentence-level和token-level自然语言任务都达到了最好效果。证明了pre-trained representations可以缓解了不同任务对特殊模型结构的设计需求。 BERT是第一个基于微调的表示模型,它在大量的句子级和token级任务上实现了最先进的性能,强于许多面向特定任务体系架构的系统。

c.BERT在11个自然语言处理任务上达到了最好效果。并在BERT的extensive ablations证明了“BERT的双向性”是一个重要的创

BERT的新语言表示模型,它代表Transformer的双向编码器表示。与最近的其他语言表示模型不同,BERT旨在通过联合调节所有层中的上下文来预先训练深度双向表示。因此,预训练的BERT表示可以通过一个额外的输出层进行微调,适用于广泛任务的最先进模型的构建,比如问答任务和语言推理,无需针对具体任务做大幅架构修改。

BERT的“里程碑”意义在于:证明了一个非常深的模型可以显著提高NLP任务的准确率,而这个模型可以从无标记数据集预训练得到。

模型的评价
(1)优点

BERT是截止至2018年10月的最新的的state of the art模型,通过预训练和精调可以解决11项NLP的任务。使用的是Transformer,相对于rnn而言更加高效、能捕捉更长距离的依赖与之前的预训练模型(ELMo,GPT)相比,它捕捉到的是真正意义上的bidirectional context信息

(2)缺点

作者在文中主要提到的就是MLM预训练时的mask问题:

1)[MASK]标记在实际预测中不会出现,训练时用过多[MASK]影响模型表现;

2)每个batch只有15%的token被预测,所以BERT收敛得比left-to-right模型要慢(它们会预测每个token)
 

进一步理解:

1. pre-training?其中 pre-training 的意思是,作者认为,确实存在通用的语言模型,先用文章预训练通用模型,然后再根据具体应用,用 supervised 训练数据,精加工(fine tuning)模型,使之适用于具体应用。

2.双向?通过self-attention实现的,利用Transformer中的encoder实现的,可以使用当前词前后的词,因此成为双向Transformer(Transformer中由于decoder限制了只能使用当前词之前词的信息,所以decoder是单向的;但是encoder在每一个词输入时,是可以利用前后所有词的信息,因此称为双向)

3.深层?因为Transformer只是用self-attention,没有使用RNN或者CNN,并且利用了残差网络,因此可以训练深层模型

4.利用非标注数据?BERT可以利用文档生成“预测是否为下一句”任务的 训练数据,从而不受标注数据量的影响

5.双向预测?由于BERT是双向的,利用词前后词的信息,所以多层之后就知道了该位置的词是什么,因此采用了mask的方式(个人觉得有点像降噪自编码器)

6.预训练过程主要解决“预测是否为下一句”的任务,因此目标函数是最小化(mask位置预测损失+是否为下一句分类任务损失)
https://blog.csdn.net/luoxiaolin_love/article/details/84618247

关于bert知识干货的汇总https://zhuanlan.zhihu.com/p/50717786

 

四、N-gram(统计语言模型)

https://www.jianshu.com/p/e91f061d6d91

语言模型主要分为规则模型和统计模型两种。统计语言模型是用概率统计的方法来揭示语言单位内在的统计规律,其中N-Gram简单有效,被广泛使用。N-Gram:该模型基于这样一种假设,第n个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。常用的是二元的Bi-Gram和三元的Tri-Gram。

关于语言模型https://zhuanlan.zhihu.com/p/52061158   语言模型 & n-gram & word2vector & RNN 联系和区别

统计语言模型是一个单词序列上的概率分布,对于一个给定长度为m的序列,它可以为整个序列产生一个概率 P(w_1,w_2,…,w_m) 。其实就是想办法找到一个概率分布,它可以表示任意一个句子或序列出现的概率。
目前在自然语言处理相关应用非常广泛,如语音识别(speech recognition) , 机器翻译(machine translation), 词性标注(part-of-speech tagging), 句法分析(parsing)等。传统方法主要是基于统计学模型,最近几年基于神经网络的语言模型也越来越成熟。
神经语言模型

神经语言模型使用连续表示或词汇Embedding来进行预测。 以神经网络为基础来训练模型。

通过神经网络训练语言模型可以得到词向量,那么,究竟有哪些类型的神经网络语言模型呢?个人所知,大致有这么些个:
a) Neural Network Language Model ,NNLM
b) Log-Bilinear Language Model, LBL
c) Recurrent Neural Network based Language Model,RNNLM
d) Collobert 和 Weston 在2008 年提出的 C&W 模型
e) Mikolov 等人提出了 CBOW( Continuous Bagof-Words)和 Skip-gram 模型

 

 

什么是语言模型?其实看上面这张 PPT 上扣下来的图就明白了,为了能够量化地衡量哪个句子更像一句人话,可以设计如上图所示函数,核心函数 P 的思想是根据句子里面前面的一系列前导单词预测后面跟哪个单词的概率大小(理论上除了上文之外,也可以引入单词的下文联合起来预测单词出现概率)。句子里面每个单词都有个根据上文预测自己的过程,把所有这些单词的产生概率乘起来,数值越大代表这越像一句人话。

假设现在让你设计一个神经网络结构,去做这个语言模型的任务,就是说给你很多语料做这个事情,训练好一个神经网络,训练好之后,以后输入一句话的前面几个单词,要求这个网络输出后面紧跟的单词应该是哪个,你会怎么做?

你可以像上图这么设计这个网络结构,这其实就是大名鼎鼎的中文人称“神经网络语言模型”,英文小名 NNLM 的网络结构,用来做语言模型。这个工作有年头了,是个陈年老工作,是 Bengio 在 2003 年发表在 JMLR 上的论文。

我们回来讲一讲 NNLM 的思路。先说训练过程,现在看其实很简单,见过 RNN、LSTM、CNN 后的你们回头再看这个网络甚至显得有些简陋。学习任务是输入某个句中单词前面句子的 t-1 个单词,要求网络正确预测单词 Bert,即最大化:

前面任意单词用Onehot编码(比如:0001000)作为原始单词输入,之后乘以矩阵 Q 后获得向量,每个单词的拼接,上接隐层,然后接 softmax 去预测后面应该后续接哪个单词。这个是什么?这其实就是单词对应的 Word Embedding 值,那个矩阵 Q 包含 V 行,V 代表词典大小,每一行内容代表对应单词的 Word embedding 值。只不过 Q 的内容也是网络参数,需要学习获得,训练刚开始用随机值初始化矩阵 Q,当这个网络训练好之后,矩阵 Q 的内容被正确赋值,每一行代表一个单词对应的 Word embedding 值。

所以你看,通过这个网络学习语言模型任务,这个网络不仅自己能够根据上文预测后接单词是什么,同时获得一个副产品,就是那个矩阵 Q,这就是单词的 Word Embedding 是被如何学会的。

2013 年最火的用语言模型做 Word Embedding 的工具是 Word2Vec,后来又出了 Glove,Word2Vec 是怎么工作的呢?看下图。

Word2Vec 的网络结构其实和 NNLM 是基本类似的,只是这个图长得清晰度差了点,看上去不像,其实它们是亲兄弟。不过这里需要指出:尽管网络结构相近,而且也是做语言模型任务,但是其训练方法不太一样。Word2Vec 有两种训练方法,一种叫 CBOW,核心思想是从一个句子里面把一个词抠掉,用这个词的上文和下文去预测被抠掉的这个词;第二种叫做 Skip-gram,和 CBOW 正好反过来,输入某个单词,要求网络预测它的上下文单词。

而你回头看看,NNLM 是怎么训练的?是输入一个单词的上文,去预测这个单词。这是有显著差异的。为什么 Word2Vec 这么处理?原因很简单,因为 Word2Vec 和 NNLM 不一样,NNLM 的主要任务是要学习一个解决语言模型任务的网络结构,语言模型就是要看到上文预测下文,而 word embedding 只是无心插柳的一个副产品。但是 Word2Vec 目标不一样,它单纯就是要 word embedding 的,这是主产品,所以它完全可以随性地这么去训练网络。

语言模型word embedding联系和区别弄清楚。!!

以上内容来自:

https://mp.weixin.qq.com/s?__biz=MzI0ODcxODk5OA==&mid=2247499341&idx=2&sn=31a806928f2d94d2904e1c2f857c2580&chksm=e99ecdb4dee944a25f63829aba6a3a89efc4486711c885abd88c6c76c1106afa672271718bd9&mpshare=1&scene=1&srcid=1120W36CQl5pUvgxMl1B8GP7&key=0494a4e70b25a2a9a6a61aadee8b0c31edccaee10fd31b93133801bbb2c4b9abea2d40487dcbdd5d252c816ee24081ab0dcb4152e26edce00d946740d725a763f92ea95a04225e85fd78c2e7a69b3718&ascene=1&uin=MjQ5MDE1MzczNA%3D%3D&devicetype=Windows+10&version=62060728&lang=zh_CN&pass_ticket=abXi3V1Z6uHr3upLH9TkLYSUFF6f3ZAJ1PeAPgx4V6puzF%2FBcLAm3WpxGOvC3uvi