同一道代码题,模型生成了 4 份答案:2 份通过测试,1 份只过了部分测试,1 份无法运行。接下来可以有几种做法:把通过的 2 份都拿去训练;从 4 份里挑评分最高的 1 份;或者直接把最好的一份交给用户,不训练。
这些流程都可能被叫作 rejection sampling,但它们并不是同一个算法。先问清楚两件事:按什么规则留下答案?留下之后,是返回给用户,还是用于更新模型?
只想了解训练流程,可以先读前两节和数据怎么存。想知道筛选怎样改变分布,再看中间的 4 个小算例。需要的基础只有概率乘法和 SFT。
同一个名字,几种不同的做法
| 做法 | 留下什么 | 是否更新参数 |
|---|---|---|
| 经典拒绝采样(accept–reject) | 按特定接受概率抽样,使结果服从目标分布 | 本身不训练模型 |
| 按验证器筛选 | 通过测试或达到门槛的回答,可能每题留下多份 | 筛选本身不更新;可以接 SFT |
| Best-of-N | 生成 N 份,按评分取最高的一份 | 推理时选答案,不必训练;验证器误判怎样限制它,见多采样、投票与验证器 |
| Rejection-sampling fine-tuning | 把筛出的回答作为示范数据 | 通过 SFT 更新参数 |
Llama 2(2023)§3.2.3使用过“每题采样多份,选奖励(reward)分最高的一份,再微调(fine-tuning)”的流程。DeepSeek-R1 初版报告(2025)§2.3.3则描述了保留多个正确回答,并额外做可读性筛选。前者不能当成所有拒绝采样的定义;两者也都不等于统计学中的精确 accept–reject。
筛选后的 SFT,到底在学什么?
可以把流程拆成 4 步:固定一版生成模型和采样设置;生成候选(candidate);评分、过滤和去重;拿保留的回答做 SFT。完成一轮后,可以换新模型重新生成,开始下一轮。把这个循环写成 EM 的 ReST-EM,以及验证器怎样决定这条路的上限,见前沿草稿自我改进:生成、验证、再训练。
对于保留的数据集 $D_{\rm keep}$,先把一条回答里所有需要监督位置的负对数概率(log-probability)加起来,得到 $\ell(x,y)$;再除以所有回答的有效 token 总数 M:
$$ \ell(x,y) =-\sum_{t\in\mathcal T_y}\log\pi_\theta(y_t\mid x,y_{<t}). $$
$$ \mathcal L_{\rm SFT} =\frac{1}{M}\sum_{(x,y)\in D_{\rm keep}}\ell(x,y). $$
$x$ 是题目,$y$ 是保留的回答,$\mathcal T_y$ 是要监督的回答位置,$M$ 是这些位置的总数。Prompt 和 padding 不计入这里的分母;如果改成每条回答先取均值,再对回答取均值,长短回答的相对权重也会变。
验证器决定了哪些示范进入数据集;训练这一步,模型仍然是在模仿留下来的回答,不需要对验证器求导,也不用 PPO 的新旧策略比值。被丢弃的回答只是没有参与这次 SFT,并没有直接教会模型“别这样答”。如果想利用这部分信息,可以另行构造偏好对。
筛掉一部分,剩下的概率就变了
固定一道题,生成模型有 3 类回答,概率分别为 $q=(0.5,0.3,0.2)$。假设第一类能通过验证,第二类有一半能通过,第三类都不能通过。接受概率为 $a=(1,0.5,0)$。
| 回答类别 | 原概率 q | 接受概率 a | 保留下来的概率质量 q × a |
|---|---|---|---|
| A | 0.50 | 1.00 | 0.50 |
| B | 0.30 | 0.50 | 0.15 |
| C | 0.20 | 0.00 | 0.00 |
总接受率是 0.65。在已接受的回答里,A 的比例是 $0.5/0.65=10/13$,B 是 $3/13$。一般地:
$$ q_{\rm keep}(y\mid x) =\frac{q(y\mid x)a(x,y)}{Z(x)}. $$
$$ Z(x)=\sum_y q(y\mid x)a(x,y). $$
要求 $Z(x)>0$。这是条件概率,不是“过滤以后自动得到理想答案分布”。验证器漏掉的正确答案、误收的错误答案,以及生成模型本来就很少给出的解法,都会影响结果。这里把类别内的通过比例写成 a;逐条确定性验证时,单条回答的 a 可以只有 0 或 1。
经典拒绝采样,多了一个关键条件
现在目标不是“保留通过的”,而是从已知目标分布 p 抽样。仍先从容易抽样的 q 生成,再以 $a(y)=p(y)/(M q(y))$ 接受;这里的 M 是包络常数,和上一节的有效 token 总数 M 无关。必须找一个有限的 M,让所有目标支持上的答案都满足 $p(y)\le Mq(y)$;目标概率大于 0 的地方,q 不能为 0。经典推导可对照 CMU Monte Carlo 讲义,第 8 页。
取 $p=(0.6,0.3,0.1)$、$q=(1/3,1/3,1/3)$,最小可用 M 是 1.8:
| 类别 | p / (M q),即接受概率 | q × 接受概率 |
|---|---|---|
| A | 1 | 1/3 |
| B | 1/2 | 1/6 |
| C | 1/6 | 1/18 |
总接受率为 $5/9=1/M$,归一化后恰好得到 $(0.6,0.3,0.1)$。M 越大,拒绝越多,但在条件成立时目标分布不变。若发现接受概率大于 1,不能直接截断再声称仍然精确:这说明包络条件不满足。
目标只有未归一化密度时也能做,但此时要用相应的包络,接受率是目标归一化常数(normalization constant)除以包络系数,不再简单等于 $1/M$。LLM 按测试筛数据通常没有指定这样的目标密度,也没有证明全局包络,所以不要把两种方法混为一谈。
Best-of-N:预算更大,不代表实际质量一定更好
仍是原始分布 $(0.5,0.3,0.2)$,评分器认为 C > B > A。独立生成 2 份,选分数最高的:只有两份都是 A 时,A 才胜出,因此概率是 $0.5^2=0.25$;只要出现 C,C 就胜出,因此概率是 $1-0.8^2=0.36$;剩下的 0.39 属于 B。
假如 C 恰好是评分器看不出的错误答案,增加采样量反而会更容易选中它。这里是手造反例,不是模型测量;它说明评分器准确性和采样预算必须一起看。
Reward Model Overoptimization(2022,ICML 2023)在用较大“gold”奖励模型代替真实偏好的合成设置中,也研究了 RL 和 best-of-N 的过度优化。它支持检查代理分数与独立质量是否背离,不意味着任何 N 增加都必然有害。
筛答案时,连题目比例也会改变
假设有同样多的容易题和困难题,每题都生成 10 次;单次通过率分别为 0.8 和 0.1。若保留所有通过的回答,长期平均每道容易题贡献 8 条,困难题只贡献 1 条。题目各占一半,训练行数却趋近于 8:1。
即使每题最多保留 1 条,也没有完全解决:至少有一条通过的概率为 $1-(1-p)^{10}$,容易题约 1,困难题约 0.651。没有成功样本的题目仍会消失。
| 调整方法 | 能改善什么 | 代价或限制 |
|---|---|---|
| 每题限额、按题目采样 | 不让容易题靠回答数量占满数据 | 无成功回答的题目仍缺席 |
| 给困难题更多尝试 | 增加找到可用示范的机会 | 多花生成和验证成本;通过率为 0 时无效 |
| 保留多种有效解法并去重 | 减少同一模板重复出现 | 解法是否真正不同,需要额外判断 |
| 混入可信人工或 teacher 示范 | 补充当前模型很难生成的行为 | 引入新来源的错误和风格偏差 |
比较方案时,固定总生成 token 或总时间预算,再报告保留量、题目覆盖和独立评估结果。只比“筛后通过率”很容易把筛选规则本身当成进步。
数据怎么存,之后才查得清?
训练可能只需要 prompt 和 response,排查问题却需要更多信息。建议把生成与验收记录一起保留:
| 字段 | 为什么保留 |
|---|---|
| prompt_id、题目来源、split | 同题改写和近重复不能跨训练 / 评估集漏过去 |
| 生成模型版本、采样设置、seed | 知道回答来自哪一轮;seed 本身不保证跨硬件复现 |
| 原回答、终止原因、长度 | 区分正常完成、截断和格式失败 |
| verifier 版本、各检查结果 | 不只存一个总分,能定位哪项规则误判 |
| 保留 / 丢弃原因、所属采样组 | 重新筛选时不必把所有候选重跑一遍 |
先切分题目,再生成候选;评估不要只重复训练用的同一套检查。验证器升级后,可以在保留的候选上重新打分,但原始记录不要悄悄覆盖。执行模型生成的代码要有隔离和资源限制;本页的演示只处理有限概率表,不执行生成代码。
自己算一遍
标准库教学脚本用确定性枚举检查筛选与 best-of-N,没有调用模型或复现论文训练:
python3 05-post-training/code/selection_and_entropy.py
前三行依次是:筛选接受率 0.65 和保留分布约 [0.769231, 0.230769, 0];经典 accept–reject 的接受率约 0.5556(即 5/9)和分布 (0.6, 0.3, 0.1);best-of-2 分布 (0.25, 0.39, 0.36)。后面几行(熵、排序检查等)属于其他笔记。把 C 的评分降到最低,再看“多生成几次”是在帮助正确答案,还是放大评分错误。
接着读什么
- SFT:如何把保留的示范变成训练目标。
- 可验证奖励:通过检查,为什么仍可能没完成任务。
- 对齐税与熵下降:怎样分清有用的集中和解法退化。
- 工程实践:后训练:框架、数据和 checkpoint 如何落地。
本页术语 5
- 奖励 reward
- RL 里指导策略更新的标量信号
- 微调 fine-tuning
- 在预训练权重上继续训练以适配具体任务
- 候选 candidate
- 召回阶段捞出来、等待精排挑选的内容
- 对数概率 log-probability
- 概率取对数后的值;0 表示概率 1,而不是“忽略”
- 归一化常数 normalization constant
- 把未归一化分数转成概率分布时共享的分母