词作为自然语言处理中的一个基本单元,如何表示一个词对于后续的处理任务至关重要,最简单的表示方式是 One-hot,但是该方法表示的词之间是相互独立的,因此局限性很大,需要采用一种更合理的表示方法。
1. 前言
目前,学习词向量的方法主流的有两种:
全局矩阵分解的方法,比如LSA,HAL,这类方法首先统计语料库中的“词-文档”或者“词-词”共现矩阵,然后通过矩阵分解的方法来获得一个低维词向量。“词-文档”矩阵是指矩阵的行表示词,列表示文档,矩阵的元素是改词在文档中出现的次数。“词-词”共现矩阵的行和列都表示一个矩阵,
局部上下文窗口的方法, 比如skip-gram,通过神经网络的方法使语料库中给定上下文中共同出现的单词对的概率更大
但是这两种方法都有一个缺点全局矩阵分解的方法虽然利用了全局统计信息,但是他会过度重视共现词频高的单词对,然而这些词并没有多大的语义联系,局部上下文窗口的方法虽然在词类比方面的任务表现的很好,但是没有充分利用全局统计信息。
该篇文章的主要思想就是两者取其长,结合各自的优点进行词向量学习。
2.Glove
首先我们先定义一些符号
: 表示“词-词”共现矩阵,是一个对阵矩阵
: 表示词 j 出现在中心词 i 的上下文(基于窗口)的次数。
: 表示任何词出现在词 i 上下文的总的次数。
: 表示单词 j 出现在 单词 i 的上下文的概率。
假设我们有一个检测词 k,则存在如下关系
j,k 相关 | j,k不相 | |
---|---|---|
i,k相关 | 1 | 非常大 |
i,k不相关 | 非常小 | 1 |
上面表格的意思就是当词 i,k相关时,如果j,k相关,则接近于1,如果j,k不想管,此时非常小,则的值会很大,如果i,k不相关,我们可以依次类推出上面的结果。
如果我们单纯地预测,此时就变回skip-gram,我们如何利用全局统计信息呢,此时我们可以利用上面表格思想,我们预测概率的比率,即:
其中,表示一个d维的词向量, 表示上下文检测词。这里的F存在很多解,但是我们可以一步步地添加约束来得到最后的一个解
因为向量空间具有线性结构,因此我们只考虑函数 在目标词的差异上进行运算(这个原因个人觉得理由有点牵强)
这句话是个人的理解:个人感觉这一部还有个原因是为了减少计算量。
从上面公式我们可以看到公式左边是个向量,右边是一个标量,因此我们可以使用向量的点乘来解决这个问题。
即
在这里我们需要寻找一个在 + 和 × 之间的同态函数,比如:
该式在结合上面地公式(4):即
因此:
对于满足公式(5)的函数,我们可以想到有指数函数 exp,即:
结合公式(7)和(8)我们可以得到
我们对其取对数可以得到:
由于上面左边具有交换性,而右边不具有,同时和k无关因此可以作为一个偏织项,因此公式(10)可以演变为
其中 作为 k 的偏置项来保持公式的对称性。
同事为了防止接近0时,log 趋向于负无穷大,因此我们对右式加上一个平滑项,即
因此该模型的损失函数为:
在这里有个问题就是他对每个单词对平等对待,但是这是不合理的,应该对 值较大的,权重应该更大,同时,我们又不应该过度重视高频词,该论文选取的权重函数如下:
最终该损失函数如下:
论文中 和 分别取值 和 100.
3. 和Skip-gram的联系
前面提过,Glove 结合了之前两种方法的优点,但是他是如何结合或者如何从Skip-gram演变而来的呢?
总所周知,Skip-gram模型可以通过如下一个公式来表达,即Softmax:
则该模型的损失函数为:
由于我们需要利用全局统计信息,因此一个单词对可能出现很多次,因此,我们首先把所有相同的单词对先进行计算,即
由于交叉熵具有某些缺点,交叉熵具有长尾效应,当过分重视不太可能的事件时建模效果不是很好,而且交叉熵需要Q归一化,这样计算很大,因此使用这样一个未归一化的最小二成损失来替代
这里是因为18式中当变得很大时,训练变得复杂,于是使用对数可以缓解或补交这个问题,即:
这里可以视为一个权重项,我们通过调整这个权重和添加权重项公式19就演变为公式14.