真实面经题目 · 原创解析

Word2Vec 负采样为什么能加速训练,训练目标如何理解?

这道题考察 Word2Vec 训练目标的本质。负采样不是简单少算几个词,而是把 full softmax 的大词表多分类问题改成真实共现与噪声共现的二分类学习,每个正样本只更新少量负例,从而把复杂度从 O(|V|) 降到 O(K),同时学到可用于相似性和共现关系的 embedding。

出现于:美团 · 算法

60 秒回答模板

Skip-gram 原目标是给定中心词预测上下文词,如果用 full softmax,每次都要对整个词表归一化,词表大时很慢。负采样把它改成二分类:对真实共现的 (w, c),希望 v_w 和 v_c 内积大;再采 K 个噪声词 n,希望 v_w 和 v_n 内积小。典型目标是 log sigmoid(v_c·v_w) + sum log sigmoid(-v_n·v_w)。这样每个样本只更新 1 个正例和 K 个负例,K 远小于词表大小。它学到的不是校准的 P(context|word),而是区分真实共现和随机噪声的向量空间,内积可理解为共现强度的相对信号。

考点 从多分类变二分类
难度 真实面经题
回答目标 讲清 Word2Vec 负采样的目标函数、复杂度收益、采样分布和推荐场景中的验证方法。

深入解析

01

原始瓶颈

Skip-gram 用中心词预测上下文。full softmax 需要计算所有词的得分和归一化分母,复杂度和词表大小相关。百万级词表或 item 表下,每个样本更新全词表不可接受。

02

负采样改写目标

负采样为一个真实共现 pair 构造 K 个噪声 pair,把问题改成判断 pair 是否来自真实语料。正例希望 sigmoid(v_c·v_w) 接近 1,负例希望 sigmoid(v_n·v_w) 接近 0。

03

复杂度为何下降

每次只访问中心词、一个上下文词和 K 个负样本的向量,不需要遍历整个词表。训练复杂度从 O(|V|) 变成 O(K),K 常见为 5 到 20 量级,取决于数据规模和质量要求。

04

采样分布有讲究

负样本通常不是均匀抽样,而是按 unigram 频率的 3/4 次方采样。这样既不会让高频词完全支配训练,也不会让低频词过度出现。高频词还常配合 subsampling 降低低信息 token 的影响。

05

训练目标不是概率校准

负采样更像噪声对比学习,学到的是真实共现和随机共现的区分边界。在一定假设下,向量内积和 PMI 有关系,但不能把内积直接当成标准 softmax 概率。

06

推荐里的 item2vec

在推荐场景中,可以把 item 当词、用户行为序列当句子。窗口、行为类型、时间衰减、负样本分布和时间切分决定 embedding 学到的是相似、互补还是热门偏置。

易错点

  • 把负采样输出当成标准 softmax 概率。
  • 只说“采几个负样本所以快”,不说明从全词表归一化改成二分类目标。
  • 负样本分布设计不当,模型只学会区分热门和冷门。
  • 随机切分训练测试,让未来行为泄漏进 embedding 训练。
  • 只看训练 loss,不检查近邻质量、召回指标和线上效果。

面试官追问

负采样和 hierarchical softmax 有什么区别?

hierarchical softmax 用树结构把 full softmax 降到路径上的 O(log |V|),更接近概率建模;负采样是二分类噪声对比,每步 O(K),实现简单,常用于学习高质量 embedding。

为什么常用词频的 3/4 次方采样?

它降低极高频词的支配性,同时保留一定高频词概率。均匀采样会过多采到低频无关词,原始词频采样又会让高频词出现过多。3/4 是经验上较稳的折中。

item2vec 中窗口怎么选?

窗口太小只学局部相似,窗口太大容易把同一用户长期但无关的兴趣拉近。通常按 session、时间间隔和行为类型设窗口,并通过 Recall@K、近邻解释和线上 A/B 调参。

如何发现热门 item hubness?

统计每个 item 出现在别人 TopK 近邻里的次数、embedding norm、热门集中度和长尾覆盖。如果少数热门 item 成为大量近邻,要调采样、subsampling、去热门或加入多样性约束。