目录
1.word2vec存在的不足
word2Vec模型训练是采用周围词预测中心词或者中心词预测周围词,其认为上下文相近的词其在词性语义信息上也是相似的,因此通过上下文与中心词的语义信息将不同的词联系到了一起,在网络模型训练的时候使得上下文语义相近的词在高纬空间中互相靠拢。但是word2vec也存在了一个缺陷,其训练的上下文与中心词都是基于一个局部的滑动窗口内,然而局部窗口的是代表不了全局的信息的。比如,有一篇关于苹果公司的报道,全局上“苹果”应该都倾向于公司的语义。但是报道里也报道了员工上班会带个苹果吃,而此时这个苹果语义上是一个水果,但是当我们的滑动窗口滑动至此的时候,所采集上的中心词(苹果,水果类)与上下文其所提供的给模型的信息都与之前苹果的上下文不同,也可以说此时的滑动窗口提供了一个噪声数据,这就会使得模型困扰,也会让原本将词“苹果”在往“公司”语义上靠时又往外拉。所以word2vec不足之处在于依赖局部上下文信息,然而若局部上下文信息因为“断章取义”提供了噪声数据给模型,这将会使得模型的最终效果大打折扣,滑动窗口越小,所提供的局部信息也明显。GloVe模型也是针对word2Vec局部性的不足进行改进。
2.共现概率比
2.1共现矩阵
想要捕捉全文的语义信息,这就不得不提出共现矩阵,其反应了在预料库中,中心词与关联词的关联程度,所谓的关联词,和word2vec一样,就是一个滑动窗口,在这个窗口内的词我都默认与中心词有关系,但是这里不像word2vec,滑动一次就采样,共现矩阵的滑动是只是统计,等窗口在全文上滑动结束了,最终统计出基于全文的统计信息。
这里举例,假设语料库为:
(1)I want to go swimming
(2)I want to go shopping
(3)I want to go outing
假设我的滑动窗口为window=1(就是word2vec中的skip-window),此时我建立起自己的共现矩阵为:
I | want | to | go | swimming | shopping | outing | |
I | 0 | 3 | 0 | 0 | 0 | 0 | 0 |
want | 3 | 0 | 3 | 0 | 0 | 0 | 0 |
to | 0 | 3 | 0 | 3 | 0 | 0 | 0 |
go | 0 | 0 | 3 | 0 | 1 | 1 | 1 |
swimming | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
shopping | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
outing | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
行表示中心词,列表示关联词。(背景是黄色),其表示在全文预料中,词“want”出现以词“I”为中心的滑动窗口内所有次数。 (背景是红色的)表示词"swimming"出现在以词"go"为中心的滑动的所有次数。因此也不难看出共现矩阵是一个对称矩阵,其次共现矩阵基于全文信息统计,反应2个词之间的关联程度。
2.2共现概率
共现的矩阵表示里面的元素表示词“j”出现在以词“i”为中心词的频数。因为基数的不同,频数我们很难判断该词与中心词的联系。比如,若关联词j在中心词为i的滑动窗口中出现100次,若中心词i全文一共作为中心词100次,那么词i和词j是强关联的,只要出现词i的地方就一定出现词j。但若中心词i出现了1亿次,词j与词i的关联就很小很小了。因此单单看共现矩阵的频次是无法让我们更直观的感受到词i和词j的关联程度。而共现概率比的计算公式如下:
这里的公式很容易看懂,分母其实就是中心词为i所有背景词出现的频次和,在表格中就是行的和,而共现概率就是具体某一元素的值占比行值和的比例(结合共现矩阵轻松理解)。那么共现概率更直观的反应两个词之间的关联程度。若共现概率越大,说明两个词关联程度越高,反之则越低。
2.3共现概率比
Glove作者在共现概率的基础上又提出了共现概率比这个东西,先看一下定义:
定义很简单,即同一关联词基于不同中心词的共现概率的比值。这有什么用呢?我们借用原文的一组数据观察:
我们发现词solid(固态)出现在ice(冰)周围的概率是大于词solid出现在steam(蒸汽)周围的,这也很符合常识。其外gas(气体)出现在ice周围是小于gas出现在steam周围的,这样很符合常识。真正的重点在于第三行,我们发现:
(1)当k与ice关联程度大于k与steam的关联程度时,其比值大于1,这种关联程度相差越远,比值越大。因此我们可以得出结论,当比值很大的时候(趋于无穷),k与ice有关于steam无关
(2)当k与ice关联程度小于k与steam的关系程度时,其比值小于1,同理这种关联程度相差越大,比值越接近0。因此结论为:当比值接近0的时候,k与ice无关与steam有关。
(3)当k与ice关系程度和k与steam关联程度相近时,其比值接近1。结论:k可能与ice和stem有关,也可能完全无关。
总结在下面的图(网上随处可见):
这个比值的优势在哪里?之前我们通过共现概率可以观察两个词之间的关联程度,然而现在通过共现概率比,我们可以观察三个词之间的关联了。而GloVe词向量的训练正是基于共现概率比去做的,我们要清楚,给定语料库,共现概率比我们是可以求出来的,这个值对我们来说是一个先验知识、常数、标量。我们需要做的就是让这三词的词向量去满足这个共现概率比,这也是GloVe算法训练的核心思想。
3.Glove算法
前面说了,我们训练的目标就是让语料库中的三个词向量之间的关联满足共现概率比,这三个词向量分别是中心词和关联背景词。我们假设找到了某种弄映射函数满足使得这三个向量最终满足共现概率比:
观察上式公式,我们发现右边是标量,而左边是向量,使得向量最终得到一个标量只能通过向量的内积操作,于是作者先用中心词作差(去掉共线性),在于背景词内积,即:
我们发现左边是差的形式,而右边是分子分母形式,可以这样的映射,那么可以推出为:
因此,我们可以得到
我们对上式两边取对数:
看似好像大功告成,我们已经找到了这种映射关系,接下来只要代入去训练词向量即可,但是:
上面两式中,左边是两个向量交互内积顺序,其值是相等的。在看右边,我们知道共现矩阵只一个对称矩阵,所以。但是与却不一定相等,因此这个公式推导不能成立。作者在这里进行了一步改写(也是GloVe一直存在争议的地方),将上式改写成:
即找到两个新的标量(偏置)使其满足等式,为了便于观察我们将新加的标量左移:
到这里,我们可以总结,Glove推导到最后总结的规律就是:我们要做的训练向量使得中心词向量和关联词向量(也可以理解为word2Vec里面背景词向量)内积加上偏置趋于共现概率比的对数。
已经知共现概率比是一个标量,为了使得我们向量内积加上偏置趋于这个标量,因此我们的损失函数考虑的均方误差(考虑回归):
4.损失函数
上面我们推得的损失为:
根据齐夫定律,我们知道,高频词往往携带的信息较少,而低频词往往携带较多的信息。若损失函数这样设置,将会使得模型趋于高频词。因此作者在此损失函数之前乘一个惩罚系数,即:
我们希望这个惩罚系数对于高频词的惩罚重一些,对于低频词的惩罚轻一些,让模型减轻对高频词的倾向性,因此作者将词惩罚系数函数设置为:
其中,表示一个阈值(超参)而非共现矩阵中的元素的最大值,高于此阈值的将视为高频词(原文作者设置为100),对其的惩罚系数将会为最大,即为1。而也是一种超参数,这类似于word2vec的重采样(要明白Glove就是针对word2vec的改进),作者对其设置为0.75,Word2vec中,负采样的也是设置为0.75。惩罚系数的函数图像如下:
可以关注,在低频词的时候系数很小,我们也发现当共现频次为0的时候,惩罚系数也为0,那么算的损失也将为0,这个惩罚系数也避免了无关联词参与了损失的计算中去(即模型在优化的过程中,不会考虑这些无关词,虽说参与了运算,但是对损失函数结果并未造成任何影响)。
5.词向量
最终函数收敛以后我们会得到两个词向量矩阵,即中心词向量矩阵和背景词向量矩阵,这与word2vec是一样的。但是在最终获取词向量的方式上所有不同,word2vec只拿了其中的一个矩阵,并将句子的每一行作为最终的词向量。而GloVe是两个都保留了,我们知道两个词向量矩阵同一行代表的是同一个词的向量,只是因为初始化不同,最终训练得到两种不同的词向量,但是都表示同一个词。Glove的做法是将其进行相加得到了最终的词向量:
仔细思考一下,我们是根据一个共现概率比来计算的,但是共现概率依赖于共现矩阵,而共现矩阵又是一个对称矩阵,因此两个向量应该计算出一样的结果,但是由于初始化的原因,最终训练出不同的结果,其实取其中之一即可,但是为了提供词向量的鲁棒性,作者将二者相加。