CS224N笔记(二) Lecture1~2 :深入理解Glove原理

NLP连载系列:

  1. NLP入门:文本特征的表示方式
  2. 命名实体分类NER初识
  3. n-gram的原理
  4. CS224N笔记(一):word2vec超详细解析
  5. CS224N笔记(二) Lecture1~2 :深入理解Glove原理
  6. CS224N笔记(三) Lecture 6~7:深入理解循环神经网络RNN模型
  7. CS224N笔记(四) Lecture 7:循环神经网络RNN的进阶——LSTM与GRU

1.背景知识

word2vec 中提到,词的表征方法还可以分成统计型和预测性这两类,统计型就是计算各个词或词序列出现的频次,比如词袋BOW、词频-逆文档频率TF-IDF、n-gram等,预测型的如word2vec,将词隐式地编码成特定大小的短向量,通过词向量空间上的语义相似性预测中心词或者周边词。这两种方法的优缺点都很明显,统计型训练快,使用了语料的统计信息但很难提取出语义信息,也很难衡量词之间但相似性,预测型可以很好地捕捉词的语义信息,能够在向量空间上衡量词之间的相似性,但是它没有用到语料的统计信息。

Glove方法的提出就是要结合统计型和预测型方法的优点,既要能捕捉词之间的相似性,又要能利用上语料的统计信息。

2.基本原理

为了能用上语料的统计信息,Glove还是从共现矩阵入手,构造的方法n-gram中介绍的共现矩阵,但Glove还要求对元素进行归一化,由频次转换成概率值,为了区分下文将这种矩阵命名为共现概率矩阵,该矩阵即代表了语料统计信息。设共现矩阵为XX,则XijX_{ij}表示在单词ii的上下文出现jj的次数,Xi=kXikX_i=\sum_{k}X_{ik}表示出现在单词ii上下文的所有单词的总次数,则单词ii上下文出现单词jj的概率就可以记作

Pij=P(ji)=Xij/XiP_{ij}=P(j|i)=X_{ij}/X_i

这里需要特别特别强调一点,共现矩阵是对称的,但是共现概率矩阵可不是对称的,词i的上下文出现词j的概率和词j的上下文出现词i的频次一样,但是概率是不一样的,Xij=XjiPijPjiX_{ij}=X_{ji},P_{ij} \not = P_{ji},举个例子:

考虑语料:Tom wants a cake and Lily also wants a cake, but jack wants a pear.

我们设定窗口大小为1,考虑词“a”的上下文出现“cake”的概率P(cakea)P(cake|a)以及反过来P(acake)P(a|cake)。“a”的上下文出现了“wants”两次,"cake"两次,“pear”一次,则P(cakea)=2/5P(cake|a)=2/5,而“cake”的上下文出现了“a”两次,“and“一次,”but”一次,因此P(acake)=2/4P(a|cake)=2/4,因此P(cakea)P(acake)P(cake|a) \not= P(a|cake)

共现概率矩阵为我们提供了语料的统计信息,接下来要求词之间的相似性能够被量化,按照word2vec的思路,是将词编码成一个向量,用向量间的余弦距离(夹角)来衡量词之间的相似性。Glove也是采取了这个思路,但是将词转化为向量时采样了不一样的解决方案。

回忆word2vec中建立统计语言模型时的基本思路是:中心词和周边词间存在联系,它们可以相互预测。而Glove采取了另一种思路,一句话概括就是:共现概率矩阵上元素间的比值可以编码词的语义。

举例:

Glove/Untitled.png

Glove/Untitled%201.png

上面两个表格第一、二行展示了共现概率矩阵中部分元素,第三行是元素间比值。

下面以第一列所展示的数值为例,在上下文出现了ice的情况下,出现solid的概率为1.9×1041.9 \times 10^{-4},而上下文出现了stream的情况下,出现solid的概率为2.2×1052.2 \times 10^{-5},单单这两个概率值只能提供有限的信息,但是二者相除的结果为8.9,相差近10倍,从第三行总体情况来看8.9算是一个较大的值,这时可以说ice的上下文比起stream的上下文更可能出现solid这一个词,我们从现实情况上来看,冰可以说是固体,蒸汽不是固体,冰确实跟固体有更强的联系,既符合现实,也符合人的直觉。

ice和stream通过solid这一桥梁建立起了联系,如果用词的不是solid而是gas,那么这个比值将变得很小,说明蒸汽才和气体有较大联系,如果这个词改为water,这个比值为1.36,很接近1,改为fashion也是接近1的数值,在比值接近1时,只能作为桥梁的这个词跟ice和stream均有较强联系或是均没有联系。通过不断更改作为桥梁的词,可以计算出一系列的概率比值,这些比值使得词之间的联系能在更高的维度上建立起来,逐渐接近词的深层语义,以上就是Glove建模的出发点。

现在知道了Glove建模的出发点,但是具体要用什么模型来表达呢?一个最简单的想法,如果我们可以在线性空间建立起模型就再好不过了,便于推导也便于优化。所谓的线性空间和向量空间是一个意思,换句话说,我们希望可以通过向量间的加减乘除就能够代表共现概率间的比值。基于这一思想,我们假设共现概率PikP_{ik}PjkP_{jk}间比值能用wi,wj,wkw_i,w_j,w_k这三个词的词向量表示:

PikPjk=g(wi,wj,wk)\frac{P_{ik}}{P_{jk}} = g(w_i,w_j,w_k)

