词向量:GloVe

2019-07-31  本文已影响0人  jerrychenly

GloVe:Global Vectors for Word Representation,它是一个基于全局词频统计的词表征工具。通过GloVe计算出的词向量捕捉到了词之间一些语义特性,比如相似性(similarity)、类比性(analogy)等。我们通过对向量的运算,比如欧氏距离或cos相似度,可以算出词之间的语义相似性。

1、准备工作

由语料库构建一个共现矩阵(Co-occurrence Matrix) X,矩阵中的每一个元素X_{ij}代表单词i和上下文单词j在特定大小的上下文窗口内共同出现的次数。这里GloVe做了额外的工作,它根据两个单词在上下文窗口的距离d,提出了一个衰减权重decay = 1/d,也就是说距离越远的两个单词所占总计数的权重越小。

2、使用GloVe模型训练词向量

原论文作者给出的loss function长这样:
J=\sum_{i, j=1}^{V} f\left(X_{i j}\right)\left(w_{i}^{T} \tilde{w}_{j}+b_{i}+\tilde{b}_{j}-\log X_{i j}\right)^{2}
其中w_{i}^{T}\tilde{w}_{j}是最终求解的词向量,b_{i}\tilde{b}_{j}是两个标量(作者定义的偏差),f是权重函数,V是词典的大小(共现矩阵的维度V x V)。这里我们知道GloVe模型没有使用神经网络做训练。

下面来说说权重函数f。在一个语料库中,存在很多单词他们在一起出现的次数是很多的,那么我们希望权重函数f满足以下几点:
a. 这些单词的权重要大于那些很少在一起出现的单词,所以这个函数是非递减的;
b. 我们不希望这个权重过大,当到达一定程度之后不再增加;
c. 如果两个单词没有在一起出现,也就是X_{ij} = 0,那么它们应该不参与到loss function的计算中来,也就是f(x)要满足f(0) = 0

综合以上,作者选择了如下的分段函数:


WX20190731-220537@2x.png

作者在实验中取的\alpha=0.75x_{max} = 100

这么看来GloVe像是一种无监督训练方法,因为不需要提供标注。但其实它还是有标注的,标注就是\log X_{i j},向量w_{i}^{T}\tilde{w}_{j}是需要不断更新的学习参数,所以本质上还是监督学习,基于梯度下降。

按原论文中的说法:采用了AdaGrad的梯度下降算法,对矩阵X中的所有非零元素进行随机采样,学习速率设置为0.05,在vector size小于300的情况下迭代了50次,其他大小的verctors上迭代了100次,直至收敛。

最终学习得到的是两个向量w_{i}^{T}\tilde{w}_{j},因为X是对称的,所以从原理上w_{i}^{T}\tilde{w}_{j}也是对称的,他们唯一的区别是初始化的值不一样,而导致最终的值不一样。所以这两者其实是等价的,都可以当成最终的结果来使用。但是为了提高鲁棒性,最终选择两者之和作为verctor(两者初始化不同,相当于加了不同的随机噪声,所以能提高鲁棒性)。

3、作者如何构建模型的

上面我们了解了GloVe模型训练词向量的过程,但是我们还有一个很大的疑问,loss function是怎么来的,为什么是这个形式?

首先我们先熟悉几个符号定义:

作者从ratio中发现了一些规律,看下表:


WX20190729-112723@2x.png

看最后一行,我们可以用这个比值观察出两个单词ij相对于单词k哪个更相关。

比如,ice和solid更相关,而stram和solid明显不相关,于是发现\frac{P(k|ice)}{P(k|steam)}比1大很多;gas和steam更相关,而与ice不相关,所以\frac{P(gas|ice)}{P(gas|steam)}远小于1;当都有关或都无关的时候,两者比例接近1.

所以,以上结论可以说明通过概率的比例而不是概率本身去学习词向量可能是一个更恰当的方法

于是乎,作者开始了表演:

假设我们已经有了词向量v_{i}、v_{j}、v_{k},并且用这些词向量通过某种函数计算ratio能够得到同样的规律的话,就意味着我们词向量与共现矩阵具有很好的一致性,也就是说我们的词向量中蕴含了共现矩阵中蕴含的信息。翻译成数学表达式:\frac{P_{i, k}}{P_{j, k}}=r a t i o_{i, j, k}=g\left(v_{i}, v_{j}, v_{k}\right),我们的目标应该是使得表达式两端尽可能地接近。所以,得出代价函数:
J=\sum_{i, j, k}^{N}\left(\frac{P_{i, k}}{P_{j, k}}-g\left(v_{i}, v_{j}, v_{k}\right)\right)^{2}
有个问题,模型中有3个单词,也就是说我们的计算复杂度是N x N x N,有点复杂。下面来做一些优化:

下面把公式做进一步变形:
\frac{P_{i, k}}{P_{j, k}}=g\left(v_{i}, v_{j}, v_{k}\right) = \exp \left(\left(v_{i}-v_{j}\right)^{T} v_{k}\right) = \exp \left(v_{i}^{T} v_{k}-v_{j}^{T} v_{k}\right) = \frac{\exp \left(v_{i}^{T} v_{k}\right)}{\exp \left(v_{j}^{T} v_{k}\right)}
因此,只要让分子分母对应相等即可:P_{i, k}=\exp \left(v_{i}^{T} v_{k}\right), P_{j, k}=\exp \left(v_{j}^{T} v_{k}\right)。因为分子分母形式相同,所以可以把两者统一考虑,我们有:P_{i, j}=\exp \left(v_{i}^{T} v_{j}\right)

两边取对数:\log \left(P_{i, j}\right)=v_{i}^{T} v_{j}

loss function可以化简为:J=\sum_{i, j}^{N}\left(\log \left(P_{i, j}\right)-v_{i}^{T} v_{j}\right)^{2}

到这里,我们成功把计算复杂度从N x N x N降到N x N。

但是这里出现了新的问题,我们看两个式子:\log \left(P_{i, j}\right)=v_{i}^{T} v_{j}\log \left(P_{j, i}\right)=v_{j}^{T} v_{i},两个等式的左边不等,但是右边却相等。

好了,继续脑洞。将代价函数中的条件概率展开:\log \left(X_{i, j}\right)-\log \left(X_{i}\right)=v_{i}^{T} v_{j},添加偏置项并将\log \left(X_{i}\right)放到偏置里面去,所以有:
J=\sum_{i, j}^{N}\left(v_{i}^{T} v_{j}+b_{i}+b_{j}-\log \left(X_{i, j}\right)\right)^{2}
最后,出现频率越高的词对应的权重应该越大,所以在代价函数中添加权重项:
J=\sum_{i, j}^{N} f\left(X_{i, j}\right)\left(v_{i}^{T} v_{j}+b_{i}+b_{j}-\log \left(X_{i, j}\right)\right)^{2}

参考:

https://www.aclweb.org/anthology/D14-1162

https://blog.csdn.net/coderTC/article/details/73864097

上一篇下一篇

猜你喜欢

热点阅读