前言

  word2vecGoogle 于 2013 年开源推出的一个用于获取词向量的工具包,它简单、高效,因此引起了很多人的关注。word2vec 可以根据给定的语料库,通过优化后的训练模型快速有效地将一个词语表达成向量形式,为自然语言处理领域的应用研究提供了新的工具。

  word2vec工具主要包含两个模型:跳字模型(skip-gram)连续词袋模型(continuous bag of words,简称CBOW),以及两种高效训练的方法:负采样(negative sampling)层序softmax(hierarchical softmax)

  值得一提的是,word2vec 词向量可以较好地表达不同词之间的相似和类比关系。word2vec 自提出后被广泛应用在自然语言处理任务中,成为一个强大的自然语言处理任务的前提手段。

  本篇博主尽可能从演变的角度来引出 word2vec,然后我们再来具体看看 word2vec,主要包括:基于 Hierarchical SoftmaxNegative Sampling 的两个模型,CBOWSkip-gram 模型,最后补充一些 word2vec 训练过程中的知识点,主要是为了让大家明白 word2vec 源码中一些参数的意义。

目录结构:

  • 1、基础知识
  • 2、哈夫曼编码
  • 3、语言模型
  • 4、词向量
  • 5、基于 Hierarchical Softmax 的模型
  • 6、基于 Negative Sampling 的模型
  • 7、总结

一、基础知识

  本节主要介绍后面 word2vec 中会涉及的一些数学概念。

1.1 逻辑回归

  逻辑回归,不能单纯从它的名字考虑,它是处理二分类问题的,生活中,常常存在一些分类问题,比如:

  • 垃圾邮件分类(判断某封邮件是否是垃圾邮件)
  • 网上交易是否为敲诈
  • 西瓜是好是坏(西瓜书中的例子)等

  上述的问题都可以抽象为输出为变量 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∏m​p(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 θ 值就是我们需要求解的模型。

1.2 贝叶斯公式

  贝叶斯公式是用来描述两个条件概率之间的关系。若记 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)​

上式便是贝叶斯公式

二、哈夫曼编码

  本节主要介绍哈夫曼树的构造,以及哈夫曼编码。

2.1 哈夫曼树的构造

  给定 n n n 个权值 { w 1 , w 2 , . . . , w n } \{w_1,w_2,...,w_n\} {w1​,w2​,...,wn​} 作为二叉树的 n n n 个叶子结点,可以通过以下算法来构造一棵哈夫曼树。

  • (1)将 { w 1 , w 2 , . . . , w n } \{w_1,w_2,...,w_n\} {w1​,w2​,...,wn​} 看成是有 n n n 棵树的森林(每棵树仅有一个结点);
  • (2)在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左右子树根结点权值之和;
  • (3)从森林中删除选取的两棵树,并将新树加入森林;
  • (4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树就是所求的哈夫曼树。

示例说明:

  假设世界杯期间,从新浪微博中爬取了若干条与足球相关的微博,经统计,“我”、“喜欢”、“观看”、“巴西”、“足球”、“世界杯”这六个词出现的次数分别为 15、8、6、5、3、1。请以这6个词为叶子结点,以相应的词频当权值,构造一棵哈夫曼树。

由图可知:

  • 词频越大的词离根结点越近
  • 若叶子结点个数为 n n n ,则构造的哈夫曼树中新增结点的个数为 n − 1 n-1 n−1 ,即图中红色结点
  • 在该哈夫曼树中,统一将词频大的结点作为左子树,词频小的作为右子树,这只是个约定,你要是非要反过来也没问题

2.2 哈夫曼编码

  由上面,我们得到了如下哈夫曼树:图中给出了六个词的哈夫曼编码,其中约定左子树(词频较大的)结点编码为1,右子树(词频较小的)编码为。这样一来,“我”、“喜欢”、“观看”、“巴西”、“足球”、“世界杯”这六个词的哈夫曼编码分别为:0,111,110,101,1001和1000

注意,关于哈夫曼树和哈夫曼编码,有两个约定:

  • (1)将权值大的结点作为左子树结点,权值小的作为右子树结点;
  • (2)左子树结点编码为1,右子树结点编码为0

word2vec 源码中将权值较大的孩子结点编码为1,较小的孩子结点编码为0,为了统一约定,下文都将权值较大的孩子结点作为左子树结点

三、语言模型

   本节主要介绍一些基础的语言模型,主要是为了引出为什么要使用 word2vec 生成词向量

3.1 统计语言模型

   为了让计算机处理自然语言,一个基本的问题就是为自然语言这种上下文相关的特性建立数学模型。这个数学模型就是在自然语言处理中常说的统计语言模型,它是今天所有自然语言处理的基础,并且广泛应用于机器翻译、语音识别、印刷体或手写体识别、拼音纠错、汉字输入和文献查询。

   判断一个句子是否合理,就看它的可能性大小如何,至于可能性就用概率来衡量。如果一个句子的可能性比较大,我们往往会认为这个句子是合理的。例如:

  • 第一个句子:今天北京的天气很好,很适合出去玩。
  • 第二个句子:北京的天气今天很好,出去玩很适合。
  • 第三个句子:天气北京的很好今天,很出去适合玩。

第一个句子符合我们的表达,而第二个句子看上去也能明白意思,但是第三个句子就很难明白其意思。

  根据语料库,第一个句子出现的概率可能为 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​)

