Glove 细节介绍

Glove全称Global Vectors for Word Representation,是目前应用范围最广的词向量,但是它基于通用语料训练,所以适合通用语言的自然处理任务,如果你的词库是领域特定词库,使用word2vec或者fasttext自己训练会比较好。

Glove模型可以简单概括为:基于通用语料,获得词频统计,学习词语表征)

从语料中通过统计方式提取一个共现矩阵 X X X X i j X_{ij} Xij表示的是单词i和单词j出现在同一个窗口中的频率(单词i和j出现在同一个上下文中的频率)。

模型公式

J = ∑ i , j N f ( X i , j ) ( v i T v j + b i + b j − l o g ( X i , j ) J=sum_{i,j}^{N}f(X_{i,j})(v_i^Tv_j+b_i+b_j-log(X_{i,j}) J=i,jNf(Xi,j)(viTvj+bi+bjlog(Xi,j)
v i v_i vi v j v_j vj即为单词i和j的词向量, b i b_i bi b j b_j bj是两个标量(偏差项,不能省略,会破坏对成型,在推导过程中你会明白为什么不能省略)。 f ( x ) f(x) f(x)是一个权重函数, N N N表示词汇表大小(共现矩阵维度为 N ∗ N N*N NN)。Glove没有使用神经网络,从这一点来讲,是无监督的学习方式,但是在公式推导过程中,你会发现它也能被看作是监督学习的方式。

推导过程如下

定义 X i X_i Xi为如下,你可以理解为出现单词i的频率之和。
X i = ∑ j = 1 N X i , j X_i=sum_{j=1}^{N}X_{i,j} Xi=j=1NXi,j
即矩阵单词i那一行的和。

条件概率 P i , k P_{i,k} Pi,k
P i , k = X i , k X i P_{i,k} = frac{X_{i,k}}{X_i} Pi,k=XiXi,k
表示单词k出现在单词i语境中的条件概率。

两个条件概率的比率:
r a t i o i , j , k = P i , k P j , k ratio_{i,j,k}=frac{P_{i, k}}{P_{j,k}} ratioi,j,k=Pj,kPi,k
作者认为这个比率蕴含语义信息:

r a t i o i , j , k ratio_{i,j,k} ratioi,j,k 单词j,k相关 单词j,k不相关
单词i,k相关 → 1 ightarrow1 1 → ∞ ightarrow infty
单词i,k不相关 → 0 ightarrow0 0 → 1 ightarrow1 1

如果训练得到的词向量能通过某种函数记为 g ( v i , v j , v k ) g(v_i,v_j,v_k) g(vi,vj,vk)计算出的 r a t i o i , j , k ratio_{i,j,k} ratioi,j,k能有同样的规律,那么可以认为词向量已经编码了共现矩阵所蕴含的语义信息。

也就是说我们希望
r a t i o i , j , k = P i , k P j , k = g ( v i , v j , v k ) ratio_{i,j,k}=frac{P_{i, k}}{P_{j,k}}=g(v_i,v_j,v_k) ratioi,j,k=Pj,kPi,k=g(vi,vj,vk)尽可能接近。

使用MSE作为代价函数
J = ∑ i , j , k N ( P i , k P j , k − g ( v i , v j , v k ) ) 2 J=sum_{i,j,k}{N}(frac{P_{i,k}}{P_{j,k}}-g(v_i,v_j,v_k))^2 J=i,j,kN(Pj,kPi,kg(vi,vj,vk))2

g ( v i , v j , v k ) g(v_i,v_j,v_k) g(vi,vj,vk)有如下三方面的考虑:

  1. 考虑 v i v_i vi v j v_j vj之间的关系,应该有 v i − v j v_i-v_j vivj
  2. r a t i o i , j , k ratio_{i,j,k} ratioi,j,k是标量,为了得到标量,可以使用内积 ( v i − v j ) T v k (v_i-v_j)^Tv_k (vivj)Tvk
  3. 不能为负值,使用exp函数,得 g ( v i , v j , v k ) = e x p ( ( v i − v j ) T ) v k g(v_i,v_j,v_k)=exp((v_i-v_j)^T)v_k g(vi,vj,vk)=exp((vivj)T)vk

综上:
P i , k P j , k = e x p ( ( v i − v j ) T ) v k ) = e x p ( v i T v k − v j T v k ) frac{P_{i, k}}{P_{j,k}}=exp((v_i-v_j)^T)v_k)=exp(v_i^Tv_k-v_j^Tv_k) Pj,kPi,k=exp((vivj)T)vk)=exp(viTvkvjTvk)

P i , k P j , k = e x p ( v i ) T e x p ( v j ) T frac{P_{i,k}}{P_{j,k}}=frac{exp(v_i)^T}{exp(v_j)^T} Pj,kPi,k=exp(vj)Texp(vi)T

实现这个优化目标,只需要拟合分子分母即可,而分子分母同型,我们可以简化为这一目标
P i , j = e x p ( v i T v j ) P_{i,j}=exp(v_i^Tv_j) Pi,j=exp(viTvj)

两边取对数

l o g ( P i , j ) = v i T v j log(P_{i,j})=v_i^Tv_j log(Pi,j)=viTvj

代价函数简化为:
J = ∑ i , j N ( v i T v j − l o g ( P i , j ) ) 2 J=sum_{i,j}^{N}(v_i^Tv_j-log(P_{i,j}))^2 J=i,jN(viTvjlog(Pi,j))2

这里存在一个问题, l o g ( P i , j ) = v i T v j log(P_{i,j})=v_i^Tv_j log(Pi,j)=viTvj l o g ( P j , i ) = v j T v i log(P_{j,i})=v_j^Tv_i log(Pj,i)=vjTvi l o g ( P i , j ) log(P_{i,j}) log(Pi,j)等于 l o g ( P j , i ) log(P_{j,i}) log(Pj,i)但是 v i T v j v_i^Tv_j viTvj不等于 v j T v i v_j^Tv_i vjTvi。这就是为什么要加上偏差项。

J = ∑ i , j N ( v i T v j + b i + b j − l o g ( P i , j ) ) 2 J=sum_{i,j}^{N}(v_i^Tv_j+b_i+b_j-log(P_{i,j}))^2 J=i,jN(viTvj+bi+bjlog(Pi,j))2

最后,每一个单词组合的权重应该不一样,所以引入权重函数
J = ∑ i , j N f ( X i , j ) ( v i T v j + b i + b j − l o g ( X i , j ) ) 2 J=sum_{i,j}^{N}f(X_{i,j})(v_i^Tv_j+b_i+b_j-log(X_{i,j}))^2 J=i,jNf(Xi,j)(viTvj+bi+bjlog(Xi,j))2

权重函数:
f ( x ) = { x x m a x 0.75 , i f   x < x m a x 1 , i f   x > = x m a x f(x)=egin{cases} frac{x}{x_{max}}^{0.75}, & if x < x_{max} \ 1, & if x >= x_{max} end{cases} f(x)={xmaxx0.75,1,if x<xmaxif x>=xmax
即频率越高权重越大,但是也不能过分增大。

参考 (如果你觉得这里不详细的话,可以看下面这篇)

理解GloVe模型(+总结)