论文原文 | GloVe: Global Vectors for Word Representation |
---|---|
论文信息 | EMNLP2014 |
个人解读 | Hytn Chen |
更新时间 | 2020-02-15 |
词表示简介
词表示已成为所有基于深度学习的自然语言处理系统的重要组成部分,它们在固定长度的向量中编码单词,从而大幅提高神经网络处理文本数据的能力。有用独热表示(离散表示)来表示词,也有用稠密表示来表示词,词表示发展的历史阶段经历基于one-hot的词表示,基于共现矩阵的词表示以及基于神经网络的词表示。
词表示相关方法
基于共现矩阵的词表示
构造这样一个矩阵,矩阵每行和每列都对应文本中出现的单词,矩阵元素代表两个词一共在一句话中共现了几次,就是统计了这样的频率。这样的矩阵仍然是高维稀疏的,可以一定程度上表示语义(如果两个词有相似的上下文,那么他们应该有相似的语义),也可以利用全局统计信息。因为稀疏由此想到奇异值分解共现矩阵SVD,对频率矩阵进行降噪和降维处理,从中挖掘出词汇的潜在含义。可是经过优化,该模型还是有许多缺点:
矩阵的维度经常会变动,比如新词频繁加入;
绝大部分词不会出现,矩阵过于稀疏;
矩阵维度很高,数量级在百万级;
训练时的计算复杂度是 O ( V 3 ) O(V^3) O(V3)。其中V是词汇表大小。
基于神经网络的词表示
最经典的例如word2vec,skip-gram以及CBOW,都很经典,在此不多加赘述。
神经网络方法优点是效果好,速度快,但是没用上全局统计的信息。
而GloVe就进行取长补短,结合了两种词表示方法的优点来学习词表示。
GloVe模型
作者的一段话:统计共现频率对于所有的无监督学习词表示的方法来说,都是主流使用的手段。那么这个统计频率说明了什么意思,以及最终的词向量是否能表达那层意思,这些都是未解决的问题。因此本文构建了一个新的词表示模型,之所以起名GloVe是因为模型可以直接抓取全局语料的统计信息。
首先明确符号
X \rm{X} X表示共现矩阵,是对称阵
X i j \rm{X}_{ij} Xij表示词j出现在中心词i的上下文的次数,这里的上下文是由窗口大小决定的
X i = ∑ k X i k \mathrm{X}_{\mathrm{i}}=\sum_{k} \mathrm{X}_{\mathrm{i} k} Xi=∑kXik表示任何词出现在i的上下文中的总次数,就是i遇见了多少次词
P i j = X i j X i P_{i j}=\frac{X_{i j}}{X_{i}} Pij=XiXij表示单词j出现在词i的上下文的概率
那么GloVe模型就定义了如下的新的变量,尝试抓住全局信息
R
a
t
i
o
=
P
i
k
P
j
k
\mathrm{Ratio}=\frac{\mathrm{P}_{i k}}{\mathrm{P}_{j k}}
Ratio=PjkPik
这里并没有直接像skip-gram一样直接用神经网络拟合局部信息
P
i
k
P_{ik}
Pik(就是单词k出现在i上下文中的概率),而是尝试拟合这样一个比率,就是单词k出现在i上下文时候的概率 / 单词k出现在j上下文时候的概率。那么共现的概率抓取到了什么意思,作者举例进行了说明:
假设两个词i和j都是展现了热力学相位的概念,如果i是ice,j是steam,这两个词的关系就可以用多个探测词汇k,通过公式中的ratio或者说共现概率来进行探测。如果k和ice有关但是和steam无关,比如k是solid,那么ratio的值就会很大;反之,如果k是gas,那ratio就会很小。如果k是water或者fashion这种和两个都很相关或者都很不相关的词,那么ratio值则会接近1。这段描述可以通过下表来体现:
上面的例子说明了什么问题?就是词向量开始学习时候的初值或者起点应该是共现概率的比率,而不是这些概率本身。在提出模型之前需要注意的点是一个词在GloVe中有两个向量,一个是作为中心词的时候,一个是作为上下文词时候的向量。而模型希望有一个函数F,可以通过i,j和k的词向量拟合出这样的Ratio,总结得公式如下:
F
(
w
i
,
w
j
,
w
^
k
)
=
P
i
k
P
j
k
\mathrm{F}\left({w}_{i}, {w}_{j}, \hat{w}_{k}\right)=\frac{\mathrm{P}_{i k}}{\mathrm{P}_{j k}}
F(wi,wj,w^k)=PjkPik
那么怎么样能让函数encode出等式右边的ratio所展现出的信息呢?也就是说怎么样体现等式右边的比率形式所表达的那种词向量之间的差异性呢?因为向量空间具有线性结构,就是a和b之间存在某种关系,c和d之间存在某种关系,这两个关系相似,那么a-b应该和c-d相似。这是word2vec的效果,最著名的例子就是国王-男人=王后-女人,由此想到直接建模词表示之差来得到差异性从而拟合比率:
F
(
w
i
−
w
j
,
w
^
k
)
=
P
i
k
P
j
k
\mathrm{F}\left({w}_{i}-{w}_{j}, \hat{w}_{k}\right)=\frac{\mathrm{P}_{i k}}{\mathrm{P}_{j k}}
F(wi−wj,w^k)=PjkPik
由于左边是向量,右边是标量,虽然函数也可以通过神经网络建模复杂的参数来实现这样的等式关系,但是这样会混淆我们尝试去抓取的那种线性的结构。因此可以先用点积建模,公式再次转变如下:
F
(
(
w
i
−
w
j
)
T
w
^
k
)
=
P
i
k
P
j
k
\mathrm{F}\left(({w}_{i}-{w}_{j})^T\hat{w}_{k}\right)=\frac{\mathrm{P}_{i k}}{\mathrm{P}_{j k}}
F((wi−wj)Tw^k)=PjkPik
这样就防止了F将词的维度弄乱,搅乱原本的线性空间。注意,在共现矩阵中,中心词和上下文词之间的区别是几乎没有的,也就是说我们是可以随意交换这两个东西的。因此不仅要让w和\hat w可以互换,还要让GloVe拟合的是一个对称矩阵。也就是说,我们最终的模型按照上面的说法重标签或者互换变量之后应该不受影响。为解决这个问题,需要两步,第一步让F变成一个异质同形的函数。由此想到对上式再做如下变换:(其实就是为了让分子或分母中的下标互换之后能和ratio中的对应位置上的P相等,要考虑什么函数的输入之差能映射到输出之比上)
F
(
(
w
i
−
w
j
)
T
w
^
k
)
=
F
(
w
i
T
w
^
k
)
F
(
w
j
T
w
^
k
)
\mathrm{F}\left(\left(w_{i}-w_{j}\right)^{T} \hat{w}_{k}\right)=\frac{F\left(w_{i}^{T} \hat{w}_{k}\right)}{F\left(w_{j}^{T} \hat{w}_{k}\right)}
F((wi−wj)Tw^k)=F(wjTw^k)F(wiTw^k)
这里是需要对应相等的部分
F
(
w
i
T
w
~
k
)
=
P
i
k
=
X
i
k
X
i
F\left(w_{i}^{T} \tilde{w}_{k}\right)=P_{i k}=\frac{X_{i k}}{X_{i}}
F(wiTw~k)=Pik=XiXik
那么原等式的解就是
F
=
e
x
p
F=exp
F=exp或者
w
i
T
w
~
k
=
log
(
P
i
k
)
=
log
(
X
i
k
)
−
log
(
X
i
)
w_{i}^{T} \tilde{w}_{k}=\log \left(P_{i k}\right)=\log \left(X_{i k}\right)-\log \left(X_{i}\right)
wiTw~k=log(Pik)=log(Xik)−log(Xi)
这时就可以发现,如果不看等式右边的
l
o
g
(
X
i
)
log(X_i)
log(Xi)的话,上面的等式就具备了对称性。但是这项和k无关,所以可以被表示为
w
i
w_i
wi的一个偏置
b
i
b_i
bi。最终,再添加
w
^
k
\hat w_k
w^k额外的偏置
b
^
k
\hat b_k
b^k,就可以得到对称性了(i和k互换也成立)
w
i
T
w
~
k
+
b
i
+
b
~
k
=
log
(
X
i
k
)
w_{i}^{T} \tilde{w}_{k}+b_{i}+\tilde{b}_{k}=\log \left(X_{i k}\right)
wiTw~k+bi+b~k=log(Xik)
上面的等式就是F的强简化版。有缺漏在于没考虑对数里面的东西是0的情况,其中一个解决方法就是在里面加个1平移一下,那么这个东西将作为模型实验的baseline。看看能不能再精确一点找到更好的F。上面的baseline的主要的缺点是它对所有的共现都同等看待,甚至是对于那些几乎从不共现的词。而这些极少共现的词作为输入不仅携带很少的信息,还会增添噪音,这样几近0的输入占据数据集的75%~95%,具体数值则和词汇表和语料库的大小有关。
因此本文提出了新的加权的最小二乘回归模型来解决这个问题,将上式作为一个最小二乘问题,引入权重函数f得到损失函数,由此得到需要优化模型:
J
=
∑
i
,
j
=
1
V
f
(
X
i
j
)
(
w
i
T
w
~
j
+
b
i
+
b
~
j
−
log
X
i
j
)
2
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}
J=i,j=1∑Vf(Xij)(wiTw~j+bi+b~j−logXij)2
这样的权重函数f应该遵守如下性质:
- f ( 0 ) = 0 f(0)=0 f(0)=0,若f是连续函数,那在频数趋近0的时候函数的极限应该也是0
- 权重函数f应该是非递减的,这样极少共现的词不会多给权重
- 权重函数f应该在频数值 X X X大的时候相应地变小,这样频繁共现的词也不会多给权重,例如中文里的停用词
有很多函数符合这样的性质,但有一种是作者找到的表现最好的函数:
f
(
x
)
=
{
(
x
/
x
max
)
α
if
x
<
x
max
1
otherwise
f(x)=\left\{\begin{array}{cc} {\left(x / x_{\max }\right)^{\alpha}} & {\text { if } x<x_{\max }} \\ {1} & {\text { otherwise }} \end{array}\right.
f(x)={(x/xmax)α1 if x<xmax otherwise
其中
α
\alpha
α的值在四分之三的时候效果最好,这一数值和word2vec那篇论文中的最佳表现的数值很接近。
但是对于词k,一个词有两个表示方法,那么怎么样让这两个方法不会造成互相矛盾的结果呢?作者直接将这两个向量相加来解决了这个问题。
和skip-gram的联系
skip-gram可以通过推导变得接近GloVe的损失函数,首先skip-gram建模的j出现在i上下文的概率我们定义成
Q
i
j
Q_{ij}
Qij,那么
Q
i
j
=
exp
(
w
i
T
w
^
j
)
∑
k
=
1
V
exp
(
w
i
T
w
^
k
)
Q_{i j}=\frac{\exp \left(w_{i}^{T} \widehat{w}_{j}\right)}{\sum_{k=1}^{V} \exp \left(w_{i}^{T} \widehat{w}_{k}\right)}
Qij=∑k=1Vexp(wiTw
k)exp(wiTw
j)
而skip-gram的损失函数
J
J
J则表示为
J
=
−
∑
i
∈
corpus
j
∈
context(i)
log
Q
i
j
J=-\sum_{i \in \text { corpus } \atop j \in \text {context(i)} } \log Q_{i j}
J=−j∈context(i)i∈ corpus ∑logQij
上式又可写为
J
=
−
∑
i
=
1
V
∑
j
=
1
V
X
i
j
log
Q
i
j
J=-\sum_{i=1}^{V} \sum_{j=1}^{V} X_{i j} \log Q_{i j}
J=−i=1∑Vj=1∑VXijlogQij
前面定义的时候说了
P
i
j
=
X
i
j
X
i
P_{i j}=\frac{X_{i j}}{X_{i}}
Pij=XiXij,于是等式变为
J
=
−
∑
i
=
1
v
X
i
∑
j
=
1
v
P
i
j
log
Q
i
j
J=-\sum_{i=1}^{v} X_{i} \sum_{j=1}^{v} P_{i j} \log Q_{i j}
J=−i=1∑vXij=1∑vPijlogQij
其实上式还可以写为
−
∑
i
=
1
V
X
i
H
(
P
i
,
P
j
)
-\sum_{i=1}^{V} X_{i} H\left(P_{i}, P_{j}\right)
−∑i=1VXiH(Pi,Pj),其中H代表两个分布的交叉熵损失,交叉熵在这里并不是一个好的损失,它过于偏重长尾分布(就是概率极低的时候也会纳入计算),并且还需要归一化,增加了计算量。由此想到用均方损失来替代交叉熵损失,将上式转变为
J = − ∑ i = 1 v X i ∑ j = 1 v ( P ^ i j − Q ^ i j ) 2 J=-\sum_{i=1}^{v} X_{i} \sum_{j=1}^{v} (\hat P_{i j} - \hat Q_{i j})^2 J=−i=1∑vXij=1∑v(P^ij−Q^ij)2
这里其实对P和Q的内容进行了替换,原本他们代表的意义是概率,现在新的意义是频数,也就是
P
^
i
j
=
X
i
j
\hat P_{ij}=X_{ij}
P^ij=Xij,而
Q
^
i
j
=
e
x
p
(
w
i
T
w
^
j
)
\hat Q_{ij} = exp(w_i^T\hat w_j)
Q^ij=exp(wiTw^j),因此得到如下等式
J
^
=
∑
i
=
1
V
∑
j
=
1
V
X
i
(
X
i
j
−
exp
(
w
i
T
w
^
j
)
)
2
\widehat{J}=\sum_{i=1}^{V} \sum_{j=1}^{V} X_{i}\left(X_{i j}-\exp \left(w_{i}^{T} \widehat{w}_{j}\right)\right)^{2}
J
=i=1∑Vj=1∑VXi(Xij−exp(wiTw
j))2
这里的频数可能会很大不利于优化,因此对两个频数分别取对数,由此得到新的等式
J
^
=
∑
i
=
1
V
∑
j
=
1
V
X
i
(
log
X
i
j
−
w
i
T
w
^
j
)
2
\hat{J}=\sum_{i=1}^{V} \sum_{j=1}^{V} X_{i}\left(\log X_{i j}-w_{i}^{T} \hat{w}_{j}\right)^{2}
J^=i=1∑Vj=1∑VXi(logXij−wiTw^j)2
此时和GloVe的损失函数进行对比:
J = ∑ i , j = 1 V f ( X i j ) ( w i T w ~ j + b i + b ~ j − log X i j ) 2 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} J=i,j=1∑Vf(Xij)(wiTw~j+bi+b~j−logXij)2
此时就可以发现skip-gram模型的不足,该模型过于偏重词频,事实上高频词带来的信息量不一定大,对此GloVe就对高频词做出了限制,引入了新的权值函数进行规范。