自然语言处理 - GloVe

先修知识:

  • 潜在语义分析 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(ji)=Xij/Xi 来代表单词 j j j 出现在单词 i i i 上下文中的概率,即co-occurrence probability。
用一个例子来解释如何用co-occurrence probability来表示词语含义:
在这里插入图片描述
例如我们想区分"ice"与"steam",它们之间的关系可通过它们与不同的单词 x x xco-occurrence probability的比值来描述。例如对于solid,solid出现在ice周围的概率为 1.9 × 1 0 − 4 1.9 \times 10^{-4} 1.9×104, solid 出现在steam周围的概率为 2.2 × 10 − 5 2.2 \times 10{-5} 2.2×105.这两个概率本身没有什么意义,有意义的是它们的比值 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(solidsteam)P(solidice).这个比值为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=1Vf(Xij)(wiTw^j+bi+b^jlogXij)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^jlogXij, 其中:

  • 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)需满足:

  1. 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) limx0f(0)log2(0) 是有限的。
  2. 较少发生的co-occurrence所占比重较小。
  3. 对于较多发生的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方法都做尝试,选择合适自己问题的方法。

我的尝试


参考资料
https://zhuanlan.zhihu.com/p/60208480

猜你喜欢

转载自blog.csdn.net/weixin_41332009/article/details/114005693