先修知识:
- 潜在语义分析 LSA
- Word2vec
看上一讲的文章:https://blog.csdn.net/weixin_41332009/article/details/113920580
1. GloVe模型的提出思想
潜在语义分析使用的 SVD 这种count based模型与Word2Vec 这种 direct prediction模型,它们各有优缺点。
Count based模型
- 优点
- 训练快速
- 有效的利用了统计信息
- 缺点
- 对于高频词汇较为偏向(disproportionate importance given to large counts)
- 仅能表示词语的相似性,有的时候产生的word vector对于解释词的含义如word analogy等任务效果不好。(primarily used to capture word similarity)
Direct Prediction
- 优点:
- 可以概括比相似性更为复杂的信息,进行word analogy等任务时效果较好. (capture complex patterns beyond word similarity)
- 缺点:
- 对统计信息利用的不够充分。
所以Manning教授等人想采取一种方法可以结合两者的优势,并将这种算法命名为GloVe(Global Vectors的缩写),表示他们可以有效的利用全局的统计信息。这里,“全局统计信息”就是指在整个语料库中,一个词语在另一个词语周围出现的概率。
2. co-occurrence probability
如何有效的利用word-word co-occurrence count并能学习到词语背后的含义呢?
首先定义一些符号:对于矩阵
X
X
X,
X
i
j
X_{ij}
Xij 代表了单词
j
j
j 出现在单词
i
i
i上下文中的次数,则
X
i
=
∑
k
X
i
k
X_i = \sum_k X_{ik}
Xi=∑kXik 即代表所有出现在单词
i
i
i 的上下文中的单词次数。我们用
P
i
j
=
P
(
j
∣
i
)
=
X
i
j
/
X
i
P_{ij} = P(j|i) = X_{ij}/X_i
Pij=P(j∣i)=Xij/Xi 来代表单词
j
j
j 出现在单词
i
i
i 上下文中的概率,即co-occurrence probability。
用一个例子来解释如何用co-occurrence probability来表示词语含义:
例如我们想区分"ice"与"steam",它们之间的关系可通过它们与不同的单词
x
x
x 的co-occurrence probability的比值来描述。例如对于solid,solid出现在ice周围的概率为
1.9
×
1
0
−
4
1.9 \times 10^{-4}
1.9×10−4, solid 出现在steam周围的概率为
2.2
×
10
−
5
2.2 \times 10{-5}
2.2×10−5.这两个概率本身没有什么意义,有意义的是它们的比值
P
(
s
o
l
i
d
∣
i
c
e
)
P
(
s
o
l
i
d
∣
s
t
e
a
m
)
\frac{P(solid|ice)}{P(solid|steam)}
P(solid∣steam)P(solid∣ice).这个比值为8.9,是一个较大的值。这是因为solid更常用来描述ice的状态而不是steam的状态,所以在ice的上下文中出现几率较大;对于gas则恰恰相反;而对于water这种描述ice与steam均可或者fashion这种与两者都没什么联系的单词,则比值接近于1。所以相较于单纯的co-occurrence probability,实际上co-occurrence probability的相对比值更有意义。
3. GloVe 模型
文章直接给出了GloVe模型的损失函数:
J
=
∑
i
,
j
=
1
V
f
(
X
i
j
)
(
w
i
T
w
^
j
+
b
i
+
b
^
j
−
l
o
g
X
i
j
)
2
J = \sum _{i,j = 1}^V f(X_{ij}) (w_i^T \hat w_j + b_i + \hat b_j - log X_{ij})^2
J=i,j=1∑Vf(Xij)(wiTw^j+bi+b^j−logXij)2
3.1
为了理解这个损失函数,我们先看最后一项 w i T w ^ j + b i + b ^ j − l o g X i j w_i^T \hat w_j + b_i + \hat b_j - log X_{ij} wiTw^j+bi+b^j−logXij, 其中:
- w i w_i wi是词语 i 作为中心词(如上例中的ice, steam)的向量表示,是我们要学习的参数。
- w ^ j \hat w_j w^j是词语 j 作为周围词(如上例中的solid, gas, water, fashion)的向量表示,是我们要学习的参数。
- b i , b ^ j b_i, \hat b_j bi,b^j是我们要学习的偏置参数。
- X i j X_{ij} Xij是周围词 j 出现在中心词 i 周围的次数。
以这个作为损失是因为经过一系列推导,我们希望 w i T w ^ j + b i + b ^ j = l o g X i j w_i^T \hat w_j + b_i + \hat b_j = log X_{ij} wiTw^j+bi+b^j=logXij。推导过程见https://zhuanlan.zhihu.com/p/60208480
3.2
f ( X i j ) f(X_{ij}) f(Xij)是个权值,加上这个权值是因为需要给那些较少发生的co-occurrence较小的权重。 f ( X i j ) f(X_{ij}) f(Xij)需满足:
- f ( 0 ) = 0 f(0) = 0 f(0)=0 ,因为要求 lim x → 0 f ( 0 ) l o g 2 ( 0 ) \lim_{x \rightarrow 0} f(0)log^2(0) limx→0f(0)log2(0) 是有限的。
- 较少发生的co-occurrence所占比重较小。
- 对于较多发生的co-occurrence,
f
(
x
)
f(x)
f(x) 也不能过大。
作者试验效果较好的权重函数形式是:
3.3
最后再对词汇表中的词两两求一次损失,将所有的损失加起来得到最终的损失即可。
4. GloVe和word2vec比较
虽然GloVe的作者在原论文中说GloVe结合了SVD与Word2Vec的优势,训练速度快并且在各项任务中性能优于Word2Vec,但是我们应该持有怀疑的态度看待这一结果,可能作者在比较结果时对于GloVe模型参数选择较为精细而Word2Vec参数较为粗糙导致GloVe性能较好,或者换另一个数据集,改换样本数量,两者的性能又会有不同。实际上,在另一篇论文Evaluation methods for unsupervised word embeddings中基于各种intrinsic和extrinsic任务的性能比较中,Word2Vec结果要优于或不亚于GloVe。实际应用中也是Word2Vec被采用的更多,对于新的任务,不妨对各种embedding方法都做尝试,选择合适自己问题的方法。
5. 关于GloVe的面试题 🚦
(1) glove vs LSA的比较?
答:LSA(Latent Semantic Analysis)可以基于co-occurance matrix构建词向量,实质上是基于全局语料采用SVD进行矩阵分解,然而SVD计算复杂度高;
glove可看作是对LSA一种优化的高效矩阵分解算法,采用Adagrad对最小平方损失进行优化;(
J
=
∑
i
,
j
=
1
V
f
(
X
i
j
)
(
w
i
T
w
^
j
+
b
i
+
b
^
j
−
l
o
g
X
i
j
)
2
J = \sum _{i,j = 1}^V f(X_{ij}) (w_i^T \hat w_j + b_i + \hat b_j - log X_{ij})^2
J=∑i,j=1Vf(Xij)(wiTw^j+bi+b^j−logXij)2)
(2) glove vs word2vec的比较?
word2vec是局部语料库训练的,其特征提取是基于滑窗的;而glove的滑窗是为了构建co-occurance matrix,是基于全局语料的,可见glove需要事先统计共现概率;因此,word2vec可以进行在线学习,glove则需要统计固定语料信息。
word2vec是无监督学习,同样由于不需要人工标注;glove通常被认为是无监督学习,但实际上glove还是有label的,即共现次数 X i j X_{ij} Xij。
word2vec损失函数实质上是带权重的交叉熵,权重固定;glove的损失函数是最小平方损失函数,权重可以做映射变换。
总体来看,glove可以被看作是更换了目标函数和权重函数的全局word2vec。