前言
word2vec虽然非常流行和被广泛关注,但即使在原作者(Mikolov et al)的文章中,也没有给出CBOW和Skip-Gram两个模型的具体推导。同时涉及到的优化算法:hierarchical softmax 和 negative sampling也没有相应的数学推导。
Xin Rong在《word2vec Parameter Learning Explained》给出了了CBOW和Skip-Gram模型以及优化技巧:Hierarchical Softmax和Negative Sampling的详细公式推导,并加以理解。文章由浅入深、循序渐进,是深入理解word2vec的好文章。痛心的是,Xin Rong于2019年因飞机失事而去世。
1. CBOW模型
1.1 一个上下文词情况
作者先从CBOW模型的简化版本(即只有一个上下文词,预测目标词)出发,对模型及参数更新进行了推导。
模型图如下:
符号说明:
- 代表词表大小;
- 代表隐藏层的大小;
- 和是两个完全不同的矩阵,不是转置矩阵!!
- 输入向量是一个词的ont-hot向量,shape =
-
Input layer到Hidden layer的权重矩阵是一个的矩阵,记为;
它的行向量其实就是我们要求的词向量(见下文推导,可以理解为一种降维计算,将原来稀疏的one-hot向量降维为稠密的为向量)
-
Hidden layer到Output layer的权重矩阵为, shape =
的列向量其实也是词向量的一种表达(见下文推导)
1.1.1 前向传播
1. Input layer ——> Hidden layer
给定一个上下文词的one-hot向量,假设其第个元素,其它元素,则Hidden layer可表示为:
因为是独热向量,所以Hidden layer 可以看做是的第行的拷贝。
2. Hidden layer ——> Output layer
分两步操作:
- 计算输入词再字典中的score(词向量从到维的线性变换);
- 构造条件概率函数(建立词向量与条件概率的关系,有了条件概率,就可以写出最大似然目标函数)
这里先单独考察词表中的任意一个词的得分(先不直接计算)
利用softmax函数,可以得到词的后验概率:
是output layer的第个元素。
将式(1)和(2)带入式(3),得到:
理解:
- 和都是词的向量表示;
- 是权重矩阵的行向量;是权重矩阵的行向量;
- 称之为input vector, 称之为output vector;
- 和越相似,则条件概率越大
1.1.2 反向传播更新参数
写出优化目标函数,利用反向传播算法更新参数(由式(4)可以看出,目标函数的参数应该是和)
设真实的目标值是,它在output layer的索引是,则目标函数可以表示为:
这里,,这个损失函数可以理解为一种特殊的交叉熵。
1. 有了目标函数,首先推导的更新更新公式
这里,,只有当第个unit代表的是真实的输出词时,才等于1,否则
接着,利用链式求导法则,可以求出关于矩阵中元素 的偏导数:
利用随机梯度下降法,可以得到Hidden layer到output layer的权重更新公式如下:
更新公式理解:
- ,学习率;,
- 通过更新公式可以看出,
每一次更新需遍历词表中的每一个单词(弊端)
,计算出它的输出概率,并和期望输出进行比较:
- 如果,("overestimating",这种情况是:, 即输出的第个单词并不是真实的上下文词),那么就从中减去隐藏向量中的一部分(比如),这样向量就会与向量相差更远;
- 如果,("underestimating",这种情况是:,即输出的第 个词确实是真实的上下文词),那么就从中加上隐藏向量中的一部分,这样向量就会与向量更接近;
- 如果和非常接近,那么更新参数基本上没啥变化。
这里再强调一遍,和是单词的两种不同的向量表示形式。
2. 介绍完输出向量的更新公式后,接下来介绍输入向量的更新公式
首先,对隐藏层单元求偏导:
是一个维向量。
将式(1)展开:
于是,利用链式求导法则,可得到关于的偏导数:
利用张量乘积的方式,可以得到:
对上式分析可得:
- 得到一个矩阵;
- 因为中只有一项不等于0,所以矩阵中只有一行不等0,其它行都为0;
于是,得到的更新公式为:
这里,是矩阵的行向量,是唯一的上下文词的"input vector",也是矩阵中唯一的导数不等于0的行。其它行元素不会更新,因为它们的导数为0。
更新公式理解:
,可以看到向量其实是字典中每个词的output vector的加权求和(权重为预测误差),所以:
- 如果输出的第 个词 被高估了(即,),那么输入词向量就会远离这个输出词向量(即 );
- 相反地,如果输出的词被低估了,(即,),那么输入词向量就会靠近();
- 如果的概率很准确,那么几乎不怎么变。
1.2 多个上下文词的CBOW模型
多个上下文词的CBOW模型如下图所示:
因为有多个上下文词,隐藏层的输出向量取得是每个词向量乘权重矩阵后的平均:
符号说明:
- 为个上下文词;
- 是词的输入向量
损失函数:
目标函数与1.1中一个词的情况是一样的,除了的定义不一样。
权重矩阵的更新公式也不变:
权重矩阵 的更新公式也类似:
2. Skip-Gram模型
Skip-Gram模型正好与CBOW相反,它是根据中心词预测上下文词,模型示意图如下:
2.1.1 前向传播
符号定义还是不变,
在输出层,skip-gram模型的输出是个多项式分布,但它们共用一个权重矩阵
符号说明:
- 是输出层第个pannel(有几个上下文词,就有几个pannel)的第 个词;
- 是输出上下文词中的第 个词;
- 是唯一的输入单词;
- 为输出层的第个panel上的第个神经单元的概率输出值;
- 是输出层第 个pannel上的第 个神经元的输入值(score)
注意到输出层所有pannel都共享一个权重矩阵,因此每个pannel的输入都是一样的:
2.1.2 反向更新参数
损失函数定义为:
说明:是输出层第个pannel(也即是第个上下文词)在字典中的索引。
对求的偏导:
为了表示方便,作者定义了一个维向量表示每一个上下文词的预测误差之和:
接下来,求损失函数关于的偏导数:
从而,可以得到(维)的更新公式为:
or
说明:
- 对更新公式的理解和式(11)一样,只是输出层的预测误差是基于个上下文词;
- 对每一个训练样本,需要利用该更新公式更新的每一项。
Input layer到Hidden layer的权重矩阵的更新公式与(16)一样:
3. 计算优化
3.1 问题分析
前面两节讨论了CBOW和Skip-Gram两个模型的原始形式。
为了更好的引出优化技巧,对模型示意图中的output layer详细画了下:
对模型的原始形式进行分析:
- 模型的参数是input vector 和output vector ,它们其实是一个词的两个表示向量;
- 参数的学习成本不高,但是的学习成本(时间复杂度)就很高了,分析如下:
首先回顾下更新时涉及到的计算:
通过观察上面的更新计算公式可以发现,对于每一个训练样本,都需要遍历字典中的每一个词,计算、、,最终更新,这个计算开销是很大的!
为了解决这个问题,一种直观的方法是每次迭代限制需要更新的输出向量,一种有效的实现是使用hierarchical softmax;另外一种方法是通过采样解决。
3.2 Hierarchical Softmax
Hierarchical Softmax是计算softmax的一种高效的方法。Hierarchical Softmax将词典构建成一个棵Huffman Tee。
关于这棵树模型的说明:
- 个单词必须是在叶节点上;如此,就有个内部节点;
- 对于每个叶节点,只存在一条路径从根节点通向该节点;
- 到达单词的路径长度记为,如图,;
- 表示路径上的第个节点;
在Hierarchical Softmax模型中,不再有词的输出向量(output vector)这种表达。而是个内部节点都有一个输出向量 。因此一个单词作为输出单词的概率计算公式定义如下::
公式符号说明:
- 表示节点的左子节点;
- 是内部节点的向量表达;
- 是隐藏层的输出向量(Skip-Gram模型对应,CBOW模型对应);
- 指示函数,定义如下:
结合Figure 4对公式(37)的理解:
如果定义是输出词的概率呢?这里将其概率定义为从根节点随机游走到的概率;
在每个内部节点(包括根节点),需要定义接下来走到左子树和右子树的概率。这里将在节点处,走向左子树的概率定义为:
相应地,走向右子树的概率定义为:
如此,那么是输出词的概率为:
不难证明,所有概率求和等于1:
接下来推导内部节点上的向量的更新公式,首先考虑只有一个上下文词的情况,记符号:
给定一个训练样本,误差函数定义为:
求对的偏导:
上式中,当时,,否则.
补充:函数性质:
进一步,可以求得损失函数对于内部节点的向量表达的偏导:
因此,可以得到输出向量的更新公式:
对更新公式的理解:
- 可理解为在内部节点上的预测误差;
- 学习的“任务”可理解为在随机游走过程中,在某个内部节点上,下一步分别走向左子树和右子树的概率;
- 意味着节点的路径指向左子树,意味着节点的路径指向右子树,是预测结果;
- 在训练过程中,会根据预测的结果做更新(靠近或远离);
- 该更新公式同时适用于CBOW模型和Skip-Gram模型,对于Sikp-Gram模型,因为有个上下文词,因此在一次训练过程中,需执行遍更新操作。
推导出后,接下来推导输入向量的更新公式:
带入式(23)可以得到CBOW模型输入向量的更新公式:
带入式(35)可以得到Skip-Gram模型的输入向量的更新公式:
总结:
对比下原始形式和Hierarchical Softmax形式下的和的更新公式,参考公式(2)~(11)和公式(51):
- 原始形式:
- Hierarchical Softmax形式:
可以看到Hierarchical Softmax形式,更新时,与其它内部节点无关。两个模型在参数几乎相等(原始形式有个单词,Hierarchical Softmax形式有个内部节点)的情况下,时间复杂度从降到了.
3.3 Negative Sampling
Negative Sampling的思想比较直接:每次迭代的时候,根据采样结果,部分更新输出矩阵。
很显然,正样本应该在我们的样本集合中,同时需要采样一部分词作为负样本。在采样的过程中,我们可以任意选择一种概率分布。我们将这种概率分布称为“噪声分布”(the noise distribution),用来表示。我们可以根据经验选择一种较好的分布。
在 word2vec中,作者没有使用一种能够产生良好定义的后验多项式分布的负采样形式(不是特别理解?),而是使用下面的训练目标函数:
上式中:
- 是输出词(即正样本),是其对应的输出向量;
- 是隐藏层的输出向量:
- COBW: ;
- Skip-Gram:
- 负样本集合
接下来的推导与之前并无二致。
上式中,当是正样本时,;否则,.
进一步对求导:
因此的更新公式为:
每次迭代,只更新样本集中词的输出向量(output vector),而不是更新整个字典中词的输出向量(output vector),因此,能显著提高计算效率。上述更新公式对CBOW和Skip-Gram模型都适用。
继续计算关于的偏导:
将带入式(23)得到CBOW模型输入向量(input vector)的更新公式;
将带入式(35)得到Skip-Gram模型输入向量(input vector)的更新公式。
4. 参考
word2vec Parameter Learning Explained
《word2vec Parameter Learning Explained》论文学习笔记