没时间,先把论文附在这,有需要的可以看下,看完后是一个很大的提升。后期有空补上
https://arxiv.org/pdf/1411.2738.pdf
https://arxiv.org/pdf/1402.3722.pdf
word2vec Parameter Learning Explained
译文:
Abstract
Mikolov等人的word2vec模型及其应用在近两年引起了极大的关注。通过word2vec模型学习的单词向量表示具有语义意义,在各种NLP任务中都很有用。随着越来越多的研究人员将实验word2vec或类似的技术,我注意到缺乏材料,全面解释字嵌入模型的参数学习过程的细节,这将阻止神经网络非专业人士理解此类模型的工作机制。
本文对word2vec模型的参数更新方程进行了详细的推导和说明,包括原始的连续词袋模型(CBOW)和skip-gram(SG)模型,以及分层softmax和负采样等先进的优化技术。除了数学推导外,还提供了梯度方程的直观解释。
在附录中,综述了神经元网络和反向传播的基础知识。我还创建了一个交互式演示程序wevi,以促进对模型的直观理解。
1 Continuous Bag-of-Word Model
1.1 One-word context
我们从Mikolov等人(2013a)引入的最简单的连续词袋模型(CBOW)开始。我们假设每个上下文只考虑一个单词,这意味着模型将在给定一个上下文单词的情况下预测一个目标单词,这就像一个bigram模型。对于初学神经网络的读者,建议先阅读附录A,快速回顾一下重要的概念和术语,然后再继续学习。
图1显示了简化了上下文定义的网络模型。在我们的设置中,词汇量大小为V,隐藏层大小为N,相邻层上的单元完全连接。输入是一个独热编码向量,这意味着对于给定的输入上下文单词,V个单元中只有一个是1,其他所有单元都是0。
输入层与输出层之间的权值可以用矩阵W表示。W的每一行是输入层关联词的N维向量表示
。形式上,W的第i行是
。给定上下文(一个单词),假设
,
其中
,我们有:
(1)
本质上是把W的第k行复制到h。是输入词
的向量表示。这意味着隐含层单元的激活函数是简单的线性函数(即,直接将其加权的输入和传递给下一层)。
从隐层到输出层,有一个不同的权值矩阵,是一个
矩阵。使用这些权重,我们可以计算出词汇表中每个单词的
分数,
(2)
其中是矩阵
的第j列。然后利用对数线性分类模型softmax得到单词的后验分布,即多项式分布。
(3)
其中是输出层中j单元的输出。将(1)(2)代入(3)得到:
(4)
注意和
是单词w的两种表示形式,
来自于
的行,是输入层→隐藏层权重矩阵,
来自于
的列,是隐藏层→输出层的权重矩阵。在后续的分析中,我们将
称为“输入向量”,将
称为单词w的“输出向量”。
Update equation for hidden→output weights
现在我们来推导这个模型的权值更新方程。虽然实际的计算是不切实际的(解释如下),但我们进行推导是为了在不使用任何技巧的情况下了解这个原始模型。有关反向传播基础知识的回顾,请参见附录A。
给定上下文单词相关的权重,训练目标(对于一个训练样本)是最大化(4)中观察实际输出单词的条件概率。
(5)(6)(7)
其中是我们的损失函数(我们想要最小化E),
是输出层中实际输出单词的索引。注意,这个损失函数可以理解为两个概率分布之间交叉熵测量的一个特例。
现在让我们推导隐藏层和输出层之间的权值的更新方程。求E对第j个单元的净输入的导数,得到
(8)
其中,即,仅当第j个单元为实际输出字时,
为1,其余
。注意,这个导数只是输出层的预测误差
。
接下来我们对求导,得到隐藏的→输出权值的梯度。(这里为什么只对
计算中间导数?请看下表,从表中我们知道,只有计算
的时候用到了
)
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
(9)
因此,利用随机梯度下降法,得到隐含层→输出权值的权值更新方程:
(10)
或者
(11)
其中是学习率,
,
是隐藏层的第i个单元;
是
的输出向量。注意,这个更新方程意味着我们必须通过所有可能的单词词汇表,检查它的输出概率
,将
其预期输出
作比较。如果
(“高估”),然后我们从
中减去一部分隐藏向
(即
),使
距离
更远;如果
(“低估”,只有当
,即
时才成立),我们在
上加一些
,从而使
更接近
。如果
非常接近
,那么根据更新方程,权值变化很小。再次注意,
(输入向量)和
(输出向量)是单词w的两种不同的向量表示。
Update equation for input→hidden weights
在得到了的更新方程后,我们现在将目标转向
。我们求
对隐含层的输出的导数,得到(
,从上表中可以看到所有的
中均包含
,因此需要对多个
分别求导累加)
(12)
其中为隐含层第i个单元的输出;
在式(2)中定义,为输出层第
个单元的净输入;
是输出层第
个字的预测误差。
是一个N-dim向量,是词汇表中所有单词的输出向量之和,由预测误差加权得到。
接下来我们要求对
的倒数。首先,要记住隐含层对输入层的值进行线性计算。将式(1)中的向量符号展开得到
(13)
现在我们可以求对
中的每个元素求导,得到
(14)
这等价于和
的张量积,即:
(15)
由此得到一个矩阵。因为
只有一个分量是不零的,所以
只有一行是不为零的,而这一行的值是
,一个N-dim向量。得到了
的更新方程
(16)
其中是
的一行,是唯一上下文单词的“输入向量”,也是
中唯一导数非零的行。所有
的其他行在这个迭代之后都保持不变,因为它们的导数是零。
直观上,由于向量是词汇表中所有单词的输出向量之和,由预测误差
加权得到,因此(16)可以理解为将词汇表中每个输出向量的一部分加入上下文单词的输入向量。如果在输出层,一个单词
作为输出单词的概率被高估(
),那么上下文单词
的输入向量将趋向于远离
的输出向量;反之,如果低估
作为输出字的概率(
),则输入向量
将趋向于更接近
的输出向量;如果对
的概率进行较为准确的预测,则对
输入向量的移动影响不大。
输入向量的移动由词汇中所有向量的预测误差决定;预测误差越大,单词对上下文单词输入向量的移动影响越大。
当我们通过训练语料库生成的上下文-目标词对迭代地更新模型参数时,对向量的影响将会累积。我们可以想象一个单词w的输出向量是由w的共现邻居的输入向量来来回回地“拖动”的,就好像w的向量与其邻居的向量之间有物理字符串一样。同样,一个输入向量也可以被认为是由许多输出向量拖拽的。这种解释可以让我们想起重力,或者力指向的图形布局。每个虚拟字符串的平衡长度与相关词对之间的共流强度以及学习速度有关。经过多次迭代,输入和输出向量的相对位置最终会趋于稳定。
1.2 Multi-word context
图2显示了具有多单词上下文设置的CBOW模型。在计算隐含层输出时,CBOW模型没有直接复制输入上下文单词的输入向量,而是取输入上下文单词向量的平均值,并使用输入→隐藏权重矩阵和平均向量的乘积作为输出。
(17)(18)
其中C为上下文单词数,为上下文单词,
为单词w的输入向量,损失函数为
(19)(20)(21)
这与单词上下文模型的目标(7)相同,只是不同,定义为(18)而不是(1)。
隐式→输出权重的更新方程与单词上下文模型(11)相同。我们复制到这里:
(22)
注意,我们需要将此应用于每个训练实例的隐藏→输出权矩阵的每个元素。
输入→隐权值的更新方程与式(16)相似,只是现在我们需要对上下文中每个单词应用如下方程:
(23)
其中为输入上下文中第
个单词的输入向量;
是一个积极的学习速率;
是(12)对这个更新方程的直观理解与(16)相同。
2 Skip-Gram Model
Mikolov等人(2013a,b)介绍了skip-gram模型。图3显示了skip-gram模型。它与CBOW模型相反。目标单词现在位于输入层,上下文单词位于输出层。
我们仍然使用表示唯一单词的输入向量的输入层,因此我们有相同的隐层输出
的定义在(1),这意味着
是简单地复制(置换)一行输入→隐藏的权重矩阵
,与输入
相关。我们将
的定义复制如下:
(24)
在输出层,不是输出一个多项式分布,而是输出多项式分布。每个输出使用相同的隐藏→输出矩阵计算:
(25)
式中为输出层第
个面板上的第
个单词;
是输出上下文单词中的实际第
个单词;
是唯一的输入单词;
为输出层第
个面板上第j个单元的输出;
是输出层第
个面板上第
个单元的净输入。因为输出层面板共享相同的权重,因此
(26)
其中为词汇表中第
个单词
的输出向量,
是隐藏→输出权矩阵
的一列。
参数更新方程的推导与单词上下文模型没有太大区别。损失函数改为
(27)(28)(29)
其中是词汇表中实际的第
个输出上下文单词的索引。
对输出层各面板上各单元的净输入求导,得到
(30)
单位上的预测误差是多少,与式(8)相同。为了表示简单,我们定义了一个维向量
,作为所有预测误差的和:
(31)
然后求对隐式→输出矩阵
的导数,得到
(32)
由此得到隐式→输出矩阵的更新方程:
(33)
或者
(34)
对这个更新方程的直观理解与(11)相同,只是预测错误是对输出层中的所有上下文单词求和。注意,我们需要对每个训练实例的隐藏→输出矩阵的每个元素应用这个更新方程。
输入→隐藏矩阵的更新方程推导式与式(12)~(16)相同,但考虑到预测误差被
代替。我们直接给出更新方程:
(35)
其中是一个N-dim向量,每个分量都定义为
(36)
(35)的直观理解与(16)相同。
3 Optimizing Computational Efficiency
到目前为止,我们讨论的模型(“bigram”模型、CBOW和skip-gram)都是原始形式,没有使用任何效率优化技巧。
对于所有这些模型,每个单词在词汇表中都存在两个向量表示:输入向量和输出向量
。但是学习输出向量是非常昂贵的。从更新方程(22)和(33),我们可以发现,为了更新
,对于每个训练实例,我们必须遍历每个字
词汇表,计算网络输入
,概率预测值
(对于skip-gram为
),其预测误差
(对于skip-gram为
),最后使用他们的预测误差更新输出向量
。
为每个训练实例的所有单词进行这样的计算非常昂贵,这使得扩展到大型词汇表或大型训练语料库是不切实际的。要解决这个问题,直觉是限制每个训练实例必须更新的输出向量的数量。实现这一目标的一种优雅的方法是分级softmax;另一种方法是通过抽样,这将在下一节中讨论。
这两种技巧都只优化输出向量更新的计算。在我们的推导中,我们关心三个值:(1),新的目标函数;(2)
,新的输出向量更新方程;(3)
,是为更新输入向量而反向传播的预测误差的加权和。
3.1 Hierarchical Softmax
层次softmax是计算softmax的一种有效方法(Morin and Bengio, 2005;Mnih和Hinton, 2009)。该模型使用二叉树表示词汇表中的所有单词。这V个词必须是树的叶节点。可以证明有V - 1个内单位。对于每个叶节点,都存在从根节点到叶节点的唯一路径,这条路径用来估计由叶节点表示的单词的概率。有关示例树,请参见图4。
在层次softmax模型中,没有词的输出向量表示。相反,每一个V - 1内部单位都有一个输出向量。一个单词作为输出单词的概率定义为
(37)
其中为节点
的左子式;
是内节点
的向量表示(“输出向量”);
为隐含层的输出值(在skip-gram模型中
;在CBOW中
);
定义为的特殊函数
(38)
让我们通过一个例子直观地理解这个方程。看图4,假设我们要计算作为输出字的概率。我们把这个概率定义为从根结点到叶结点的随机游走的概率。在每个内部节点(包括根单元),我们需要分配向左和向右移动的概率。我们定义内节点
向左的概率是
(39)
它由内部节点的向量表示和隐含层的输出值(由输入单词的向量表示确定)决定。显然,在单位处的概率是
(40)
按照图4中从根到的路径,我们可以计算
作为输出字的概率为
(41)(42)
这正是由(37)给出的。这应该不难证实
(43)
使分层softmax在所有词之间成为一个定义良好的多项分布。
现在让我们推导出内部单位向量表示的参数更新方程。为了简单起见,我们首先查看一个单词上下文模型。将更新方程扩展到CBOW和跳跃图模型是很容易的。
为了表示法的简单性,我们在不引入歧义的情况下定义了以下缩写:
(44)
(45)
对于训练实例,损失函数定义为
(46)
我们求E对的导,得到
(47)(48)(49)
其中时
,否则
。
接下来我们求关于内单位
的向量表示求导,得到
(50)
得到如下更新方程:
(51)
应用于。我们可以理解
是内节点
的预测误差。每个内部节点的“任务”是预测从左子节点还是从右子节点随机漫步。
表示地面真相是跟随左子节点;
表示它应该跟随正确的子元素。
是预测结果。对于一个训练实例,如果内部节点的预测非常接近地面真实值,则其向量表示
的运动很小;否则
将向适当的方向移动(离
更近或更远),以减少该实例的预测误差。该更新方程既可用于CBOW模型,也可用于skip-gram模型。当用于skip-gram模型时,我们需要对输出上下文中的每个C单词重复这个更新过程。
为了将误差反向传播,学习输入→隐含权值,我们对隐含层的输出E求导,得到
(52)(53)(54)
可以直接代入(23)得到CBOW输入向量的更新方程。对于skip-gram模型,我们需要计算skip-gram上下文中每个单词的EH值,并将EH值的和代入(35),得到输入向量的更新方程。
从更新方程可以看出,每个训练实例每个上下文单词的计算复杂度从O(V)降低到O(log(V)),速度有了很大的提高。我们仍然有大致相同数量的参数(内部单位的V - 1向量与原始单词的V输出向量相比)。
3.2 Negative Sampling
负抽样的思想比分层softmax更直接:为了解决每次迭代需要更新的输出向量太多的问题,我们只更新它们的一个样本。
显然输出词(即ground truth,或positive sample)应该保存在我们的sample中并得到更新,我们需要将一些单词作为negative sample进行抽样(因此称为“negative sampling”)。采样过程需要一个概率分布,可以任意选择。我们称这个分布为噪声分布,用表示。一个人可以根据经验确定一个好的分布。
在word2vec中,作者认为以下简化的训练目标能够生成高质量的单词嵌入,而不是使用一种产生良好定义的后验多项分布的负抽样形式:
(55)
其中为输出字(即,为正样本),
为输出向量;h为隐含层的输出值:CBOW模型
, skip-gram模型
。
是基于
采样的一组单词,即负样本。
为了得到负采样下单词向量的更新方程,我们首先对输出单元的净输入
求导:
(56)(57)
其中为
的“label”。当
为正样本时,t = 1;否则t = 0。接下来我们求
对
输出向量求导,
(58)
其输出向量的更新方程为:
(59)
它只需要应用于,而不是词汇表中的每个单词。这说明了为什么我们可以在每次迭代中节省大量的计算工作。
对上述更新方程的直观理解应与式(11)相同。该方程既适用于CBOW模型,也适用于跳跃图模型。对于跳跃图模型,我们将此方程一次应用于一个上下文单词。
为了将误差反向传播到隐层,从而更新单词的输入向量,我们需要对E对隐层的输出求导,得到
(60)(61)
将EH代入(23)得到CBOW模型输入向量的更新方程。对于skip-gram模型,我们需要计算skip-gram上下文中每个单词的EH值,并将EH值的和代入(35),得到输入向量的更新方程。