核心要点

  • 原始 softmax 需对整个词表归一化,每步计算量 O(V),大词表下极慢

  • 负采样:把 V 类多分类转成 1 个正样本 + 少量负样本的二分类,复杂度与采样数相关

  • 层次 softmax:用 Huffman 树编码词表,把复杂度从 O(V) 降到 O(logV)

  • 高频词二次采样(subsampling)丢弃部分高频词,加速且提升低频词质量

标准回答

Word2Vec 训练慢的根源在于输出层的 softmax 需要在整个词表上做归一化:每更新一个样本都要计算所有 V 个词的得分,复杂度为 O(V),词表常达几十万到百万,代价极高。主流加速方法有三种:

1. 负采样(Negative Sampling)
把"在 V 个词上做多分类"转化为"区分正样本与少量负样本的二分类"问题。对每个正样本(真实的中心词-上下文对),只随机采样 k 个负样本(通常 k 取 5–20,小语料可更大),用 sigmoid 分别判断每个样本是否为真实搭配。

  • 每步只需更新 1+k 个词向量,而非全词表,计算量与 V 解耦。
  • 负样本按词频的 3/4 次方分布采样,兼顾高频词与低频词。
  • 实现简单、效果好,是实践中最常用的方案。

2. 层次 Softmax(Hierarchical Softmax)
用词表构建一棵 Huffman 树:高频词路径短、低频词路径长,每个词对应从根到叶子的一条路径。计算某个词的概率不再遍历全词表,而是沿路径做一连串二分类(每个内部节点一个 sigmoid),把复杂度从 O(V) 降到 O(logV)

  • 对低频词友好(无需采样),但树结构带来一定实现复杂度。
  • 当词表巨大且低频词多时优势明显。

3. 高频词二次采样(Subsampling)
"的""是"这类高频词信息量低却占大量样本。按一定概率随机丢弃高频词(词频越高丢弃概率越大),既减少训练样本数加速训练,又让模型把更多容量分给信息量大的低频词,常能同时提升速度与质量。

取舍小结

  • 负采样:实现简单、速度快,对高频词和稠密向量更友好,是默认首选。
  • 层次 softmax:理论复杂度更低、对低频词更友好,但实现稍复杂、对高频词反而不一定更快。
  • 二次采样:与上述两者正交,可叠加使用,专门处理高频词冗余。

常见误区

⚠️ 常见踩坑

误以为负采样和层次 softmax 必须二选一中的某个永远更快——实际取决于词表规模与词频分布:层次 softmax 对低频词友好,负采样对高频词与一般场景更快。另一个误区是把高频词二次采样当成与前两者互斥的方案,其实它是正交的预处理,可与任一加速方法叠加。

追问

追问 1负采样的负样本为什么按词频的 3/4 次方采样?

若直接按原始词频采样,"的""是"等极高频词会被过度选为负样本;若均匀采样,低频词又被过度采样。取 3/4 次方是一个折中:相对降低高频词的采样概率、提高低频词的概率,使两类词都能得到合理训练。这是 Mikolov 论文中的经验取值,实践效果良好。

追问 2层次 softmax 为什么能把复杂度降到 O(logV)?

它把词表组织成 Huffman 二叉树,每个词是一个叶子,对应根到该叶子的唯一路径。预测某词的概率等于沿路径上每个内部节点二分类概率的连乘,路径长度约为 log₂V,因此每次只需计算约 logV 个 sigmoid,而非全词表 V 次,复杂度由 O(V) 降为 O(logV)。高频词用 Huffman 编码后路径更短,进一步省时。

追问 3负采样和层次 softmax 在实践中该如何选择?

经验上:负采样实现简单、训练快,在大多数任务和较大语料上是默认选择,尤其当更关注高频词和整体效率时。层次 softmax 对低频词的表示更友好、在超大词表上理论开销更小,但实现复杂、对高频词未必更快。常见做法是先用负采样作为基线,再视低频词需求与词表规模决定是否切换。

🔗 相似问题

同一考点的不同问法,面试官可能换着问,一起刷更稳

没找到想看的面试题?把你想看的告诉我们 →

延伸学习

按主题分类的相关资源,便于系统复习