观察这个公式,左边是可以用统计算出来的已知信息,右边的词向量wi,wj,wkw_i,w_j,w_k以及函数gg的形式都是未知,和word2vec一样,词向量同样是作为模型参数,也是我们最终想得到的东西。我们暂且抛开函数g的具体形式不谈,我们可以如果要构造一个损失函数,可以根据上面式子的形式,将损失函数写作:

J= ( g(wi,wj,wk)PikPjk)J=\sum\ (\ g(w_i,w_j,w_k) - \frac{P_{ik}}{P_{jk}} )

这种式子应该很熟悉,g是模型预测,P之间的比值是真实值,也是我们已知的值,接下来用梯度下降等方法求解模型参数wi,wj,wkw_i,w_j,w_k即可。现在的问题是g的形式应该是什么样的?下面就是作者对该损失进行魔改的时间了。

说个题外话,Glove的作者原本是理论物理博士,如果接触过量子力学、微观物理那一套理论的话,应该可以深切体会到,这个领域有些推导是没有严谨地遵循数学逻辑的,很多时候需要用启发式的思维,看起来合理,但深究起来又感觉有点说不通。

作者的思路是这样的:

  1. 我们通过wkw_k这一桥梁希望发现wiw_iwjw_j间的语义关系,那么在向量空间中应该可以w_i和w_j间的差值来表示他们间的关系吧?所以g(wi,wj,wk)g(w_i, w_j, w_k)间应该存在有(wiwj)(w_i-w_j)这一项。
  2. PikPjk\frac{P_{ik}}{P_{jk}}是标量,那么gg输出的也应该是标量,而wi,wj,wkw_i,w_j,w_k都是向量,要得到标量可以通过向量间的内积,所以gg应该具有这种形式(wiwj)Twk(w_i-w_j)^Tw_k
  3. 最后是对(wiwj)Twk(w_i-w_j)^Tw_k进行指数运算exp()exp(),这样就可以得到以下推导:

PikPjk=g(wi,wj,wk)=exp((wiwj)Twk)=exp(wiTwk)exp(wjTwk)\begin{aligned}\frac{P_{ik}}{P_{jk}}=&g(w_i,w_j,w_k)\\=&exp((w_i-w_j)^Tw_k)\\ =&\frac{exp(w_i^Tw_k)}{exp(w_j^Tw_k)}\end{aligned}

这时发现分子分母可以统一形式,既写成向量内积的指数形式:

Pij=exp(wiTwj)   or   logPij=wiTwjP_{ij} = exp(w_i^Tw_j) \ \ \ or \ \ \ logP_{ij} = w_i^Tw_j

第三步套一层exp()感觉算是一种启发式推导了,就是为了推导化简,使分子分母的共现概率能够写成简单且一致的形式。此时我们的损失函数可以改写成:

J=wiTwjlogPijJ=\sum w_i^Tw_j - logP_{ij}

但现在存在一个问题,即logPij=wiTwjlogP_{ij} = w_i^Tw_j中,左右的对称性不成立,如果i和j交换,wiTwj=wjTwiw_i^Tw_j = w_j^Tw_i自然是成立,但是本文一开头也说了PijPjiP_{ij} \not = P_{ji},所以要给这条式子补个偏置项强行使等式继续成立,即:

logPij=wiTwj+bjlogP_{ij} = w_i^Tw_j+b_j

此时再看我们的损失函数,就可以继续展开

J=wiTwj+bjlogPij=wiTwj+bjlogXijXi=wiTwj+bjlogXij+logXi\begin{aligned} J&=\sum w_i^Tw_j + b_j -logP_{ij} \\ &= \sum w_i^Tw_j +b_j - log\frac{X_{ij}}{X_i} \\ &= \sum w_i^Tw_j + b_j - logX_{ij} + logX_i \end{aligned}

如果将logX_i也写记作一个偏置项b_i,则可以进一步写成:

J=wiTwj+bi+bjlogXijJ = \sum w_i^Tw_j + b_i + b_j - logX_{ij}

最后是基于词频越高权重应该越大的原则,给损失函数的每一项求和项加一个权值,写成下面的式子:

J=f(Xij)(wiTwj+bi+bjlogXij)J = \sum f(X_{ij})(w_i^Tw_j + b_i + b_j - logX_{ij})

f(Xij)f(X_{ij})即为基于词频XijX_{ij}的权值,它的表达式和函数图形如下:

f(x)={(x/xmax)0.75if  x<xmax1if  x>=xmaxf(x) = \begin{cases} (x/xmax)^{0.75} & \text{if} \ \ x<xmax \\ 1 & \text{if} \ \ x>=xmax\end{cases}

Glove/Untitled%202.png

设计成这个形式的主要目的是根据词频的大小对损失进行加权,词频越大,损失项的权值越大,代表越重要,但是词频大到一定程度时,权值也不能无限增大,权值再大不能超过1。

以上就是Glove的所有推导,Glove的构思很有想法,以共现概率的比值来表示词的意义,并将词向量运用进来,但是其模型的推导有一点随性,这也是它被人质疑的一个地方,虽说它针对word2vec中没有利用到统计信息这一缺陷进行改进,但是Glove和word2vec在实际效果并没有太大区别。

3.参考文献

  1. https://blog.csdn.net/mr_tyting/article/details/80180780
  2. http://www.fanyeong.com/2018/02/19/glove-in-detail/
  3. https://zhuanlan.zhihu.com/p/60208480
  4. Stanford cs224n Lecture 2 - Word Vectors and Word Senses (slides-marginnote)
  5. https://blog.csdn.net/coderTC/article/details/73864097
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信