Press enter to see results or esc to cancel.

【GloVe: Global Vectors for Word Representation】

前几天看一篇中文的论文看的顺眼,就想着写一篇中文的论文的笔记换换胃口,可今天正式尝试看了一下里面的内容看的自己脑壳痛,想了想原因,首先英文在一些名词术语方面的表述相比于中文来说是有很大的优势的,中文的翻译就是洋不洋土不土的,其次自己看的英文文献还是以大牛的文章或者是有重要历史地位的文章居多,所以看起来就会舒服很多。其实今天自己看的一个也算是中文核心期刊,作者是武大计算机学院的一个教授,出品理应是有保障的,但是看起来还是看的头疼,虽然自己水平不一定多高,不过论文里面的内容确实不敢恭维。所以在晚上十点多临阵换将,把Glove写一下。

Glove是斯坦福的Manning大神写的一篇文章,和Word2Vec一样都还是属于Word Embedding的内容范畴,顺便说一嘴,Manning大神最近也搞了个Stanza的工具包,可以蛮方便的做NER,POS还有分词这种基础性的自然语言处理的工作。

Introduction

词向量的构建方法一般分成两种,基于全局的矩阵分解的方式,比如说LSA通过SVD的方法获得U矩阵,即单词的词向量,但是由于是从全局的视角看,必然只见森林不见树木。或者是局部的方法,比如说Mikolov的Skip-Gram完全没有使用到全局的信息,但是更好的获得了词语的analogy的信息,这又只见树木不见森林了。所以文章提出了一种方法,又可以看见树木又可以看见森林。

Model

词语的共现矩阵是一个非常重要的统计特征,但是如何使用这个共现矩阵是一个非常值得考虑的方法,错误的操作很有可能导致最终的向量结果无法正确的表达词语的含义。那么作者是怎么操作的呢?

首先我们规定一些记号,将词语的共现矩阵记作是$X$,共现矩阵的含义我就不赘述了,相信大家都有了解。将$P_{ij} = P(j|i) = X_{ij}/X_{i}$,也就是词语$j$出现在单词$i$的周围的概率记作是共现概率。

文中使用一个小例子展示了可以使用共现概率表示单词的含义。假设存在两个单词$i$以及$j$都分别表示了某个特殊的含义。比如说$i$是Ice而$j$是Steam,通过比较他们与其他的乱七八糟的单词的共现概率就可以得到他们的关系。比如说与Solid这个单词的共现概率,很明显Ice会和Solid共同出现的可能性更高,而Steam则没有那么可能和Solid共同出现,将$k$记作是Solid的话,以$P_{ik}/P_{jk}$就会很高。而如果$k$是Gas的话,那么这个比值就会比较低。而如果是其他的一些与Ice和Steam并没有这么多联系的单词,那么这个比值可能会趋近于1.也就是说这个比值可以反映出所需要比较的单词在给定某些单词的情况下出现的不同的特征。

通过上面的过程,可以知道,在给定了$i,j,k$的情况下就可以得到一个唯一的值,那么就可以看成是一个函数映射三个词向量成为一个标量。简单的记作是

$$F(w_{i} , w_{j} , \tilde{w_{k}} ) = \frac{P_{ik}}{P_{jk}}$$

其中的$w_{i},w_{j}$就是正常的单词的词向量了,而$\tilde{w_{k}}$加了一个波浪说明事情没有那么简单。那么这个波浪代表什么呢?稍安勿躁,后面解释。我们希望词向量是可以表示词语之间的相似程度的,所以我们要在目标之后进行表示,所以对于上面的函数的表示进行一点点小修改。

$$F(w_{i}-w_{j} , \tilde{w_{k}} ) = \frac{P_{ik}}{P_{jk}}$$

通过这样一个减号表明我们这是要计算相似性了。再好好的看一看上面的式子,我们的左边是通过函数的映射方法得到右边的概率而右边是一个标量,左边的映射函数则是可以随便挑的,如果选择了神经网络的话,那么就不知道变成了什么鬼样子了,说不定直接把$k$给丢掉了也不好说。所以为了更好的利用这些可能的特征,将函数的自变量再给改变一下

$$F( (w_{i}-w_{j})^T \tilde{w_{k}} ) = \frac{P_{ik}}{P_{jk}}$$

搞定了这些之后,确保不管选择什么函数都可以利用到一切信息,而且不会丢失向量之间的线性结构。作者注意到了在共现矩阵之中,Context Word和Word是可以任意交换的而这并不影响最终的共现矩阵的值,但是上面的等式是无法满足这一点的(因为前面的变化函数可能会比较复杂),所以又做了一步变化

$$F( (w_{i}-w_{j})^T \tilde{w_{k}} ) = \frac{F(w_{i }^{T} \tilde(w)_{k} )}{F(w_{j }^{T} \tilde(w)_{k} )}$$

也就是说把$P_{ik} $用$F(w_{i }^{T} \tilde(w)_{k} )$表达。可能是为了可以把所有的这套运算逻辑都是在同一个运算空间之中进行,就可以保证上面的那点。而把上面的那个方程解出来

可以得到

$$w_{i }^{T} \tilde(w)_{k} = \log (P_{ik}) =\log(X_{ik}) – \log(X_i)$$

但是注意到,在这里还是无法满足$i$与$k$的角色互换的,这里依旧存在一个$\log(X_{i})$这一项是与$w_{i}$息息相关的,所以我们选择在左边加两项抵消这一项的影响

$$w_{i }^{T} \tilde(w)_{k} + b_i + \tilde{b}_{k}= \log (P_{ik}) =\log(X_{ik}) $$

而上面的这玩意的右边就可以看成是一个因变量,左边就可以看成是自变量。那么我们就可以用OLS来做这个任务.但是需要注意的是,在语境之中那些出现次数非常小的单词可以认为是噪声一类的东西,我们并不需要考虑他们过多。所以可以根据他们一起出现的频率作为一个权重,然后类似于分配Attention在不同的变量上面。但是这个权重肯定是不能太大的,不然所有的注意力都会被那些出现次数过多的单词对给拿走了。所以作者最后选择了下面的这个模型

图像如下所示

在$x$过大的时候就直接设置为1。

然后对于下面的这个函数进行优化

$$J = \sum_{i,j = 1}^{V} f(X_{ij})(x_{i}^{T}\tilde{w}_{j} +b_{i} +\tilde{b}_{j} – \log X_{ij} )$$

Comments

这篇文章读起来就一股浓浓的数学味,字里行间都充满了那种证明的跳跃性和推理性,看惯了现在的深度学习的文章,再读一些这样数学味浓厚的文章会让人有耳目一新的感觉吧。里面的一些处理,比如说对于函数的构造,比如说为了实现对称性所做的转换都让人感觉非常的优雅,特别是为了对称性,而使用两个$b$来吸收多余的常数项,非常简单的操作,但是却非常难想到。而自己最近读的文章感觉都是给Motivation然后拿神经网络去套,比如说VAE之中的隐层表示就是拿神经网络来模拟(当然VAE的思路也非常的漂亮),完全的使用神经网络的方法确实可以在搞定实操的问题上省事不少,但是这种数学的创造性也不能完全丢弃吧。

无聊查了下Manning的本科,果然是学数学的。

Reference

GloVe: Global Vectors for Word Representation

 

 

 

 

大多数的词向量的评估的方法都是基于下面的一个假设,就是通过比较词向量之间的距离判断他们的相似程度。

 

Comments

Leave a Comment