其中:

  • P ( w 1 ) P(w_1) P(w1​) 表示第一个词 w 1 w_1 w1​ 出现的概率;
  • P ( w 2 ∣ w 1 ) P(w_2|w_1) P(w2​∣w1​) 表示在已知第一个词的前提下,第二个词出现的概率;
  • 依此类推

不难看出:

  • 只要每个词的条件概率已经全部算好,那么给定一个句子 S S S ,就可以很快算出相应的概率。
  • 词 w n w_n wn​ 的出现概率取决于它前面所有的词。

从计算上来看,第一个词的条件概率很容易求,第二个词的条件概率也不太麻烦,但是第三个词的条件概率已经非常难算了,因为它涉及三个变量,每个变量的可能性都是一种语言字典的大小。到了最后一个词 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模型 详细介绍可参考:链接中的第五部分

3.2 神经概率语言模型

  本节主要介绍 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=1N​eywi​​eywc​​​

其中 w c w_c wc​ 表示词 w w w 在词典 D \mathcal{D} D 中的索引。

神经概率语言模型总结起来,包括两个部分:

  • 词向量: v ( w ) ∈ R m , w ∈ D v(w) \in \mathcal{R}^m, w \in \mathcal{D} v(w)∈Rm,w∈D 以及填充向量;
  • 神经网络参数: W ∈ R n h × ( n − 1 ) m , p ∈ R N × n h , q ∈ R N W \in \mathcal{R}^{n_h \times (n-1)m},p \in \mathcal{R}^{N \times n_h},q \in \mathcal{R}^{N} W∈Rnh​×(n−1)m,p∈RN×nh​,q∈RN

这些参数均是通过训练算法得到,值得一提的是,通常的机器学习算法中,输入都是已知的,而上述的神经概率语言模型中,输入 v ( w ) v(w) v(w) 也是需要通过训练才能得到的。

3.3 N-gram模型神经概率语言模型比较

N-gram模型 相比,神经概率语言模型存在以下两点优势:

  • 1、词语之间的相似性可以通过词向量来体现

举个例子来说明:

  如果某个(英语)语料中 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.

只要在语料库中出现一个,其他句子的概率也会相应地增大。

  • 2、基于词向量的模型自带平滑化功能

  在 N-gram模型中由于是概率的相乘,如果某个值为0,那么乘积就为0,所以需要对其做平滑处理,具体怎么做这里就不介绍了,而神经概率语言模型 就不再需要进行额外的处理了。

四、词向量

  通过前面的介绍,相信大家对词向量已经有一些了解了。下面我们对词向量做进一步的介绍。

  在NLP任务中,我们将自然语言交给机器学习算法来处理,但机器无法直接理解人类的语言,因此首先要做的事情就是将语言数学化,如何对自然语言进行数学化呢?词向量提供一个很好的方式。

4.1 one-hot representation

  one-hot representation就是用一个很长的向量来表示一个词,向量的长度为词典 D \mathcal{D} D 的大小 N N N,向量的分量只有一个为1,其他全为0。1的位置对应词在词典中的索引。例如:

  • 词典 D \mathcal{D} D 为:[“北京”,“上海”,“杭州”,“南京”,“西安”,“昆明”]
  • 那么词"北京"的词向量就为:[1,0,0,0,0,0]
  • “上海”:[0,1,0,0,0,0]
  • “杭州”:[0,0,1,0,0,0]

