GloVe原理与公式讲解

GloVe是2014年提出的一种词嵌入方法,结合了矩阵分解以及上下文窗口两种词嵌入方法。相较于Word2Vec而言,其论文写得很清晰。本文主要是整理了该论文中的内容。

对了宝贝儿们,卑微小李的公众号【野指针小李】已开通,期待与你一起探讨学术哟~摸摸大!

1 背景知识

GloVe是结合了基于矩阵分解的词嵌入技术以及基于局部窗口的词嵌入技术。

1.1 基于矩阵分解的词嵌入技术

基于矩阵分解的词嵌入技术的代表为LSA,在LSA中需要分解的矩阵是term-document矩阵,即每一行代表了词语,每一列代表了文档, x i j x_{ij} xij指的就是第 i i i个词语在第 j j j个文档中的重要性程度。

举个简单的SVD获得词向量的例子[2]:

假设语料库为:

  • I like deep learning.
  • I like NLP.
  • I enjoy flying.

代码为:

import numpy as np

words = ['I', 'like', 'enjoy', 'deep', 'learning', 'NLP', 'flying', '.']
X = np.array([[0, 2, 1, 0, 0, 0, 0, 0],
              [2, 0, 0, 1, 0, 1, 0, 0],
              [1, 0, 0, 0, 0, 0, 1, 0],
              [0, 1, 0, 0, 1, 0, 0, 0],
              [0, 0, 0, 1, 0, 0, 0, 1],
              [0, 1, 0, 0, 0, 0, 0, 1],
              [0, 0, 1, 0, 0, 0, 0, 1],
              [0, 0, 0, 0, 1, 1, 1, 0]])

U, s, Vh = np.linalg.svd(X, full_matrices=False)

import matplotlib.pyplot as plt

for i in range(len(words)):
    plt.scatter(U[i, 0], U[i, 1])
    plt.text(U[i, 0], U[i, 1], words[i])

plt.show()

获得的结果为:

SVD
从图中可以得出结论,Ilike词频最高;对于like而言,enjoyI是距离最近的点。

SVD的更多知识可以看[3],这里不再多赘述。

1.2 基于局部窗口的词嵌入技术

基于局部窗口的词嵌入技术的代表就是Word2Vec,其中有两个模型——Skip-gram和CBOW。

Skip-gram是通过中心词预测窗口中的上下文,CBOW是根据窗口中的上下文预测中心词。

详细的内容可以见:《Word2Vec原理与公式详细推导》[4],《Word2Vec之Hierarchical Softmax与Negative Sampling》[5],《TensorFlow学习笔记(3)——TensorFlow实现Word2Vec》[6]

2 GloVe

作者针对上面两类词嵌入方法,argue到[1]:

  1. 基于矩阵分解的方法可以有效利用统计信息,但是在词语类比(word analogies)任务上表现的相对较差。
  2. 基于局部滑动窗口的方法在词语类比任务上表现较好,但是没有能够利用全局信息。

针对上面的问题,作者们提出的GloVe就既使用了语料库的全局统计特性,也使用了局部上下文特征。于是引入了共现概率矩阵(Co-occurrence Probabilities Matrix)

2.1 共现概率矩阵

以下是论文中的例子:
共现概率矩阵
X i j X_{ij} Xij 为词语 j j j 出现在词语 i i i 的上下文中的次数 X i = ∑ k X i k X_i=\sum_kX_{ik} Xi=kXik,是词语 i i i 上下文中出现的词语总次数 P i j = P ( j ∣ i ) = X i j X i P_{ij}=P(j|i)=\frac{X_{ij}}{X_i} Pij=P(ji)=XiXij 为词语 j j j 出现在词语 i i i 的上下文中的概率

根据我们的常识会发现icesolid比起stramsolid更经常出现;icegas比起steamgas更不容易出现;icewater以及steamwater出现的次数差不多;而icefashion以及steamfashion基本不会共同出现。

于是可以绘制出如下的矩阵[7]:

相关性矩阵

2.1.1 共现概率矩阵构建

