很棒的资料:https://blog.csdn.net/coderTC/article/details/73864097
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_{ij}^N f(X_{ij})(v_i^Tv_j + b_i + b_j - log(X_{ij}))^2 J=∑ijNf(Xij)(viTvj+bi+bj−log(Xij))2
Glove基于词的共现矩阵 X X X来学习词向量,考虑了全局统计信息,同时设置了权重函数 f f f,使得当词频过高的时候,权重没有过分增大。
具体来说,在Glove中,不是将整个corpus作为输入,而是统计出词的共现矩阵X,后面基于这个X进行学习。
统计共现矩阵X:
X
i
,
j
X_{i,j}
Xi,j表示在一个窗口中,单词i和单词j同时出现的次数。
这个过程是,依次将语料库里的单词作为窗口中心词,然后确定其左右两边的单词,从而得到一个窗口。
X
中
心
词
,
左
右
两
边
的
词
+
=
1
X_{中心词,左右两边的词} += 1
X中心词,左右两边的词+=1
从代价函数看出,Glove没有使用神经网络的方法
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_{ij}^N f(X_{ij})(v_i^Tv_j + b_i + b_j - log(X_{ij}))^2
J=∑ijNf(Xij)(viTvj+bi+bj−log(Xij))2
作者是从共现矩阵中发现了一定的规律,想让词向量与共现矩阵有很好的一致性,从而说明了词向量中也蕴含了共现矩阵中所蕴涵的信息。
上面列出的参考链接,详细地介绍了Glove优化目标是怎么得到的。
优化目标中,
f
f
f函数是一个加权作用,本着共现频率越高,权重越大的原则。同时,为了当频率过高时,权重不应过分增大,作者设计的权重函数是: