一、先铺垫背景:传统多分类为什么扛不住?

传统 Softmax + 交叉熵,完整公式:

= 总类别数(词表/图像类别)。 分母要遍历全部C个类别求和:

  • 大词表NLP(如词表10万、百万)、超大类别检索任务,每次前向+反向都要算百万次指数,算力爆炸,根本跑不动。

目标:换掉完整归一化的Softmax,不用遍历全部类别,近似算出分类损失。NCE 就是干这个的。

二、核心:把多分类 → 二分类(Noise Contrast)

1. 原始多分类任务逻辑

给定输入,从全部个类别里,找出真实目标类别

2. NCE 改造:构建二分类判别任务

每次构造一个二元数据集,只有两类:

  1. 正样本(data sample),真实匹配的输入-目标对;标签
  2. 负样本(noise sample):从全局噪声分布 随机采个无关类别 ,标签

模型现在不学“多分类选正确类”,只学一件事:

判断一对是不是来自真实数据分布(D=1),还是随机噪声(D=0)

名字里的 Contrast(对比)

真实样本噪声样本做对比区分,让模型学会: 真实匹配的打分更高,随机噪声匹配打分更低,这就是「噪声对比」。

三、关键矛盾:全量负样本复杂度没降低,引出 Estimation(估计近似)

方案A:拿全集所有其他类别当负样本

对一条正样本,把剩下个类别全部当成负例训练:

  • 数学上等价于原始Softmax交叉熵,无近似、理论最优;
  • 致命问题:动辄几十万,每条样本要算几十万负例,计算量完全没下降,初衷(提速)失效。

方案B:负样本采样 Estimation(NCE里Estimation的来源)

不去取全部噪声,只随机采样少量k个负样本近似代表全局噪声分布: 只用 正 + 负样本计算损失,代替完整类求和。

  • Estimation 含义:我们没有使用完整噪声分布,只用少量采样样本估计真实的对比损失;
  • 是近似算法,不是精确等价原始多分类。

采样数量的影响

  • 越大:采样的噪声越接近全局完整噪声分布,损失估计越准,模型效果逼近完整Softmax;
  • 越小:计算越快,但估计偏差变大,效果会轻微下降; 工程上一般取 做速度与精度平衡。

四、数学极简印证(直观看懂近似逻辑)

标准NCE损失,单样本形式:

  • :模型给的匹配打分;
  • sigmoid做二分类概率; 第一项:正样本判为真实数据loss; 第二项:k个噪声样本判为噪声loss。

原始Softmax分母是对全部C类求和; NCE 只用k个采样噪声代替全集求和,用采样期望估计全局求和,这就是 Estimation。

五、一句话浓缩全文逻辑

  1. 超大类别下完整Softmax计算量爆炸;
  2. NCE 把“从海量类别选1个”的多分类,转成“区分真实匹配对/随机噪声对”的二分类对比任务(Noise Contrast);
  3. 如果拿全部剩余类别做负样本,复杂度依旧很高;
  4. 于是只随机抽少量负样本近似全局噪声分布,用采样来估计真实损失,这就是 Estimation;
  5. 负样本采样越多,近似越精准,效果越接近完整Softmax。

补充区分易混点

  • Contrast:真实样本 vs 噪声样本做区分对比;
  • Estimation:用少量采样负样本近似全集,不是精确计算,是估计值。