word2Vec学习笔记

Word2Vec学习笔记

一、n-gram语言模型

1.1 n-gram语言模型介绍

自然语言是一个连续的概率模型,当前位置出现哪个词和这个词前面出现了哪些词是紧密关联的,如在前面出现了“我爱自然语言”后面就有很大概率出现“处理”这个词。但是若将词与它前面的所有词进行关联,又会使计算量过大,为简化计算,将当前词出现的概率仅仅和该词前面出现的n个词进行关联,这就产生了n-gram语言模型,公式表达如下:
word2Vec学习笔记
下标代表词的位置,式子左边位置k的词与从位置1到位置k-1的词相关,采用n-gram模型后,左边式子约等于右边式子,即当前位置k出现的词仅与位置k-n+1到k-1位置上出现的词相关。
至于如何计算这个概率,可以采用统计学上的大数定理进行计算,在一个标准的语料库上,统计一个连续词语序列word2Vec学习笔记出现的次数,记为word2Vec学习笔记,同时计算计算词语序列word2Vec学习笔记出现的次数,记为word2Vec学习笔记,于是上面的式子就可以写成:
word2Vec学习笔记

1.2 n-gram存在的问题

1、n越大越好,但随着n的增大,计算量也会增大;
2、该模型需要考虑平滑处理。
n-gram主要的工作量是要在语料库中统计大量词语出现的条件概率,并且需要做一些平滑性处理,当要估计某句话出现的概率时就需将这些条件概率连城起来即可。计算和存储这么大的概率数工作量会很大。

二、神经概率语言模型

1.传统的神经网络模型如下所示:

word2Vec学习笔记
网络分为三层:第一层是word2Vec学习笔记,输入的是将当前词前面的n-1个词的词向量拼接在一起的向量,假设词向量的维度为m,那么该层输入的向量就是(n-1)*m,中间隐藏层的维度为word2Vec学习笔记,可以由用户自己来设定该层有多少维,最后一层是输出层,输出的是在当前n-1个词的条件下,最有可能输出的是哪个词,所以输出的维度是语料库词语的个数,这个数量级别一般是百万级别的。可见训练这样一个神经网络,训练参数主要集中在U这个矩阵中,优化矩阵U的计算就变得很关键。wiord2vec的工作也主要集中在这一部分。

2 word2vec

word2vec有两种模型,两种优化方法。两种模型指的是:CBOW模型(Continuous Bag-of-Word Model)和Skip-gram(Continuous Skip-gram Model),两种优化方式指的是:多层次的softmax(Hierarchical Softmax)方法和负采样(Negative Sampling),这两种优化方法都能有效降低softmax层的计算复杂度。

2.1.CBOW模型
CBOW模型是根据当前词的上下文预测当前词,即一句话“我爱自然语言处理”在给定“我”,“爱”, “语言”,“处理”的条件下,建模使得模型输出“自然”的概率取得最大。模型框架如下:
word2Vec学习笔记

还是以上面的句子为例,假如使用的是该CBOW模型,那么这个模型的左边输入w(t+1),w(t+2),w(t-1),w(t-2)就分别为对应位“语言”,”处理”,“爱”和“我”,而模型右边输出的w(t)就对应的是“自然”。通过调整参数,使得模型右边输出“自然”的概率最大。假如仅仅是这样的话,word2vec倒没有特别的地方,因为它还是和上面提到的传统的神经网络模型一样,需要计算从图中Sum到w(t)的一个巨大矩阵。这一步也是在计算一个庞大的多分类问题,每一类对应着语料库中每一个词语。为简化这个矩阵的计算,word2vec采用了多层次softmax(Hierarchical Softmax)方法和负采样(Negative Sampling)方法。
2.1.1Hierachical Softmax
主要的区别点就是该输出层不再使用线性结构,而是使用树形结构,构建一个Huffman树,每个叶子结点代表一个输出的词语。
word2Vec学习笔记
根据词频建好哈夫曼树后,每个词语对应的哈夫曼编码就固定下来了,最后要最大化的对数似然目标函数为:
word2Vec学习笔记
其中lw为w这个词哈夫曼编码长度,C是语料库中的每一个词,word2Vec学习笔记 是词w在哈夫曼节点j-1处的参数,也是我们要学习优化的参数。
具体模型参数的推导和梯度的计算可以参考这篇文章,讲解很详细:
word2vec 中的数学原理详解(四)基于 Hierarchical Softmax 的模型
采用该Hierachical Softmax的好处是:
使得原本在输出层需要做N分类问题的,转化成在最后一层做log(N)次的二分类问题:当按照词频把这棵哈夫曼树建好以后,这棵树对应的哈夫曼编码就会固定了,如(0,1,1,0),即二分类的结果已经确定下来了,而接下来要做的只是拟合每个节点上的参数使得在每个节点上的的二分类都尽可能分类准确。这也是word2vec计算词向量快的原因
采用哈夫曼树编码,使得频数越高的词的路径越短,频数越低的词路径越长,最终使得平均加权路径最短。

