[博客翻译]词嵌入——第3部分:Word2Vec的秘密成分


原文地址:https://www.ruder.io/secret-word2vec/


词嵌入科普:word2vec成功的秘密成分

你是否听说过“word2vec”?它是一种广泛应用于自然语言处理领域的工具,用来学习单词的向量表示(即词嵌入)。那么,为什么word2vec如此成功呢?答案其实隐藏在一些特定的架构选择中。如果把这些选择应用到传统的分布语义方法上,也会让它们的表现与流行的词嵌入方法不相上下。

这篇文章将探讨word2vec成功背后的关键因素,并解释这些因素如何与更传统的模型建立联系。

GloVe简介

GloVe是一种流行的词嵌入模型,它的目标是明确地通过向量差来编码单词的意义——这在某种程度上可以看作是word2vec的一种偶然副产物。具体来说,GloVe作者证明了两个单词共现概率的比值包含信息,而不是它们的共现概率本身。因此,他们提出了一种加权最小二乘目标函数J,直接最小化两个单词向量点积与它们共现次数对数之间的差异:

[
J = \sum_{i,j=1}^V f(X_{ij})(w_i^T \tilde{w}_j + b_i + \tilde{b}j - \log X{ij})^2
]

其中:

  • ( w_i ) 和 ( b_i ) 分别是单词i的向量和偏置;
  • ( \tilde{w}_j ) 和 ( b_j ) 分别是上下文单词j的向量和偏置;
  • ( X_{ij} ) 是单词i在单词j上下文中出现的次数;
  • ( f ) 是一个权重函数,用于降低稀有和频繁共现的权重。

由于共现计数可以直接存储在单词-上下文共现矩阵中,因此GloVe使用这样的矩阵作为输入,而非整个语料库。


词嵌入与分布语义模型

尽管表面上看,分布语义模型(DSMs)和词嵌入模型使用不同的算法来学习单词表示——前者基于计数,后者基于预测——但从根本上看,这两类模型都依赖于相同的数据基础统计量,即单词间的共现计数。

因此,问题就变成了:为什么在几乎相同的信息下,词嵌入模型的表现仍优于传统DSM?


模型比较

根据Levy等人(2015)的研究,我们可以通过比较以下四种模型来识别神经词嵌入模型成功的关键因素,并展示如何将这些因素转移到传统方法中:

  1. 正点互信息(PPMI)
    PPMI是一种常用度量,用于衡量两词之间的关联强度。计算公式为:
    [
    PPMI(w, c) = \max(\log \frac{P(w, c)}{P(w)P(c)}, 0)
    ]
    其中,( P(w, c) ) 是两词共同出现的概率,( P(w) ) 和 ( P(c) ) 是它们各自出现的概率。
  2. 奇异值分解(SVD)
    SVD是一种常用的降维方法,在潜在语义分析(LSA)中被引入NLP领域。SVD将单词-上下文共现矩阵分解为三个矩阵 ( U \cdot \Sigma \times V^T ),并通常保留最大的 ( d ) 个特征值以生成单词和上下文的表示。
  3. Skip-gram with Negative Sampling(SGNS)
    即word2vec模型。详细内容可以参考我的之前博客
  4. 全局向量(GloVe)
    在前一节中已有详细介绍。

超参数

接下来,我们将分析以下几个超参数对模型表现的影响:

预处理

  1. 动态上下文窗口
    DSMs通常使用固定大小且未加权的上下文窗口,而SGNS和GloVe则赋予距离较近的单词更多权重,因为越接近的单词通常对词义更重要。
  2. 采样频率较高的词
    SGNS会随机移除频率高于某阈值 ( t ) 的高频词,概率为 ( p = 1 - \sqrt{\frac{t}{f}} )。
  3. 删除低频词
    这一步在预处理阶段进行,可以扩大实际使用的上下文窗口。

关联度量

  1. 偏移PMI
    提高负样本数量 ( k ) 可以提高参数估计精度。word2vec隐式因子化的PMI矩阵会发生平移,即每个PMI值增加 ( \log k )。对于普通PMI,我们得到偏移后的PPMI(SPPMI):
    [
    SPPMI(w, c) = \max(PMI(w, c) - \log k, 0)
    ]
  2. 上下文分布平滑
    SGNS按照平滑的一元分布(提升到幂次 ( \alpha ))采样负样本。我们可以将这一特性应用到PMI上,得到:
    [
    PMI(w, c) = \log \frac{p(w, c)}{p(w)p^\alpha(c)}
    ]

后处理

  1. 添加上下文向量
    将单词向量和上下文向量相加生成最终输出向量,例如 ( \mathbf{v}{cat} = \mathbf{w}{cat} + \mathbf{c}_{cat} )。
  2. 特征值加权
    使用额外参数 ( p ) 对特征值矩阵 ( \Sigma_d ) 加权。
  3. 向量归一化
    将所有向量归一化至单位长度。

结果

Levy等人(2015)在英文维基百科数据集上训练了所有模型,并在常见的词相似性和类比数据集上进行了评估。以下是主要发现:

  1. SVD在相似性任务上表现最佳,SGNS在类比任务上表现最佳。
  2. 超参数设置往往比算法选择更重要。没有一种算法能始终优于其他方法。

打破常见误解

  1. 词嵌入真的优于分布语义方法吗? 不是。有了正确的超参数,两者没有明显优劣。
  2. GloVe真的优于SGNS吗? SGNS在所有任务中表现更好。
  3. CBOW是好的word2vec配置吗? CBOW在任何任务中都不如SGNS。

推荐建议

最后,我们给出一些实用的建议:

  • 不要在SVD中使用偏移PPMI。
  • 不要“正确”地使用SVD(无特征值加权,性能会下降15分)。
  • 在短上下文(窗口大小为2)中使用PPMI和SVD。
  • 在SGNS中使用大量负样本。
  • 对所有方法使用上下文分布平滑(提升幂次 ( \alpha = 0.75 ))。
  • 将SGNS作为基线模型(鲁棒、快速且便宜)。
  • 尝试在SGNS和GloVe中添加上下文向量。

总结

这些研究结果表明,无论是使用词嵌入还是分布语义方法,差别并不重要;关键在于调整超参数并采取适当的预处理和后处理步骤。近年来的研究也进一步证实了SVD可能是获取准确词表示的最佳选择。希望通过本文,你能对传统分布语义方法与流行嵌入模型之间的联系有更深的理解,并考虑将这些方法结合到你的工具箱中。