但是这种词向量表示有些缺点,容易受维数灾难的困扰,尤其是将其用于深度学习场景,而且它不能很好地刻画词与词之间的相似性。

4.2 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,跳字模型,如下右图。


  对于 CBOWSkip-gram 两个模型,word2vec 给出了两套框架,它们分别基于 Hierarchical SoftmaxNegative Sampling 来进行设计。本节介绍基于 Hierarchical SoftmaxCBOWSkip-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 SoftmaxCBOW 模型,优化目标函数也形如上式;而基于 Hierarchical SoftmaxSkip-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) 的构造上,接下来我们将从数学的角度对这两个模型进行详解。

5.1 CBOW 模型

5.1.1 网络结构

  下图给出了 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∑2c​v(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)(输出层)前者是线性结构,后者是树形结构。

5.1.2 梯度计算

   Hierarchical Softmaxword2vec 中用于提高性能的一项关键技术,为了便于描述,我们引入相关记号。考虑哈夫曼树中的某个叶子结点,假设它对应词典 D \mathcal{D} D 中的词 w w w ,记:

  • p w p^w pw:从根结点出发到达 w w w 对应叶子结点的路径;
  • l w l^w lw:路径 p w p^w pw 中包含结点的个数;
  • p 1 w , p 2 w , . . . , p l w w p_1^w,p_2^w,...,p_{l^w}^w p1w​,p2w​,...,plww​:路径 p w p^w pw 中的 l w l^w lw个结点,其中 p 1 w p_1^w p1w​ 表示根结点, p l w w p_{l^w}^w plww​ 表示词 w w w 对应的节点;
  • d 2 w , d 3 w , . . . , d l w w ∈ { 0 , 1 } d_2^w,d_3^w,...,d_{l^w}^w \in \{0,1\} d2w​,d3w​,...,dlww​∈{0,1}:词 w w w 的哈夫曼编码,它由 l w − 1 l^w-1 lw−1 位编码构成, d j w d_j^w djw​ 表示路径 p w p^w pw 中第 j j j 个结点对应的编码,根结点不对应编码;
  • θ 1 w , θ 2 w , . . . , θ l w − 1 w ∈ R m \theta_1^w,\theta_2^w,...,\theta_{l^w-1}^w \in \mathcal{R}^m θ1w​,θ2w​,...,θlw−1w​∈Rm:路径 p w p^w pw 中非叶子结点对应的向量, θ j w \theta_j^w θjw​ 表示路径 p w p^w pw 中第 j j j 个非叶子结点对应的向量。

  下面我仍以足球那个例子,考虑词 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次二分类,将每次分类结果的概率写出来:

  1. 第1次: p ( d 2 w ∣ X w , θ 1 w ) = 1 − σ ( X w T θ ) p(d_2^w|X_w,\theta_1^w) = 1-\sigma(X_w^T\theta) p(d2w​∣Xw​,θ1w​)=1−σ(XwT​θ)
  2. 第2次: p ( d 3 w ∣ X w , θ 2 w ) = σ ( X w T θ ) p(d_3^w|X_w,\theta_2^w) = \sigma(X_w^T\theta) p(d3w​∣Xw​,θ2w​)=σ(XwT​θ)
  3. 第3次: p ( d 4 w ∣ X w , θ 3 w ) = σ ( X w T θ ) p(d_4^w|X_w,\theta_3^w) = \sigma(X_w^T\theta) p(d4w​∣Xw​,θ3w​)=σ(XwT​θ)
  4. 第4次: p ( d 5 w ∣ X w , θ 4 w ) = 1 − σ ( X w T θ ) p(d_5^w|X_w,\theta_4^w) = 1-\sigma(X_w^T\theta) p(d5w​∣Xw​,θ4w​)=1−σ(XwT​θ)

  但是,我们要求的是 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∏5​p(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 ) ) 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∏lw​p(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模型中采用随机梯度上升法更新个参数的伪代码:

  1. e=0;
  2. X w = ∑ u ∈ C o n t e x t ( w ) v ( u ) X_w = \sum_{u \in Context(w)} v(u) Xw​=∑u∈Context(w)​v(u);
  3. for j = 2 : l w l^w lw do
    {
      3.1 q = σ ( X w T θ j − 1 w ) q = \sigma(X_w^T\theta_{j-1}^w) q=σ(XwT​θj−1w​)
      3.2 g = η ( 1 − d j w − q ) g = \eta(1-d_j^w-q) g=η(1−djw​−q)
      3.3 e : = e + g θ j − 1 w e : = e + g\theta_{j-1}^w e:=e+gθj−1w​
      3.4 θ j − 1 w : = θ j − 1 w + g X w \theta_{j-1}^w:=\theta_{j-1}^w+gX_w θj−1w​:=θj−1w​+gXw​
    }
  4. for u ∈ C o n t e x t ( w ) u \in Context(w) u∈Context(w) do
    {
       v ( u ) : = v ( u ) + e v(u):=v(u)+e v(u):=v(u)+e
    }

注意,第3.3、3.4步不能交换次序,即 θ j − 1 w \theta_{j-1}^w θj−1w​ 应等贡献到 e e e 后再做更新。

5.2 Skip-gram模型

5.2.1 网络结构

  如下图,给出了 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模型一样,输出层也是一棵哈夫曼树
5.2.2 梯度计算

  对于 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∏lu​p(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模型中采用随机梯度上升法更新个参数的伪代码:

  1. e=0;
  2. for u ∈ C o n t e x t ( w ) u \in Context(w) u∈Context(w) do
    {
      for j = 2 : l u l^u lu do
      {
        2.1 q = σ ( v ( w ) T θ j − 1 u ) q = \sigma(v(w)^T\theta_{j-1}^u) q=σ(v(w)Tθj−1u​)
        2.2 g = η ( 1 − d j u − q ) g = \eta(1-d_j^u-q) g=η(1−dju​−q)
        2.3 e : = e + g θ j − 1 u e : = e + g\theta_{j-1}^u e:=e+gθj−1u​
        2.4 θ j − 1 u : = θ j − 1 u + g v ( w ) \theta_{j-1}^u:=\theta_{j-1}^u+gv(w) θj−1u​:=θj−1u​+gv(w)
      }
    }
  3. v ( w ) : = v ( w ) + e v(w):=v(w)+e v(w):=v(w)+e

但是,word2vec 源码中,并不是等 C o n t e x t ( w ) Context(w) Context(w) 中所有词都处理完才更新 v ( w ) v(w) v(w) ,而是,没处理完一个词 u u u,就即使更新:

  1. for u ∈ C o n t e x t ( w ) u \in Context(w) u∈Context(w) do
    {
      e = 0;
      for j = 2 : l u l^u lu do
      {
        1.1 q = σ ( v ( w ) T θ j − 1 u ) q = \sigma(v(w)^T\theta_{j-1}^u) q=σ(v(w)Tθj−1u​)
        1.2 g = η ( 1 − d j u − q ) g = \eta(1-d_j^u-q) g=η(1−dju​−q)
        1.3 e : = e + g θ j − 1 u e : = e + g\theta_{j-1}^u e:=e+gθj−1u​
        1.4 θ j − 1 u : = θ j − 1 u + g v ( w ) \theta_{j-1}^u:=\theta_{j-1}^u+gv(w) θj−1u​:=θj−1u​+gv(w)
      }
       v ( w ) : = v ( w ) + e v(w):=v(w)+e v(w):=v(w)+e
    }

同样,循环体内步1.3、1.4不能交换次序,即 θ j − 1 u \theta_{j-1}^u θj−1u​ 应等贡献到 e e e 后再做更新。

至此,关于基于 Hierarchical Softmax 的两个模型 CBOWSkip-gram 已经介绍完了,下面我们将介绍基于 Negative Sampling 的模型。

六、基于 Negative Sampling 的模型

  Negative Sampling简称 NEG ,它是 NCE (Noise Contrastive Estimation) 的一个简化版,目的是用来提高训练速度并改善所得词向量的质量。与 Hierarchical Softmax 相比, NEG 不再使用(复杂的)哈夫曼树,而是利用(相对简单的)随机负采样,能大幅度提高性能,因而可作为 Hierarchical Softmax 的一种替代。

6.1 负采样算法

  在基于 Negative SamplingCBOWSkip-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∈D​counter(u)counter(w)​

这里 c o u n t e r ( ⋅ ) counter(\cdot) counter(⋅) 表示一个词在语料 C \mathcal{C} C 中出现的次数(分母中的求和项用来做归一化),现在将这些线段首尾相连拼在一起,形成一个长度为1的单位线段。如果随机地在这个线段上打点,则其中长度越长的线段(对应高词频)被打中的概率就越大。

那么在 word2vec 中是如何做的呢?

  • 记 l 0 = 0 , l k = ∑ j = 1 k l e n ( w j ) , k = 1 , 2 , . . . , N l_0=0,l_k=\sum_{j=1}^klen(w_j),k=1,2,...,N l0​=0,lk​=∑j=1k​len(wj​),k=1,2,...,N;

其中, 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] 上的一个非等距部分

  • I i = ( l i − 1 , l i ] , i = 1 , 2 , . . . , N I_i=(l_{i-1},l_i],i=1,2,...,N Ii​=(li−1​,li​],i=1,2,...,N;

其中 N N N 为其 N N N 个部分区间

  • 进一步引入区间 [ 0 , 1 ] [0,1] [0,1] 上的一个等距离部分,部分节点为 { m j } j = 1 M \{m_j\}_{j=1}^M {mj​}j=1M​;

其中, 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​​

6.2 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 SoftmaxCBOW模型对应的部分)

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 SamplingCBOW 模型中采用的随机梯度上升法的更新各参数的伪代码:

  1. e = 0;
  2. X w = ∑ u ∈ C o n t e x r ( w ) v ( u ) X_w = \sum_{u \in Contexr(w)} v(u) Xw​=∑u∈Contexr(w)​v(u);
  3. for u = { w } ∪ N E G ( w ) u = \{w\} \cup NEG(w) u={w}∪NEG(w) do
    {
      3.1 q = σ ( X w T θ u ) q = \sigma(X_w^T\theta^u) q=σ(XwT​θu)
      3.2 g = η ( L w ( u ) − q ) g = \eta(L^w(u)-q) g=η(Lw(u)−q)
      3.3 e : = e + g θ u e:=e+g\theta^u e:=e+gθu
      3.4 θ u : = θ u + g X w \theta^u:=\theta^u + gX_w θu:=θu+gXw​
    }
  4. for u ∈ C o n t e x t ( w ) u \in Context(w) u∈Context(w) do
    {
       v ( u ) : = v ( u ) + e v(u):=v(u)+e v(u):=v(u)+e
    }

