原作者:Alex Minnaar
原文地址(已失效):Word2Vec Tutorial Part II: The Continuous Bag-of-Words Model
原文的copy版本:Word2Vec Tutorial Part II: The Continuous Bag-of-Words Model
在上篇文章中,我解释了词向量的概念,它是skip-gram模型的衍生物。如果你理解了skip-gram模型,那么CBOW模型应该是非常直接的,因为在许多地方它们都互为镜像。例如,如果你看看它的模型图

它就像是输入和输出反转的skip-gram模型。输入层由one-hot编码了的输入上下文单词 {x_1, ..., x_c} 组成,它的窗口大小为C,字典大小为V。隐藏层是一个N维的向量h。最后,输出层是输出单词y,它也是one-hot编码了的。输入向量通过V x N的权重矩阵W连接到隐藏层,隐藏层通过N x V的权重矩阵W'连接到输出层。
前向传播
首先要理解输出是如何通过输入计算的(i.e. 前向传播)。接下来假设已经知道了输入和输出权重矩阵(我会在下一节解释它们如何真正被学习的)。第一步是计算隐藏层的输出h,它的计算公式为

这是输入向量由矩阵W加权后的平均。值得注意的是,隐藏层的输出计算是CBOW模型和skip-gram模型的唯一区别(在考虑了它们互为镜像之后)。下面计算每个输出层节点的输入

上式中,v'_{w_j}是权重矩阵W'的第j列。最后计算输出层的输出。输出y_j通过将输入u_j用softmax函数转换后得到

现在我们知道前向传播如何工作了,接下来可以了解权重矩阵W和W'是如何被学习的。
通过反向传播学习权重
在学习W和W'的过程中,我们先从随机初始化开始。在按顺序将训练样本喂给模型的过程中,会观察到预期输出和实际输出的差别,也就是误差。之后我们计算误差相对于两个权重矩阵的元素的梯度并在该梯度的方向上校正它们。总的优化过程被称作随机梯度下降(或SGD),但导出梯度但方法是反向传播。
首先定义loss函数,目标是最大化输出单词对给定输入上下文的条件概率,因此loss函数是

其中j^*是实际输出单词的下标。下一步是推导隐藏-输出层权重W'的更新等式,然后推导输入-隐藏层权重W的更新等式。
更新隐藏-输出层的权重
首先计算loss函数E对输出层的第j个节点的输入u_j的偏导数

当 j = j^* 时,t_j = 1 ,否则 t_j = 0 。这是对输出层节点j的预测误差。下面对输出权重w'_{ij}应用链式法则求导

现在对任意输出权重w'_{ij}都能计算梯度了,定义随机梯度下降等式如下

\eta > 0,它就是学习率。
更新输入-隐藏层的权重
现在推导输入权重w_{ij}的更新等式,过程与上面相似。首先计算E对任意隐藏层h_i的偏导数(再次应用链式法则)

这个求和是基于这样的事实,隐藏层的节点h_i连接着输出层的每一个节点,因此每个预测误差都必须参与计算。下一步是计算E对任意输入权重w_{ki}的偏导数

其中EH是一个N维向量,因为输入x是one-hot编码了的,所以上面第二个等式N x V的矩阵W'只有一行是非零的。因此最终输入权重的随机梯度下降等式是

其中w_{I,c}是输入上下文的第c个单词。
参考文献
Word2Vec Tutorial Part I: The Skip-Gram Model
Distributed Representations of Words and Phrases and their Compositionality, Mikolov et al.
Natural Language Processing (almost) from Scratch, Collobert et al.
网友评论