Negative Sampling

Negative Sampling 是一种训练优化技巧,将对整个词表的 Softmax 计算简化为少量"负样本"的二分类问题,大幅降低 Word2Vec 等模型的训练成本。

Negative Sampling

直觉理解

假设你在学英语单词。老师给你一个句子 "The cat sat on the ___",正确答案是 "mat"。

传统方法:让你从整本词典(几十万个词)中选出 "mat"——代价极高。

Negative Sampling 的方法:只让你区分 "mat"(正样本)和随机挑出的几个干扰词如 "banana"、"quantum"、"Tuesday"(负样本)。只要你能从这几个选项中选对,就算学到了。

为什么需要它

在 Word2Vec 的原始设计中,预测下一个词需要对整个词表计算 Softmax:

P(wowI)=exp(vwovwI)w=1Vexp(vwvwI)P(w_o | w_I) = \frac{\exp(\mathbf{v}'_{w_o} \cdot \mathbf{v}_{w_I})}{\sum_{w=1}^{V} \exp(\mathbf{v}'_w \cdot \mathbf{v}_{w_I})}P(wowI)=w=1Vexp(vwvwI)exp(vwovwI)

分母需要遍历词表中所有 VVV 个词(通常 V>100,000V > 100{,}000V>100,000),每一步训练都要计算十万次以上的点积和指数运算。这在实践中极其缓慢。

核心思想

Negative Sampling 将问题从"V 分类"转化为"几个二分类":

不再问"哪个词是正确的",而是问"这个词对是真实共现的,还是随机凑的?"

对于一个真实的 (context, target) 词对,训练目标变为:

L=logσ(vwovwI)+i=1kEwiPn(w)[logσ(vwivwI)]\mathcal{L} = \log \sigma(\mathbf{v}'_{w_o} \cdot \mathbf{v}_{w_I}) + \sum_{i=1}^{k} \mathbb{E}_{w_i \sim P_n(w)} \left[ \log \sigma(-\mathbf{v}'_{w_i} \cdot \mathbf{v}_{w_I}) \right]L=logσ(vwovwI)+i=1kEwiPn(w)[logσ(vwivwI)]

其中:

  • 第一项:让正样本的得分尽量高
  • 第二项:让 kkk随机采样的负样本的得分尽量低
  • σ\sigmaσ 是 Sigmoid 函数
  • kkk 通常取 5-20

采样策略

负样本不是均匀随机选的。Word2Vec 使用词频的 3/4 次幂分布:

Pn(w)=f(w)3/4wf(w)3/4P_n(w) = \frac{f(w)^{3/4}}{\sum_{w'} f(w')^{3/4}}Pn(w)=wf(w)3/4f(w)3/4

为什么是 3/43/43/4

  • 如果均匀采样,高频词("the"、"a")和低频词被选中的概率一样,但高频词作为负样本的区分度很低
  • 3/43/43/4 次幂提升低频词的采样概率,使负样本更具挑战性,训练效果更好

效果对比

方案每步计算量训练速度效果
Full SoftmaxO(V)O(V)O(V)极慢精确
Hierarchical SoftmaxO(logV)O(\log V)O(logV)较快对低频词好
Negative SamplingO(k)O(k)O(k)kVk \ll VkV极快对高频词好

k=15k=15k=15V=100,000V=100{,}000V=100,000 时,计算量缩减了约 6600 倍

更广泛的影响

Negative Sampling 的思想不限于 Word2Vec,它启发了许多后续工作:

  • 对比学习(Contrastive Learning):拉近正样本对、推远负样本对
  • InfoNCE 损失:CLIP、SimCLR 等模型的核心损失函数
  • 检索模型训练:用负样本训练 query-document 匹配

本质上,Negative Sampling 提出了一个通用的工程洞察:当精确计算太贵时,用采样近似往往足够好