word2vec作为一个优秀的用于产生词向量开源工具,在自然语言处理和计算机视觉领域有着很多应用,实践中效果相当好,但是很多使用者往往知其然不知其所以然。本文对word2vec Parameter Learning Explained这篇文章进行翻译和解读。深入浅出地剖析了词嵌入模型的参数学习过程,给出了详细的数学推导以及直观的解释。看完对word2vec会有一个更深层次的理解,有利于更好地使用和改进这一工具。
说明:读本文之前,需要对神经网络及后向传播有一定了解。另外,对word2vec需要有一个大概的了解。
1 连续词袋模型(CBOW)
1.1 单个单词上下文
从一个最简单的连续词袋模型开始,假设上下文只有一个单词,即输入一个目标单词,预测一个单词(而不是多个)。
下图是在上述定义之下的网络模型。
上图中,词汇量大小为 V V ,隐藏层大小为
,各层直接都是全连接。输入是一个one-hot向量,即对于一个给定的上下文单词, V V 个元素
中只有一个为1,其他均为0。
解释:每个输入的向量 { x1,...xV} { x 1 , . . . x V } 有 V V 个元素,一个元素 代表一个单词。如果向量表示第 k k 个单词, 为1,其他元素均为0。
为了让大家有一个更直观具体的理解,这里给出一个具体的例子,图中假设 V=6 V = 6 , N=3 N = 3 。
输入层和隐藏层之间的权重可以用一个 V×N V × N 矩阵 W W 表示,
的每一行是一个 N N 维的向量
,表示输入层对应的单词, W W 的第
行用 vTw v w T 表示,给定一个上下文(在这个模型中即为一个单词),假设 xk=1,xk′=0,k′≠k x k = 1 , x k ′ = 0 , k ′ ≠ k ,有以下式子:
隐藏层和输出层之间,有一个不同的权重矩阵 W′={ w′ij} W ′ = { w i j ′ } ,这是一个 N×V N × V 矩阵。使用这些权重,我们可以计算词汇表( V V 个单词组成的词汇表)中每一个单词的分值 :
解释:输出共有 个元素,每一个元素由 W W 的第 列和 h h 相乘得到(加权和),即为 uj u j 。
接着我们使用softmax,一个log线性分类器模型,以得到每个单词的后验概率,这是一个多项式分布:
p(wj|wI)=yj=exp(uj)∑Vj′=1exp(uj′)(3) p ( w j | w I ) = y j = e x p ( u j ) ∑ j ′ = 1 V e x p ( u j ′ ) ( 3 )其中, yj y j 是输出层的第 j j 个元素。
将(1)式和(2)式代入(3)式有:注意 vw v w 和 v′w v w ′ 是词语 w w 的两个表示。 来自输入层和隐藏层间的权重矩阵 W W 的行, 来自隐藏层和输出层间的权重矩阵 W′ W ′ 的列。在接下来的分析中,我们称 vw v w 为词语 w w 的输入向量,称 为词语 w w 的输出向量。注意:在一次训练中,输入向量和输出向量不是同一个向量,不是代表同一个词语,输入的是上下文词语,输出的是由上下文推导而来的词语。
隐藏层到输出层的权重更新等式
先说更新思路,目标是最大化 ,即要最小化损失函数 E E 。因此找到权重关于 的公式,求偏导得到梯度,利用梯度更新权重,使得 E E 尽快下降。
尽管实际进行这种权重更新计算是不切实际的(下文有解释),但我们探究这个源头有利于理解没用任何技巧的初始模型。
我们训练的目标是为了最大化式(4):