GloVe

GloVe(Global Vectors)是常见的词向量表示方法,GloVe模型认为语料库中单词出现的统计是学习词向量表示的无监督学习算法的重要因素。相较于word2vec,GloVe利用语料库的全局信息。

论文地址:GloVe: Global Vectors for Word Representation

GloVe 的实现主要分为三步:

  • 构建共现矩阵
  • 词向量和共现矩阵的近似关系
  • 构造损失函数。

构建共现矩阵

共现矩阵;矩阵中的每一个元素 Xij\ X_{ij}代表单词 i\ i和上下文单词 j\ j在特定大小的滑动窗口内共同出现的次数。

举个例子

假设有如下语料库

i love deep learning

i love NLP

i enjoy flying

这个语料库涉及 7 个词:i,love,enjoy,deep,learning,NLP,flying。假设使用窗口大小为1的滑动窗口,进行滑动构建共现矩阵:

第一个语句 “i love deep learning” 中,则会生成以下窗口内容:

窗口标号 中心词 窗口内容
0 i i love
1 love i love deep
2 deep love deep learning
3 learning deep learning

以窗口 1 为例,中心词为 love,上下文词为 i、deep,则更新共现矩阵中的元素:

Xlove,i+=1Xlove,deep+=1X_{love,i}+=1\\ X_{love,deep}+=1

 Xij\ X_{ij} : 表示词 j 在词 i 滑动窗口中出现的次数。

将整个语料库遍历一遍,即可得到共现矩阵:

i love enjoy deep learning NLP flying
i 0 2 1 0 0 0 0
love 2 0 0 1 0 1 0
enjoy 1 0 0 0 0 0 1
deep 0 1 0 0 1 0 0
learning 0 0 0 1 0 0 0
NLP 0 1 0 0 0 0 0
flying 0 0 1 0 0 0 0

词向量和共现矩阵的近似关系

定义如下变量:

Pij=P(ji)=XijXiP(ji)ijXijP_{ij}=P(j|i)=\frac{X_{ij}}{X_i}\\ P (j|i)为中心词i周围出现j的概率,X为共现矩阵,i为中心词,j为上下词

在论文中,作者提出两个单词之间的关系能通过它们基于不同单词k得到的共现矩阵概率之比得到。

上表中显示了一个大型语料库的概率和比率的结果,其中取 i = ice和 j = steam。选取一个与 ice 有关但与 steam 无关的词k = solid,可以看到 P(kice)P(ksteam)\ \frac{P(k|ice)}{P(k|steam)}远远大于1,对于像 water 或 fashion 这样的词,其比率要么与 ice 和 steam 都有关,要么与两者都无关,其比率接近 1。

于是作者提出:共现概率比也可以很好的体现3个单词间的关联,比率越大则词与分母词相近,反之则于分子词相近

推导过程

模型就可以表示成如下形式:

F(wi,wj,w~)=PikPjkF(w_i,w_j,\tilde{w})=\frac{P_{ik}}{P_{jk}}

其中 wi,wj\ w_i,w_j 是中心词向量, w~\ \tilde{w} 是上下文词的词向量,F(x)是一个函数

因为向量空间是线性结构的,所以要表达出两个概率的比例差,最自然的方法是使用向量差,即可得到:

F(wiwj,wk~)=PikPjkF(w_i-w_j,\tilde{w_k})=\frac{P_{ik}}{P_{jk}}

由于F中参数为向量而右边等式为数值,我们可以将F中向量点积

F((wiwj)Twk~)=PikPjkF((w_i-w_j)^T\tilde{w_k})=\frac{P_{ik}}{P_{jk}}

由于共现矩阵是一个对称矩阵,改变单词和上下文词位置得到的值是一样的,于是可以进一步化简:

F((wiwj)Twk~)=F(wiTwk~wjTwk~)=F(wiTwk~)F(wjTwk)~F(wiTwk~)=Pik=XikXiFx,使wiTwk~=log(Pik)=log(Xik)log(Xi)把减法的函数变成函数的除法\\ F((w_i-w_j)^T\tilde{w_k})\\ =F(w_i^T\tilde{w_k}-w_j^T\tilde{w_k})\\ =\frac{F(w_i^T\tilde{w_k})}{F(w_j^T\tilde{w_k)}} \\且:F(w_i^T\tilde{w_k})=P_{ik}=\frac{X_{ik}}{X_i} \\变换F(x)为指数函数,使得:\\ w_i^T\tilde{w_k}=log(P_{ik})=log(X_{ik})-log(X_i)

同时注意到, log(xi)\ log(x_i)是一个常数,如果上式没有 log(xi)\ log(x_i)则满足对称的可交换性。然而,该项是与k独立的,所以它可以吸收到 wi\ w_i 的偏差 bi\ b_i 中,于是就得到了词向量和共现矩阵之间的近似关系

wiTwk~+bi+bk~=log(Xik)w^T_i\tilde{w_k}+b_i+\tilde{b_k}=log(X_{ik})

构造损失函数

作者在论文中提出了一个新的加权最小二乘回归模型来构造损失函数。将上式看作一个最小二乘问题,并在损失函数中引入权重函数

J=i,j=1Vf(Xij)(wiTwj~+bi+bj~log(Xij))2J=\sum_{i,j=1}^Vf(X_{ij})(w^T_i\tilde{w_j}+b_i+\tilde{b_j}-log(X_{ij}))^2

其中 f(Xij)\ f(X_{ij})是用来控制不同大小的共现次数 Xij\ X_{ij} 对结果的影响的。作者是这么设计这个权重函数的

f(X)={(xxmax)a, if x<xmax1, elsef(X)=\begin{cases} (\frac{x}{x_{max}})^a ,\ if\ x<x_{max}\\ 1 ,\ else\\ \end{cases}

作者认为a=0.75, xmax\ x_{max}=100时是一个较好的选择

生成词向量过程

  • 由于损失函数 J 的计算复杂度与共现矩阵X中非零元素呈线性关系,可以随机从X中采样小批量的非零元素。
  • 随机初始化目标词向量和上下文向量
  • 计算损失函数并使用随机梯度下降法迭代更新初始化向量和上下文向量和偏移项
  • 循环以上过程直到结束条件
  • 当所有词向量都完成学习后,将目标词向量和上下文向量相加得到最终的词向量矩阵