GloVe原理介绍

1. 引言

当前,学习词向量表示的方法主要有两种类型:一种是基于全局矩阵分解的方法,如LSA,另一种是局部上下文窗口的方法,如Mikolov在2013年提出来的CBOW和skip-gram方法。但是这两种方法都有各自的缺陷,其中,LSA虽然有效利用了统计信息,但是在词汇类比方面却很差,而CBOW和skip-gram虽然可以很好地进行词汇类比,但是因为这两种方法是基于一个个局部的上下文窗口方法,因此,没有有效地利用全局的词汇共现统计信息。

为了克服全局矩阵分解和局部上下文窗口的缺陷,在2014年,Jeffrey Pennington等人提出了一种新的GloVe方法,该方法基于全局词汇共现的统计信息来学习词向量,从而将统计信息与局部上下文窗口方法的优点都结合起来,并发现其效果确实得到了提升。

  • 论文地址:《GloVe: Global Vectors for Word Representation Jeffrey》

2. GloVe原理介绍

首先,记词汇的共现矩阵为 X X X,其中,每一个元素 X i j X_{i j} Xij表示词汇 j j j出现在词汇 i i i上下文中的次数总和,令 X i = ∑ k X i k X_{i}=\sum_{k} X_{i k} Xi=kXik表示所有出现在词汇 i i i上下文中的词汇的次数总和,令 P i j = P ( j ∣ i ) = X i j / X i P_{i j}=P(j | i)=X_{i j} / X_{i} Pij=P(ji)=Xij/Xi表示词汇 j j j出现在词汇 i i i上下文的概率。

