word2vec原理_word2vec论文阅读笔记

word2vec算是NLP中的经典算法,之前在课程中简单的学过,但面试时经不起深问。痛定思痛,参考Jack(@没搜出来)的总结,笔者重点阅读了Mikolov的原始论文[1]和Xin Rong的详细推导[2]

Jack:word2vec 相关论文​zhuanlan.zhihu.com

Mikolov的原始论文主要从时间复杂度论证了word2vec的效率,但对于其中原理和具体训练方法描述却相对较少,本文将以Xin Rong的推导为主(最后行文可能像是这篇论文的中文缩略版)。

一、bigram情形

笔者认为这是word2vec模型的核心,即用一个词预测另一个词共现概率(显然这两个词的次序、相隔距离都是可以叠加设置的,从而转换成word2vec的两种方法——CBOW和skip-gram)。其框架图如下所示:

8ab6bb328c6b2fc193c6f393226765c7.png

图中V是词的数量,即词独热编码的长度,N为隐藏层变量的维度,在这里等于所要训练词向量的维度,该模型相当于用词向量为隐含层,从而从输入层(上下文词)的独热编码预测输出层(目标词)的独热编码。计算隐含层的权重矩阵记为W,从隐含层计算输出层的权重矩阵记为W'。接下来我们需一步步推导其更新方程。

首先从输入层到隐藏层的公式为:

这里可以看到,由于x是独热编码(即对应该向量只有词id位置的值为1,其余值均为0),隐含层相当于取出W(维度为V×N)中词id对应的行向量,这里定义为输入词的向量

对于隐含层到输出层,定义了另一个权重矩阵W'(ps:在源码实际训练中,W'是W转置,共享词的信息),维度为N×V,可理解为词id位置对应的列向量为输出词的词向量。通过隐藏层与输出词词向量作内积,可以认为是隐藏层(此处不使用输入词向量是因为在后续CBOW时,h不等于输入词向量,而是上下文多个词向量平均值)与实际输出的余弦相似度。从而得到每个词与当前位置的匹配度为:

其中,下标j即为输出词的id,

即第j个输出词对应的词向量,是W'的第j列。

为了将匹配度转化为对应词出现的概率分布,记作y,使用了经典的softmax函数,从而将其映射到0-1之间,这里不列出公式了。模型的目标是使对应真实输出词的匹配度最高(即出现概率最大),从而可以得出目标函数,同时其相反数为损失函数:

其中上标*表示实际对应的情况,即

表示实际输出词对应到模型中的匹配度。

之后就是对损失函数进行求偏导,从而得出训练时更新方程,分为两部分:

  1. 隐含层到输出层的权重;
  2. 输入层到隐含层的权重。

对于第一部分,依靠链式法则进行计算,首先计算损失函数对于匹配度的偏导(预测误差):

其中,

对应
部分,求导后为预测的概率分布;而
对应
的定义为当且仅当下标为
时为1,其余时候都为0。(ps:我认为将记为
可能更直观明了一些。)

之后通过链式法则,即可计算出代价函数关于W'的偏导:

从而得出:

接着计算代价函数对于W的偏导,首先计算代价函数关于隐含层的偏导:

这里定义EH(维度为N的向量)为W'所有词向量关于预测误差

为权重的和,即:

从而,同样通过链式法则计算代价函数关于W的偏导:

从而得到更新函数为:

由于x是独热编码的缘故,事实上只需更新输入函数的那一行,至此word2vec最核心的部分bigram用单个词上下文信息预测某个词的证明完成,加下来分别增加输入词数量(CBOW)和输出词数量(skip-gram)。

二、CBOW方法

CBOW方法是用词上下文k个词来预测该位置词的信息(通常是该词前k/2个词,该词后k/2个词,但从推导来看由于权重不同,对于窗口和词位置的关系并没有太大关系,前后词数不一定要对称),预测模型的框架图如下所示:

bb72f753d49738867025d89e6cf9155d.png

与bigram情况的主要不同在于输入词由一个变为C个,隐含层计算公式为这些词的等权平均数:

由于隐含层到输出层过程相较于bigram情形没有任何变化,对于W'的更新函数也完全相同:

而对于输入层到隐含层过程,可以对于C个输入词分别按照bigram过程进行计算后取平均值,因而可以得出输入层到隐含层权重的更新函数为:

笔者认为可以修改bigram情形中输入词的定义,将其改为输入上下文词独热编码的等权平均值,从而完全套用bigram情形中的公式:

三、Skip-Gram方法

Skip-Gram方法是用中心词预测输出上下文的概率,预测模型框架图如下所示:

3d039d765e95fee95bd56bfc2bfc6fa7.png

与bigram情形的最大区别在于输出词由1个变为C个,从而从损失函数函数开始就要发生变化:

从而可看出等于C次bigram损失函数加和,由此,根据bigram情形损失函数对于单一匹配度的偏导,定义对于上下文输出匹配度的偏导(预测误差):

根据链式法则,损失函数关于隐含层到输出层权重的偏导为:

从而得出隐含层到输出层权重的更新函数为:

同时更新定义EH(维度为N的向量)为W'所有词向量关于预测误差

为权重的和,即:

从而输入层到隐含层的更新函数仍然适用:

笔者认为由推导过程中也可以看出,skip-gram算法虽然输出层的权重是相同的,也可重新定义y为C个上下文词的独热编码等权平均数,从而完全套用bigram情形中的公式(和原公式相比只是更新项相差C倍):

ps: 对于word2vec原理推导应该算完成了,但对于具体计算过程的细节仍存在一些疑问,比如层次softmax和负采样两种计算技巧,留个坑,如果有机会写源码阅读笔记再写。

参考

  1. ^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
  2. ^Rong X. word2vec parameter learning explained[J]. arXiv preprint arXiv:1411.2738, 2014. https://www.researchgate.net/publication/268226652_word2vec_Parameter_Learning_Explained
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值