词向量:GloVe

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了词向量:GloVe相关的知识,希望对你有一定的参考价值。

参考技术A

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

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

原论文作者给出的loss function长这样:

其中 和 是最终求解的词向量, 和 是两个标量(作者定义的偏差), 是权重函数,V是词典的大小(共现矩阵的维度V x V)。这里我们知道GloVe模型没有使用神经网络做训练。

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

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

作者在实验中取的 , 。

这么看来GloVe像是一种无监督训练方法,因为不需要提供标注。但其实它还是有标注的,标注就是 ,向量 和 是需要不断更新的学习参数,所以本质上还是监督学习,基于梯度下降。

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

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

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

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

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

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

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

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

假设我们已经有了词向量 ,并且用这些词向量通过某种函数计算ratio能够得到同样的规律的话,就意味着我们词向量与共现矩阵具有很好的一致性,也就是说我们的词向量中蕴含了共现矩阵中蕴含的信息。翻译成数学表达式: ,我们的目标应该是使得表达式两端尽可能地接近。所以,得出代价函数:

有个问题,模型中有3个单词,也就是说我们的计算复杂度是N x N x N,有点复杂。下面来做一些优化:

下面把公式做进一步变形:

因此,只要让分子分母对应相等即可: 。因为分子分母形式相同,所以可以把两者统一考虑,我们有: 。

两边取对数:

loss function可以化简为:

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

但是这里出现了新的问题,我们看两个式子: 与 ,两个等式的左边不等,但是右边却相等。

好了,继续脑洞。将代价函数中的条件概率展开: ,添加偏置项并将 放到偏置里面去,所以有:

最后,出现频率越高的词对应的权重应该越大,所以在代价函数中添加权重项:

以上是关于词向量:GloVe的主要内容,如果未能解决你的问题,请参考以下文章

文本情感分析:基于word2vec和glove词向量的文本表示

使用github--stanfordnlp--glove训练自己的数据词向量

GloVe----模型与损失函数

加载glove或者word2vec训练好的词向量进行训练LSTM等模型的训练

BERT实战:使用DistilBERT作为词嵌入进行文本情感分类,与其它词向量(FastText,Word2vec,Glove)进行对比

[Pytorch系列-56]:循环神经网络 - word2vec词向量表Embedding/Glove的定义与读访问