在介绍GloVe的原理之前,先来看论文中的一个案例,假设 i = i c e , j = s t e a m i=ice, j=steam i=ice,j=steam,并对 k k k取不同的词汇,如“solid”,“gas”,“water”,“fashion”,根据上面的定义,我们分别计算他们的概率 P ( k ∣ i c e ) P(k | i c e) P(kice) P ( k ∣ steam ) P(k | \text {steam}) P(ksteam),并计算两者的比率 P ( k ∣ i c e ) / P ( k ∣ s t e a m ) P(k | i c e) / P(k | s t e a m) P(kice)/P(ksteam),可以发现,对于“solid”,其出现在“ice”上下文的概率应该比较大,出现在“steam”上下文的概率应该比较小,因此,他们的比值应该是一个比较大的数,在下表中是8.9,而对于“gas”,出现在“ice”上下文的概率应该比较小,而出现在“steam”上下文的概率应该比较大,因此,两者的比值应该是一个比较小的数,在下表中是 8.5 × 1 0 − 2 8.5 \times 10^{-2} 8.5×102,而对于“water、fashion”这两个词汇,他们与“ice”和steam“的相关性应该比较小,因此,他们的比值应该都是接近1。因此,这样来看可以发现,比值 P ( k ∣ i c e ) / P ( k ∣ s t e a m ) P(k | i c e) / P(k | s t e a m) P(kice)/P(ksteam)在一定程度上可以反映词汇之间的相关性,当相关性比较低时,其值应该在1附件,当相关性比较高时,比值应该偏离1比较远。
GloVe原理介绍_第1张图片
基于这样的思想,作者提出了这样一种猜想,能不能通过训练词向量,使得词向量经过某种函数计算之后可以得到上面的比值,具体如下:
F ( w i , w j , w ~ k ) = P i k P j k F\left(w_{i}, w_{j}, \tilde{w}_{k}\right)=\frac{P_{i k}}{P_{j k}} F(wi,wj,w~k)=PjkPik
其中, w i , w j , w ~ k w_{i}, w_{j}, \tilde{w}_{k} wi,wj,w~k为词汇 i , j , k i, j, k i,j,k对应的词向量,其维度都为 d d d,而 P i k P j k \frac{P_{i k}}{P_{j k}} PjkPik则可以直接通过语料计算得到,这里 F F F为一个未知的函数。由于词向量都是在一个线性向量空间,因此,可以对 w i , w j w_{i}, w_{j} wi,wj进行差分,将上式转变为如下:
F ( w i − w j , w ~ k ) = P i k P j k F\left(w_{i}-w_{j}, \tilde{w}_{k}\right)=\frac{P_{i k}}{P_{j k}} F(wiwj,w~k)=PjkPik
由于上式中左侧括号中是两个维度为 d d d的词向量,而右侧是一个标量,因此,很容易会想到向量的内积,因此,上式可以进一步改变为:
F ( ( w i − w j ) T w ~ k ) = F ( w i T w k − w j T w k ) = P i k P j k F\left(\left(w_{i}-w_{j}\right)^{T} \tilde{w}_{k}\right)=F\left(w_{i}^{T} w_{k}-w_{j}^{T} w_{k}\right)=\frac{P_{i k}}{P_{j k}} F((wiwj)Tw~k)=F(wiTwkwjTwk)=PjkPik
由于上式中左侧是一种减法,而右侧是一种除法,很容易联想到指数计算,因此,可以把 F F F限定为指数函数,此时有:
exp ⁡ ( w i T w k − w j T w k ) = exp ⁡ ( w i T w k ) exp ⁡ ( w j T w k ) = P i k P j k \exp \left(w_{i}^{T} w_{k}-w_{j}^{T} w_{k}\right)=\frac{\exp \left(w_{i}^{T} w_{k}\right)}{\exp \left(w_{j}^{T} w_{k}\right)}=\frac{P_{i k}}{P_{j k}} exp(wiTwkwjTwk)=exp(wjTwk)exp(wiTwk)=PjkPik
因此,此时只要确保等式两边分子分母相等即可,即:
exp ⁡ ( w i T w k ) = P i k , exp ⁡ ( w j T w k ) = P j k \exp \left(w_{i}^{T} w_{k}\right)=P_{i k}, \exp \left(w_{j}^{T} w_{k}\right)=P_{j k} exp(wiTwk)=Pik,exp(wjTwk)=Pjk
进一步的,可以转化为对语料中的所有词汇,考察 exp ⁡ ( w i T w k ) = P i k = X i k X i \exp \left(w_{i}^{T} w_{k}\right)=P_{i k}=\frac{X_{i k}}{X_{i}} exp(wiTwk)=Pik=XiXik,即:
w i T w k = log ⁡ ( X i k X i ) = log ⁡ X i k − log ⁡ X i w_{i}^{T} w_{k}=\log \left(\frac{X_{i k}}{X_{i}}\right)=\log X_{i k}-\log X_{i} wiTwk=log(XiXik)=logXiklogXi
由于上式左侧 w i T w k w_{i}^{T} w_{k} wiTwk中,调换 i i i k k k的值不会改变其结果,即具有对称性,因此,为了确保等式右侧也具备对称性,引入了两个偏置项,即
w i T w k = log ⁡ X i k − b i − b k w_{i}^{T} w_{k}=\log X_{i k}-b_{i}-b_{k} wiTwk=logXikbibk此时, log ⁡ X i \log X_{i} logXi已经包含在 b i b_{i} bi当中。因此,此时模型的目标就转化为通过学习词向量的表示,使得上式两边尽量接近,因此,可以通过计算两者之间的平方差来作为目标函数,即:
J = ∑ i , k = 1 V ( w i T w ~ k + b i + b k − log ⁡ X i k ) 2 J = \sum_{i, k=1}^{V}\left(w_{i}^{T} \tilde{w}_{k}+b_{i}+ b_{k}-\log X_{i k}\right)^{2} J=i,k=1V(wiTw~k+bi+bklogXik)2
但是这样的目标函数有一个缺点,就是对所有的共现词汇都是采用同样的权重,因此,作者对目标函数进行了进一步的修正,通过语料中的词汇共现统计信息来改变他们在目标函数中的权重,具体如下:
J = ∑ i , k = 1 V f ( X i k ) ( w i T w ~ k + b i + b k − log ⁡ X i k ) 2 J=\sum_{i, k=1}^{V} f\left(X_{i k}\right)\left(w_{i}^{T} \tilde{w}_{k}+b_{i}+b_{k}-\log X_{i k}\right)^{2} J=i,k=1Vf(Xik)(wiTw~k+bi+bklogXik)2
这里 V V V表示词汇的数量,并且权重函数 f f f必须具备以下的特性:

  • f ( 0 ) = 0 f(0)=0 f(0)=0,当词汇共现的次数为0时,此时对应的权重应该为0。
  • f ( x ) f(x) f(x)必须是一个非减函数,这样才能保证当词汇共现的次数越大时,其权重不会出现下降的情况。
  • 对于那些太频繁的词, f ( x ) f(x) f(x)应该能给予他们一个相对小的数值,这样才不会出现过度加权。

综合以上三点特性,作者提出了下面的权重函数:
f ( x ) = { ( x / x max ⁡ ) α  if  x < x max ⁡ 1  otherwise  f(x)=\left\{\begin{array}{cc}{\left(x / x_{\max }\right)^{\alpha}} & {\text { if } x<x_{\max }} \\ {1} & {\text { otherwise }}\end{array}\right. f(x)={(x/xmax)α1 if x<xmax otherwise 
作者在实验中设定 x max ⁡ = 100 x_{\max }=100 xmax=100,并且发现 α = 3 / 4 \alpha=3 / 4 α=3/4时效果比较好。函数的图像如下图所示:
GloVe原理介绍_第2张图片

3. 总结

以上就是有关GloVe原理的介绍,作者其实也是基于最开始的猜想一步一步简化模型的计算目标,最后看GloVe的目标函数时发现其实不难计算,但是要从最开始就想到这样一个目标函数其实还是很难的。最后做一下总结:

  • Glove综合了全局词汇共现的统计信息和局部窗口上下文方法的优点,可以说是两个主流方法的一种综合,但是相比于全局矩阵分解方法,由于GloVe不需要计算那些共现次数为0的词汇,因此,可以极大的减少计算量和数据的存储空间。
  • 但是GloVe把语料中的词频共现次数作为词向量学习逼近的目标,当语料比较少时,有些词汇共现的次数可能比较少,笔者觉得可能会出现一种误导词向量训练方向的现象。

你可能感兴趣的:(语言模型)