美文网首页
Glove 原理详细解读

Glove 原理详细解读

作者: zuomeng844 | 来源:发表于2020-08-26 18:15 被阅读0次

    本文主要对《GloVe: Global Vectors for Word Representation》进行解读。

    尽管word2vector在学习词与词间的关系上有了大进步,但是它有很明显的缺点:只能利用一定窗长的上下文环境,即利用局部信息,没法利用整个语料库的全局信息。鉴于此,GloVe诞生了,它的全称是global vector,很明显它是要改进word2vector,利用语料库的全局信息。

    1.共现概率

    什么是共现

    单词i出现在单词j的环境中(论文给的环境是以为中心的左右10个单词区间)叫共现。

    什么是共现矩阵

    共现矩阵是单词对共现次数的统计表。我们可以通过大量的语料文本来构建一个共现统计矩阵。

    例如,有语料如下:

    I like deep learning.

    I like NLP.

    I enjoy flying.

    以窗半径为1来指定上下文环境,则共现矩阵就应该是:

    图1 共现矩阵

    X01:它表示like出现在I的环境(I like区间)中的次数(在整个语料库中的总计次数),此处应当为2次,故第一行第二列应当填2。还应当发现,这个共现矩阵它是对称阵,因为like出现在I的环境中,那么必然I也会出现在like的环境中,所以X10= 2。

    共现矩阵有以下3个特点:

    ·统计的是单词对在给定环境中的共现次数;所以它在一定程度上能表达词间的关系。

    ·共现频次计数是针对整个语料库而不是一句或一段文档,具有全局统计特征。

    ·共现矩阵它是对称的。

    共现矩阵的生成步骤:

    ·首先构建一个空矩阵,大小为V×V,即词汇表×词汇表,值全为0。矩阵中的元素坐标记为(i,j)

    ·确定一个滑动窗口的大小(例如取半径为m)

    ·从语料库的第一个单词开始,以1的步长滑动该窗口,因为是按照语料库的顺序开始的,所以中心词为到达的那个单词即i

    ·上下文环境是指在滑动窗口中并在中心单词i两边的单词。

    ·若窗口左右无单词,一般出现在语料库的首尾,则空着,不需要统计。

    ·在窗口内,统计上下文环境中单词出现的次数,并将该值累计到(i,j)位置上。

    ·不断滑动窗口进行统计即可得到共现矩阵。

    什么是叫共现概率

    定义X为共现矩阵,共现矩阵的元素X_{ij}为词j出现在词i环境的次数,令X_i\sum\nolimits_{k}X _ik,为任意词出现在i的环境的次数(即共现矩阵第i行的和),那么:

    P_{ij}=P(j|i)=\frac{X_{ij}}{X_i}

    为词j出现在词环境中的概率(这里以频率计算概率),这一概率被称为词i和词j的共现概率。共现概率是指在给定的环境下出现(共现)某一个词的概率。注意:在给定语料库的情况下,我们是可以事先计算出任意一对单词的共现概率的。

    2.共现概率比

         接下来阐述为啥作者要提共现概率和共现概率比这一概念。下面是论文中给的一组数据:

    先看一下第一行数据,以ice为中心词的环境中出现solid固体的概率是大于gas、fashion而且小于water的,这是很合理的,对吧,因为现实语言使用习惯就是这样的。同理可以解释第二行数据。我们来重点考虑第三行数据:共现概率比。我们把共现概率相比,我们发现:

    1.看第三行第一列:当ice的语境下共现solid的概率应该很大,当stream的语境下共现solid的概率应当很小,那么比值就>1。

    2.看第三行第二列:当ice的语境下共现gas的概率应该很小,当stream的语境下共现gas的概率应当很大,那么比值就<1。

    3.看第三行第三列:当ice的语境下共现water的概率应该很大,当stream的语境下共现water的概率也应当很大,那么比值就近似=1。

    4.看第三行第四列:当ice的语境下共现fashion的概率应该很小,当stream的语境下共现fashion的概率也应当很小,那么比值也是近似=1。

    因为作者发现用共现概率比也可以很好的体现3个单词间的关联(因为共现概率比符合常理),所以glove作者就大胆猜想,如果能将3个单词的词向量经过某种计算可以表达共现概率比就好了(glove思想)。如果可以的话,那么这样的词向量就与共现矩阵有着一致性,可以体现词间的关系。

    3.Glove优化目标

    想要表达共现概率比,这里涉及到的有三个词即i,j,k,它们对应的词向量用v_i,v_j,\tilde{x}_k表示,那么我们需要找到一个映射f,使得:f(v_i,v_j, \tilde{v}_k )=\frac{P_{ik}}{P_{jk}} ,等式的右边的比值可以通过统计得到。这个比值可以作为标签,我们需要设计一个模型通过训练的方式让映射值逼近这个确定的共现概率比。很明显这是个回归问题,我们可以用均方误差作为loss。当然,设计这个函数或者这个模型当然有很多途径,我们来看看作者是怎么设计的。

    下面将从如何构造f(v_i,v_j, \tilde{v}_k )=\frac{P_{ik}}{P_{jk}} 展开讨论,首先声明以下的内容更多的是体现作者构造模型的思路,不是严格的数学证明。

    为了让f(v_i,v_j, \tilde{x}_k )=\frac{P_{ik}}{P_{jk}} 左右两边相等,很容易想到用两者的均方差做代价函数:

    J=\sum_{i,j,k}^V (\frac {P_{ik}}{P_{jk}}- f(v_i,v_j,\tilde{v}_k )))^2

    但是里面含有3个单词,这意味这要在V*V*V的复杂度上计算,太复杂了。

    为了简化计算,作者是这样思考的:

    1. 为了考虑单词i和单词j之间的关系,那么v_{i} -v_{j}是一个合理的选择

    2.\frac{P_{ik}}{P_{jk}} 是标量,而v_i,v_j,\tilde{v}_k 均为向量,为了将向量转为标量,可以将两个向量做内积,于是有了(v_i-v_j)^T\tilde{v}_k

    3. 接着,作者在(v_i-v_j)^T\tilde{v}_k外面加了指数运算exp(),得到:

    f(v_i,v_j,\tilde{v}_k) =exp((v_i-v_j)^T\tilde{v}_k)

    即:f(v_i,v_j,\tilde{v}_k) =\frac{P_{ik}}{P_{jk}} =exp((v_i-v_j)^T\tilde{v}_k)

    即:\frac{P_{ik}}{P_{jk}} =exp(v_i^T\tilde{v}_k-v_j^T\tilde{v}_k)

    即:\frac{P_{ik}}{P_{jk}} =\frac{exp(v_i^T\tilde{v}_k)}{exp(v_j^T\tilde{v}_k)}

    这样,便可以发现简化方法了:只需要上式分子对应相等,分母对应相等即可。

    即:P_{ik} =exp(v_i^T\tilde{v}_k)并且P_{jk} =exp(v_j^T\tilde{v}_k)

    考虑到P_{ik} =exp(v_i^T\tilde{v}_k)P_{jk} =exp(v_j^T\tilde{v}_k)形式是相同的,于是进行统一考虑,即:

    P_{ij} =exp(v_i^T\tilde{v}_j)

    本来我们追求的是:f(v_i,v_j, \tilde{v}_k )=\frac{P_{ik}}{P_{jk}}

    现在只需要追求:P_{ij} =exp(v_i^T\tilde{v}_j)

    两边取对数:log(P_{ij}) = v_i^T\tilde{v}_j

    那么代价函数可简化为:J=\sum_{ij}^V(log(P_{ij})-v_i^T\tilde{v}_j)^2

    现在只需要在V*V的复杂度上进行计算。

    4.仔细观察log(P_{ij}) = v_i^T\tilde{v}_jlog(P_{ji}) = v_j^T\tilde{v}_i可以发现:log(P_{ij})不等于log(P_{ji})但是v_i^T\tilde{v}_jv_j^T\tilde{v}_i是相等的。即等式左侧不具有对称性而右侧有对称性。这在数学上出现问题,有可能会导致模型无法训练优化。

    为了解决这个问题将log(P_{ij}) = v_i^T\tilde{v}_j中的log(P_{ij})按照条件概率展开,即为: log(P_{ij}) = log(\frac{X_{ij}}{X_i} )=log(X_{ij})-log(Xi)= v_i^T\tilde{v}_j

    将其变为:log(X_{ij})=v_i^T\tilde{v}_j+b_i+\tilde{b} _j

    即添加一个偏置项\tilde{b} _j,将log(X_i)吸收到偏置项b_i中。

    于是代价函数变成了: J=\sum_{ij}^V (v_i^T\tilde{v}_j+b_i+\tilde{b} _j-log(X_{ij}))^2

    5.在代价函数中添加权重项,于是代价函数进一步进化为:

    J=\sum_{ij}^V f(X_{ij})(v_i^T\tilde{v}_j+b_i+\tilde{b} _j-log(X_{ij}))^2

    f(X_{ij})是怎样的呢?有什么作用呢?为什么要添加权重函数?

    我们知道在一个语料库中,肯定存在很多单词他们在一起出现的次数是很多的,那么我们希望:

    1.这些单词的权重须大于那些很少在一起出现的单词,所以这个函数要是非递减函数;

    2.但我们也不希望这个权重过大,当到达一定程度之后应该不再增加;

    3.如果两个单词没有在一起出现,也就是X_{ij}=0,那么他们应该不参与到loss function的计算当中去,也就是f(x)要满足f(0)=0

    满足以上条件的函数有很多,作者采用了如下形式的分段函数:

    函数图像:

    这篇glove论文中的所有实验,的取值都是\alpha 为0.75,而x_{max}为100

    也就是说词对共现次数越多的,有更大的权重将被惩罚得更厉害些;次数少,有更小的惩罚权重,这样就可以使得不常共现的词对对结果的贡献不会太小,而不会过分偏向于常共现的词对。

    那么总结下,glove的优化目标为:J=\sum_{ij}^V f(X_{ij})(v_i^T\tilde{v}_j+b_i+\tilde{b} _j-log(X_{ij}))^2

    Question&Answer

    Question1: GloVe是如何训练的?

    Answer1: 虽然很多人声称GloVe是一种无监督的学习方式(因为它确实不需要人工标注label),但其实它还是有label的,这个label就是优化目标中的log(X_{ij})。而优化目标中的v_i,\tilde{v}_i就是要不断更新/学习的参数,所以本质上它的训练方式跟监督学习的训练方法没什么不一样,都是基于梯度下降的。具体地,这篇论文里的实验是这么做的:采用了AdaGrad的梯度下降算法,对矩阵中的所有非零元素进行随机采样,学习率(learning rate)设为0.05,在vector size小于300的情况下迭代了50次,其他大小的vectors上迭代了100次,直至收敛。最终学习得到的是两个vector是v_i,\tilde{v}_i,因为X是对称的,所以从原理上讲v_i,\tilde{v}_i也是对称的,他们唯一的区别是初始化的值不一样,而导致最终的值不一样。所以这两者其实是等价的,都可以当成最终的结果来使用。但是为了提高鲁棒性,最终会选择两者之和作为最终的vector(两者的初始化不同相当于加了不同的随机噪声,所以能提高鲁棒性)。

    三千多字,码字不易,如果大家发现我有地方写得不对或者有疑问的,麻烦评论,我会回复并改正。对于重要问题,我会持续更新至Question&Answer。

    参考

    Pennington J , Socher R , Manning C . Glove: Global Vectors for Word Representation[C]// Conference on Empirical Methods in Natural Language Processing. 2014.

    CS224N Winter 2019

    Glove模型---词向量模型

    GloVe详解

    详解GloVe词向量模型

    相关文章

      网友评论

          本文标题:Glove 原理详细解读

          本文链接:https://www.haomeiwen.com/subject/wukfsktx.html