共现矩阵的构建就体现了作者提到的滑动窗口的思想,计算的是一个窗口中词语与中心词共现的次数。在原论文中,这个次数并非是出现就 X i j + 1 X_{ij}+1 Xij+1,而是采用了一个递减的函数,假设词语 j j j 与中心词 i i i 之间的距离为 d d d ,那么 X i j + 1 d X_{ij}+\frac{1}{d} Xij+d1。就是说词语 j j j 与词语 i i i 的距离 d = 1 d=1 d=1 i i i j j j 是相邻的词语),则 X i j + 1 X_{ij}+1 Xij+1 ;如果 d = 5 d=5 d=5 ,则 X i j + 1 5 X_{ij}+\frac{1}{5} Xij+51

In all cases we use a decreasing weighting function, so that word pairs that are d d d words apart contribute 1 / d 1/d 1/d to the total count.

作者这样做的是认为距离中心词 i i i 较远的词语,对 i i i 提供的信息就较少。

This is one way to account for the fact that very distant word pairs are expected to contain less relevant information about the words’ relationship to one another.

2.2 目标函数构建

作者为了捕获到词语之间共现概率的关系,于是假定了式(1)这个函数:
F ( w i , w j , w ~ k ) = P i k P j k (1) F(w_i, w_j, \tilde{w}_k)=\frac{P_{ik}}{P_{jk}} \tag{1} F(wi,wj,w~k)=PjkPik(1)

其中 w ∈ R d w \in \mathbb{R}^d wRd 是词向量; w ~ ∈ R d \tilde{w} \in \mathbb{R}^d w~Rd 是目标词上下文词语的词向量。这里的问题在于,根据语料库就可以确定 P i k P j k \frac{P_{ik}}{P_{jk}} PjkPik ,但是 F F F 这个函数就有无数种可能性,所以需要确定 F F F 这个函数。

根据上面2.1最下面的混淆矩阵,我们可以很轻易的得出 P i k P j k \frac{P_{ik}}{P_{jk}} PjkPik 是一种词语间相似度的表达,又由于词向量都是线性的,所以最简单的一种词向量之间相似度的表达方式就是两个向量做差。于是式(1)就可以变为:
F ( w i − w j , w ~ k ) = P i k P j k (2) F(w_i - w_j, \tilde{w}_k) = \frac{P_{ik}}{P_{jk}} \tag{2} F(wiwj,w~k)=PjkPik(2)

根据式(2),我们继续推导发现 P i k P j k \frac{P_{ik}}{P_{jk}} PjkPik 是个标量,而 w i − w j w_i - w_j wiwj w ~ k \tilde{w}_k w~k 是向量,为了让向量也变为标量,所以这里取内积。这里取内积的目的有二:不仅能够将向量变为标量,而且内积也是一种很简单的刻画向量相似度的方法。
F ( ( w i − w j ) T w ~ k ) = P i k P j k (3) F\left((w_i-w_j)^T\tilde{w}_k\right)=\frac{P_{ik}}{P_{jk}} \tag{3} F((wiwj)Tw~k)=PjkPik(3)

又因为 X X X是个对称矩阵,所以在做 w ↔ w ~ w \leftrightarrow \tilde{w} ww~ 以及 X ↔ X T X \leftrightarrow X^T XXT 转换时,等式(3)不应该发生变化,但是现在的公式是不满足的。其原因在于,对于左侧的式子而言,由于是向量的内积,那么能够满足 w T w ~ = w ~ T w w^T\tilde{w}=\tilde{w}^Tw wTw~=w~Tw;但是对于右侧而言,如下所示:
P i k P j k = X j X i k X i X j k ≠ P k i P k j = X k i X k j \frac{P_{ik}}{P_{jk}}=\frac{X_j X_{ik}}{X_{i}X_{jk}} \neq \frac{P_{ki}}{P_{kj}}=\frac{ X_{ki}}{X_{kj}} PjkPik=XiXjkXjXik=PkjPki=XkjXki

