Glove 细节介绍
Glove全称Global Vectors for Word Representation,是目前应用范围最广的词向量,但是它基于通用语料训练,所以适合通用语言的自然处理任务,如果你的词库是领域特定词库,使用word2vec或者fasttext自己训练会比较好。
Glove模型可以简单概括为:基于通用语料,获得词频统计,学习词语表征)
从语料中通过统计方式提取一个共现矩阵 X X X, X i j X_{ij} Xij表示的是单词i和单词j出现在同一个窗口中的频率(单词i和j出现在同一个上下文中的频率)。
模型公式
J
=
∑
i
,
j
N
f
(
X
i
,
j
)
(
v
i
T
v
j
+
b
i
+
b
j
−
l
o
g
(
X
i
,
j
)
J=\sum_{i,j}^{N}f(X_{i,j})(v_i^Tv_j+b_i+b_j-log(X_{i,j})
J=i,j∑Nf(Xi,j)(viTvj+bi+bj−log(Xi,j)
v
i
v_i
vi和
v
j
v_j
vj即为单词i和j的词向量,
b
i
b_i
bi和
b
j
b_j
bj是两个标量(偏差项,不能省略,会破坏对成型,在推导过程中你会明白为什么不能省略)。
f
(
x
)
f(x)
f(x)是一个权重函数,
N
N
N表示词汇表大小(共现矩阵维度为
N
∗
N
N*N
N∗N)。Glove没有使用神经网络,从这一点来讲,是无监督的学习方式,但是在公式推导过程中,你会发现它也能被看作是监督学习的方式。
推导过程如下
定义
X
i
X_i
Xi为如下,你可以理解为出现单词i的频率之和。
X
i
=
∑
j
=
1
N
X
i
,
j
X_i=\sum_{j=1}^{N}X_{i,j}
Xi=j=1∑NXi,j
即矩阵单词i那一行的和。
条件概率
P
i
,
k
P_{i,k}
Pi,k:
P
i
,
k
=
X
i
,
k
X
i
P_{i,k} = \frac{X_{i,k}}{X_i}
Pi,k=XiXi,k
表示单词k出现在单词i语境中的条件概率。
两个条件概率的比率:
r
a
t
i
o
i
,
j
,
k
=
P
i
,
k
P
j
,
k
ratio_{i,j,k}=\frac{P_{i, k}}{P_{j,k}}
ratioi,j,k=Pj,kPi,k
作者认为这个比率蕴含语义信息:
r a t i o i , j , k ratio_{i,j,k} ratioi,j,k | 单词j,k相关 | 单词j,k不相关 |
---|---|---|
单词i,k相关 | → 1 \rightarrow1 →1 | → ∞ \rightarrow \infty →∞ |
单词i,k不相关 | → 0 \rightarrow0 →0 | → 1 \rightarrow1 →1 |
如果训练得到的词向量能通过某种函数记为 g ( v i , v j , v k ) g(v_i,v_j,v_k) g(vi,vj,vk)计算出的 r a t i o i , j , k ratio_{i,j,k} ratioi,j,k能有同样的规律,那么可以认为词向量已经编码了共现矩阵所蕴含的语义信息。
也就是说我们希望
r
a
t
i
o
i
,
j
,
k
=
P
i
,
k
P
j
,
k
=
g
(
v
i
,
v
j
,
v
k
)
ratio_{i,j,k}=\frac{P_{i, k}}{P_{j,k}}=g(v_i,v_j,v_k)
ratioi,j,k=Pj,kPi,k=g(vi,vj,vk)尽可能接近。
使用MSE作为代价函数
J
=
∑
i
,
j
,
k
N
(
P
i
,
k
P
j
,
k
−
g
(
v
i
,
v
j
,
v
k
)
)
2
J=\sum_{i,j,k}{N}(\frac{P_{i,k}}{P_{j,k}}-g(v_i,v_j,v_k))^2
J=i,j,k∑N(Pj,kPi,k−g(vi,vj,vk))2
g ( v i , v j , v k ) g(v_i,v_j,v_k) g(vi,vj,vk)有如下三方面的考虑:
- 考虑 v i v_i vi和 v j v_j vj之间的关系,应该有 v i − v j v_i-v_j vi−vj
- r a t i o i , j , k ratio_{i,j,k} ratioi,j,k是标量,为了得到标量,可以使用内积 ( v i − v j ) T v k (v_i-v_j)^Tv_k (vi−vj)Tvk
- 不能为负值,使用exp函数,得 g ( v i , v j , v k ) = e x p ( ( v i − v j ) T ) v k g(v_i,v_j,v_k)=exp((v_i-v_j)^T)v_k g(vi,vj,vk)=exp((vi−vj)T)vk
综上:
P
i
,
k
P
j
,
k
=
e
x
p
(
(
v
i
−
v
j
)
T
)
v
k
)
=
e
x
p
(
v
i
T
v
k
−
v
j
T
v
k
)
\frac{P_{i, k}}{P_{j,k}}=exp((v_i-v_j)^T)v_k)=exp(v_i^Tv_k-v_j^Tv_k)
Pj,kPi,k=exp((vi−vj)T)vk)=exp(viTvk−vjTvk)
即
P
i
,
k
P
j
,
k
=
e
x
p
(
v
i
)
T
e
x
p
(
v
j
)
T
\frac{P_{i,k}}{P_{j,k}}=\frac{exp(v_i)^T}{exp(v_j)^T}
Pj,kPi,k=exp(vj)Texp(vi)T
实现这个优化目标,只需要拟合分子分母即可,而分子分母同型,我们可以简化为这一目标
P
i
,
j
=
e
x
p
(
v
i
T
v
j
)
P_{i,j}=exp(v_i^Tv_j)
Pi,j=exp(viTvj)
两边取对数
l o g ( P i , j ) = v i T v j log(P_{i,j})=v_i^Tv_j log(Pi,j)=viTvj
代价函数简化为:
J
=
∑
i
,
j
N
(
v
i
T
v
j
−
l
o
g
(
P
i
,
j
)
)
2
J=\sum_{i,j}^{N}(v_i^Tv_j-log(P_{i,j}))^2
J=i,j∑N(viTvj−log(Pi,j))2
这里存在一个问题, l o g ( P i , j ) = v i T v j log(P_{i,j})=v_i^Tv_j log(Pi,j)=viTvj, l o g ( P j , i ) = v j T v i log(P_{j,i})=v_j^Tv_i log(Pj,i)=vjTvi, l o g ( P i , j ) log(P_{i,j}) log(Pi,j)等于 l o g ( P j , i ) log(P_{j,i}) log(Pj,i)但是 v i T v j v_i^Tv_j viTvj不等于 v j T v i v_j^Tv_i vjTvi。这就是为什么要加上偏差项。
J = ∑ i , j N ( v i T v j + b i + b j − l o g ( P i , j ) ) 2 J=\sum_{i,j}^{N}(v_i^Tv_j+b_i+b_j-log(P_{i,j}))^2 J=i,j∑N(viTvj+bi+bj−log(Pi,j))2
最后,每一个单词组合的权重应该不一样,所以引入权重函数
J
=
∑
i
,
j
N
f
(
X
i
,
j
)
(
v
i
T
v
j
+
b
i
+
b
j
−
l
o
g
(
X
i
,
j
)
)
2
J=\sum_{i,j}^{N}f(X_{i,j})(v_i^Tv_j+b_i+b_j-log(X_{i,j}))^2
J=i,j∑Nf(Xi,j)(viTvj+bi+bj−log(Xi,j))2
权重函数:
f
(
x
)
=
{
x
x
m
a
x
0.75
,
i
f
x
<
x
m
a
x
1
,
i
f
x
>
=
x
m
a
x
f(x)=\begin{cases} \frac{x}{x_{max}}^{0.75}, & if \ x < x_{max} \\ 1, & if \ x >= x_{max} \end{cases}
f(x)={xmaxx0.75,1,if x<xmaxif x>=xmax
即频率越高权重越大,但是也不能过分增大。