word2vec算是NLP中的经典算法,之前在课程中简单的学过,但面试时经不起深问。痛定思痛,参考Jack(@没搜出来)的总结,笔者重点阅读了Mikolov的原始论文[1]和Xin Rong的详细推导[2]。
Jack:word2vec 相关论文zhuanlan.zhihu.comMikolov的原始论文主要从时间复杂度论证了word2vec的效率,但对于其中原理和具体训练方法描述却相对较少,本文将以Xin Rong的推导为主(最后行文可能像是这篇论文的中文缩略版)。
一、bigram情形
笔者认为这是word2vec模型的核心,即用一个词预测另一个词共现概率(显然这两个词的次序、相隔距离都是可以叠加设置的,从而转换成word2vec的两种方法——CBOW和skip-gram)。其框架图如下所示:

图中V是词的数量,即词独热编码的长度,N为隐藏层变量的维度,在这里等于所要训练词向量的维度,该模型相当于用词向量为隐含层,从而从输入层(上下文词)的独热编码预测输出层(目标词)的独热编码。计算隐含层的权重矩阵记为W,从隐含层计算输出层的权重矩阵记为W'。接下来我们需一步步推导其更新方程。
首先从输入层到隐藏层的公式为:
这里可以看到,由于x是独热编码(即对应该向量只有词id位置的值为1,其余值均为0),隐含层相当于取出W(维度为V×N)中词id对应的行向量,这里定义为输入词的向量
对于隐含层到输出层,定义了另一个权重矩阵W'(ps:在源码实际训练中,W'是W转置,共享词的信息),维度为N×V,可理解为词id位置对应的列向量为输出词的词向量。通过隐藏层与输出词词向量作内积,可以认为是隐藏层(此处不使用输入词向量是因为在后续CBOW时,h不等于输入词向量,而是上下文多个词向量平均值)与实际输出的余弦相似度。从而得到每个词与当前位置的匹配度为:
其中,下标j即为输出词的id,
为了将匹配度转化为对应词出现的概率分布,记作y,使用了经典的softmax函数,从而将其映射到0-1之间,这里不列出公式了。模型的目标是使对应真实输出词的匹配度最高(即出现概率最大),从而可以得出目标函数,同时其相反数为损失函数:
其中上标*表示实际对应的情况,即
之后就是对损失函数进行求偏导,从而得出训练时更新方程,分为两部分:
- 隐含层到输出层的权重;
- 输入层到隐含层的权重。
对于第一部分,依靠链式法则进行计算,首先计算损失函数对于匹配度的偏导(预测误差):
其中,
之后通过链式法则,即可计算出代价函数关于W'的偏导:
从而得出:
接着计算代价函数对于W的偏导,首先计算代价函数关于隐含层的偏导:
这里定义EH(维度为N的向量)为W'所有词向量关于预测误差
从而,同样通过链式法则计算代价函数关于W的偏导:
从而得到更新函数为:
由于x是独热编码的缘故,事实上只需更新输入函数的那一行,至此word2vec最核心的部分bigram用单个词上下文信息预测某个词的证明完成,加下来分别增加输入词数量(CBOW)和输出词数量(skip-gram)。
二、CBOW方法
CBOW方法是用词上下文k个词来预测该位置词的信息(通常是该词前k/2个词,该词后k/2个词,但从推导来看由于权重不同,对于窗口和词位置的关系并没有太大关系,前后词数不一定要对称),预测模型的框架图如下所示:

与bigram情况的主要不同在于输入词由一个变为C个,隐含层计算公式为这些词的等权平均数:
由于隐含层到输出层过程相较于bigram情形没有任何变化,对于W'的更新函数也完全相同:
而对于输入层到隐含层过程,可以对于C个输入词分别按照bigram过程进行计算后取平均值,因而可以得出输入层到隐含层权重的更新函数为:
笔者认为可以修改bigram情形中输入词的定义,将其改为输入上下文词独热编码的等权平均值,从而完全套用bigram情形中的公式:
三、Skip-Gram方法
Skip-Gram方法是用中心词预测输出上下文的概率,预测模型框架图如下所示:

与bigram情形的最大区别在于输出词由1个变为C个,从而从损失函数函数开始就要发生变化:
从而可看出等于C次bigram损失函数加和,由此,根据bigram情形损失函数对于单一匹配度的偏导,定义对于上下文输出匹配度的偏导(预测误差):
根据链式法则,损失函数关于隐含层到输出层权重的偏导为:
从而得出隐含层到输出层权重的更新函数为:
同时更新定义EH(维度为N的向量)为W'所有词向量关于预测误差
从而输入层到隐含层的更新函数仍然适用:
笔者认为由推导过程中也可以看出,skip-gram算法虽然输出层的权重是相同的,也可重新定义y为C个上下文词的独热编码等权平均数,从而完全套用bigram情形中的公式(和原公式相比只是更新项相差C倍):
ps: 对于word2vec原理推导应该算完成了,但对于具体计算过程的细节仍存在一些疑问,比如层次softmax和负采样两种计算技巧,留个坑,如果有机会写源码阅读笔记再写。
参考
- ^Tomas Mikolov, Kai Chen, Greg Corrado, and Jeffrey Dean. Efficient estimation of word representations in vector space.ICLR Workshop, 2013 https://www.researchgate.net/publication/234131319_Efficient_Estimation_of_Word_Representations_in_Vector_Space
- ^Rong X. word2vec parameter learning explained[J]. arXiv preprint arXiv:1411.2738, 2014. https://www.researchgate.net/publication/268226652_word2vec_Parameter_Learning_Explained