6.3 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∑​u∈Context(w)∑​z∈{u}∪NEG(u)∑​{Lu(z)⋅log[σ(v(w)Tθz)]+(1−Lu(z))⋅log[1−σ(v(w)Tθz)]}

同样,选取花括号内的内容,并记为 L ( u , w , z ) \mathcal{L}(u,w,z) L(u,w,z),作为优化目标函数,即:

L ( u , w , z ) = L u ( z ) ⋅ l o g [ σ ( v ( w ) T θ z ) ] + ( 1 − L u ( z ) ) ⋅ l o g [ 1 − σ ( v ( w ) T θ z ) ] \mathcal{L}(u,w,z) = L^u(z)\cdot log[\sigma(v(w)^T\theta^z)] + (1-L^u(z)) \cdot log [1-\sigma(v(w)^T\theta^z)] L(u,w,z)=Lu(z)⋅log[σ(v(w)Tθz)]+(1−Lu(z))⋅log[1−σ(v(w)Tθz)]

下面我们就需要计算梯度:

(1) L ( u , w , z ) \mathcal{L}(u,w,z) L(u,w,z) 对 θ z \theta^z θz 求梯度

∂ L ( u , w , z ) ∂ θ z = ∂ ∂ θ z { L u ( z ) ⋅ l o g [ σ ( v ( w ) T θ z ) ] + ( 1 − L u ( z ) ) ⋅ l o g [ 1 − σ ( v ( w ) T θ z ) ] } \frac{\partial \mathcal{L}(u,w,z)}{\partial \theta^z}= \frac{\partial}{\partial \theta^z} \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\} ∂θz∂L(u,w,z)​=∂θz∂​{Lu(z)⋅log[σ(v(w)Tθz)]+(1−Lu(z))⋅log[1−σ(v(w)Tθz)]}
= L u ( z ) [ 1 − σ ( v ( w ) T θ z ) ] v ( w ) − ( 1 − L u ( z ) ) [ σ ( v ( w ) T θ z ) ] v ( w ) =L^u(z)[1-\sigma(v(w)^T\theta^z)]v(w)-(1-L^u(z))[\sigma(v(w)^T\theta^z)]v(w) =Lu(z)[1−σ(v(w)Tθz)]v(w)−(1−Lu(z))[σ(v(w)Tθz)]v(w)
= { L u ( z ) [ 1 − σ ( v ( w ) T θ z ) ] − ( 1 − L u ( z ) ) [ σ ( v ( w ) T θ z ) ] } v ( w ) =\Big\{L^u(z)[1-\sigma(v(w)^T\theta^z)]-(1-L^u(z))[\sigma(v(w)^T\theta^z)]\Big\}v(w) ={Lu(z)[1−σ(v(w)Tθz)]−(1−Lu(z))[σ(v(w)Tθz)]}v(w)
= [ L u ( z ) − σ ( v ( w ) T θ z ) ] v ( w ) =[L^u(z)-\sigma(v(w)^T\theta^z)]v(w) =[Lu(z)−σ(v(w)Tθz)]v(w)

