Lazy loaded image
InBatchNeg采样去偏推导
Words 726Read Time 2 min
2025-10-4
2026-3-13
type
Post
status
Published
date
Oct 4, 2025
slug
summary
在学习 DSSM / Two-Tower 召回模型时,经常会看到 in-batch negative、sampled softmax、logQ correction 等概念。很多文章会提到 “logits − logQ 可以缓解热门偏置、提升长尾”,但很少从训练目标和负采样分布的角度把这个机制讲清楚。实际上,(-\log Q) 的核心作用并不是刻意优化长尾,而是用于纠正负采样分布带来的训练偏差(sampling bias),使 sampled softmax 的优化目标更接近 full softmax。本文整理了自己理解这一问题的过程,从负采样、logQ correction 到长尾采样策略,尝试用更直观的方式解释这些概念之间的关系。
tags
DL
思考
数学
category
知行合一
icon
password
😀
在学习 DSSM / Two-Tower 召回模型时,经常会看到 in-batch negative、sampled softmax、logQ correction 等概念。很多文章会提到 “logits − logQ 可以缓解热门偏置、提升长尾”,但很少从训练目标和负采样分布的角度把这个机制讲清楚。实际上,(-\log Q) 的核心作用并不是刻意优化长尾,而是用于纠正负采样分布带来的训练偏差(sampling bias),使 sampled softmax 的优化目标更接近 full softmax。本文整理了自己理解这一问题的过程,从负采样、logQ correction 到长尾采样策略,尝试用更直观的方式解释这些概念之间的关系。
思路: 概率推导 → 直觉解释 → logit形式 → 为什么不是除以 q 而是减 logq
 

原始目标 Full Softmax

真实训练目标是Softmax:
多分类交叉熵损失CE:
其中相似度:
问题:
item数量(V)可能达到百万级,无法计算这一项:

用 Sampled Softmax 近似

所以我们只能通过采样进行近似,假设我们只采样 K 个负样本:
这些 negative 来自分布
例如:
  • 样本(物品)出现的频率 item popularity
  • unigram distribution
  • batch distribution

采样带来的偏差 Bias

如果直接写:
这是错误的。因为:真实 softmax 底下是这样的
即我们想要近似的目标:
 
但我们现在只用了:
而且这些样本是从 采样的。
 

通过重要性采样 Importance Sampling 修正

在深度学习中,Batch一般是随机选取,我们可以认为Batch内的分布符合真实数据分布
则对于服从分布
这是 importance sampling 基本公式
💡
从期望值理解:为什么从 q(i) 采样,每个样本要除以 q(i)。
💡
在这里可以被看成我们softmax中的

因此:
可以写成期望:
用 K 个样本估计:

把它放回 softmax

真实 softmax
用 importance sampling 近似
其中
 

写成 logit 形式

注意:
因为
所以:
于是:
 

得到 logQ correction

于是新的 logit:
 
这就是:logQ correction

代码工程优化

因为 softmax 的输入必须是 logit,而我们真实需要:
为了保持 softmax 形式:
就必须写成:
所以:
  • 重要性采样需要给样本加权 importance weight = 1 / q(i)
  • 放入Softmax:
  • 提前在logtis处理:exp(s_i - log q(i))
 

InBatchNeg的理解

上面的所有推导,以及 只是为了数据计算层面「近似」和「纠偏」,让 sampled softmax / in-batch negatives 的训练行为接近 full softmax。
 
那么如何理解其给InBatchNeg带来的贡献或者是在推荐系统中其到的作用呢?
💡
更准确地说:logits - logQ只有一个理论目的,但有两个理解方向。

缓解热门 item 被过度惩罚

因为热门 item 被采样为 negative 的概率更大。如果不做 correction,模型会反复被要求降低热门 item 的 score。于是 embedding 会被过度推远。所以 -logQ 能够避免热门 item 被错误打压

相对提升长尾 item

因为 tail item 的 q(i) 很小,经过 -logQ,于是 score_tail 被提升更多。看起来就像模型更容易给长尾 item 更高分。但本质上只是对采样概率的补偿
 
但以上理解容易让人认为 -logQ 是一种优化手段,可以起到打压热门、提升长尾的效果。但其实并不是这样,我们换个说法,就会发现他们仅仅只是为了「消除近似偏差」or「补偿」or「纠偏」。
💡
如果不减 logQ 热门 item 会被过度惩罚
💡
如果不减 logQ 冷门 item 几乎不会被训练

 
 

思维扩展

学术界理解
Correcting the LogQ Correction: Revisiting Sampled Softmax for Large-Scale Retrieval 论文链接 RecSys2025中有文章提出,这种纠偏方式仍然存在偏差。在 sampled softmax 中:
  • negative 是 sampled
  • positive 是 deterministic
但是 logQ 推导默认 positive 也来自 q(i) 这是错的,详细可阅读文章。
 
“冷门 item 几乎不会被训练” 怎么理解?
 
那如果真的要做打压热门提升长尾,应该怎么做?
 
上一篇
主流Serverless平台免费额度 良心大PK
下一篇
动态规划-背包问题解题思路