一、先铺垫背景:传统多分类为什么扛不住?
传统 Softmax + 交叉熵,完整公式:
= 总类别数(词表/图像类别)。 分母要遍历全部C个类别求和:
- 大词表NLP(如词表10万、百万)、超大类别检索任务,每次前向+反向都要算百万次指数,算力爆炸,根本跑不动。
目标:换掉完整归一化的Softmax,不用遍历全部类别,近似算出分类损失。NCE 就是干这个的。
二、核心:把多分类 → 二分类(Noise Contrast)
1. 原始多分类任务逻辑
给定输入,从全部个类别里,找出真实目标类别。
2. NCE 改造:构建二分类判别任务
每次构造一个二元数据集,只有两类:
- 正样本(data sample):,真实匹配的输入-目标对;标签
- 负样本(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。
五、一句话浓缩全文逻辑
- 超大类别下完整Softmax计算量爆炸;
- NCE 把“从海量类别选1个”的多分类,转成“区分真实匹配对/随机噪声对”的二分类对比任务(Noise Contrast);
- 如果拿全部剩余类别做负样本,复杂度依旧很高;
- 于是只随机抽少量负样本近似全局噪声分布,用采样来估计真实损失,这就是 Estimation;
- 负样本采样越多,近似越精准,效果越接近完整Softmax。
补充区分易混点
- Contrast:真实样本 vs 噪声样本做区分对比;
- Estimation:用少量采样负样本近似全集,不是精确计算,是估计值。