GloVe与论文学习

GloVe与论文学习

一、介绍

GloVeGloVe最早由斯坦福大学的 Jeffrey Pennington 于2014年提出,发表的文章为《GloVe: Global Vectors for Word Representation》,发表在EMNLPEMNLP


二、论文导读

1、背景知识

文章中提到了学习词向量的两种方法:

  • 矩阵分解方法( Matrix Factorization Methods ):所谓的矩阵分解方法,是先构造一个词共现矩阵,例如如果这里有三句话: I enjoy flying.I like NLP.I like deep learning. ,则这词共现矩阵如下图所示(规定window=1window=1,即只有在该词左右的一个词才称之为共同出现);通常来说,词共现矩阵非常大,为V×V|V| \times |V|的一个矩阵,因此我们需要使用降维的方法对矩阵降维,得到的降维后的矩阵就是一个一个的词向量

GloVe与论文学习

  • 基于上下文的向量学习方法( Shallow Window-Based Methods ):所谓的基于上下文的向量学习方法就是Word2VecWord2Vec中的CBOWCBOWSkipGramSkip-Gram这两种方法:
    GloVe与论文学习

文章中提到,上述的两种学习词向量的方法都有缺点,矩阵分解方法在词对推理任务上表现特别差,同时解释性较差;而基于上下文的向量学习方法的缺点是无法使用全局的统计信息,因此文章中提出了一种对数双线性回归模型

2、研究成果及意义

  • 成果:
    • 在词对推理数据集上取得最好的结果
    • 公布了一系列基于GloVeGloVe的预训练词向量
    • 意义:推动了基于深度学习的自然语言处理的发展,尤其是预训练词向量被广泛引用,在 Google Scholar 上的引用量已破万

三、论文精读

1、GloVe模型

 文章中提到,我们可以使用一些词来描述一个词,比如我们使用冰块蒸汽来描述固体气体时尚四个词。如果与词语与冰块接近,并且和蒸汽不接近,那么这个词很有可能是固体,并且概率比值很大;如果与蒸汽接近,并且和冰块不接近:那么这个词很有可能是气体并且概率比值很小;如果与冰块和蒸汽都不接近: 那么这个词很有可能是时尚并且概率比值不大不小,论文给出的具体的结果如下表所示:

GloVe与论文学习

因此,根据这个思路,我们就可以通过共现矩阵的概率比值可以用来区分词,这也是GloVeGloVe模型的核心思想.


 既然通过概率比值可以用来区分词语,那么应该如何计算概率比值呢?文章中给出了概率比值的计算公式:
F(wi,wj,w~k)=PikPjk F\left(w_{i}, w_{j}, \tilde{w}_{k}\right)=\frac{P_{i k}}{P_{j k}}
从上面的公式中可以看出,公式与三个参数:wi,wj,w~kw_{i}, w_{j}, \tilde{w}_{k}有关,表示的含义是词w~k\tilde{w}_{k}与词wiw_{i}wjw_{j}这两个词之间的差异,因此,既然是表示wiw_{i}wjw_{j}这两个词之间的差异,我们可以将公式改写为:
F(wiwj,w~k)=PikPjk F\left(w_{i}-w_{j}, \tilde{w}_{k}\right)=\frac{P_{i k}}{P_{j k}}
同时注意到,最后得到的比值一定是一个数,即标量;而等式坐标的括号中,wi,wj,w~kw_{i}, w_{j}, \tilde{w}_{k}均是词向量,如果将向量转化为标量呢?文章中给出的方法是内积的方法,即公式可转换为:
F((wiwj)w~k)=PikPjk F\left(\left(w_{i}-w_{j}\right)^{\top} \tilde{w}_{k}\right)=\frac{P_{i k}}{P_{j k}}
这里我们就可以认为公式中的FF表示的是一个标量映射到了另一个标量,而括号中的参数可以通过学习得到


        前文提到FF表示的是一个标量映射到了另一个标量,那么FF具体应该是一个怎样的函数呢?文章中将FF函数认为是指数函数expexp,那么可以得到:

F((wiwj)w~k))=F(wiw~kwjw~k)=exp(wiw~kwjw~k)=exp(wiw~k)exp(wjw~k)=PikPjk \left.F\left(\left(w_{i}-w_{j}\right)^{\top} \tilde{w}_{k}\right)\right)=F\left(w_{i}^{\top} \tilde{w}_{k}-w_{j}^{\top} \tilde{w}_{k}\right)=\exp \left(w_{i}^{\top} \tilde{w}_{k}-w_{j}^{\top} \tilde{w}_{k}\right)=\frac{\exp \left(w_{i}^{\top} \tilde{w}_{k}\right)}{\exp \left(w_{j}^{\top} \tilde{w}_{k}\right)}=\frac{P_{i k}}{P_{j k}}
我们可以令分子分母分别等于PikP_{ik}PjkP_{jk},即:
{exp(wiw~k)=Pikexp(wjw~k)=Pjk \left\{ \begin{array}{ll} \exp \left(w_{i}^{\top} \tilde{w}_{k}\right) &= P_{ik}\\ \exp \left(w_{j}^{\top} \tilde{w}_{k}\right) &= P_{jk}\\ \end{array} \right.
因此,对于任意的词向量wiw_i,均成立:exp(wiw~k)=Pik,i(0,V)\exp \left(w_{i}^{\top} \tilde{w}_{k}\right) = P_{ik} , \quad i \in (0, |V|).

 由于Pik=XikXiP_{ik}=\frac{X_{ik}}{X_{i}},因此exp(wiw~k)=Pik=XikXi\exp \left(w_{i}^{\top} \tilde{w}_{k}\right) = P_{ik} = \frac{X_{ik}}{X_{i}},两边同时取对数得:wiw~k=log(Xik)log(Xi)w_{i}^{\top} \tilde{w}_{k} = \log(X_{ik}) - \log(X_{i});由于log(Xi)\log(X_{i})只与XiX_i有关而与wkw_k无关,因此可以将将等式变换为:wiw~k+log(Xi)=log(Xik)w_{i}^{\top}\tilde{w}_{k}+\log(X_{i})=\log(X_{ik}),由于与wkw_k无关,因此可以将log(Xik)\log(X_{ik})视为一个转置bib_i,即:
wiw~k+bi=log(Xik) w_{i}^{\top} \tilde{w}_{k} + b_i= \log(X_{ik})
注意到,如果我们将wiw_iwkw_k对调,可以发现等式右边log(Xki)=log(Xik)\log(X_{ki})=\log(X_{ik}),但是wkw~i+bkw_{k}^{\top} \tilde{w}_{i} + b_k并不等于wiw~k+biw_{i}^{\top} \tilde{w}_{k} + b_i,因此$\log(X_{ik}) $的形式为:
wiw~k+bi+bj=log(Xik) w_{i}^{\top} \tilde{w}_{k} + b_i + b_j= \log(X_{ik})


 推导得到wiw~k+bi+bj=log(Xik)w_{i}^{\top} \tilde{w}_{k} + b_i + b_j= \log(X_{ik})后,我们就可以构造损失函数JJ,文章中使用交叉熵损失函数:
J=i,j=1Vf(Xij)(wiTw~j+bi+b~jlogXij)2 J=\sum_{i, j=1}^{V} f\left(X_{i j}\right)\left(w_{i}^{T} \tilde{w}_{j}+b_{i}+\tilde{b}_{j}-\log X_{i j}\right)^{2}
这里的f(Xij)f(X_{ij})用于刻画词对出现次数对损失函数的影响,即词对出现次数越多,那么这两个词在损失函数中的影响越大,但是f(Xij)f(X_{ij})需要满足一定的条件:

  • Xij=0X_{ij}=0时,f(Xij)=0f(X_{ij})=0:表示没有共现过的权重为0,不参加训练
  • 非减函数,因为共现次数越多,权重越大
  • f(Xij)f(X_{ij})不能无限制的大,防止 isarethe 这一类词语的影响

论文中构造的f(Xij)f(X_{ij})
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hohanrl6-1598087000349)(./_image/2020-07-22-00-01-28.jpg?r=40)][center]
其中xmaxx_{\max}α\alpha均为大于0的数,需要自己决定取值,文章中xmax=100,  α=34x_{\max}=100, \ \ \alpha=\frac{3}{4},函数图像如下:
GloVe与论文学习

 推导完GloVeGloVe的核心公式后,我们再回过头看一下如果进行训练:

  • 第一步:构建词共现矩阵term-tern
  • 第二步:去掉矩阵中为零的元素,只对非零元素进行训练
  • 第三步:生成训练集(两组词向量)

2、实验结果及分析

(1)GloVe实现的成绩
  • 在词对推理数据集上取得最好的结果
  • 多个词相似度任务上取得最好的结果
  • 命名实体识别实验结果
(2)分析参数影响

GloVe与论文学习

  • 从上面第一幅图可以看出,向量的长度对准确率有明显的影响,长度越长,准确率越大
  • 从上面第二、三幅图可以看出,窗口大小对准确率也有明显的影响,窗口越大,准确率高;并且在非对称的情况下,语意的表现明显好于对称情况下语意的表现

GloVe与论文学习

  • 从上面这幅图可以看出,训练语料对结果也有非常大的影响:
    • 语料越大,对语法的训练越准确
    • 语料越大,对语意的训练准确率并不是一个单调递增的趋势, WiKi 上的语意训练准确率显著大于其他语料的训练准确率,文章中解释这是因为 Wiki 有实时更新,并且在训练之前就已经有一些知识蕴含其中

GloVe与论文学习

  • 上面这幅图分别与Word2VecWord2Vec中的CBOWCBOWCloveClove进行比较,发现,在同样的训练时间下,GloVeGloVe的准确率比CBOWCBOWSkipGramSkip-Gram要好

3、论文总结

  • 关键点
    • 矩阵分解的词向量学习方法
    • 基于上下文的词向量学习方法
    • 预训练词向量
  • 创新点
    • 提出了一种新的词向量训练模型
    • GloveGlove在多个任务上取得最好的结果
    • 公布了一系列预训练的词向量
  • 启发点
    • 相对于原始的概率,概率的比值更能够区分相关的词和不相关的词,并且能够区分两种相关的词
    • 提出了一种新的对数双线性回归模型,这种模型结合全局矩阵分解和局部上下文的优点

四、代码实现

实现GloveGlove,具体代码见我的Github