于是, θ u \theta_u θu​的更新公式为:

θ u : = θ u + η [ L u ( z ) − σ ( v ( w ) T θ z ) ] v ( w ) \theta_u:=\theta_u+\eta [L^u(z)-\sigma(v(w)^T\theta^z)]v(w) θu​:=θu​+η[Lu(z)−σ(v(w)Tθz)]v(w)

(2) L ( u , w , z ) \mathcal{L}(u,w,z) L(u,w,z) 对 v ( w ) v(w) v(w) 求梯度,同样根据对称性,得:

∂ L ( u , w , z ) ∂ v ( w ) = [ L u ( z ) − σ ( v ( w ) T θ z ) ] θ z \frac{\partial \mathcal{L}(u,w,z)}{\partial v(w)} = [L^u(z)-\sigma(v(w)^T\theta^z)]\theta^z ∂v(w)∂L(u,w,z)​=[Lu(z)−σ(v(w)Tθz)]θz

于是, v ( w ) v(w) v(w)的更新公式为:

v ( w ) : = v ( w ) + η ∑ u ∈ { w } ∪ N E G ( w ) ∂ L ( u , w , z ) ∂ v ( w ) v(w):= v(w) + \eta \sum_{u \in \{w\} \cup NEG(w)} \frac{\partial \mathcal{L}(u,w,z)}{\partial v(w)} v(w):=v(w)+ηu∈{w}∪NEG(w)∑​∂v(w)∂L(u,w,z)​

  但是 word2vec 源代码中基于 Negative SamplingSkip-gram 模型并不是这样来编程的。上面的方法对于每一个样本 ( w , C o n t e x t ( w ) ) (w,Context(w)) (w,Context(w)) ,需要针对 C o n t e x t ( w ) Context(w) Context(w) 中的每一个词进行负采样,而 word2vec 源代码中只是针对 w w w 进行了 ∣ C o n t e x t ( w ) ∣ |Context(w)| ∣Context(w)∣ 次负采样。

