美文网首页
词向量:GloVe

词向量:GloVe

作者: jerrychenly | 来源:发表于2019-07-31 22:06 被阅读0次

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是怎么来的,为什么是这个形式?

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

  • X_{ij}表示单词j出现在单词i的上下文中的次数;

  • X_{i}=\sum_{j=1}^{N} X_{i, j}, 表示单词i的上下文中所有单词出现的总次数;

  • P_{i, k}=\frac{X_{i, k}}{X_{i}}, 表示单词k出现在单词i语境中的概率。

  • ratio_{i, j, k}=\frac{P_{i, k}}{P_{j, k}}, 两个条件概率的比值。

作者从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,有点复杂。下面来做一些优化:

  • 要考虑单词i和j之间的关系,那g(v_{i}, v_{j}, v_{k})中大概要有v_{j} - v_{j}这么一项;
  • ratio_{i,j,k}是个标量,那么g(v_{i}, v_{j}, v_{k})最后应该是个标量,虽然输入都是向量,那内积应该是合理的,所以应该有这么一项:\left(v_{i}-v_{j}\right)^{T} v_{k}
  • 然后作者又在\left(v_{i}-v_{j}\right)^{T} v_{k}上加了一层指数运算,最终得到: g\left(v_{i}, v_{j}, v_{k}\right)=\exp \left(\left(v_{i}-v_{j}\right)^{T} v_{k}\right)

下面把公式做进一步变形:
\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

相关文章

  • 利用Word2vec生成句向量(一)

    首先为什么是Word2vec?不是Glove也不是什么Fasttext等其他的词向量?Glove词向量的训练与部署...

  • 词向量:GloVe

    GloVe:Global Vectors for Word Representation,它是一个基于全局词频统计...

  • GloVe 词向量

    GloVe(Global Vectors for Word Representation)它是一个基于全局词频统计...

  • Glove词向量

    转载自http://www.fanyeong.com/2018/02/19/glove-in-detail/ Gl...

  • 如何gensim加载glove训练的词向量

    如何gensim加载glove训练的词向量 一、前言 glove和word2vec是目前最常用的两个训练词向量的模...

  • Keras文本分类案例

    关键词: word embedding cnn glove:大神预先做好的词向量(就是每个单词用固定维数的向量表示...

  • 词向量

    1.更别致的词向量模型:Simpler GloVe - Part 2 2.

  • 动态词向量算法 — ELMo

    传统的词向量模型,例如 Word2Vec 和 Glove 学习得到的词向量是固定不变的,即一个单词只有一种词向量,...

  • 词向量学习算法 Glove

    常见的词嵌入算法有基于矩阵分解的方法和基于浅层窗口的方法,Glove 结合了这两类方法的优点生成词向量。基于矩阵分...

  • NLP in TensorFlow: 使用预训练的词向量

    知识点: 使用预训练的glove词向量 导入所需的包 参数设置 下载数据集 预处理数据集 下载并处理预训练的词向量...

网友评论

      本文标题:词向量:GloVe

      本文链接:https://www.haomeiwen.com/subject/plvxdctx.html