Glove,话说这个模型好像一直没太了解.jpg,补票!
简介
首先这篇文章一上来就有个地方没看懂,文章说当时的大多数词向量表示是依赖于the distance or angle between pairs of word vectors也就是向量间的距离和角度,但最近以Mikolov为首的提出了一种基于单词类比(word analogies)的方法,其所依赖的not the scalar distance between word vectors, but rather their various dimensions of difference.我琢磨了一下这scalar distance和various dimensions of difference,前面那个标量距离还好懂,后面这个多维度上的差距到底说的是个什么。
好在后面给出了解释,king is to queen as man is to woman这句话中,希望能够达到king − queen = man − woman的效果,所以这里应该就是指直接计算的距离和L1、L2之类距离的一个区别吧,话说其实就是这张图了:
这样看好懂一些,CS224也用过类似的图。这个思想是希望给模型的维度赋予意义,如图中那样,向量之间的运算得到的结果,可以用来模拟对应的词语含义的相加得到的结果,如King + Female = Queen这样。
当时学习词向量主要采用的是两种方法:
- 全局矩阵分解,如LSA。
- 局部上下文划窗,如Skip-grams和上面提过的Mikolov的方法,话说Mikolov不就是提出了Skip-grams和CBOW吗。
这两种方法都存在比较大的缺陷。
LSA这样的全局方法利用了全局的统计信息(从后文来看,应该就是词语的共现计数),但对于涉及到个别词的类比能力很差,后面这句indicating a sub-optimal vector space structure我还是没看懂,网上也没有比较靠谱的中英文解读,就按字面意思理解为因此并没给出最优的向量空间吧。
Skip-gram这样的局部方法则是在词语类比上做的很好,但因为基本上是划窗上下文作为样本数据,所以没用到全局的统计信息。
话说到这个地步也很明确了,作者希望提出一种模型能够涵盖上述两种模型的优点。
相关工作
就是介绍一下论文发布前当时的主要方法。
矩阵分解的词表示方法最早可以追溯到LSA,采用低秩近似对含有语料库信息的大型矩阵进行分解,在LSA中,每一行对应一个term,每列则对应一篇文档;相反的,在1996年提出的FAL中,行列皆对应不同的单词,该行该列的数值则是上下文共现次数。
HAL最大的问题是:那些使用率极高的单词在共现次数上表现得很高,但对于相似度计量的贡献却很低,相当于停用词,虽然随处可见但对语义分析的贡献无限接近于零。为了解决这一问题,COALS方法对那些明显高出正常共现计数8到9倍的词语的共现次数进行了压缩,后来又提出了进一步解决问题的“正值点互信息”(PPMI),公式为。p(w)和p(c)是两个单词的分别出现频率,p(w,c)则是共现频率,寄望于用w和c中相对低的那个词语的出现概率拉低整体的共现评分。再后来也有采用Hellinger转化的PCA之类的方法。
基于窗口的方法主要则以Word2vec的两种变种形式为主,这种方法没能利用到词语之间的共现关系是一个比较大的缺陷。
Glove模型
符号确认
- X:词语共现矩阵,表达单词i上下文中出现单词j的次数。
- ,即单词i的出现次数为全部与之共现的词的与其共现次数之和
- 表示在给定单词i的出现次数时,单词j与单词i共现的条件概率。
以上图为例,可以看到solid与ice的关系更近,gas与steam的关系更近,于是gas和steam分别在这两个词中有高过对方的出现率,比率也分别很高和很低。而由于water、fashion这样的词和两个词的关系要么都很近要么都很远,共现率的比率就很接近1。
这说明了计算共现次数之间的比率比单纯的计算贡献率更有意义,公式如下:
其中为词向量,为单独的上下文词向量。在上式中,公式的右半边是完全可以从语料库中计算出来的共现比率,而左侧的F则可以根据参数决定,也是我们所要学习的目标函数。而如果希望F对进行编码且具有具体的含义,则很容易想到将其与向量间的距离对应,公式演进为:
接下来这句话我又没太看懂,我的理解是,其实F只要足够复杂就能够完成上面的模型,但这里希望F保持线性结构不被破坏,但我没理解为什么要保持线性结构,总之为了降低F的复杂度,进一步将公式简化为:
对于单词共现矩阵,任意交换两个单词,结果应该是不变的,中心词i、j和上下文词k也是可以互换的:
进而可得:
到了这一步,单词i和单词k的共现比率已经完全和向量乘积挂钩了,接下来设F为exp():
这里可以注意到,如果没有{X_i}的话,则k和i任意交换都不会对右侧有影响。 那么,考虑到{X_i}和k无关,则将其转换为一个依赖于i的偏置换到左侧,然后再加上一个k的偏置:
接下来是重点,首先为了防止发散,不能对0求对数,需要加一个1来平滑。
其次,目前的公式给所有的共现词以相同的权重,包括那些出现次数很少,很可能相当于噪声且带不来多少信息的词汇。为此,需要在原模型上添加一个关于的权重函数——哦对了,因为各个单词可以随意替换,现在k可以换回j了:
其中V为词典规模大小。
对于加权函数f,需要符合以下限制:
- f(0)=0,如果f为连续函数,则随着参数逐渐接近于0,f也要降低的足够快,这是因为函数希望能够给一个较低的共现次数以同样低的分数。
- f(x)应该是递减的,否则出现次数越少的共现越会得到更高加权。
- 但f(x)对于过大的共现次数也应给出较少的分数,以免对那些大量出现但无意义的类似停用词的词语给出较大权重。
最终发现这样的一个函数能很好满足上述条件:
这样一来,函数会随着的上升而不断上升,但到达最大值以后就会停下,此时f(x)=1,后面就都是1了。
需要说明的是,四分之三是作者在调参时找出来的一个比1好的α值,作者还在文中指出,如果分段进行参数收缩,效果可能会变好。
后文是对模型复杂度的论述以及模型效果表现,这里不继续解读了。
总结
在两小时内看完这玩意对于初学者的本人来说还是有点头痛了,不过排除推导过程,只看最终公式其实就是一个同时把【全局统计计数】和【上下文单词计数】同时纳入考量,在此基础上学习各个单词的词向量。
J这个目标函数应该还是期待它趋近于0的,只不过在X比较小的时候,后面的词向量计算需要的是作用就更小了,为0的时候更不用提。i和j分别是什么呢?当然是关心的两个词语,通常来说,就是从邻近的上下文中获取的。最终模型说是i和j,其实是i和k的关系,原始设定的另一个与i计算比率的词j已经在计算的过程中被约掉了。