学习词向量有两种方法:局部和全局
全局的代表有 LSA PLSA等
局部的代表有 Word2Vec
他们都有各自的缺陷,全局的没有利用好词之间的类比信息,局部的方法没有利用词全局的统计信息
Glove词向量即利用了局部信息也利用了全局的统计信息,全名为:Global Vectors for Word Representation Jeffrey
首先引入词汇的共现矩阵 X X X,其中每一个元素 X i j X_{ij} Xij表示词汇 j j j出现在词汇 i i i的上下文的次数总和,令 X i = Σ k X i k X_{i}=\Sigma_{k}X_{ik} Xi=ΣkXik表示所有出现在词汇 i i i上下文中的词汇次数综合, P i j = P ( j ∣ i ) = X i j / X i P_{ij}=P(j|i)=X_{ij}/X_i Pij=P(j∣i)=Xij/Xi表示词汇 j j j出现在词汇 i i i上下文的概率。一般来说,共现矩阵是通过词的窗口计算得到的,比如以下内容,设定窗口大小为3
I am 30 years old
计算次序如下
次序 | 中心词 | 窗口内容 |
---|---|---|
1 | I | I am |
2 | am | I am 30 |
3 | 30 | am 30 years |
4 | years | 30 years old |
5 | old | years old |
通过此种方式计算了 X I , a m + = 1 X_{I,am}+=1 XI,am+=1, X I , 30 + = 1 , X a m , 30 + = 1... X_{I,30}+=1,X_{am,30}+=1... XI,30+=1,Xam,30+=1...等,这样就得到了共现矩阵。由此得到了词汇的局部信息
然后作者在研究过程中发现了一个有趣的现象,有以下表格表示词汇 i , j , k i,j,k i,j,k之间的关系
r a t i o i , j , k ratio_{i,j,k} ratioi,j,k | 单词 j , k j,k j,k相关 | 单词 j , k j,k j,k不想关 |
---|---|---|
单词 i , j i,j i,j相关 | 接近于1 | 很大 |
单词 i , j i,j i,j不相关 | 很小 | 接近于1 |
其中: 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,P即为上述描述的方法进行计算
由此现象能说明共现矩阵存在这样的关系,如果我们学习到的词向量也有这种关系,那么就可以说明学习到了共现矩阵的信息,也意味着学习到了全局的信息
那思想有了,怎么得到最后的损失函数呢?
作者给了以下的思路,此方法也是从博客 理解GloVe模型拿下来的
首先, P i , k P j , k = g ( v i , v j , v k ) \frac{P_{i,k}}{P_{j,k}}=g(v_i,v_j,v_k) Pj,kPi,k=g(vi,vj,vk), g ( v i , v j , v k ) g(v_i,v_j,v_k) g(vi,vj,vk)是词向量 i , j , k i,j,k i,j,k的计算函数,我们认为等式的左右两边应该是无限接近的,所以 J = Σ ( P i , j P j , k − g ( v i , v j , v k ) ) 2 J=\Sigma(\frac{P_{i,j}}{P_{j,k}}-g(v_i,v_j,v_k))^2 J=Σ(Pj,kPi,j−g(vi,vj,vk))2,发现J代价函数包含3个词的计算,比较复杂,需要简化
要考虑单词 i , j i,j i,j两者之间的关系,那么我们认为 v i − v j v_i-v_j vi−vj可以合理的考察两个向量间的相似性
r a t i o i , j , k ratio_{i,j,k} ratioi,j,k是一个标量,那么函数 g ( v i , v j , v k ) g(v_i,v_j,v_k) g(vi,vj,vk)应该最后也是一个标量,那么最后由 v i − v j v_i-v_j vi−vj得到的相减向量后应该乘以一个向量从而得到一个标量,我们可以这么表示 ( v i − v j ) T v k (v_i-v_j)^Tv_k (vi−vj)Tvk在 ( v i − v j ) T v k (v_i-v_j)^Tv_k (vi−vj)Tvk之上,作者有套用了一层指数运算 e x p ( ) exp() 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)^Tv_k) g(vi,vj,vk)=exp((vi−vj)Tvk),然后公式简化为: g ( v i , v j , v k ) = e x p ( ( v i − v j ) T v k ) = e x p ( v i T v k − v j T v k ) = e x p ( v i T v k ) e x p ( v j T v k ) g(v_i,v_j,v_k)=exp((v_i-v_j)^Tv_k)=exp(v_i^Tv_k-v_j^Tv_k)=\frac{exp(v_i^Tv_k)}{exp(v_j^Tv_k)} g(vi,vj,vk)=exp((vi−vj)Tvk)=exp(viTvk−vjTvk)=exp(vjTvk)exp(viTvk)
上面的式子就变成了 P i , k P j , k = e x p ( v i T v k ) e x p ( v j T v k ) \frac{P_{i,k}}{P_{j,k}}=\frac{exp(v_i^Tv_k)}{exp(v_j^Tv_k)} Pj,kPi,k=exp(vjTvk)exp(viTvk),那么直接令 P i , k = e x p ( v i T v k ) , P j , k = e x p ( v j T v k ) P_{i,k}=exp(v_i^Tv_k),P_{j,k}=exp(v_j^Tv_k) Pi,k=exp(viTvk),Pj,k=exp(vjTvk)就可以
我们暂时认为 i , j i,j i,j可互换,那么最后我们只要求解的是 P i , k = e x p ( v i T v k ) P_{i,k}=exp(v_i^Tv_k) Pi,k=exp(viTvk),两边取对数 l o g ( P i , k ) = v i T v k log(P_{i,k})=v_i^Tv_k log(Pi,k)=viTvk
代价函数就简化为了 J = Σ ( l o g ( P i , k ) − v i T v k ) 2 J=\Sigma(log(P_{i,k})-v_i^Tv_k)^2 J=Σ(log(Pi,k)−viTvk)2
但上述函数还有一个问题就是一般意义上来说 P i , j ! = P ( j , i ) P_{i,j}!=P(j,i) Pi,j!=P(j,i),所以需要加上一个补救措施,最终得到代价函数
J = Σ ( − l o g ( P i , j + v i T v k + b i + b j ) ) J=\Sigma(-log(P_{i,j}+v_i^Tv_k+b_i+b_j)) J=Σ(−log(Pi,j+viTvk+bi+bj))
再考虑权重项,按照 出现频率搞得单词对于权重应该较大的思路,有
J = Σ f ( X i , j ) ( − l o g ( P i , j ) + v i T v k + b i + b j ) J=\Sigma f(X_{i,j})(-log(P_{i,j})+v_i^Tv_k+b_i+b_j) J=Σf(Xi,j)(−log(Pi,j)+viTvk+bi+bj)
f ( X ) = ( x / x m a x ) α , x < x m a x f(X)=(x/x_{max})^\alpha ,x
f ( X ) = 1 , x > = x m a x f(X)=1 ,x>=x_{max} f(X)=1,x>=xmax
那么以上原理部分介绍完了
GloVe原理介绍
理解GloVe模型