第 275 题:实现负采样,基于流行度的有偏采样与修正。
题目
实现负采样,基于流行度的有偏采样与修正。
完整讲解
一、负采样的目的
- 在推荐/embedding 学习中,正样本(点击、共现)远少于负样本(未点击、未共现);若对全部负样本做 softmax 或 pairwise 损失,计算量巨大。负采样即从负样本中采样一小部分参与损失,近似全量 softmax 或 NCE 目标,并常做修正以保持无偏或低偏。
二、基于流行度的有偏采样
- 流行度:物品出现/曝光次数多则流行度高。有偏采样即按流行度分布采样负样本(如 $p_j \propto \text{pop}_j^\alpha$,$\alpha$ 常取 0.75),使热门物品更常被采为负样本,与真实「未点击」中热门占比高一致,训练更稳定、区分度更好。
- 实现:预计算每个物品的采样概率或 alias table,每步采样 $K$ 个负样本与正样本组成 batch;或按 batch 内正样本的负例采样(每个正样本配若干负样本)。
三、修正(Debiasing)
- 目标:原始 softmax 或 NCE 的期望梯度在「负样本=全体」时有一形式;负采样后只有采到的负样本有梯度,需对负样本损失做权重修正,使期望与全量一致或偏差可控。
- 常见修正:对负样本 $j$ 的损失项乘以 $1/p_j$(或归一化因子),其中 $p_j$ 为采样概率;或使用 NCE/负采样损失的理论形式(如 Word2Vec 的负采样公式)本身已含修正。不修正时,模型会过度压低高 $p_j$ 物品的分数,需在评估或推理时注意。
- 实践:$\alpha=0.75$ 的流行度采样 + 损失中的 $1/p_j$ 修正(或采用已含修正的 loss 形式);大规模时可用近似修正或忽略修正但监控偏差。
面试要点
- 能说清负采样的动机(降低计算)、有偏采样(按流行度)的做法与原因。
- 能说明修正的含义(期望梯度一致)及常见方式($1/p_j$ 或 NCE 公式);能写出采样概率 $p_j \propto \text{pop}_j^\alpha$。
记忆要点
- 负采样:按流行度有偏采样($p_j \propto \text{pop}_j^{0.75}$),减少计算;修正用 $1/p_j$ 或 NCE 形式保持无偏/低偏。