对于一个给定的样本 ( w , C o n t e x t ( w ) ) (w,Context(w)) (w,Context(w)),我们希望最大化的是:

g ( w ) = ∏ w ~ ∈ C o n t e x t ( w ) ∏ z ∈ { w } ∪ N E G w ~ ( w ) p ( z ∣ w ~ ) g(w) = \prod_{\widetilde{w} \in Context(w)}\prod_{z \in \{w\} \cup NEG^{\widetilde{w}}(w)} p(z|\widetilde{w}) g(w)=w ∈Context(w)∏​z∈{w}∪NEGw (w)∏​p(z∣w )

其中:

p ( z ∣ w ~ ) = { σ ( v ( w ~ ) T θ u ) , L w ( u ) = 1 ; 1 − σ ( v ( w ~ ) T θ u ) , L w ( u ) = 0 ; p(z|\widetilde{w}) = \begin{cases} \sigma(v(\widetilde{w})^T\theta^u), \ \ L^w(u) =1;\\ \\ 1-\sigma(v(\widetilde{w})^T\theta^u), \ \ L^w(u) =0; \end{cases} p(z∣w )=⎩⎪⎨⎪⎧​σ(v(w )Tθu),  Lw(u)=1;1−σ(v(w )Tθu),  Lw(u)=0;​

写成整体表达式为:

p ( z ∣ w ~ ) = [ σ ( v ( w ~ ) T θ u ) ] L w ( u ) ⋅ [ 1 − σ ( v ( w ~ ) T θ u ) ] 1 − L w ( u ) p(z|\widetilde{w})=[\sigma(v(\widetilde{w})^T\theta^u)]^{L^w(u)}\cdot[1-\sigma(v(\widetilde{w})^T\theta^u)]^{1-L^w(u)} p(z∣w )=[σ(v(w )Tθu)]Lw(u)⋅[1−σ(v(w )Tθu)]1−Lw(u)

其中:

  • N E G w ~ ( w ) NEG^{\widetilde{w}}(w) NEGw (w) 表示处理词 w ~ \widetilde{w} 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 = ∑ w ∈ C ∑ w ~ ∈ C o n t e x t ( w ) ∑ u ∈ { w } ∪ N E G w ~ ( u ) { L w ( u ) ⋅ l o g [ σ ( v ( w ~ ) T θ u ) ] + ( 1 − L w ( u ) ) ⋅ l o g [ 1 − σ ( v ( w ~ ) T θ u ) ] } \mathcal{L} = \sum_{w\in\mathcal{C}}\sum_{\widetilde{w} \in Context(w)}\sum_{u \in \{w\} \cup NEG^{\widetilde{w}}(u)}\Big\{L^w(u)\cdot log[\sigma(v(\widetilde{w})^T\theta^u)] + (1-L^w(u)) \cdot log [1-\sigma(v(\widetilde{w})^T\theta^u)]\Big\} L=w∈C∑​w ∈Context(w)∑​u∈{w}∪NEGw (u)∑​{Lw(u)⋅log[σ(v(w )Tθu)]+(1−Lw(u))⋅log[1−σ(v(w )Tθu)]}

下面求梯度的过程和上面一样,这里就不具体计算了。

以样本 ( w , C o n t e x t ( w ) ) (w,Context(w)) (w,Context(w)) 为例,给出基于 Negative SamplingSkip-gram 模型中采用随机梯度上升法更新参数的伪代码:

  1. for w ~ = C o n t e x t ( w ) \widetilde{w}= Context(w) w =Context(w) do
    {
      e = 0;
  2.   for u = { w } ∪ N E G w ~ ( w ) u = \{w\} \cup NEG^{\widetilde{w}}(w) u={w}∪NEGw (w) do
      {
        2.1 q = σ ( v ( w ~ ) T θ u ) q = \sigma(v(\widetilde{w})^T\theta^u) q=σ(v(w )Tθu)
        2.2 g = η ( L w ( u ) − q ) g = \eta(L^w(u) - q) g=η(Lw(u)−q)
        2.3 e : = e + g θ u e:=e+g\theta^u e:=e+gθu
        2.4 θ u : = θ u + g v ( w ~ ) \theta^u:=\theta^u + gv(\widetilde{w}) θu:=θu+gv(w )
      }
  3.    v ( w ~ ) : = v ( w ~ ) + e v(\widetilde{w}):=v(\widetilde{w}) + e v(w ):=v(w )+e
    }

注意,步骤2.3和2.4不能交换次序,即 θ u \theta^u θu 要等贡献到 e e e 后才能更新

七、总结

  到此,我们对 word2vec 的两种框架下的两种模型的介绍就告一段落了,要想进一步深入理解 word2vec 可以通过分析源码。从以上内容,我们可以发现,其实两种框架下的两个模型在推导过程中都是一一对应的,因此公式也比较类似。

我们思考一个问题:

  前面我们介绍算法的时候都默认了已经分好词,对于英文分词不是难事,因为英文默认分词了(空格分割)。但是对于中文来说,分词的预处理是必须的了。现在我们主要是使用jieba工具进行分词,也可是使用北大的分词工具,或者其他的。不同的分词工具的分词结果不一样,那么不同的分词结果会对 word2vec 的词向量有什么影响呢?

博主将在下篇中,使用维基百科的中文文章来训练 word2vec 词向量,看看效果如何。

这里给出链接:维基百科中文数据训练word2vec词向量模型——基于gensim库

本篇主要内容参考:word2vec 中的数学原理详解

【NLP】word2vec详解相关推荐

  1. 语言处理方法-Word2Vec详解

    NLP之--Word2Vec详解 2013年,Google开源了一款用于词向量计算的工具--word2vec,引起了工业界和学术界的关注.首先,word2vec可以在百万数量级的词典和上亿的数据集上进 ...

  2. Word2Vec详解

    Word2Vec详解 这几天集中学习了Word2Vec,实现并不复杂,但是真正对一些细节有些了解还查阅了一些资料,今天在这里统一自己整理总结一下. 简介 首先说为什么会有Word2Vec,之前对文字的 ...

  3. 通俗易懂word2vec详解词嵌入-深度学习

    https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...

  4. 【NLP】Word2Vec详解(含数学推导)

    word2vec可以在百万数量级的词典和上亿的数据集上进行高效地训练:并且,该工具得到的训练结果--词向量(word embedding),可以很好地度量词与词之间的相似性.随着深度学习(Deep L ...

  5. NLP之——Word2Vec详解

    2013年,Google开源了一款用于词向量计算的工具--word2vec,引起了工业界和学术界的关注.首先,word2vec可以在百万数量级的词典和上亿的数据集上进行高效地训练:其次,该工具得到的训 ...

  6. [NLP]高级词向量表达之Word2vec详解(知识点全覆盖)

    1.词表征(Word Representation) 首先明确句子是 序列化 ,里面携带了大量大信息.在NLP发展的进程里面, 采用了one-hot vector的形式来表示一个句子里面的词是一种方式 ...

  7. Word2Vec详解-公式推导以及代码

    Word2Vec 1.前记 2.一些背景知识 2.1词向量简单介绍 2.2哈弗曼树简单介绍 3.基于层次softmax的模型 3.1COBW 层次softmax 3.1.1整体结构 3.1.2 前向传 ...

  8. 词向量模型(word2vec) 详解

    转载:https://blog.csdn.net/peghoty/article/details/37969519 pdf下载链接:https://github.com/renpengcheng-gi ...

  9. 通俗易懂word2vec详解,入门级选手无难度

    项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star,留言,一起学习进步 前言 自从Mikolov在他2013年 ...

最新文章

  1. 都996了,需求还是没法按时交付,怎么办?
  2. “静态常量”与“ #define”与“枚举”
  3. Linux创建文件自动消失,Linux中没有文件创建时间的概念
  4. 数据中心基础设施运维是什么?
  5. rmi 反序列化漏洞_IDEA动态调试(二)——反序列化漏洞(Fastjson)
  6. java-number
  7. HttpClientFactory的套路,你知多少?
  8. MSN on 2/16/2009
  9. Linux中的chmod详解
  10. 教师资格证综合素质思维导图
  11. bitcoin jsonrpc java_BitcoinCore JSONRPC Java使用创建账号,获取余额,转账等等...
  12. Java微信公众号开发梳理
  13. Windows核心编程_将窗口嵌入到桌面图标下面不被遮挡 spy 分析过程
  14. C语言普通字体转换花体 英文网名神器
  15. python怎么安装lxml库_lxml解析库的安装和使用
  16. LeetCode 633.平方数之和(python题解)
  17. 傅里叶变换的性质(一)
  18. 文本处理强调的是使用计算机对文本中,【判断题】文本处理强调的是使用计算机对文本中所含文字信息的形、音、义等进行分析和处理。文语转换(语音合成)不属于文本处理。...
  19. Qt 多文本框设置行距和
  20. php的表达爱意的一句代码,表达爱意的爱情诗句

热门文章

  1. 裸眼3D手机的技术原理
  2. Macs处理ChIP_Seq数据
  3. 在线书店java项目_基于jsp的网上书店-JavaEE实现网上书店 - java项目源码
  4. C# 线程池 ThreadPool
  5. 多个excel合并软件
  6. 十八种方法提升淘宝店流量
  7. 使用python实现与机器人聊天
  8. 将VS2013的“解决方案资源管理器”设置到左边位置的方法
  9. 阿里云语音服务配合alertmanager实现电话告警
  10. 一步一步_kickstart详解