为了满足这个条件,我们要求函数 F F F 要满足同态特性(homomorphism)[8]:
F ( ( w i − w j ) T w ~ k ) = F ( w i T w ~ k ) F ( w j T w ~ k ) (4) F\left((w_i-w_j)^T\tilde{w}_k\right)=\frac{F(w_i^T\tilde{w}_k)}{F(w_j^T\tilde{w}_k)} \tag{4} F((wiwj)Tw~k)=F(wjTw~k)F(wiTw~k)(4)

接着我们发现左侧是差(可转换为 w i T w ~ k − w j T w ~ k w_i^T\tilde{w}_k - w_j^T\tilde{w}_k wiTw~kwjTw~k),右侧是商,所以通过指数函数将左右关联起来,即 F F F e x p {\rm exp} exp
e x p ( ( w i − w j ) T w ~ k ) = e x p ( w i T w ~ k ) e x p ( w j T w ~ k ) (5) {\rm exp}\left((w_i-w_j)^T\tilde{w}_k\right)=\frac{{\rm exp}(w_i^T\tilde{w}_k)}{{\rm exp}(w_j^T\tilde{w}_k)} \tag{5} exp((wiwj)Tw~k)=exp(wjTw~k)exp(wiTw~k)(5)

到此,等式左侧与右侧就相等起来了。接着我们开始构建目标函数。

因为
F ( w i T x ~ k ) = P i k = X i k X i F(w_i^T\tilde{x}_k)=P_{ik}=\frac{X_{ik}}{X_i} F(wiTx~k)=Pik=XiXik

所以可以将 e x p ( w i T w k ~ ) {\rm exp}(w_i^T\tilde{w_k}) exp(wiTwk~)转换为:
w i T w ~ k = l o g ( P i k ) = l o g ( X i k ) − l o g ( X i ) (6) w_i^T\tilde{w}_k={\rm log}(P_{ik})={\rm log}(X_{ik})-{\rm log}(X_i) \tag{6} wiTw~k=log(Pik)=log(Xik)log(Xi)(6)

由于 w i T w ~ k w_i^T\tilde{w}_k wiTw~k 是对称的, X i k X_{ik} Xik 也是对称的,但是 X i X_i Xi 不是对称的(因为独立于 k k k ),所以将公式(6)变为:
w i T w ~ k + b i = l o g ( X i k ) (7) w_i^T\tilde{w}_k + b_i = {\rm log}(X_{ik}) \tag{7} wiTw~k+bi=log(Xik)(7)

这里 b i b_i bi 替代 w i w_i wi。同时,为了保证 w ~ k \tilde{w}_k w~k 的对称性,添加一个关于 w ~ k \tilde{w}_k w~k 的偏置项 b ~ k \tilde{b}_k b~k,于是得到GloVe的公式:
w i T w ~ k + b i + b ~ k = l o g ( X i k ) (8) w_i^T\tilde{w}_k + b_i + \tilde{b}_k = {\rm log}(X_{ik}) \tag{8} wiTw~k+bi+b~k=log(Xik)(8)

但是由于 X i k = 0 X_{ik}=0 Xik=0 时, l o g ( X i k ) → − ∞ {\rm log}(X_{ik}) \rightarrow -\infty log(Xik) 是发散的,为了保证不改变 X X X 的稀疏性以及避免发散,所以将式(8)变为:
w i T w ~ k + b i + b ~ k = l o g ( 1 + X i k ) (9) w_i^T\tilde{w}_k + b_i + \tilde{b}_k = {\rm log}(1 + X_{ik}) \tag{9} wiTw~k+bi+b~k=log(1+Xik)(9)

由此可以得到目标函数:
J = 1 2 ∑ i , j = 1 V f ( X i j ) ( w i T w ~ j + b i + b ~ j − l o g ( 1 + X i j ) ) 2 (10) J = \frac{1}{2}\sum_{i, j=1}^V f(X_{ij})(w_i^T\tilde{w}_j + b_i + \tilde{b}_j -{\rm log}(1 + X_{ij}) )^2 \tag{10} J=21i,j=1Vf(Xij)(wiTw~j+bi+b~jlog(1+Xij))2(10)

