GloVe模型: Global Vectors for Word Representation

一、前言

  • 目前学习词向量的方法主流的有两种

    • 全局矩阵分解的方法:比如LSA,HAL,这类方法首先统计语料库中的“词-文档”或者“词-词”共现矩阵,然后通过矩阵分解的方法来获得一个低维词向量。
    • 局部上下文窗口的方法,:比如skip-gram

  • 但是这两种方法都有缺点

    • 全局矩阵分解的方法虽然利用了全局统计信息,但是他会过度重视共现词频高的单词对,然而这些词并没有多大的语义联系。
    • 局部上下文窗口的方法,没有充分利用全局统计信息。
  • 这篇论文的主要思想就是结合两者的优点进行词向量学习

二、GloVe模型

1、共现矩阵

  • 根据语料库构建一个共现矩阵(Co-ocurrence Matrix)X, 矩阵中的每一个元素 X i j X_{ij} Xij代表表示词 j j j出现在以词 i i i为中心的窗口中的次数。并且 X X X是一个对称矩阵
  • 定义几个符号与运算: X i = ∑ j = 1 N X i j X_i=∑_{j=1}^NX_{ij} Xi=j=1NXij X i X_i Xi就是矩阵第i行(单词i那一行)的和. P i , k = X i , k X i P_{i,k}=\frac{X_{i,k}}{X_i} Pi,k=XiXi,k P i , k P_{i,k} Pi,k是一个条件概率,表示单词 k k k出现在单词 i i 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是两个条件概率的比率。

  • 现在对 r a t i o i , j , k ratio_{i,j,k} ratioi,j,k进行分析一下:
    • P i , k P_{i,k} Pi,k公式我们知道词 i i i与词 k k k共现的次数越多(越相关)该值越大,反正越小。并且有 P i , k ∈ [ 0 , 1 ] P_{i,k}∈[0,1] Pi,k[0,1]
    • 所以 r a t i o i , j , k ratio_{i,j,k} ratioi,j,k有下表规律:

2、损失函数:

  • 上面的表格是通过词频统计运算得到的规律,我们希望我们学习到的词向量也有这种规律,也就是说词向量包含上面分析的这一规律。更具体的来说,我们希望通过对 i , j , k i,j,k i,j,k三个词向量的某种运算得到 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)函数 g g g的具体形式先不用管。
  • 通过上面分析我们可以得到下面的损失函数: J = ∑ i , j , k N ( P i , k P j , k − g ( v i , v j , v k ) ) 2 J=∑_{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其实质就是一个均方误差损失函数,这个损失函数的复杂度是 O ( N 3 ) , O(N^3), O(N3),比较大。

  • 现在我们考虑函数 g g g 的具体形式:
    • 为将我们的词向量与共现矩阵 X X X,联系起来,我们对每个词 w i w_i wi都定义了两个向量, v i 和 v ^ i v_i和\hat{v}_i viv^i ,他们分别于矩阵 X X X的行于列相对应。
    • 假设我们用向量的内积来表示两个词的相关程度,即我们用$ v_i*\hat{v}_j$ 表示词 i i i与词 j j j的相关程度,那么我们就可以将 g g g函数定义如下: g ( v i , v j , v k ) = v i ∗ v ^ k − v j ∗ v ^ k g(v_i,v_j,v_k )=v_i*\hat{v}_k-v_j*\hat{v}_k g(vi,vj,vk)=viv^kvjv^k
    • 上面公式的 g g g函数是符合上面表格中中规律的。所以得到: P i , k P j , k − = v i ∗ v ^ k − v j ∗ v ^ k \frac{P_{i,k}}{P_{j,k}} - =v_i*\hat{v}_k-v_j*\hat{v}_k Pj,kPi,k=viv^kvjv^k
    • 为了降低损失函数的复杂度,我们可以将 g g g函数的形式表示成分数的形式,不改变函数的性质同时化减法为除发,很容易想到使用取指数的方法 P i , k P j , k = e x p ( v i ∗ v ^ k − v j ∗ v ^ k ) = e x p ( v i ∗ v ^ k ) e x p ( v i ∗ v ^ k ) \frac{P_{i,k}}{P_{j,k}}=exp(v_i*\hat{v}_k-v_j*\hat{v}_k )=\frac{exp(v_i*\hat{v}_k )}{exp(v_i*\hat{v}_k )} Pj,kPi,k=exp(viv^kvjv^k)=exp(viv^k)exp(viv^k)
    • 上式成立,可以等价的转化为: P i , k = e x p ( v i ∗ v ^ k ) P_{i,k}= exp(v_i*\hat{v}_k ) Pi,k=exp(viv^k) P j , k = e x p ( v i ∗ v ^ k ) P_{j,k}= exp(v_i*\hat{v}_k ) Pj,k=exp(viv^k)
    • 于是我们学习词向量的目标函数: P i , j = e x p ( v i ∗ v ^ j ) P_{i,j}= exp(v_i*\hat{v}_j ) Pi,j=exp(viv^j)两边取个对数: l n ( P i , j ) = v i ∗ v ^ j = v i T v ^ j ln(P_{i,j} )= v_i*\hat{v}_j=v_i^T \hat{v}_j ln(Pi,j)=viv^j=viTv^j
    • 于是我们的损失函数变成: J = ∑ i , j N ( l n ( P i , j ) − v i T v j ) 2 J=∑_{i,j}^N(ln(P_{i,j} )-v_i^T v_j )^2 J=i,jN(ln(Pi,j)viTvj)2 这个损失函数的复杂度是 O ( N 2 ) O(N^2) O(N2)

  • 进一步化解损失函数:
    • P i , j P_{i,j} Pi,j表达式带入下面式子: l n ( P i , j ) = v i T v ^ j ln(P_{i,j} )=v_i^T\hat{v}_j ln(Pi,j)=viTv^j得: l n ( X i , j ) − l n ( X i ) = v i T v ^ j ln(X_{i,j} )-ln(X_i )=v_i^T \hat{v}_j ln(Xi,j)ln(Xi)=viTv^j
    • 并且可以得到: l n ( X j , i ) − l n ( X j ) = v j T v ^ i ln(X_{j,i} )-ln(X_j )=v_j^T \hat{v}_i ln(Xj,i)ln(Xj)=vjTv^i由于矩阵 X X X的对称性得: l n ( X j , i ) = l n ( X i , j ) ln(X_{j,i} )=ln(X_{i,j} ) ln(Xj,i)=ln(Xi,j)并且 l n ( X j ) ln(X_j ) ln(Xj)相对所有其他词 i i i是一个常数,同理 l n ( X i ) ln(X_i) ln(Xi)也相当于一个常数。而且有: v i T v ^ j ! = v j T v ^ i v_i^T\hat{v}_j!=v_j^T \hat{v}_i viTv^j!=vjTv^i他们的差值为一个常数项。我们将这些常数项进行合并得到下面式子: l n ( X i , j ) = v i T v ^ j + b i + b j ln(X_{i,j} )=v_i^T \hat{v}_j +b_i+b_j ln(Xi,j)=viTv^j+bi+bj b i b_i bi b j b_j bj是与词 i i i和词 j j j相关的偏置项学习得到
    • 于是我们进一步得到损失函数: J = ∑ i , j N ( v i T v ^ j + b i + b j − l n ( X i , j ) ) 2 J=∑_{i,j}^N(v_i^T \hat{v}_j +b_i+b_j-ln(X_{i,j} ))^2 J=i,jN(viTv^j+bi+bjln(Xi,j))2
  • 们知道在一个语料库中,肯定存有些单词对他们在一起出现的次数是很多,有些单词对在一起的次数确很少。我们当然希望出现次数多的单词对更能体现出上面表格中的规律,为了达到这个目标,我们在损失函数中增大这些词的取值就ok了,于是得到下面的损失函数: J = ∑ i , j N f ( X i j ) ( v i T v ^ j + b i + b j − l n ( X i , j ) ) 2 J=∑_{i,j}^Nf(X_{ij})(v_i^T \hat{v}_j +b_i+b_j-ln(X_{i,j} ))^2 J=i,jNf(Xij)(viTv^j+bi+bjln(Xi,j))2
  • 函数 f ( X i j ) f(X_{ij}) f(Xij)就是权重函数。论文中使用的是下面函数: f ( x ) = { ( x x m a x ) α x < x m a x 1 其 他 f(x)=\begin{cases} (\frac{x}{x_{max}})^α & x<x_max \\ 1 & 其他 \end{cases} f(x)={(xmaxx)α1x<xmax
    GloVe模型: Global Vectors for Word Representation_第1张图片
    • x m a x x_{max} xmax是我们也不希望这个权重过大,为使它到达一定程度之后应该不再增加,而设置的一个最大值。
    • 如果两个单词没有在一起出现,也就是 X i j = 0 X_{ij}=0 Xij=0,那么他们应该不参与到loss function的计算当中去,也就是 f ( x ) f(x) f(x)要满足 f ( 0 ) = 0 f(0)=0 f(0)=0
    • 这篇论文中的所有实验, α α α的取值是 0.75 0.75 0.75,而 x m a x x_{max} xmax取值是100。

3、模型训练过程

  • 在我们经过统计得到共现矩阵 X X X后,我们可以将 l n ⁡ ( X i j ) ln⁡(X_{ij}) ln(Xij)视为数据的标签。各词的向量 v i v_i vi作为训练的参数,使用上面的损失函数。然后就是基于梯度下降进行参数学习。
  • 具体地,论文中的做法是:采用了AdaGrad的梯度下降算法,对矩阵 X X X中的所有非零元素进行随机采样,学习曲率(learning rate)设为0.05,在vector size小于300的情况下迭代了50次,其他大小的vectors上迭代了100次,直至收敛。
  • 训练完成之和对于每个词我们都得到两个向量 v i , v ^ i v_i,\hat{v}_i vi,v^i.因为 X X X是对称的,所以从原理上讲 v i , v ^ i v_i,\hat{v}_i vi,v^i是也是对称的,他们唯一的区别是初始化的值不一样,而导致最终的值不一样。所以这两者其实是等价的,都可以当成最终的结果来使用。但是为了提高鲁棒性,我们最终会选择两者之和 v i + v ^ i v_i+\hat{v}_i vi+v^i作为最终的词向量,两者的初始化不同相当于加了不同的随机噪声,所以能提高鲁棒性。

参考链接

  • 论文链接:https://www.aclweb.org/anthology/D14-1162
  • 项目链接:https://github.com/dmlc/gluon-nlp

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