word2vec
是 Google
于 2013 年开源推出的一个用于获取词向量的工具包,它简单、高效,因此引起了很多人的关注。word2vec
可以根据给定的语料库,通过优化后的训练模型快速有效地将一个词语表达成向量形式,为自然语言处理领域的应用研究提供了新的工具。
word2vec
工具主要包含两个模型:跳字模型(skip-gram)
和连续词袋模型(continuous bag of words,简称CBOW)
,以及两种高效训练的方法:负采样(negative sampling)
和层序softmax(hierarchical softmax)
。
值得一提的是,word2vec
词向量可以较好地表达不同词之间的相似和类比关系。word2vec
自提出后被广泛应用在自然语言处理任务中,成为一个强大的自然语言处理任务的前提手段。
本篇博主尽可能从演变的角度来引出 word2vec
,然后我们再来具体看看 word2vec
,主要包括:基于 Hierarchical Softmax
和 Negative Sampling
的两个模型,CBOW
和 Skip-gram
模型,最后补充一些 word2vec
训练过程中的知识点,主要是为了让大家明白 word2vec
源码中一些参数的意义。
目录结构:
Hierarchical Softmax
的模型Negative Sampling
的模型 本节主要介绍后面 word2vec
中会涉及的一些数学概念。
逻辑回归,不能单纯从它的名字考虑,它是处理二分类问题的,生活中,常常存在一些分类问题,比如:
上述的问题都可以抽象为输出为变量 y y y 的问题。这里默认大家知道,使用线性模型可以进行回归学习,但是若要做的任务是分类问题呢?这里可以考虑广义线性模型:只要找到一个单调可微函数将分类任务的真实标记 y y y 与线性回归模型的预测值联系起来即可。
考虑二分类任务,其输出标记 y ∈ { 0 , 1 } y \in \{0,1\} y∈{0,1},而线性回归模型参数的预测值 z z z 是实值,于是,我们需要将实值 z z z 转换为 0 / 1 0/1 0/1 值。当然最理想的是单位阶跃函数,但是单位阶跃函数不连续,因此不能作为广义线性回归模型。于是我们希望能够找到一个程度上类似单位阶跃函数的“替代函数”,并希望它单调可微。
这个函数便是:sigmoid 函数
sigmoid
函数真是这样一个常用的替代函数。表达式如下:
g ( z ) = 1 1 + e − z g(z) = \dfrac {1}{1+e^{-z}} g(z)=1+e−z1
即:
h θ ( x ) = g ( θ T x ) = 1 1 + e − θ T x h_\theta(x) = g(\theta^Tx) = \dfrac {1}{1+e^{-\theta^Tx}} hθ(x)=g(θTx)=1+e−θTx1
对比 阶跃函数
和 sigmoid函数
如下图:
从上图可以看到sigmoid函数是一个 s 形的曲线,它的取值在[0, 1]之间,在远离0的地方函数值回很快接近0/1。
这个性质使我们能够以概率的方式来解释:
z z z 是一个矩阵, θ θ θ 是参数列向量(要求解的), x x x 是样本列向量(给定的数据集)。 θ T θ^T θT 表示 θ θ θ 的转置。 g ( z ) g(z) g(z) 函数实现了任意实数到 [ 0 , 1 ] [0,1] [0,1] 的映射,这样我们的数据集 ( [ x 0 , x 1 , … , x n ] ) ([x_0,x_1,…,x_n]) ([x0,x1,…,xn]),不管是大于1或者小于0,都可以映射到 [ 0 , 1 ] [0,1] [0,1] 区间进行分类。 h θ ( x ) h_θ(x) hθ(x)给出了输出为1的概率。比如当 h θ ( x ) = 0.7 h_θ(x)=0.7 hθ(x)=0.7,那么说明有70%的概率输出为1。输出为0的概率是输出为1的补集,也就是30%。
如果我们有合适的参数列向量 θ ( [ θ 0 , θ 1 , … θ n ] T ) θ([θ_0,θ_1,…θ_n]^T) θ([θ0,θ1,…θn]T),以及样本列向量 x ( [ x 0 , x 1 , … , x n ] ) x([x_0,x_1,…,x_n]) x([x0,x1,…,xn]),那么我们对样本 x x x分类就可以通过上述公式计算出一个概率,如果这个概率大于0.5,我们就可以说样本是正样本,否则样本是负样本。
那么如何得到合适的参数向量 θ \theta θ
根据 sigmoid函数
的特性,假设:
P ( y = 1 ∣ x ; θ ) = h θ ( x ) P (y = 1 | x; \theta) = h_\theta(x) P(y=1∣x;θ)=hθ(x)
P ( y = 0 ∣ x ; θ ) = 1 − h θ ( x ) P (y = 0 | x; \theta) = 1 - h_\theta(x) P(y=0∣x;θ)=1−hθ(x)
上式即为在已知样本 x x x 和参数 θ \theta θ 的情况下,样本 x x x 属性正样本 ( y = 1 ) (y=1) (y=1) 和负样本 ( y = 1 ) (y=1) (y=1) 的条件概率。理想状态下,根据上述公式,求出各个点的概率均为1,也就是完全分类都是正例。但是考虑到实际情况,样本点的概率越接近于1,其分类效果越好。比如一个样本属于正样本的概率为0.51,那么我们就可以说明这个样本属于正样本。另一个样本属于正样本的概率为0.99,那么我们也可以说明这个样本属于正样本。但是显然,第二个样本概率更高,更具说服力。我们可以把上述两个概率公式合二为一:
P ( y ∣ x ; θ ) = ( h θ ( x ) ) y ( ( 1 − h θ ( x ) ) ( 1 − y ) P(y | x; \theta) = (h_\theta(x))^y((1-h_\theta(x))^{(1-y)} P(y∣x;θ)=(hθ(x))y((1−hθ(x))(1−y)
合并后的我们称之为代价函数(Cost Function)
这个代价函数,是对于一个样本而言的。给定一个样本,我们就可以通过这个代价函数求出,样本所属类别的概率,而这个概率越大越好,所以也就是求解这个代价函数的最大值。既然概率出来了,那么最大似然估计也该出场了。假定样本与样本之间相互独立,那么整个样本集生成的概率即为所有样本生成概率的乘积,再将公式对数化,过程如下:
似然函数:
L ( θ ) = ∏ i = 1 m p ( y ( i ) ∣ x ( i ) ; θ ) = ∏ i = 1 m ( h θ ( x ( i ) ) ) y ( i ) ( ( 1 − h θ ( x ( i ) ) ) ( 1 − y ( i ) ) L(\theta) = \prod_{i=1}^{m} p(y^{(i)} | x^{(i)}; \theta) = \prod_{i=1}^{m} (h_\theta(x^{(i)}))^{y^{(i)}}((1-h_\theta(x^{(i)}))^{(1-y^{^{(i)}})} L(θ)=i=1∏mp(y(i)∣x(i);θ)=i=1∏m(hθ(x(i)))y(i)((1−hθ(x(i)))(1−y(i))
对数似然函数:
J ( θ ) = ℓ ( θ ) = l o g L ( θ ) = ∑ i = 1 m ( y ( i ) l o g h θ ( x ( i ) ) + ( 1 − y ( i ) ) l o g ( 1 − h θ ( x ( i ) ) ) ) J(\theta) = \ell(\theta)=logL(\theta)= \sum_{i=1}^{m}(y^{(i)}logh_\theta(x^{(i)})+(1-y^{(i)})log(1-h_\theta(x^{(i)}))) J(θ)=ℓ(θ)=logL(θ)=i=1∑m(y(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i))))
其中, m m m 为样本的总数, y ( i ) y(i) y(i) 表示第 i i i 个样本的类别, x ( i ) x(i) x(i) 表示第 i i i 个样本,需要注意的是 θ θ θ 是多维向量, x ( i ) x(i) x(i) 也是多维向量。
综上所述,满足上式值最大的 θ \theta θ 值就是我们需要求解的模型。
贝叶斯公式是用来描述两个条件概率之间的关系。若记 P ( A ) , P ( B ) P(A),P(B) P(A),P(B) 分别表示事件 A A A 和事件 B B B 发生的概率, P ( A ∣ B ) P(A|B) P(A∣B) 表示事件 B B B 发生的情况下事件 A A A 发生的概率, P ( A , B ) P(A,B) P(A,B) 表示事件 A A A 和事件 B B B 同时发生的概率,则有:
P ( A ∣ B ) = P ( A , B ) P ( B ) , P ( B ∣ A ) = P ( A , B ) P ( A ) P(A|B) = \frac{P(A,B)}{P(B)},P(B|A) = \frac{P(A,B)}{P(A)} P(A∣B)=P(B)P(A,B),P(B∣A)=P(A)P(A,B)
利用上式,进一步可得:
P ( A ∣ B ) = P ( B ∣ A ) P ( A ) P ( B ) P(A|B) =\frac{P(B|A)P(A)}{P(B)} P(A∣B)=P(B)P(B∣A)P(A)
上式便是贝叶斯公式
本节主要介绍哈夫曼树的构造,以及哈夫曼编码。
给定 n n n 个权值 { w 1 , w 2 , . . . , w n } \{w_1,w_2,...,w_n\} {w1,w2,...,wn} 作为二叉树的 n n n 个叶子结点,可以通过以下算法来构造一棵哈夫曼树。
示例说明:
假设世界杯期间,从新浪微博中爬取了若干条与足球相关的微博,经统计,“我”、“喜欢”、“观看”、“巴西”、“足球”、“世界杯”这六个词出现的次数分别为 15、8、6、5、3、1。请以这6个词为叶子结点,以相应的词频当权值,构造一棵哈夫曼树。
由图可知:
- 词频越大的词离根结点越近
- 若叶子结点个数为 n n n ,则构造的哈夫曼树中新增结点的个数为 n − 1 n-1 n−1 ,即图中红色结点
- 在该哈夫曼树中,统一将词频大的结点作为左子树,词频小的作为右子树,这只是个约定,你要是非要反过来也没问题
由上面,我们得到了如下哈夫曼树:图中给出了六个词的哈夫曼编码,其中约定左子树(词频较大的)结点编码为1,右子树(词频较小的)编码为。这样一来,“我”、“喜欢”、“观看”、“巴西”、“足球”、“世界杯”这六个词的哈夫曼编码分别为:0,111,110,101,1001和1000
注意,关于哈夫曼树和哈夫曼编码,有两个约定:
- (1)将权值大的结点作为左子树结点,权值小的作为右子树结点;
- (2)左子树结点编码为1,右子树结点编码为0
在
word2vec
源码中将权值较大的孩子结点编码为1,较小的孩子结点编码为0,为了统一约定,下文都将权值较大的孩子结点作为左子树结点
本节主要介绍一些基础的语言模型,主要是为了引出为什么要使用 word2vec
生成词向量
为了让计算机处理自然语言,一个基本的问题就是为自然语言这种上下文相关的特性建立数学模型。这个数学模型就是在自然语言处理中常说的统计语言模型,它是今天所有自然语言处理的基础,并且广泛应用于机器翻译、语音识别、印刷体或手写体识别、拼音纠错、汉字输入和文献查询。
判断一个句子是否合理,就看它的可能性大小如何,至于可能性就用概率来衡量。如果一个句子的可能性比较大,我们往往会认为这个句子是合理的。例如:
第一个句子符合我们的表达,而第二个句子看上去也能明白意思,但是第三个句子就很难明白其意思。
根据语料库,第一个句子出现的概率可能为 1 0 − 20 10^{-20} 10−20;第二个句子出现的概率可能为 1 0 − 25 10^{-25} 10−25;第三个句子出现的概率可能为 1 0 − 70 10^{-70} 10−70。因此,第一个句子出现的可能性最大。我们可以将上述的方法严格的描述如下:
假定 S S S 表示某一个有意义的句子,由一连串特定顺序排列的词 w 1 , w 2 , . . . , w n w_1,w_2,...,w_n w1,w2,...,wn 组成,这里 n n n 是句子的长度。现在,我们想知道 S S S 在文本中出现的可能性,也就是数学上所说的 S S S 的概率 P ( S ) P(S) P(S)。我们需要有个模型来估算,既然 S = w 1 , w 2 , . . . , w n S= w_1,w_2,...,w_n S=w1,w2,...,wn ,那么不妨把 P ( S ) P(S) P(S) 展开表示:
P ( S ) = P ( w 1 , w 2 , . . . , w n ) P(S) = P(w_1,w_2,...,w_n) P(S)=P(w1,w2,...,wn)
利用条件概率公式, S S S 这个序列出现的概率等于每一个词出现的条件概率相乘,于是 P ( w 1 , w 2 , . . . , w n ) P(w_1,w_2,...,w_n) P(w1,w2,...,wn) 可展开为:
P ( w 1 , w 2 , . . . , w n ) = P ( w 1 ) ⋅ P ( w 2 ∣ w 1 ) ⋅ P ( w 3 ∣ w 1 , w 2 ) ⋅ . . . ⋅ P ( w n ∣ w 1 , w 2 , . . . , w n − 1 ) P(w_1,w_2,...,w_n) = P(w_1)\cdot P(w_2|w_1)\cdot P(w_3|w_1,w_2)\cdot...\cdot P(w_n|w_1,w_2,...,w_{n-1}) P(w1,w2,...,wn)=P(w1)⋅P(w2∣w1)⋅P(w3∣w1,w2)⋅...⋅P(wn∣w1,w2,...,wn−1)
其中:
不难看出:
从计算上来看,第一个词的条件概率很容易求,第二个词的条件概率也不太麻烦,但是第三个词的条件概率已经非常难算了,因为它涉及三个变量,每个变量的可能性都是一种语言字典的大小。到了最后一个词 w n w_n wn,条件概率 P ( w n ∣ w 1 , w 2 , . . . , w n − 1 P(w_n|w_1,w_2,...,w_{n-1} P(wn∣w1,w2,...,wn−1 的可能性太多,无法估算,那么该怎么办呢?
上面的公式中,一个词的出现与它前面的所有词都相关。如果我们假定一个词出现的概率只与它前面固定数目的词相关了?这就是 N-gram模型
的基本思想,它作了一个 n − 1 n-1 n−1 阶的马尔科夫假设,认为一个词的出现概率就只与它前面 n − 1 n-1 n−1 个词相关,即:
P ( w i ∣ w i − n + 1 , . . , w i − 1 ) P(w_i|w_{i-n+1},..,w_{i-1}) P(wi∣wi−n+1,..,wi−1)
例如,2阶的 n = 3 , i = 3 n=3,i=3 n=3,i=3:
P ( w 3 ∣ w 1 , w 2 ) P(w_3|w_1,w_{2}) P(w3∣w1,w2)
这样一来,需要计算的参数总量变少了
N-gram模型
中的 n n n 实际应用中最多的是采用 n = 3 n = 3 n=3 的三元模型。
关于 N-gram模型
详细介绍可参考:链接中的第五部分
本节主要介绍 Bengio 等人提出的一种神经概率语言模型,该模型中用到了一个重要的工具——词向量。
什么是词向量呢?简单来说就是,对词典 D \mathcal{D} D 中的任意词 w w w ,指定一个固定长度的实值向量 v ( w ) ∈ R m v(w) \in \mathcal{R}^m v(w)∈Rm, v ( w ) v(w) v(w) 就称为 w w w 的词向量, m m m 为词向量的长度。关于词向量的进一步理解我们下一节来介绍。
既然是神经概率语言模型,其中当然要用到一个神经网络啦。下图给出了这个神经网络的结构示意图,它包括四个层:输入(Input)层、投影(Projection)层、隐藏(Hidden)层和输出(Output)层。其中 W , U W,U W,U 分别为投影层与隐藏层以及隐藏层和输出层之间的权重矩阵, p , q p,q p,q 分别为隐藏层和输入层上的偏置向量。
对于语料 C \mathcal{C} C 中任意一个词 w w w ,将 C o n t e x t ( w ) Context(w) Context(w) 取为其前面 n − 1 n-1 n−1 个词,这样二元对 ( C o n t e x t ( w ) , w ) (Context(w), w) (Context(w),w) 就是一个训练样本了。接下来,讨论样本 ( C o n t e x t ( w ) , w ) (Context(w), w) (Context(w),w) 经过如图神经网络时是如何参与运算的。注意,一旦语料 C \mathcal{C} C 和词向量长度 m m m 给定后,投影层和输出层的规模就确定了,前者为 ( n − 1 ) m (n-1)m (n−1)m,后者为 N = ∣ D ∣ N=|\mathcal{D}| N=∣D∣,即语料 C \mathcal{C} C 的词汇量大小。而隐藏层的规模 n h n_h nh 是可调参数有用户指定。
投影层的向量 X w X_w Xw 是将输入层的 n − 1 n-1 n−1 个词向量按顺序首尾相接地拼起来形成一个长向量,其长度就是 ( n − 1 ) m (n-1)m (n−1)m。有了向量 X w X_w Xw,接下来的计算过程就是很简单了,具体如下:
{ Z w = t a n h ( W X w + p ) y w = U Z w + q \begin{cases} Z_w = tanh(WX_w+p) \\ y_w = UZ_w+q \end{cases} {Zw=tanh(WXw+p)yw=UZw+q
其中 t a n h tanh tanh 为双曲正切函数,用来做隐藏层的激活函数的,上式中, t a n h tanh tanh 作用在向量上表示它作用在向量的每一个分量上。
有些人会发现,对于语料中的一个给定的句子的前几个词,其前面的词不足 n − 1 n-1 n−1 个怎么办?此时,可以人为地添加一个或几个填充向量就可以了,它们也参与训练过程。
经过上述两步计算得到 y w = ( y w 1 , y w 2 , . . . , y w N ) y_w = (y_{w_1},y_{w_2},...,y_{w_N}) yw=(yw1,yw2,...,ywN),这只是一个长度为 N N N 的向量,其分量并不能表示概率,如果想要 y w y_w yw 的分量 y w i y_{w_i} ywi 表示当上下文为 C o n t e x t ( w ) Context(w) Context(w) 时下一个词恰为词典 D \mathcal{D} D 中的第 i i i 个词的概率,则还需要做一个 Softmax
归一化,归一化后, p ( w ∣ C o n t e x t ( w ) ) p(w|Context(w)) p(w∣Context(w)) 就可以表示为:
p ( w c ∣ C o n t e x t ( w ) ) = e y w c ∑ i = 1 N e y w i p(w_c|Context(w)) = \frac{e^{y_{w_c}}}{\sum_{i=1}^Ne^{y_{w_i}}} p(wc∣Context(w))=∑i=1Neywieywc
其中 w c w_c wc 表示词 w w w 在词典 D \mathcal{D} D 中的索引。
神经概率语言模型总结起来,包括两个部分:
这些参数均是通过训练算法得到,值得一提的是,通常的机器学习算法中,输入都是已知的,而上述的神经概率语言模型中,输入 v ( w ) v(w) v(w) 也是需要通过训练才能得到的。
N-gram模型
与 神经概率语言模型
比较与 N-gram模型
相比,神经概率语言模型
存在以下两点优势:
举个例子来说明:
如果某个(英语)语料中 S 1 = S_1 = S1= “A dog is running in the room.” 出现了 10000 次,而 S 2 = S_2 = S2= “A cat is running in the room.”只出现了1次。按照 N-gram模型
的做法, p ( S 1 ) p(S_1) p(S1) 肯定会远大于 p ( S 2 ) p(S_2) p(S2)。注意, S 1 , S 2 S_1,S_2 S1,S2的唯一区别就在于 dog 和 cat,而这两个词无论是句法还是语义上都扮演着相同的角色,因此 p ( S 1 ) p(S_1) p(S1)和 p ( S 2 ) p(S_2) p(S2)应该很相近才对。
而在神经概率语言模型中的 p ( S 1 ) p(S_1) p(S1)和 p ( S 2 ) p(S_2) p(S2) 是大致相等的。原因在于:
(1)在神经概率语言模型中假定了“相似性”的词对应的词向量也是相似的;
(2)概率函数关于词向量是光滑的,即词向量中的一个小变化对概率的影响也只是一个小变化,这样一来,对于下面这些句子:
A dog is running in the room.
A cat is running in the room.
The cat is running in a room.
A dog is working in the room.
A dog was working in the room.
…
只要在语料库中出现一个,其他句子的概率也会相应地增大。
在 N-gram模型
中由于是概率的相乘,如果某个值为0,那么乘积就为0,所以需要对其做平滑处理,具体怎么做这里就不介绍了,而神经概率语言模型
就不再需要进行额外的处理了。
通过前面的介绍,相信大家对词向量已经有一些了解了。下面我们对词向量做进一步的介绍。
在NLP任务中,我们将自然语言交给机器学习算法来处理,但机器无法直接理解人类的语言,因此首先要做的事情就是将语言数学化,如何对自然语言进行数学化呢?词向量提供一个很好的方式。
one-hot representation
one-hot representation
就是用一个很长的向量来表示一个词,向量的长度为词典 D \mathcal{D} D 的大小 N N N,向量的分量只有一个为1,其他全为0。1的位置对应词在词典中的索引。例如:
但是这种词向量表示有些缺点,容易受维数灾难的困扰,尤其是将其用于深度学习场景,而且它不能很好地刻画词与词之间的相似性。
Distributed Representation
Distributed Representation
最早是 Hinton 于1986年提出的,可以克服 one-hot representation
的上述缺点。其基本思想是:通过训练将某语言中的每一个词映射成一个固定长度的短向量(这里的短是相对于one-hot representation
中的长而言的),所以这些向量构成一个词向量空间,而每一个向量则可视为该空间中的一个点,在这个空间上引入“距离”,就可以根据词之间的距离来判断它们之间在语法、语义上的相似性了。word2vec
中采用的就是这种 Distributed Representation
词向量。
下面我们通过一个例子来说明:
假设在二维平面上分布有 a a a 个不同的点,给定其中的某个点,现在想在平面上找到与这个点最相近的一个点。
我们的做法是:首先,建立一个直角坐标系,基于该坐标系,其上的每一个点就是唯一的对应一个坐标 ( x , y ) (x,y) (x,y);接着引入欧氏距离;最后分布计算这个点与其他 a − 1 a-1 a−1个点之间的距离,对应最小距离值的那个店便是我们要找的点了。
上面的例子中,坐标 ( x , y ) (x,y) (x,y) 的地位就相当于词向量,它用来将平面上的一个点的位置在数学上做量化。坐标系建立好以后,要得到某个点的坐标就很容易了。然而,在 NLP 任务中,要得到词向量就复杂得多了,而且词向量并不唯一,其质量依赖于训练语料、训练算法等因素。
由此可见,一个好的词向量是很有价值的,它能让后续的模型效果进一步提升。
Hierarchical Softmax
的模型 有了前面的准备,我们就可以正式介绍 word2vec
的两个重要模型:
CBOW模型
:Continuous Bag-of-Words Model,连续词袋模型,如下左图;Skip-gram模型
:Continuous Skip-gram Model,跳字模型,如下右图。
对于 CBOW
和 Skip-gram
两个模型,word2vec
给出了两套框架,它们分别基于 Hierarchical Softmax
和 Negative Sampling
来进行设计。本节介绍基于 Hierarchical Softmax
的 CBOW
和 Skip-gram
模型。
前面我们提到的基于神经网络的语言模型的目标函数通常取为如下的对数似然函数:
L = ∑ w ∈ C l o g p ( w ∣ C o n t e x t ( w ) ) \mathcal{L} = \sum_{w \in \mathcal{C}} log p(w|Context(w)) L=w∈C∑logp(w∣Context(w))
其中的关键是条件概率函数 p ( w ∣ C o n t e x t ( w ) ) p(w|Context(w)) p(w∣Context(w)) 的构造。
对于 word2vec
中基于 Hierarchical Softmax
的 CBOW
模型,优化目标函数也形如上式;而基于 Hierarchical Softmax
的 Skip-gram
模型,优化的目标函数则形如:
L = ∑ w ∈ C l o g p ( C o n t e x t ( w ) ∣ w ) \mathcal{L} = \sum_{w \in \mathcal{C}} log p(Context(w)|w) L=w∈C∑logp(Context(w)∣w)
因此,讨论过程中我们应将重点放在 p ( w ∣ C o n t e x t ( w ) ) p(w|Context(w)) p(w∣Context(w)) 和 p ( C o n t e x t ( w ) ∣ w ) p(Context(w)|w) p(Context(w)∣w) 的构造上,接下来我们将从数学的角度对这两个模型进行详解。
CBOW
模型 下图给出了 CBOW
模型的网络结构,它包括三层:输入层、投影层和输出层。下面以样本 ( C o n t e x t ( w ) , w ) (Context(w),w) (Context(w),w)为例( C o n t e x t ( w ) Context(w) Context(w) 由 w w w 前后各 c c c g个词构成)。
说明:
- 输入层:包含 C o n t e x t ( w ) Context(w) Context(w) 中 2 c 2c 2c 个词的词向量:
v ( C o n t e x t ( w ) 1 ) , v ( C o n t e x t ( w ) 2 ) , . . . , v ( C o n t e x t ( w ) 2 c ) ∈ R m v(Context(w)_1),v(Context(w)_2),...,v(Context(w)_{2c}) \in \mathcal{R}^m v(Context(w)1),v(Context(w)2),...,v(Context(w)2c)∈Rm m m m 表示词向量的长度;- 投影层:将输入层的 2 c 2c 2c 个向量做求和累加,即:
X w = ∑ i = 1 2 c v ( C o n t e x t ( w ) i ) ∈ R m X_w = \sum_{i=1}^{2c}v(Context(w)_i) \in \mathcal{R}^m Xw=i=1∑2cv(Context(w)i)∈Rm- 输出层:输出层对应一棵二叉树,它以语料中出现过的词当做叶子结点,以各词在语料中出现的次数当做权值构造出来的哈夫曼树。在这棵哈夫曼树中,叶子结点共 N = ∣ D ∣ N=|\mathcal{D}| N=∣D∣ 个,分别对应词典 D \mathcal{D} D 中的词,非叶子结点 N − 1 N-1 N−1个。
对比前面神经概率语言模型的网络图和 CDOW模型的结构图:
(1)(从输入层到投影层)前者是通过拼接,后者是通过累加求和;
(2)(隐藏层)前者有隐藏层,后者无隐藏层;
(3)(输出层)前者是线性结构,后者是树形结构。
Hierarchical Softmax
是 word2vec
中用于提高性能的一项关键技术,为了便于描述,我们引入相关记号。考虑哈夫曼树中的某个叶子结点,假设它对应词典 D \mathcal{D} D 中的词 w w w ,记:
下面我仍以足球那个例子,考虑词 w = w= w= “足球” 的情形,如下图:
如图:
- 由4条红色边串起来的5个结点就构成了路径 p w p^w pw;
- 其长度: l w = 5 l^w = 5 lw=5 ;
- p 1 w , p 2 w , p 3 w , p 4 w , p 5 w p_1^w,p_2^w,p_3^w,p_4^w,p_5^w p1w,p2w,p3w,p4w,p5w 为路径 p w p^w pw 上的5个结点,其中 p 1 w p_1^w p1w对应根结点;
- d 2 w , d 3 w , d 4 w , d 5 w d_2^w,d_3^w,d_4^w,d_5^w d2w,d3w,d4w,d5w分别为 1、0、0、1,即“足球”的哈夫曼编码为:1001;
- θ 1 w , θ 2 w , θ 3 w , θ 4 w \theta_1^w,\theta_2^w,\theta_3^w,\theta_4^w θ1w,θ2w,θ3w,θ4w分别表示路径 p w p^w pw 上4个非叶子结点对应的向量。
那么,我们如何利用 X w ∈ R m X_w \in \mathcal{R}^m Xw∈Rm以及哈夫曼树来定义条件概率函数 p ( w ∣ C o n t e x t ( w ) ) p(w|Context(w)) p(w∣Context(w)) 呢?以图中 w = w= w= “足球” 为例,从根结点出发到达“足球”这个叶子结点,中间共经历了4次分支(每条红色的边对应一次分支),而每一次分支都可视为进行了一次二分类。
既然从二分类的角度来考虑问题,那么对于一个非叶子结点,就需要为其左右孩子结点指定一个类别,即哪个是正类(标签为1),哪个是负类(标签为0)。碰巧,除根结点以外,树中每个节点都对应一个取值为 0 或 1的哈夫曼编码。因此,一种最自然的做法就是将哈夫曼编码为1的结点定义为正类,编码为0的结点定义为负类。当然,这只是个约定,你也可以反着来。事实上,word2vec
就是反着来的,因此这里统一使用反着来的,即约定:
L a b e l ( p i w ) = 1 − d i w , i = 2 , 3 , . . . , l w Label(p_i^w) = 1 - d_i^w, i=2,3,...,l^w Label(piw)=1−diw,i=2,3,...,lw
简而言之就是将一个节点分类时,分到左边就是负类,分到右边就是正类。
根据逻辑回归中介绍的,易知,一个节点被分类为正类的概率为:
σ ( X w T θ ) = 1 1 + e − X w T θ \sigma(X_w^T\theta) = \frac{1}{1+e^{-X_w^T\theta}} σ(XwTθ)=1+e−XwTθ1
被分类为负类的概率即为:
1 − σ ( X w T θ ) 1-\sigma(X_w^T\theta) 1−σ(XwTθ)
上式中的 θ \theta θ 向量,它是待定参数,显然,在这里非叶子结点对应的那些向量 θ i w \theta_i^w θiw 就可以扮演着参数 θ \theta θ 的角色
对于从根结点出发到词“足球”这个叶子结点所经历的4次二分类,将每次分类结果的概率写出来:
但是,我们要求的是 p ( 足 球 ∣ C o n t e x t ( 足 球 ) ) p(足球|Context(足球)) p(足球∣Context(足球)),它跟这4个概率有什么关系呢?关系就是:
p ( 足 球 ∣ C o n t e x t ( 足 球 ) ) = ∏ j = 2 5 p ( d j w ∣ X w , θ j − 1 w ) p(足球|Context(足球)) = \prod_{j=2}^5 p(d_j^w|X_w,\theta_{j-1}^w) p(足球∣Context(足球))=j=2∏5p(djw∣Xw,θj−1w)
至此,我们通过 w = w= w=“足球” 的小例子, Hierarchical Softmax
的基本思想其实就已经介绍完了。
通用表达总结如下:
对于词典 D \mathcal{D} D 中的任意词 w w w,哈夫曼树中必存在一条从根结点到词 w w w 对应结点的路径 p w p^w pw(且这条路径是唯一的),路径 p w p^w pw上存在 l w − 1 l^w-1 lw−1个分支,将每个分支看做一次二分类,每一次二分类就产生一个概率,将这些概率乘起来,就是所需的 p ( w ∣ C o n t e x t ( w ) ) p(w|Context(w)) p(w∣Context(w))
p ( w ∣ C o n t e x t ( w ) ) = ∏ j = 2 l w p ( d j w ∣ X w , θ j − 1 w ) p(w|Context(w)) = \prod_{j=2}^{l^w} p(d_j^w|X_w,\theta_{j-1}^w) p(w∣Context(w))=j=2∏lwp(djw∣Xw,θj−1w)
其中:
p ( d j w ∣ X w , θ j − 1 w ) = { σ ( X w T θ j − 1 w ) , d j w = 0 1 − σ ( X w T θ j − 1 w ) , d j w = 1 p(d_j^w|X_w,\theta_{j-1}^w) = \begin{cases} \sigma(X_w^T\theta_{j-1}^w), d_j^w=0\\ \\ 1-\sigma(X_w^T\theta_{j-1}^w), d_j^w=1 \end{cases} p(djw∣Xw,θj−1w)=⎩⎪⎨⎪⎧σ(XwTθj−1w),djw=01−σ(XwTθj−1w),djw=1
写成整体表达式:
p ( d j w ∣ X w , θ j − 1 w ) = [ σ ( X w T θ j − 1 w ) ] 1 − d j w ⋅ [ 1 − σ ( X w T θ j − 1 w ) ] d j w p(d_j^w|X_w,\theta_{j-1}^w)=[\sigma(X_w^T\theta_{j-1}^w)]^{1-d_j^w}\cdot[1-\sigma(X_w^T\theta_{j-1}^w)]^{d_j^w} p(djw∣Xw,θj−1w)=[σ(XwTθj−1w)]1−djw⋅[1−σ(XwTθj−1w)]djw
将上式代入之前的似然函数,便得:
L = ∑ w ∈ C l o g ∏ j = 2 l w { [ σ ( X w T θ j − 1 w ) ] 1 − d j w ⋅ [ 1 − σ ( X w T θ j − 1 w ) ] d j w } \mathcal{L} = \sum_{w \in \mathcal{C}} log \prod_{j=2}^{l^w} \Big\{[\sigma(X_w^T\theta_{j-1}^w)]^{1-d_j^w}\cdot[1-\sigma(X_w^T\theta_{j-1}^w)]^{d_j^w}\Big\} L=w∈C∑logj=2∏lw{[σ(XwTθj−1w)]1−djw⋅[1−σ(XwTθj−1w)]djw}
= ∑ w ∈ C ∑ j = 2 l w { ( 1 − d j w ) ⋅ l o g [ σ ( X w T θ j − 1 w ) ] + d j w ⋅ l o g [ 1 − σ ( X w T θ j − 1 w ] } =\sum_{w \in \mathcal{C}}\sum_{j=2}^{l^w}\Big\{(1-d_j^w)\cdot log[\sigma(X_w^T\theta_{j-1}^w)]+d_j^w\cdot log[1-\sigma(X_w^T\theta_{j-1}^w]\Big\} =w∈C∑j=2∑lw{(1−djw)⋅log[σ(XwTθj−1w)]+djw⋅log[1−σ(XwTθj−1w]}
为了后面求偏导方便,我们取上式中花括号内的内容记为 L ( w , j ) \mathcal{L}(w,j) L(w,j),即:
L ( w , j ) = ( 1 − d j w ) ⋅ l o g [ σ ( X w T θ j − 1 w ) ] + d j w ⋅ l o g [ 1 − σ ( X w T θ j − 1 w ] \mathcal{L}(w,j) = (1-d_j^w)\cdot log[\sigma(X_w^T\theta_{j-1}^w)]+d_j^w\cdot log[1-\sigma(X_w^T\theta_{j-1}^w] L(w,j)=(1−djw)⋅log[σ(XwTθj−1w)]+djw⋅log[1−σ(XwTθj−1w]
至此,我们就构造除了对数似然函数,这就是CBOW
模型的目标函数,接下来就是要优化它,即使其最大化,word2vec
里面采用的是随机梯度上升法(其实就是我们通常说的梯度下降,只不过这里是按梯度的负方向优化)。该函数中的参数包括向量 X w , θ j − 1 w , w ∈ C , J = 2 , 3 , . . . , l w X_w,\theta_{j-1}^w,w \in \mathcal{C},J = 2,3,...,l^w Xw,θj−1w,w∈C,J=2,3,...,lw,因此我们需要分别求偏导:
(1) L ( w , j ) \mathcal{L}(w,j) L(w,j) 对 θ j − 1 w \theta_{j-1}^w θj−1w求偏导
∂ L ( w , j ) ∂ θ j − 1 w = ∂ ∂ θ j − 1 w { ( 1 − d j w ) ⋅ l o g [ σ ( X w T θ j − 1 w ) ] + d j w ⋅ l o g [ 1 − σ ( X w T θ j − 1 w ] } \frac{\partial \mathcal{L}(w,j)}{ \partial \theta_{j-1}^w}=\frac{\partial}{ \partial \theta_{j-1}^w}\Big\{(1-d_j^w)\cdot log[\sigma(X_w^T\theta_{j-1}^w)]+d_j^w\cdot log[1-\sigma(X_w^T\theta_{j-1}^w]\Big\} ∂θj−1w∂L(w,j)=∂θj−1w∂{(1−djw)⋅log[σ(XwTθj−1w)]+djw⋅log[1−σ(XwTθj−1w]}
= ( 1 − d j w ) [ 1 − σ ( X w T θ j − 1 w ) ] X w − d j w σ ( X w T θ j − 1 w ) X w =(1-d_j^w)[1-\sigma(X_w^T\theta_{j-1}^w)]X_w-d_j^w\sigma(X_w^T\theta_{j-1}^w)X_w =(1−djw)[1−σ(XwTθj−1w)]Xw−djwσ(XwTθj−1w)Xw
= { ( 1 − d j w ) [ 1 − σ ( X w T θ j − 1 w ) ] + d j w σ ( X w T θ j − 1 w ) } X w =\Big\{(1-d_j^w)[1-\sigma(X_w^T\theta_{j-1}^w)]+d_j^w\sigma(X_w^T\theta_{j-1}^w)\Big\}X_w ={(1−djw)[1−σ(XwTθj−1w)]+djwσ(XwTθj−1w)}Xw
= [ 1 − d j w − σ ( X w T θ j − 1 w ) ] X w =[1-d_j^w-\sigma(X_w^T\theta_{j-1}^w)]X_w =[1−djw−σ(XwTθj−1w)]Xw
其中:
- [ l o g σ ( x ) ] ′ = 1 − σ ( x ) , [ l o g ( 1 − σ ( x ) ) ] ′ = − σ ( x ) [log \sigma(x)]' = 1-\sigma(x),[log(1-\sigma(x))]'=-\sigma(x) [logσ(x)]′=1−σ(x),[log(1−σ(x))]′=−σ(x)
于是, θ j − 1 w \theta_{j-1}^w θj−1w的更新公式可写为:
θ j − 1 w : = θ j − 1 w + η [ 1 − d j w − σ ( X w T θ j − 1 w ) ] X w \theta_{j-1}^w:= \theta_{j-1}^w + \eta[1-d_j^w-\sigma(X_w^T\theta_{j-1}^w)]X_w θj−1w:=θj−1w+η[1−djw−σ(XwTθj−1w)]Xw
其中, η \eta η表示学习率
(2) L ( w , j ) \mathcal{L}(w,j) L(w,j) 对 X w X_w Xw求偏导,利用 X w X_w Xw 和 θ j − 1 w \theta_{j-1}^w θj−1w在式子里面的对称性(即只是交换了位置),易求得:
∂ L ( w , j ) ∂ X w = [ 1 − d j w − σ ( X w T θ j − 1 w ) ] θ j − 1 w \frac{\partial \mathcal{L}(w,j)}{ \partial X_w}=[1-d_j^w-\sigma(X_w^T\theta_{j-1}^w)]\theta_{j-1}^w ∂Xw∂L(w,j)=[1−djw−σ(XwTθj−1w)]θj−1w
到这里,我们发现了问题:我们的最终目的是要求字典 D \mathcal{D} D中每个词的词向量,而这里的 X w X_w Xw 表示的是 C o n t e x t ( w ) Context(w) Context(w) 中各词词向量的累加。那么,我们如何用这个梯度来对 v ( w ~ ) , w ~ ∈ C o n t e x t ( w ) v(\widetilde{w}),\widetilde{w}\in Context(w) v(w ),w ∈Context(w)进行更新的呢? word2vec
中的做法很简单,直接取:
v ( w ~ ) : = v ( w ~ ) + η ∑ j = 1 l w ∂ L ( w , j ) ∂ X w , w ~ ∈ C o n t e x t ( w ) v(\widetilde{w}):=v(\widetilde{w})+\eta\sum_{j=1}^{l^w}\frac{\partial \mathcal{L}(w,j)}{ \partial X_w}, \widetilde{w}\in Context(w) v(w ):=v(w )+ηj=1∑lw∂Xw∂L(w,j),w ∈Context(w)
当然,这里还有其他做法,比如采用平均贡献
最后我们以样本 ( C o n t e x t ( w ) , w ) (Context(w),w) (Context(w),w)为例,给出 CBOW
模型中采用随机梯度上升法更新个参数的伪代码:
注意,第3.3、3.4步不能交换次序,即 θ j − 1 w \theta_{j-1}^w θj−1w 应等贡献到 e e e 后再做更新。
Skip-gram
模型 如下图,给出了 Skip-gram
模型的网络结构,同 CBOW
模型的网络结构类似,它也包括三层:输入层、投影层和输出层。
说明:
- 输入层:只含当前样本的中心词 w w w 的词向量 v ( w ) ∈ R m v(w) \in \mathcal{R}^m v(w)∈Rm
- 投影层:这是个恒等投影,把 v ( w ) v(w) v(w) 投影到 v ( w ) v(w) v(w),因此,这个投影层其实是多余的,这里之所以保留,主要是方便和
CBOW
模型的网络结构做比较- 输出层:和
CBOW
模型一样,输出层也是一棵哈夫曼树
对于 Skip-gram
模型,已知的是当前词 w w w,需要对其上下文 C o n t e x t ( w ) Context(w) Context(w) 中的词进行预测,因此目标函数应该形如我们前面提到的两种目标函数中的后一个,且关键是条件概率函数 p ( C o n t e x t ( w ) ∣ w ) p(Context(w)|w) p(Context(w)∣w) 的构造, Skip-gram
模型中将其定义为:
p ( C o n t e x t ( w ) ∣ w ) = ∏ u ∈ C o n t e x t ( w ) p ( u ∣ w ) p(Context(w)|w) = \prod_{u \in Context(w)} p(u|w) p(Context(w)∣w)=u∈Context(w)∏p(u∣w)
上式中的 p ( u ∣ w ) p(u|w) p(u∣w) 可按照 Hierarchical Softmax
思想,写为:
p ( u ∣ w ) = ∏ j = 2 l u p ( d j u ∣ v ( w ) , θ j − 1 u ) p(u|w) = \prod_{j=2}^{l^u} p(d_j^u|v(w), \theta_{j-1}^u) p(u∣w)=j=2∏lup(dju∣v(w),θj−1u)
其中:
p ( d j u ∣ v ( w ) , θ j − 1 u ) = [ σ ( v ( w ) T θ j − 1 u ] 1 − d j u ⋅ [ 1 − σ ( v ( w ) T θ j − 1 u ] d j u p(d_j^u|v(w), \theta_{j-1}^u) = [\sigma(v(w)^T\theta_{j-1}^u]^{1-d_j^u} \cdot [1- \sigma(v(w)^T\theta_{j-1}^u]^{d_j^u} p(dju∣v(w),θj−1u)=[σ(v(w)Tθj−1u]1−dju⋅[1−σ(v(w)Tθj−1u]dju
将上式代入对数似然函数可得:
L = ∑ w ∈ C ∏ u ∈ C o n t e x t ( w ) ∏ j = 2 l u { [ σ ( v ( w ) T θ j − 1 u ] 1 − d j u ⋅ [ 1 − σ ( v ( w ) T θ j − 1 u ] d j u } \mathcal{L} = \sum_{w \in \mathcal{C}}\prod_{u \in Context(w)}\prod_{j=2}^{l^u}\Big\{ [\sigma(v(w)^T\theta_{j-1}^u]^{1-d_j^u} \cdot [1- \sigma(v(w)^T\theta_{j-1}^u]^{d_j^u}\Big\} L=w∈C∑u∈Context(w)∏j=2∏lu{[σ(v(w)Tθj−1u]1−dju⋅[1−σ(v(w)Tθj−1u]dju}
= ∑ w ∈ C ∑ u ∈ C o n t e x t ( w ) ∑ j = 2 l u { ( 1 − d j u ) ⋅ l o g [ σ ( v ( w ) T θ j − 1 u ] + d j u ⋅ l o g [ 1 − σ ( v ( w ) T θ j − 1 u ] } = \sum_{w \in \mathcal{C}}\sum_{u \in Context(w)}\sum_{j=2}^{l^u}\Big\{(1-d_j^u)\cdot log[\sigma(v(w)^T\theta_{j-1}^u] + d_j^u\cdot log[1- \sigma(v(w)^T\theta_{j-1}^u]\Big\} =w∈C∑u∈Context(w)∑j=2∑lu{(1−dju)⋅log[σ(v(w)Tθj−1u]+dju⋅log[1−σ(v(w)Tθj−1u]}
同样取出花括号内的内容,记为 L ( w , u , j ) \mathcal{L}(w,u,j) L(w,u,j):
L ( w , u , j ) = ( 1 − d j u ) ⋅ l o g [ σ ( v ( w ) T θ j − 1 u ] + d j u ⋅ l o g [ 1 − σ ( v ( w ) T θ j − 1 u ] \mathcal{L}(w,u,j) = (1-d_j^u)\cdot log[\sigma(v(w)^T\theta_{j-1}^u] + d_j^u\cdot log[1- \sigma(v(w)^T\theta_{j-1}^u] L(w,u,j)=(1−dju)⋅log[σ(v(w)Tθj−1u]+dju⋅log[1−σ(v(w)Tθj−1u]
(1) L ( w , u , j ) \mathcal{L}(w,u,j) L(w,u,j) 对 θ j − 1 u \theta_{j-1}^u θj−1u 求偏导
∂ L ( w , u , j ) ∂ θ j − 1 u = ∂ ∂ θ j − 1 u { ( 1 − d j u ) ⋅ l o g [ σ ( v ( w ) T θ j − 1 u ] + d j u ⋅ l o g [ 1 − σ ( v ( w ) T θ j − 1 u ] } \frac{\partial \mathcal{L}(w,u,j)}{\partial \theta_{j-1}^u} = \frac{\partial}{\partial \theta_{j-1}^u}\Big\{(1-d_j^u)\cdot log[\sigma(v(w)^T\theta_{j-1}^u] + d_j^u\cdot log[1- \sigma(v(w)^T\theta_{j-1}^u]\Big\} ∂θj−1u∂L(w,u,j)=∂θj−1u∂{(1−dju)⋅log[σ(v(w)Tθj−1u]+dju⋅log[1−σ(v(w)Tθj−1u]}
= ( 1 − d j u ) [ 1 − σ ( v ( w ) T θ j − 1 u ] v ( w ) − d j u σ ( v ( w ) T θ j − 1 u ) v ( w ) = (1-d_j^u)[1-\sigma(v(w)^T\theta_{j-1}^u]v(w)-d_j^u\sigma(v(w)^T \theta_{j-1}^u)v(w) =(1−dju)[1−σ(v(w)Tθj−1u]v(w)−djuσ(v(w)Tθj−1u)v(w)
= { ( 1 − d j u ) [ 1 − σ ( v ( w ) T θ j − 1 u ] − d j u σ ( v ( w ) T θ j − 1 u ) } v ( w ) =\Big\{(1-d_j^u)[1-\sigma(v(w)^T\theta_{j-1}^u]-d_j^u\sigma(v(w)^T \theta_{j-1}^u)\Big\}v(w) ={(1−dju)[1−σ(v(w)Tθj−1u]−djuσ(v(w)Tθj−1u)}v(w)
= [ 1 − d j u − σ ( v ( w ) T θ j − 1 u ) ] v ( w ) =[1-d_j^u-\sigma(v(w)^T\theta_{j-1}^u)]v(w) =[1−dju−σ(v(w)Tθj−1u)]v(w)
于是, θ j − 1 u \theta_{j-1}^u θj−1u的更新公式为:
θ j − 1 u : = θ j − 1 u + η [ 1 − d j u − σ ( v ( w ) T θ j − 1 u ) ] v ( w ) \theta_{j-1}^u :=\theta_{j-1}^u+\eta[1-d_j^u-\sigma(v(w)^T\theta_{j-1}^u)]v(w) θj−1u:=θj−1u+η[1−dju−σ(v(w)Tθj−1u)]v(w)
(2) L ( w , u , j ) \mathcal{L}(w,u,j) L(w,u,j) 对 v ( w ) v(w) v(w) 求偏导,同样根据对称性,易求得:
∂ L ( w , u , j ) ∂ v ( w ) = [ 1 − d j u − σ ( v ( w ) T θ j − 1 u ) ] θ j − 1 u \frac{\partial \mathcal{L}(w,u,j)}{\partial v(w)} = [1-d_j^u-\sigma(v(w)^T\theta_{j-1}^u)]\theta_{j-1}^u ∂v(w)∂L(w,u,j)=[1−dju−σ(v(w)Tθj−1u)]θj−1u
于是, v ( w ) v(w) v(w) 的更新公式为:
v ( w ) : = v ( w ) + η ∑ u ∈ C o n t e x t ( w ) ∑ j = 2 l u ∂ L ( w , u , j ) ∂ v ( w ) v(w):=v(w)+\eta \sum_{u \in Context(w)} \sum_{j=2}^{l^u} \frac{\partial \mathcal{L}(w,u,j)}{\partial v(w)} v(w):=v(w)+ηu∈Context(w)∑j=2∑lu∂v(w)∂L(w,u,j)
下面以样本 ( C o n t e x t ( w ) , w ) (Context(w),w) (Context(w),w)为例,给出 Skip-gram
模型中采用随机梯度上升法更新个参数的伪代码:
但是,word2vec
源码中,并不是等 C o n t e x t ( w ) Context(w) Context(w) 中所有词都处理完才更新 v ( w ) v(w) v(w) ,而是,没处理完一个词 u u u,就即使更新:
同样,循环体内步1.3、1.4不能交换次序,即 θ j − 1 u \theta_{j-1}^u θj−1u 应等贡献到 e e e 后再做更新。
至此,关于基于 Hierarchical Softmax
的两个模型 CBOW
和 Skip-gram
已经介绍完了,下面我们将介绍基于 Negative Sampling
的模型。
Negative Sampling
的模型 Negative Sampling
简称 NEG
,它是 NCE
(Noise Contrastive Estimation) 的一个简化版,目的是用来提高训练速度并改善所得词向量的质量。与 Hierarchical Softmax
相比, NEG
不再使用(复杂的)哈夫曼树,而是利用(相对简单的)随机负采样,能大幅度提高性能,因而可作为 Hierarchical Softmax
的一种替代。
在基于 Negative Sampling
的 CBOW
和 Skip-gram
模型中,负采样是个非常重要的环节,对于一个给定的词 w w w,如何生成 N E G ( w ) NEG(w) NEG(w) 呢?
词典 D \mathcal{D} D 中的词在语料 C \mathcal{C} C 中出现的次数有高有低,对于那些高频词,被选为负样本的概率就应该比较大,反之,对于那些低频词,其被选中的概率就应该比较小。这便是我们对负采样过程的一个大致要求,本质上就是一个 带权采样问题。
带权采样的原理:
- 设词典 D \mathcal{D} D 中的每一个词 w w w 对应一个线段 l ( w ) l(w) l(w),长度为:
- l e n ( w ) = c o u n t e r ( w ) ∑ u ∈ D c o u n t e r ( u ) len(w) = \frac{counter(w)}{\sum_{u \in \mathcal{D}}counter(u)} len(w)=∑u∈Dcounter(u)counter(w)
这里 c o u n t e r ( ⋅ ) counter(\cdot) counter(⋅) 表示一个词在语料 C \mathcal{C} C 中出现的次数(分母中的求和项用来做归一化),现在将这些线段首尾相连拼在一起,形成一个长度为1的单位线段。如果随机地在这个线段上打点,则其中长度越长的线段(对应高词频)被打中的概率就越大。
那么在 word2vec
中是如何做的呢?
其中, w j w_j wj 表示词典 D \mathcal{D} D 中第 j j j 个词,则以 { l j } j = 0 N \{l_j\}_{j=0}^N {lj}j=0N 为部分节点可得到区间 [ 0 , 1 ] [0,1] [0,1] 上的一个非等距部分
其中 N N N 为其 N N N 个部分区间
其中, M > > N M >> N M>>N
示意图如下:
将内部部分节点 { m j } j = 1 M − 1 \{m_j\}_{j=1}^{M-1} {mj}j=1M−1 投影到非等距离部分上,如上图中的红线,则可建立 { m j } j = 1 M − 1 \{m_j\}_{j=1}^{M-1} {mj}j=1M−1 与区间 { I j } j = 1 N \{I_j\}_{j=1}^N {Ij}j=1N (或者说 { w j } j = 1 N \{w_j\}_{j=1}^N {wj}j=1N)的映射关系:
T a b l e ( i ) = w k , w h e r e m i ∈ I k , i = 1 , 2 , . . . , M − 1 Table(i) = w_k,\ where \ \ \ m_i \in I_k, \ \ i = 1,2,...,M-1 Table(i)=wk, where mi∈Ik, i=1,2,...,M−1
有了这个映射,采样就简单多了:
每次生成一个 [ 1 , M − 1 ] [1,M-1] [1,M−1] 间的随机整数 r r r , T a b l e ( r ) Table(r) Table(r) 就是一个样本。当然,这里还有一个细节,当对 w i w_i wi 进行负采样时,如果碰巧选到 w i w_i wi 自己,那么就跳过。
word2vec
源码中为词典 D \mathcal{D} D 中的词设置了权值,不是直接用 c o u n t e r ( w ) counter(w) counter(w),而是对其做了 α \alpha α 次幂,其中 α = 3 4 \alpha=\frac{3}{4} α=43,即:
l e n ( w ) = [ c o u n t e r ( w ) ] 3 4 ∑ u ∈ D [ c o u n t e r ( u ) ] 3 4 len(w) = \frac{[counter(w)]^{\frac{3}{4}}}{\sum_{u \in \mathcal{D}}[counter(u)]^{\frac{3}{4}}} len(w)=∑u∈D[counter(u)]43[counter(w)]43
CBOW
模型 在 CBOW
模型中,已知词 w w w 的上下文 C o n t e x t ( w ) Context(w) Context(w),需要预测 w w w ,因此,对于给定的 C o n t e x t ( w ) Context(w) Context(w), 词 w w w 就是一个正样本,其它词就是负样本了。负样本那么多,该如何选取呢?就是采用上面的负采样算法。
假定现在已经选好了一个关于 w w w 的负样本集 N E G ( w ) 不 等 于 ∅ NEG(w) 不等于 \varnothing NEG(w)不等于∅,且对 w ~ ∈ D \widetilde{w} \in \mathcal{D} w ∈D,定义:
L w ( w ~ ) = { 1 , w ~ = w ; 0 , w ~ 不 等 于 w , L^w(\widetilde{w}) = \begin{cases} 1, \widetilde{w} = w;\\ \\ 0, \widetilde{w} \ 不等于 \ w, \end{cases} Lw(w )=⎩⎪⎨⎪⎧1,w =w;0,w 不等于 w,
表示词 w ~ \widetilde{w} w 的标签,即正样本的标签为1,负样本的标签为0
对于一个给定的正样本 ( C o n t e x t ( w ) , w ) (Context(w),w) (Context(w),w),我们希望最大化:
g ( w ) = ∏ u ∈ { w } ∪ N E G ( w ) p ( u ∣ C o n t e x t ( w ) ) g(w) = \prod_{u \in \{w\} \cup NEG(w)} p(u|Context(w)) g(w)=u∈{w}∪NEG(w)∏p(u∣Context(w))
其中:
p ( u ∣ C o n t e x t ( w ) ) = { σ ( X w T θ u ) , L w ( u ) = 1 ; 1 − σ ( X w T θ u ) , L w ( u ) = 0 ; p(u|Context(w)) = \begin{cases} \sigma(X_w^T\theta^u), \ \ \ L^w(u) = 1;\\ \\ 1-\sigma(X_w^T\theta^u), \ \ \ L^w(u) = 0; \end{cases} p(u∣Context(w))=⎩⎪⎨⎪⎧σ(XwTθu), Lw(u)=1;1−σ(XwTθu), Lw(u)=0;
写成整体表达式为:
p ( u ∣ C o n t e x t ( w ) ) = [ σ ( X w T θ u ) ] L w ( u ) ⋅ [ 1 − σ ( X w T θ u ) ] 1 − L w ( u ) p(u|Context(w)) = [\sigma(X_w^T\theta^u)]^{L^w(u)}\cdot[1-\sigma(X_w^T\theta^u)]^{1-L^w(u)} p(u∣Context(w))=[σ(XwTθu)]Lw(u)⋅[1−σ(XwTθu)]1−Lw(u)
这里 X w X_w Xw 仍表示 C o n t e x t ( w ) Context(w) Context(w) 中各词的词向量之和,而 θ u ∈ R m \theta^u \in \mathcal{R}^m θu∈Rm 表示词 u u u 对应的一个(辅助)向量,为待训练参数。
代入 g ( w ) g(w) g(w) 得:
g ( w ) = σ ( X w T θ w ) ∏ u ∈ N E G ( w ) [ 1 − σ ( X w T θ u ) ] g(w) =\sigma(X_w^T\theta^w) \prod_{u \in NEG(w)} [1-\sigma(X_w^T\theta^u)] g(w)=σ(XwTθw)u∈NEG(w)∏[1−σ(XwTθu)]
其中:
- σ ( X w T θ w ) \sigma(X_w^T\theta^w) σ(XwTθw) 表示上下文为 C o n t e x t ( w ) Context(w) Context(w)时,预测中心词为 w w w 的概率;
- s i g m a ( X w T θ u ) , u ∈ N E G ( w ) sigma(X_w^T\theta^u),u \in NEG(w) sigma(XwTθu),u∈NEG(w) 表示当上下文为 C o n t e x t ( w ) Context(w) Context(w) 时,预测中心词为 u u u 的概率
从形式上看,最大化 g ( w ) g(w) g(w),相当于最大化 σ ( X w T θ w ) \sigma(X_w^T\theta^w) σ(XwTθw),同时最小化 s i g m a ( X w T θ u ) , u ∈ N E G ( w ) sigma(X_w^T\theta^u),u \in NEG(w) sigma(XwTθu),u∈NEG(w) 。
这正是我们希望的,增大正样本的概率,同时降低负样本的概率。
于是,对于一个给定的语料库 C \mathcal{C} C,函数:
G = ∏ w ∈ C g ( w ) G = \prod_{w \in \mathcal{C}} g(w) G=w∈C∏g(w)
就可以作为整体的优化目标,当然为了计算方便,对 G G G 取对数,最终目标函数就是:
L = l o g G = l o g ∏ w ∈ C g ( w ) \mathcal{L} = log G = log \prod_{w \in \mathcal{C}} g(w) L=logG=logw∈C∏g(w)
= ∑ w ∈ C l o g ∏ u ∈ { w } ∪ N E G ( w ) { [ σ ( X w T θ u ) ] L w ( u ) ⋅ [ 1 − σ ( X w T θ u ) ] 1 − L w ( u ) } = \sum_{w \in \mathcal{C}} log \prod_{u \in \{w\} \cup NEG(w)} \Big\{[\sigma(X_w^T\theta^u)]^{L^w(u)}\cdot[1-\sigma(X_w^T\theta^u)]^{1-L^w(u)}\Big\} =w∈C∑logu∈{w}∪NEG(w)∏{[σ(XwTθu)]Lw(u)⋅[1−σ(XwTθu)]1−Lw(u)}
= ∑ w ∈ C ∑ u ∈ { w } ∪ N E G ( w ) { L w ( u ) ⋅ l o g [ σ ( X w T θ u ) ] + ( 1 − L w ( u ) ) ⋅ l o g [ 1 − σ ( X w T θ u ) ] } = \sum_{w \in \mathcal{C}} \sum_{u \in \{w\} \cup NEG(w)} \Big\{L^w(u) \cdot log[\sigma(X_w^T\theta^u)]+(1-L^w(u)) \cdot log[1-\sigma(X_w^T\theta^u)]\Big\} =w∈C∑u∈{w}∪NEG(w)∑{Lw(u)⋅log[σ(XwTθu)]+(1−Lw(u))⋅log[1−σ(XwTθu)]}
= ∑ w ∈ C { l o g [ σ ( X w T θ w ) ] + ∑ u ∈ N E G ( w ) l o g [ 1 − σ ( X w T θ u ) ] } = \sum_{w \in \mathcal{C}} \Big\{log[\sigma(X_w^T\theta^w)] + \sum_{u \in NEG(w)} log[1-\sigma(X_w^T\theta^u)]\Big\} =w∈C∑{log[σ(XwTθw)]+u∈NEG(w)∑log[1−σ(XwTθu)]}
= ∑ w ∈ C { l o g [ σ ( X w T θ w ) ] + ∑ u ∈ N E G ( w ) l o g [ σ ( − X w T θ u ) ] } =\sum_{w \in \mathcal{C}} \Big\{log[\sigma(X_w^T\theta^w)] + \sum_{u \in NEG(w)} log[\sigma(-X_w^T\theta^u)]\Big\} =w∈C∑{log[σ(XwTθw)]+u∈NEG(w)∑log[σ(−XwTθu)]}
利用了等式
1 − σ ( x ) = σ ( − x ) 1-\sigma(x) = \sigma(-x) 1−σ(x)=σ(−x)
上式中花括号内的内容便是目标函数
为下面求梯度方便,将花括号内的内容记为 L ( w , u ) \mathcal{L}(w,u) L(w,u),即:
L ( w , u ) = L w ( u ) ⋅ l o g [ σ ( X w T θ u ) ] + ( 1 − L w ( u ) ) ⋅ l o g [ 1 − σ ( X w T θ u ) ] \mathcal{L}(w,u) = L^w(u) \cdot log[\sigma(X_w^T\theta^u)]+(1-L^w(u)) \cdot log[1-\sigma(X_w^T\theta^u)] L(w,u)=Lw(u)⋅log[σ(XwTθu)]+(1−Lw(u))⋅log[1−σ(XwTθu)]
接下来我们同样利用随机梯度上升法求上式进行优化:
(1) L ( w , u ) \mathcal{L}(w,u) L(w,u) 对 θ u \theta^u θu 梯度计算
∂ L ( w , u ) ∂ θ u = ∂ ∂ θ u { L w ( u ) ⋅ l o g [ σ ( X w T θ u ) ] + ( 1 − L w ( u ) ) ⋅ l o g [ 1 − σ ( X w T θ u ) ] } \frac{\partial \mathcal{L}(w,u)}{\partial \theta^u} = \frac{\partial}{\partial \theta^u}\Big\{ L^w(u) \cdot log[\sigma(X_w^T\theta^u)]+(1-L^w(u)) \cdot log[1-\sigma(X_w^T\theta^u)]\Big\} ∂θu∂L(w,u)=∂θu∂{Lw(u)⋅log[σ(XwTθu)]+(1−Lw(u))⋅log[1−σ(XwTθu)]}
= L w ( u ) [ 1 − σ ( X w T θ u ) ] X w − [ 1 − L w ( u ) ] σ ( X w T θ u ) X w = L^w(u)[1-\sigma(X_w^T\theta^u)]X_w-[1-L^w(u)]\sigma(X_w^T\theta^u)X_w =Lw(u)[1−σ(XwTθu)]Xw−[1−Lw(u)]σ(XwTθu)Xw
= { L w ( u ) [ 1 − σ ( X w T θ u ) ] − [ 1 − L w ( u ) ] σ ( X w T θ u ) } X w =\Big\{L^w(u)[1-\sigma(X_w^T\theta^u)]- [1-L^w(u)]\sigma(X_w^T\theta^u)\Big\}X_w ={Lw(u)[1−σ(XwTθu)]−[1−Lw(u)]σ(XwTθu)}Xw
= [ L w ( u ) − σ ( X w T θ u ) ] X w =[L^w(u)-\sigma(X_w^T\theta^u)]X_w =[Lw(u)−σ(XwTθu)]Xw
于是, θ u \theta_u θu 的更新公式可写为:
θ u : = θ u + η [ L w ( u ) − σ ( X w T θ u ) ] X w \theta_u:=\theta_u+\eta[L^w(u)-\sigma(X_w^T\theta^u)]X_w θu:=θu+η[Lw(u)−σ(XwTθu)]Xw
(2) L ( w , u ) \mathcal{L}(w,u) L(w,u) 对 X w X_w Xw 梯度计算,同样根据 X w X_w Xw 和 θ u \theta^u θu的对称性,有:
∂ L ( w , u ) ∂ X w = [ L w ( u ) − σ ( X w T θ u ) ] θ u \frac{\partial \mathcal{L}(w,u)}{\partial X_w} = [L^w(u)-\sigma(X_w^T\theta^u)]\theta^u ∂Xw∂L(w,u)=[Lw(u)−σ(XwTθu)]θu
于是, v ( w ~ ) , w ~ ∈ C o n t e x t ( w ) v(\widetilde{w}) , \widetilde{w} \in Context(w) v(w ),w ∈Context(w) 的更新公式如下:(此部分可参考基于 Hierarchical Softmax
的 CBOW
模型对应的部分)
v ( w ~ ) : = v ( w ~ ) + η ∑ u ∈ { w } ∪ N E G ( w ) ∂ L ( w , u ) ∂ X w , w ~ ∈ C o n t e x t ( w ) v(\widetilde{w}):=v(\widetilde{w})+\eta \sum_{u \in \{w\} \cup NEG(w)}\frac{\partial \mathcal{L}(w,u)}{\partial X_w} , \widetilde{w} \in Context(w) v(w ):=v(w )+ηu∈{w}∪NEG(w)∑∂Xw∂L(w,u),w ∈Context(w)
以样本 ( C o n t e x t ( w ) , w ) (Context(w),w) (Context(w),w)为例,给出基于 Negative Sampling
的 CBOW
模型中采用的随机梯度上升法的更新各参数的伪代码:
Skip-gram
模型 有了基于 Hierarchical Softmax
框架下由 CBOW
模型过渡到 Skip-gram
模型的推导经验,这里,我们仍然可以这样做,首先,将优化目标函数有原来的:
G = ∏ w ∈ C g ( w ) G = \prod_{w \in \mathcal{C}} g(w) G=w∈C∏g(w)
改写为:
G = ∏ w ∈ C ∏ u ∈ C o n t e x t ( w ) g ( u ) G = \prod_{w\in\mathcal{C}}\prod_{u \in Context(w)} g(u) G=w∈C∏u∈Context(w)∏g(u)
其中:
- ∏ u ∈ C o n t e x t ( w ) g ( u ) \prod_{u \in Context(w)} g(u) ∏u∈Context(w)g(u)表示对于一个给定的样本 ( w , C o n t e x t ( w ) ) (w,Context(w)) (w,Context(w)),我们希望最大化的量
- g ( u ) g(u) g(u) 类似于上一节的 g ( w ) g(w) g(w),定义为:
g ( u ) = ∏ z ∈ { u } ∪ N E G ( u ) p ( z ∣ w ) g(u) = \prod_{z \in \{u\} \cup NEG(u)} p(z|w) g(u)=z∈{u}∪NEG(u)∏p(z∣w)
N E G ( u ) NEG(u) NEG(u) 表示处理词 u u u 时生成的负样本子集,条件概率:
p ( z ∣ w ) = { σ ( v ( w ) T θ z ) , L u ( z ) = 1 ; 1 − σ ( v ( w ) T θ z ) , L u ( z ) = 0 ; p(z|w) = \begin{cases} \sigma(v(w)^T\theta^z), \ \ L^u(z) =1;\\ \\ 1-\sigma(v(w)^T\theta^z), \ \ L^u(z) =0; \end{cases} p(z∣w)=⎩⎪⎨⎪⎧σ(v(w)Tθz), Lu(z)=1;1−σ(v(w)Tθz), Lu(z)=0;
写成整体表达式为:
p ( z ∣ w ) = [ σ ( v ( w ) T θ z ) ] L u ( z ) ⋅ [ 1 − σ ( v ( w ) T θ z ) ] 1 − L u ( z ) p(z|w) = [\sigma(v(w)^T\theta^z)]^{L^u(z)} \cdot [1-\sigma(v(w)^T\theta^z)]^{1-L^u(z)} p(z∣w)=[σ(v(w)Tθz)]Lu(z)⋅[1−σ(v(w)Tθz)]1−Lu(z)
取 G G G 的对数,最终的目标函数就是:
L = l o g G = l o g ∏ w ∈ C ∏ u ∈ C o n t e x t ( w ) g ( u ) = ∑ w ∈ C ∑ u ∈ C o n t e x t ( w ) l o g g ( u ) \mathcal{L} = log G = log \prod_{w\in\mathcal{C}}\prod_{u \in Context(w)} g(u) = \sum_{w\in\mathcal{C}}\sum_{u \in Context(w)} log g(u) L=logG=logw∈C∏u∈Context(w)∏g(u)=w∈C∑u∈Context(w)∑logg(u)
= ∑ w ∈ C ∑ u ∈ C o n t e x t ( w ) l o g ∏ z ∈ { u } ∪ N E G ( u ) p ( z ∣ w ) =\sum_{w\in\mathcal{C}}\sum_{u \in Context(w)}log \prod_{z \in \{u\} \cup NEG(u)} p(z|w) =w∈C∑u∈Context(w)∑logz∈{u}∪NEG(u)∏p(z∣w)
= ∑ w ∈ C ∑ u ∈ C o n t e x t ( w ) ∑ z ∈ { u } ∪ N E G ( u ) l o g p ( z ∣ w ) =\sum_{w\in\mathcal{C}}\sum_{u \in Context(w)}\sum_{z \in \{u\} \cup NEG(u)}log p(z|w) =w∈C∑u∈Context(w)∑z∈{u}∪NEG(u)∑logp(z∣w)
= ∑ w ∈ C ∑ u ∈ C o n t e x t ( w ) ∑ z ∈ { u } ∪ N E G ( u ) l o g { [ σ ( v ( w ) T θ z ) ] L u ( z ) ⋅ [ 1 − σ ( v ( w ) T θ z ) ] 1 − L u ( z ) } =\sum_{w\in\mathcal{C}}\sum_{u \in Context(w)}\sum_{z \in \{u\} \cup NEG(u)} log \Big\{ [\sigma(v(w)^T\theta^z)]^{L^u(z)} \cdot [1-\sigma(v(w)^T\theta^z)]^{1-L^u(z)}\Big\} =w∈C∑u∈Context(w)∑z∈{u}∪NEG(u)∑log{[σ(v(w)Tθz)]Lu(z)⋅[1−σ(v(w)Tθz)]1−Lu(z)}
= ∑ w ∈ C ∑ u ∈ C o n t e x t ( w ) ∑ z ∈ { u } ∪ N E G ( u ) { L u ( z ) ⋅ l o g [ σ ( v ( w ) T θ z ) ] + ( 1 − L u ( z ) ) ⋅ l o g [ 1 − σ ( v ( w ) T θ z ) ] } =\sum_{w\in\mathcal{C}}\sum_{u \in Context(w)}\sum_{z \in \{u\} \cup NEG(u)}\Big\{L^u(z)\cdot log[\sigma(v(w)^T\theta^z)] + (1-L^u(z)) \cdot log [1-\sigma(v(w)^T\theta^z)]\Big\} =w∈C∑