这里 V V V 是语料库中词语数量的大小。这个目标函数实质上就是一种带权的均方误差。权重就是函数 f ( X i j ) f(X_{ij}) f(Xij)。这个函数需要满足以下3点:

  1. f ( 0 ) = 0 f(0)=0 f(0)=0
  2. f ( x ) f(x) f(x) 应该是个非递减函数;
  3. f ( x ) f(x) f(x) x x x 很大的时候变化的应该相对较小。

这样做的目的在于,既能够保证共现频率低的词语的权重较小,也不至于使得共现频率高的词语的权重过大(比如"the","and"这些非停用词)。由此构建出权重函数:
f ( x ) = { ( x x m a x ) α i f   x < x m a x 1 o t h e r w i s e (11) \begin{aligned} f(x)=\left\{ \begin{aligned} &(\frac{x}{x_{\rm max}})^\alpha && {\rm if}\ x < x_{\rm max} \\ &1 && {\rm otherwise} \end{aligned} \right. \tag{11} \end{aligned} f(x)=(xmaxx)α1if x<xmaxotherwise(11)

其图像如下图所示:
权重函数
论文中提到 x m a x x_{\rm max} xmax 对实验结果影响不大,所以取 x m a x = 100 x_{\rm max}=100 xmax=100。同时根据实验结果得出 α = 3 4 \alpha = \frac{3}{4} α=43

我们从这个公式中就可以得出,我们优化的目标是希望最小化语料库中每一对词的内积距离和两个词计数的对数

根据公式(10),我们可以计算出两个向量, W W W W ~ \tilde{W} W~,由于 X X X 是对称的,所以 W W W W ~ \tilde{W} W~ 的区别仅在于初始化不同。根据经验表明, W + W ~ W+\tilde{W} W+W~ 即可获得最终的词向量。

The model generates two sets of word vectors, W W W and W ~ \tilde{W} W~ . When X X X is symmetric, W W W and W ~ \tilde{W} W~ are equivalent and differ only as a result of their random initializations; the two sets of vectors should perform equivalently. On the other hand, there is evidence that for certain types of neural networks, training multiple instances of the network and then combining the results can help reduce overfitting and noise and generally improve results (Ciresan
et al., 2012). With this in mind, we choose to use the sum W + W ~ W +\tilde{W} W+W~ as our word vectors.

这里也就体现出了GloVe的全局性。Word2Vec模型试图一次捕获同时出现的一个窗口,GloVe试图捕获这些单词词频的总体统计数据。

3 参考

[1] Jeffrey Pennington, Richard Socher, Christopher D. Manning. Glove: Global Vectors for Word Representation[C]// Conference on Empirical Methods in Natural Language Processing. 2014.
[2] AI研习社-译站. 【官方】【中英】CS224n 斯坦福深度自然语言处理课 @雷锋字幕组[EB/OL]. (2019-01-22)[2021-07-06]. https://www.bilibili.com/video/BV1pt411h7aT?p=3
[3] 漫漫成长. 奇异值分解(SVD)[EB/OL]. (2017-10-12)[2021-07-06]. https://zhuanlan.zhihu.com/p/29846048
[4] 野指针小李. Word2Vec原理与公式详细推导[EB/OL]. (2021-04-28)[2021-07-06]. https://blog.csdn.net/qq_35357274/article/details/116240180
[5] 野指针小李. Word2Vec之Hierarchical Softmax与Negative Sampling[EB/OL]. (2021-05-03)[2021-07-06]. https://blog.csdn.net/qq_35357274/article/details/116381205
[6] 野指针小李. TensorFlow学习笔记(3)——TensorFlow实现Word2Vec[EB/OL]. (2021-06-18)[2021-07-06]. https://blog.csdn.net/qq_35357274/article/details/117967345
[7] 梦里寻梦. (十五)通俗易懂理解——Glove算法原理[EB/OL]. (2018-08-15)[2021-07-06]. https://zhuanlan.zhihu.com/p/42073620
[8] 范永勇. GloVe详解[EB/OL]. (2018-02-19)[2021-07-06]. http://www.fanyeong.com/2018/02/19/glove-in-detail/

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值