word2vec参数学习解释
摘 要
近两年来由Mikolov等人提出的word2vec模型和应用引起了社会的极大的关注。使用word2vec模型学习的单词的向量表示已经被证明能够携带语义信息,且在各种NLP任务中都是有用的。越来越多的研究人员希望尝试使用word2vec,但我注意到对于word2vec参数学习过程目前还缺乏一个全面解释的资料,因此限制了许多神经网络方面了解不深的人去理解word2vec的工作原理。
本文提供了word2vec模型的参数更新方程的详细推导和解释,包括原始的连续词袋(CBOW)模型和skip-gram模型,以及一些高级技巧--分层的soft-max和负抽样。在附录中,回顾了神经元网络模型和反向传播的基础知识
1 连续词袋(CBOW)模型
1.1 One-word context (只考虑目标单词前面一个单词的情况)
我们从Mikolov等人最简单版本的连续词袋模型(CBOW)开始介绍。连续词袋模型做出这样的假设一个单词出现的可能性与其上下文的单词组成有关,这意味着对于CBOW模型我们可以通过给定的上下文单词环境来预测一个目标单词,就像一个二元模型。
图一为简化的通过上下文来定义词向量的网络模型,我们设置词汇量的大小为V,隐藏层的大小为N,相邻层上的节点完全连接。输入向量是一个one-hot编码的向量,对于给定的输入上下文单词,one-hot编码中每个单词的向量表示为,其中只有一个节点为1,而所有其他节点为0。
输入层和输出层之间的权重可以由的矩阵表示。
其中矩阵的每一行代表的是一个与输入层相关的单词的维向量表示形式 。那么假设我们给定了一个输入单词,其单词向量的第个元素,其余,则有:
(1)
向量完全是由矩阵第行计算出来的 (因为除外,其余都为0),是输入字的向量表示。
分析完输入层到隐藏层之后,我们再看隐藏层到输出层,有一个新的的权重矩阵,它也是一个矩阵。使用这些权重,我们可以计算词汇表中每个单词的分数:
(2)
其中是矩阵的第列,然后我们使用一个满足多项式分布的对数线性分类模型soft-max来获取单词的后验概率。
(3)
其中是输出层中节点的输出,我们将式子(1)和(2)代入式子(3),得到:
(4)
注意和是单词的两种表示方式,是矩阵的一行,是由输入层→隐藏层的权值矩阵。是矩阵的一列,是由隐藏层→输出层的权值矩阵。在之后的分析中,我们默认将称为单词的“input vector”,将称为单词的“output vector”。
更新隐藏层→输出层权重的等式
现在我们开始推到CBOW模型的权值更新方程。虽然实际的计算方式有点不切实际(之后解释),但是这不妨碍我们推到这个方程来增加我们对这个原始模型的理解。推到过程需要一些神经网络的知识基础:有关反向传播基础知识的综述,请参阅附录A。
由上一阶段的描述可知,现在训练的目标(这节只针对一个单词)就是求公式(4)的最大值。其意在当我们给定了上下文信息以及其权值矩阵的情况下,在词汇表中计算每个词成为中心单词的概率,从而预测目标单词。
这里我们设置一个为我们的损失函数(一个最小化的目标),是目标单词在输出层的索引。可以发现,对于这个损失函数的计算,我们可以将其理解为一种特殊情况下对2个概率分布的交叉熵测量。
现在我们来推到一下隐藏层到输出层之前的权重更新方程,首选我们对损失函数求关于的偏导,这样得:
其中,即当且仅当输出层的第个单词为目标单词时,的值为1,其余情况都为0。可以看出这个导数实质上是输出层的预测误差。
接下来我们通过链式法则来求出损失函数在上的偏导, 并通过此来计算隐藏层到输出层的梯度。
之后我们使用随机梯度下降方法,得到最终的隐藏层→输出层的权重更新方程
或者说:
其中为梯度下降算法的学习率() ,,其中是隐藏层的第个神经元,是输出单词的向量表示。可以看出,通过对比输出的可能性和期望的输出(取值只能为0或者1)来更新权重意味着我们需要遍历词汇表中所有单词。
这个过程中:
当 ('高估')的时候,,那么会从上减去隐藏向量的一部分,这样向量就与向量相差更远;
当 ('低估')的时候,,那么会从上加上隐藏向量的一部分,这样向量就与向量相差更近;
当 ('相近')的时候,,那么会从的值在更新过程基本不会发生变化;
更新隐藏层→输出层权重的等式
在介绍完hidden→output的权重矩阵更新公式之后,我们接着介绍input→hidden的权重矩阵的更新过程。在上面小节中我们解释了损失函数,现在我们对在上求偏导:
(12)
其中为隐藏层上第个神经元的输出;,表示输出层第j个神经单元的输入;为输出层第j个单词的预测误差。所以我们设定一个维的向量,它的每一个元素代表的是词汇表中的每个单词的预测误差与词汇表中每个输出单词的向量的乘积之和。
接下来,我们需要求出损失函数关于权重矩阵的偏导数。首先,我们知道隐藏层激活单元的输出是输入层的值与其权重的线性组合,由此分解式子(1)我们可以得到:
(13)
对于权重矩阵的每一个元素,通过式(12)和式(13),我们可以求得其在损失函数上的偏导:
(14)
以线性代数的角度来说:
(15)
通过式(15)我们得到一个的矩阵,由于只有一个非零值(one-hot),所以的结果也只有一行是非零的,非零N维向量就是那一行的值,由此我们得到权重矩阵的更新方程:
其中是矩阵中输入单词(即one-hot编码中非零的哪行对应的单词)的输入向量。我们不用去关心除外的其他行向量,因为其的值为0,由式(14)可以看出其偏导也为0。