glove 学习笔记

话不多说,入正题。

动机:

现有的词向量模型,
1 局部上下文建模的方法 例如word2vector
用通俗的话来讲就是,如果两个词在训练语料中出现的上下文比较类似,比如“食堂”和“餐厅”,都在“我”,“去”,“吃饭”这种上下文上出现了许多次,那么他俩的词向量就比较相似。
2 矩阵分解的方法,例如LSA
将文档和单词的共现矩阵,也就是行是文档,列是单词,第i行第j列,表示文档i中是否包含单词j(具体是词频还是是否出现记不清楚了,不过不影响)。然后通过SVD矩阵分解的方式就能够得到两组向量,分别表示文档的向量(可以用来做文本距离)和单词的向量。(这种方法相对于word2vector的优势就是利用了词共现的信息,也就是不仅仅只关注word2vector窗口大小的上下文,而是用到了全局信息)

所以作者就想把两者都优点给结合起来。
那么想把这两个东西都利用起来,应该怎么学习词向量呢?
首先,作者计算了两个东西。记录词典维度为V
1 X ( 一个 VxV的矩阵), Xij 表示了词j和词i所在的上下文中出现的次数,至于上下文,就是在一定范围的窗口内(窗口大小为K)。
2 Xi 表示以词i为中心的上下文的所有词。
举例:“苹果”一个词,在语料中出现了10词,窗口大小为20,那么 Xi 就是200,而在这些词中“手机”一次出现了20次,那么 Xij 中对应的那个值就是20。

有了这两个东西,我们能干啥。
P(j|i)=Xij/Xi
我们就能通过一个比值的方案。我们可以看大
solid(固体)ice(冰块)gas(气体)steam(蒸汽)
这里写图片描述
这个图中最后一行中8.9和0.08.5说明,solid在ice的上下文中出现的次数远远比在steam的上下文中出现的次数多,而在gas上则相反。
作者总结出,对于词i,j,k,如果k在i和j的上下文中出现的次数比率太大或太小,这说明其中有相关性存在,而如果这个 比值接近1,那么就没啥意义。
因为我们要学习词向量,所以的用数学公式表达,然后设计成loss function。
比率的意义与wi,wj , wk相关,所以有下面的公式。我们希望有一个函数F来拟合共现矩阵的比率关系
这里写图片描述

接下来,我们知道词向量具有线性关系,也就是国王-女王 = 男人-女人,所以我们显示的把词向量的差加入公式(感觉这么说有点牵强,引用别人的解释@飞奔的石头456:同时因为向量空间是内在线性结构,最自然、能达到这个目的就是做差。)
这里写图片描述
为什么有公式(3),作者论文中说的是,因为公式左边是向量,但右边是标量,而且如果以公式(2)的形式,使得输入是向量,那么F的参数可能让我们学不到我们想要学习的线性关系,所以这么搞。但给我的感觉是word2vector中的优化目标就是两个向量的点乘。可能这么做更有道理。
这里写图片描述
公式(4)是怎么来的。我也是看了一会才明白。我们这里把词i,j叫做上下文词,把k叫待预测词,但这种关系是可以对称的,也就是k也可以作为上下文词,然后去看i,j和他的相关度,也就是我们把X转置,也可以算出差不多的结果。
那么我们就需要我们的f满足可加性和可乘性。
所以由公式三。我们可以得到公式(5),把5带入就能得到公式(4)
这里写图片描述

这里写图片描述
从而推出
这里写图片描述

到这里,大概的思路就差不多了。
贴一个word2vector的损失函数的形式
这里写图片描述
作者再通过加偏置和加权就能够得到如下的损失函数,也就是优化目标。(如果需要详细了解公式(16)的可以去看原文,但我认为如果只需要了解glove这些细节不需要去深究)
可以看到。损失函数中有 Xij 这一项,用到了全局信息。
这里写图片描述

虽然glove在有些地方有他的有点,貌似现在好多任务中,word2vector还是最常用的。

感谢@飞奔的石头456
http://blog.csdn.net/weixin_36711901/article/details/71241590

原文链接
https://nlp.stanford.edu/pubs/glove.pdf

欢迎大家批评指正