GloVe与论文学习
一、介绍
GloVe最早由斯坦福大学的 Jeffrey Pennington 于2014年提出,发表的文章为《GloVe: Global Vectors for Word Representation》,发表在EMNLP上
二、论文导读
1、背景知识
文章中提到了学习词向量的两种方法:
- 矩阵分解方法( Matrix Factorization Methods ):所谓的矩阵分解方法,是先构造一个词共现矩阵,例如如果这里有三句话: I enjoy flying. 、 I like NLP. 、 I like deep learning. ,则这词共现矩阵如下图所示(规定window=1,即只有在该词左右的一个词才称之为共同出现);通常来说,词共现矩阵非常大,为∣V∣×∣V∣的一个矩阵,因此我们需要使用降维的方法对矩阵降维,得到的降维后的矩阵就是一个一个的词向量

- 基于上下文的向量学习方法( Shallow Window-Based Methods ):所谓的基于上下文的向量学习方法就是Word2Vec中的CBOW和Skip−Gram这两种方法:
文章中提到,上述的两种学习词向量的方法都有缺点,矩阵分解方法在词对推理任务上表现特别差,同时解释性较差;而基于上下文的向量学习方法的缺点是无法使用全局的统计信息,因此文章中提出了一种对数双线性回归模型
2、研究成果及意义
- 成果:
- 在词对推理数据集上取得最好的结果
- 公布了一系列基于GloVe的预训练词向量
- 意义:推动了基于深度学习的自然语言处理的发展,尤其是预训练词向量被广泛引用,在 Google Scholar 上的引用量已破万
三、论文精读
1、GloVe模型
文章中提到,我们可以使用一些词来描述一个词,比如我们使用冰块和蒸汽来描述固体、气体、水和时尚四个词。如果与词语与冰块接近,并且和蒸汽不接近,那么这个词很有可能是固体,并且概率比值很大;如果与蒸汽接近,并且和冰块不接近:那么这个词很有可能是气体并且概率比值很小;如果与冰块和蒸汽都不接近: 那么这个词很有可能是水和时尚并且概率比值不大不小,论文给出的具体的结果如下表所示:

因此,根据这个思路,我们就可以通过共现矩阵的概率比值可以用来区分词,这也是GloVe模型的核心思想.
既然通过概率比值可以用来区分词语,那么应该如何计算概率比值呢?文章中给出了概率比值的计算公式:
F(wi,wj,w~k)=PjkPik
从上面的公式中可以看出,公式与三个参数:wi,wj,w~k有关,表示的含义是词w~k与词wi和wj这两个词之间的差异,因此,既然是表示wi和wj这两个词之间的差异,我们可以将公式改写为:
F(wi−wj,w~k)=PjkPik
同时注意到,最后得到的比值一定是一个数,即标量;而等式坐标的括号中,wi,wj,w~k均是词向量,如果将向量转化为标量呢?文章中给出的方法是内积的方法,即公式可转换为:
F((wi−wj)⊤w~k)=PjkPik
这里我们就可以认为公式中的F表示的是一个标量映射到了另一个标量,而括号中的参数可以通过学习得到
前文提到F表示的是一个标量映射到了另一个标量,那么F具体应该是一个怎样的函数呢?文章中将F函数认为是指数函数exp,那么可以得到:
F((wi−wj)⊤w~k))=F(wi⊤w~k−wj⊤w~k)=exp(wi⊤w~k−wj⊤w~k)=exp(wj⊤w~k)exp(wi⊤w~k)=PjkPik
我们可以令分子分母分别等于Pik和Pjk,即:
{exp(wi⊤w~k)exp(wj⊤w~k)=Pik=Pjk
因此,对于任意的词向量wi,均成立:exp(wi⊤w~k)=Pik,i∈(0,∣V∣).
由于Pik=XiXik,因此exp(wi⊤w~k)=Pik=XiXik,两边同时取对数得:wi⊤w~k=log(Xik)−log(Xi);由于log(Xi)只与Xi有关而与wk无关,因此可以将将等式变换为:wi⊤w~k+log(Xi)=log(Xik),由于与wk无关,因此可以将log(Xik)视为一个转置bi,即:
wi⊤w~k+bi=log(Xik)
注意到,如果我们将wi和wk对调,可以发现等式右边log(Xki)=log(Xik),但是wk⊤w~i+bk并不等于wi⊤w~k+bi,因此$\log(X_{ik}) $的形式为:
wi⊤w~k+bi+bj=log(Xik)
推导得到wi⊤w~k+bi+bj=log(Xik)后,我们就可以构造损失函数J,文章中使用交叉熵损失函数:
J=i,j=1∑Vf(Xij)(wiTw~j+bi+b~j−logXij)2
这里的f(Xij)用于刻画词对出现次数对损失函数的影响,即词对出现次数越多,那么这两个词在损失函数中的影响越大,但是f(Xij)需要满足一定的条件:
-
Xij=0时,f(Xij)=0:表示没有共现过的权重为0,不参加训练
- 非减函数,因为共现次数越多,权重越大
-
f(Xij)不能无限制的大,防止 is , are , the 这一类词语的影响
论文中构造的f(Xij)为
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hohanrl6-1598087000349)(./_image/2020-07-22-00-01-28.jpg?r=40)][center]
其中xmax和α均为大于0的数,需要自己决定取值,文章中xmax=100, α=43,函数图像如下:

推导完GloVe的核心公式后,我们再回过头看一下如果进行训练:
- 第一步:构建词共现矩阵( term-tern )
- 第二步:去掉矩阵中为零的元素,只对非零元素进行训练
- 第三步:生成训练集(两组词向量)
2、实验结果及分析
(1)GloVe实现的成绩
- 在词对推理数据集上取得最好的结果
- 多个词相似度任务上取得最好的结果
- 命名实体识别实验结果
(2)分析参数影响

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

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

- 上面这幅图分别与Word2Vec中的CBOW和Clove进行比较,发现,在同样的训练时间下,GloVe的准确率比CBOW和Skip−Gram要好
3、论文总结
- 关键点
- 矩阵分解的词向量学习方法
- 基于上下文的词向量学习方法
- 预训练词向量
- 创新点
- 提出了一种新的词向量训练模型
-
Glove在多个任务上取得最好的结果
- 公布了一系列预训练的词向量
- 启发点
- 相对于原始的概率,概率的比值更能够区分相关的词和不相关的词,并且能够区分两种相关的词
- 提出了一种新的对数双线性回归模型,这种模型结合全局矩阵分解和局部上下文的优点
四、代码实现
实现Glove,具体代码见我的Github