用Hierachical Softmax层近似计算softmax:
主要参考文献:词嵌入系列博客Part2:比较语言建模中近似softmax的几种方法
原本在最后一层是一个softmax层,输出每一个词的概率的计算公式如下:
word2Vec学习笔记
可见,为保证输出概率的归一化,softmax函数需要计算当前词的输出概率除以所有词的概率加和,计算复杂度很高,而H-Softmax是在保证softmax层完整的情况下,修改了其中的结构来提高效率。H_softmax通过构建二叉树,每个叶子节点的加和保证为1,这可以直观的理解为:一个节点分为左右两支,但左右两支的概率加和为1,不存在概率损失,只是相当于把当前的概率分别分配给了左右分支而已,所以会使得最终的叶子结点概率加和后还是1。简单地以一个三层二叉树为例:

word2Vec学习笔记
计算各叶子结点后,得到:
word2Vec学习笔记
原来的softmax可以看成是一个只有一层的树,叶子结点为|V|个,除了计算当前对应词的概率外,还需要计算其他|V-1|个词的概率用于归一化。而H_softmax可以看成是一个深度为log(V)的二叉树,二叉树已经可以保证最后的叶子结点概率加和为1,所以在计算一个词的输出时只需要按照这个词在树中的路径进行二分类即可,不需要考虑其他的词。

2.1.2 负采样
在CBOW模型中,当上下文给定时,上下文对应的那个词是正样本,通过采样得到出这个词以外的词作为负样本,通过构建目标函数使得得到正样本的概率越大,得到负样本的概率越小。构建的目标函数如下表:
word2Vec学习笔记
word2Vec学习笔记 是词u对应的参数,是最终我们要学习的参数,最大化上述目标函数就可以使在当前上下文下使得产生正样本的概率增大,负样本的概率变小。至于为什么要采用负采样,主要是考虑到训练模型的问题,若将所有的除了该词以外的所有词作为负样本,训练数据太多,模型太复杂,可以训练数据量就越小,而word2vec在简化模型后,可以训练的数据量越大。

3 总结:

softmax的计算很复杂,在word2vec中分别采用Hierachical Softmax层和负采样的方法来近似计算softma函数,同时网络结构也大大简化,训练过程也可以得到简化
另外,在word2vec的训练过程中,都会考虑词的上下文,使得有相似上下文的词有相似的词向量表达,可以得到词语义间的关系。
后来的总结:
(1)目标函数采用的是最大似然估计作为目标函数,即在看到上下文是“我”,‘“爱”,“语言”,“处理”后最有可能生成的是“自然”这个词后,该模型就是学习目标函数,使得生成”自然”的概率最大化,同时希望在测试数据数据上同样具有这种性质,但不能一定保证具有这种性质,只是一种希望;
(2)word2vec中无论是cbow模型或是Skip-gram模型,都是基于一个假设“一个词怎么,应该看这个词旁边的词是怎么样的”,如“天上有星星”和“天上有月亮”,星星和月亮有相同的上下文,故星星和月亮应该有相似的词向量表达。模型的本身是非常朴素的,是基于当前词生成上下文或是基于上下文生成当前词,但仅仅用这一个模型的话,会存在计算庞大的softmax函数,计算量非常大。负采样和层次softmax是两种近似计算softmax的方法

参考链接:
word2vec中关于霍夫曼树的应用原理
词嵌入系列博客Part2:比较语言建模中近似softmax的几种方法
Word2Vec-知其然知其所以然