对齐算法:PPO、DPO、GRPO 推导与对比¶
本章导读:对齐是大模型算法岗的“重灾区”。2025–2026 的面经里,PPO/DPO/GRPO 不仅要求背流程,还要求推公式、解释 KL 与 β、比较 on/off-policy、说明 reward hacking。本章用一个统一目标把三者串起来,再给出可直接写在白板上的推导与工程陷阱。
阅读建议:先掌握第 1 节的 KL 正则目标,它是 DPO 推导的起点;再分别看 PPO、DPO、GRPO 的目标与梯度;最后用第 7 节的对比表和追问自测。
核心要点¶
- 对齐的本质是带 KL 约束的策略优化:最大化奖励,同时不要偏离参考策略太远。
- PPO 是 on-policy 的 actor-critic:需要 policy、reference、reward、value 四个模型,用 clip 限制更新,用 GAE 估优势。
- DPO 把 KL 正则目标的最优策略代入 Bradley-Terry,消掉配分函数,得到纯偏好对的分类损失;不需要 RM 和 value,但依赖离线数据。
- GRPO 用同一 prompt 的一组采样做组内相对优势,去掉 critic,特别适合数学/代码等可验证奖励任务。
- DAPO/GSPO 是对 GRPO 的工程修正:动态采样、非对称 clip、token-level loss、sequence-level ratio。
- reward hacking 的根源是“代理奖励 ≠ 真实目标”;KL、reward 归一化、长度惩罚、ensemble RM 只能缓解,不能根治。
- RLVR 用可验证奖励(答案、单测)替代人类偏好,是推理模型后训练的核心范式。
- 面试答题顺序:目标 → 公式 → 模型数量/显存 → 数据 → 失败模式 → 项目数字。
1. 统一视角:KL 正则的策略优化¶
给定 prompt \(x\),策略 \(\pi_\theta(y\mid x)\) 生成回答 \(y\),奖励模型给 \(r(x,y)\)。对齐目标:
其中:
- \(\pi_{\mathrm{ref}}\) 是参考策略(通常是 SFT 模型),参数冻结;
- \(\beta>0\) 控制偏离惩罚;
- KL 项防止模型为了刷奖励而输出退化、重复、谄媚的内容。
1.1 最优策略的闭式解¶
对每个 \(x\) 单独优化,构造拉格朗日或直接使用变分:
这个式子说明:最优策略是在参考策略上按“指数奖励”重新加权;\(\beta\) 越小,越偏向高奖励;\(\beta\to\infty\) 时退化为参考策略。
反解奖励:
这是 DPO 推导的关键:奖励可以用策略与参考策略的 log-ratio 表示,只差一个与 \(y\) 无关的常数 \(\beta\log Z(x)\)。
面试点:为什么 KL 正则能导出闭式解?因为目标对每个 \(x\) 是“线性奖励 + KL”的凸优化,变分后得到指数族形式。
2. PPO:带裁剪的 on-policy 策略梯度¶
2.1 把生成建模成 MDP¶
- 状态 \(s_t=(x,y_{<t})\):prompt 加已生成前缀;
- 动作 \(a_t=y_t\):下一个 token;
- 策略 \(\pi_\theta(a_t\mid s_t)\):token 分布;
- 奖励:通常只在序列末尾给 \(R(x,y)\),其余为 0;也可以加 per-token KL 惩罚。
Per-token reward 的一种常见写法:
这样 KL 被拆到每个 token,PPO 可以在 token 级别优化。
2.2 目标函数¶
重要性比:
裁剪目标:
完整损失(最大化):
其中 \(A_t\) 是优势,\(V_\phi\) 是价值网络,\(c_v\) 常取 0.5,\(c_e\) 很小或为 0。
2.3 为什么 clip、为什么取 min¶
- 重要性采样允许用旧策略采样的数据更新新策略,但如果 \(\rho_t\) 离 1 太远,方差爆炸。
- clip 把 \(\rho_t\) 限制在 \([1-\epsilon,1+\epsilon]\),限制单步更新幅度。
- 取 min 是一种悲观下界:
- \(A_t>0\) 时,目标最多到 \((1+\epsilon)A_t\),防止过度提高概率;
- \(A_t<0\) 时,目标最多到 \((1-\epsilon)A_t\),防止过度降低概率。
- 面试陷阱:clip 的是重要性比,不是 reward,也不是 advantage。
2.4 GAE:优势估计¶
TD 误差:
GAE:
- \(\lambda=0\):TD(0),偏差大、方差小;
- \(\lambda=1\):Monte Carlo,偏差小、方差大;
- 常用 \(\gamma=0.99\)、\(\lambda=0.95\)。
LLM 中常取 \(\gamma=1\)(回合制、无折扣),\(\lambda=0.95\)。
2.5 工程实现与坑¶
- 四个模型:policy(训练)、reference(冻结,算 KL)、reward(冻结)、value(训练)。显存约为 4 倍模型 + 优化器状态。
- token-level vs sequence-level:奖励通常在序列级,但 loss 在 token 级;需要广播与 mask。
- 长度归一化:按 token 平均还是按序列平均,会影响长回答的权重。
- 优势归一化:batch 内标准化可以稳定训练,但会改变不同 prompt 的相对权重。
- KL 估计器:\(k_1=\log(\pi/\pi_{\mathrm{ref}})\) 无偏但方差大;\(k_3=(\pi_{\mathrm{ref}}/\pi)-1-\log(\pi_{\mathrm{ref}}/\pi)\) 方差小但可能有偏。
- reward 归一化/裁剪:防止个别样本主导。
- 生成截断:超过最大长度时 reward 怎么给,会影响长度偏置。
- off-policy 程度:PPO 允许多个 epoch 复用 rollout,但 \(\pi_\theta\) 离 \(\pi_{\mathrm{old}}\) 太远时 clip 会失效。
面试表达:PPO 的稳定性来自“信任域”思想,clip 是简化版 TRPO;但它对超参、reward scale、KL 系数都敏感。
3. DPO:把奖励模型解析掉¶
3.1 从 KL 正则目标推导¶
由第 1 节:
Bradley-Terry 偏好模型:
代入 \(r^*\),\(\beta\log Z(x)\) 在差值中消掉:
用 \(\pi_\theta\) 替换 \(\pi^*\),得到 DPO 损失:
3.2 梯度与直觉¶
令
则
直觉:
- 当模型已经更偏好 \(y_w\)(\(z\) 大)时,\(\sigma(-z)\) 小,梯度小;
- 当模型偏好错误(\(z\) 小或为负)时,梯度大,把 \(y_w\) 的概率推高、\(y_l\) 推低;
- \(\beta\) 控制“隐式奖励”的尺度,也影响对 reference 的偏离。
3.3 DPO 的性质¶
- 不需要 RM、不需要 value、不需要在线采样,工程简单、显存低(policy + reference)。
- off-policy:偏好数据由某个行为策略产生,训练时不再采样;数据覆盖不足会限制效果。
- 需要 reference:\(\pi_{\mathrm{ref}}\) 通常就是 SFT 模型;不是“完全不需要参考模型”。
- 隐式奖励:\(\hat r_\theta(x,y)=\beta\log\frac{\pi_\theta(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)}\),可用于排序/分析。
- 长度偏置:DPO 倾向选择更长的回答,因为 log-prob 与长度相关;需要长度归一化或 SimPO。
- 偏好噪声敏感:标注不一致会直接污染梯度。
3.4 DPO 变体¶
| 方法 | 核心改动 | 解决的问题 |
|---|---|---|
| IPO | 用均方误差替代 log-sigmoid,加入正则 | 防过拟合偏好数据 |
| KTO | 只需 thumbs up/down,不需要成对 | 降低标注成本 |
| ORPO | 把 SFT 与 odds-ratio 偏好合一阶段 | 省掉 reference、简化流程 |
| SimPO | 去掉 reference,长度归一化,加目标间隔 \(\gamma\) | 降低显存、缓解长度偏置 |
| CPO | 对比偏好优化 + SFT 正则 | 更稳的单阶段训练 |
| R-DPO | 长度正则 | 显式控制长度 |
面试陷阱:说“DPO 不需要 reference model”是错的;SimPO/ORPO 才去掉 reference。DPO 只是去掉了显式 RM 和 value。
4. GRPO:用组内相对优势替代 critic¶
4.1 动机¶
PPO 需要 value 模型,显存和训练复杂度高;而 LLM 的奖励往往是序列级的,critic 很难学。GRPO 的思路:对同一个 prompt 采样一组回答,用组内奖励的相对高低估计优势,不需要 critic。
4.2 目标¶
对每个问题 \(q\),从旧策略采样 \(G\) 个回答 \(\{o_1,\dots,o_G\}\),奖励 \(\{r_1,\dots,r_G\}\)。
组内标准化优势:
(也有实现不做 std 归一化,见 Dr.GRPO。)
token 级重要性比:
目标:
4.3 为什么省显存¶
| 方法 | 模型数 | 是否需要 critic | 是否需要在线采样 |
|---|---|---|---|
| PPO | 4 | 是 | 是 |
| GRPO | 3(policy/ref/reward)或 2(规则奖励) | 否 | 是 |
| DPO | 2(policy/ref) | 否 | 否 |
GRPO 用组内均值作为基线,替代 value 函数;组内标准差进一步归一化奖励尺度。
4.4 工程坑¶
- 全对/全错组:优势全为 0,没有梯度;需要动态采样或过滤。
- 组大小 \(G\):太小优势估计噪声大,太大采样成本高;常见 8–64。
- 长度偏置:按 token 平均会让短回答权重高;按序列求和会让长回答主导。
- reward 设计:规则奖励(答案匹配、单测)比 RM 更稳,但要防格式刷分。
- KL 项:有的实现去掉 KL(DAPO),靠 clip 和 reward 约束;要说明取舍。
- off-policy 程度:一个 rollout 做多个梯度步时,\(\pi_\theta\) 会偏离 \(\pi_{\mathrm{old}}\),clip 可能失效。
4.5 代码:GRPO 优势与 loss 核心¶
import torch
import torch.nn.functional as F
def grpo_advantage(rewards: torch.Tensor, eps: float = 1e-4) -> torch.Tensor:
# rewards: [G],同一个 prompt 的 G 个回答
mean = rewards.mean()
std = rewards.std(unbiased=False)
return (rewards - mean) / (std + eps)
def grpo_loss(logp: torch.Tensor, logp_old: torch.Tensor,
adv: torch.Tensor, clip_eps: float = 0.2) -> torch.Tensor:
# logp/logp_old: [G, T],adv: [G]
ratio = torch.exp(logp - logp_old)
adv = adv.unsqueeze(-1)
unclipped = ratio * adv
clipped = torch.clamp(ratio, 1 - clip_eps, 1 + clip_eps) * adv
# 按 token 平均;实际实现需处理 padding mask
return -torch.min(unclipped, clipped).mean()
真实实现还要处理:序列 mask、token 级/序列级归一化、KL、多卡 all-gather、梯度累积。
5. GRPO 的改进:DAPO、GSPO、RLOO¶
5.1 DAPO¶
DAPO(Decoupled Clip and Dynamic sAmpling Policy Optimization)主要改动:
- Clip-Higher:上下界解耦,\(\epsilon_{\mathrm{low}}\) 小、\(\epsilon_{\mathrm{high}}\) 大,鼓励探索。
- 动态采样:过滤全对/全错的组,保证有梯度。
- Token-level loss:对所有 token 的损失求和再除以总 token 数,避免长度偏置。
- Overlong reward shaping:对超长回答做软惩罚,减少截断噪声。
- 去掉 KL:部分实现不再显式加 KL,依赖 clip 与奖励。
5.2 GSPO¶
GSPO(Group Sequence Policy Optimization)把重要性比从 token 级提升到序列级:
用序列级 ratio 做 clip,减少 token 级方差,对 MoE 模型更稳定。
5.3 RLOO¶
REINFORCE Leave-One-Out:对每个样本用其他样本的平均奖励作为基线:
不需要 critic,也不需要 std 归一化;实现简单,但方差仍受采样影响。
6. RLVR 与推理模型¶
6.1 什么是 RLVR¶
RLVR(Reinforcement Learning with Verifiable Rewards)用可验证的规则给奖励,而不是训练一个 RM:
- 数学:答案与标准答案匹配(需做格式归一化);
- 代码:单元测试通过;
- 指令:格式/长度/关键词约束;
- 工具:调用结果是否正确。
奖励通常写成:
6.2 为什么有效¶
- 奖励信号准确、可扩展,避免 RM 的偏差与 reward hacking;
- 允许大规模采样,探索长链推理;
- 把“推理”变成可优化的行为,而不只是 prompt 技巧。
6.3 风险¶
- 奖励漏洞:模型可能猜答案、钻格式空子、重复检查;
- 难度分布:全对/全错样本没有梯度,需要难度课程;
- 过度思考:长 CoT 增加延迟与成本;
- 泛化:在数学/代码上有效,不代表开放域推理同样有效。
6.4 PRM vs ORM¶
| 类型 | 信号 | 优点 | 缺点 |
|---|---|---|---|
| ORM(结果奖励) | 最终答案对错 | 标注便宜、客观 | 信用分配难、过程不可控 |
| PRM(过程奖励) | 每一步推理的质量 | 更细粒度、可引导 | 标注贵、步骤边界难定义 |
实践:数学/代码先用 ORM/规则奖励,再考虑 PRM;PRM 的自动标注可用蒙特卡洛 rollout 估计每步成功率。
7. 三者对比与选型¶
| 维度 | PPO | DPO | GRPO |
|---|---|---|---|
| 范式 | on-policy RL | off-policy 对比学习 | on-policy RL |
| 需要 RM | 是 | 否(隐式) | 是(或规则奖励) |
| 需要 critic | 是 | 否 | 否 |
| 模型数 | 4 | 2 | 3(或 2) |
| 数据 | 在线采样 + 偏好 | 离线偏好对 | 在线采样 + 奖励 |
| 稳定性 | 难调 | 较稳 | 中等 |
| 效果上限 | 高 | 受数据限制 | 高(可验证任务) |
| 典型场景 | 通用对话对齐 | 偏好对齐、低成本 | 数学/代码推理 |
| 主要风险 | reward hacking、显存 | 分布偏移、长度偏置 | 零梯度、reward 漏洞 |
选型建议:
- 有高质量偏好数据、预算有限 → DPO/SimPO;
- 有可靠 RM、追求效果上限 → PPO;
- 数学/代码等可验证任务、想省 critic → GRPO/DAPO;
- 冷启动 → SFT → DPO 或 GRPO,再做 PPO 精调。
8. 面试高频问题¶
Q1:写出 KL 正则对齐目标的最优策略,并解释 β。¶
- \(\pi^*=\frac{1}{Z}\pi_{\mathrm{ref}}e^{r/\beta}\)。
- β 越大越保守,越接近 reference;β 越小越激进。
- Z 只与 x 有关,在 pairwise 差值中会消掉。
Q2:PPO 的 clip 为什么取 min?¶
- 对优势为正和负的情况分别限制更新幅度。
- 取 min 是悲观估计,防止重要性比过大导致策略剧变。
- clip 的是 \(\rho_t\),不是 reward。
Q3:PPO 为什么要四个模型?¶
- policy 训练、reference 算 KL、reward 打分、value 估优势。
- 显存约为 4 份模型 + 优化器;可用共享 backbone、量化、offload 缓解。
Q4:GAE 的 λ 怎么影响偏差方差?¶
- λ=0 接近 TD(0),偏差大方差小;λ=1 接近 Monte Carlo,偏差小方差大。
- 常用 0.95;LLM 回合制常取 γ=1。
Q5:推导 DPO 损失。¶
- 从 KL 正则最优策略反解 \(r=\beta\log(\pi^*/\pi_{\mathrm{ref}})+\beta\log Z\)。
- 代入 BT,Z 消掉。
- 用 \(\pi_\theta\) 替换,得到 \(-\log\sigma(\beta\log\frac{\pi_\theta(y_w)}{\pi_{\mathrm{ref}}(y_w)}-\beta\log\frac{\pi_\theta(y_l)}{\pi_{\mathrm{ref}}(y_l)})\)。
Q6:DPO 是 on-policy 还是 off-policy?有什么影响?¶
- off-policy:偏好数据由行为策略产生,训练不再采样。
- 优点:简单、稳定、便宜;缺点:分布偏移、数据覆盖不足、无法探索。
- 改进:迭代 DPO、在线 DPO、混合 RL。
Q7:DPO 的 β 怎么选?¶
- 控制隐式奖励尺度与对 reference 的约束。
- 太大 → 学不动、接近 SFT;太小 → 过拟合偏好、退化。
- 常见 0.01–0.5,实践多用 0.1;结合验证集 win rate、长度、KL 调。
Q8:GRPO 和 PPO 的核心区别?¶
- GRPO 用组内相对奖励替代 critic,省掉 value 模型。
- 适合序列级奖励、可验证任务;PPO 更通用但更难调。
- GRPO 的组采样成本高,零梯度组需要处理。
Q9:GRPO 全对/全错怎么办?¶
- 优势为 0,梯度消失;动态采样过滤,或加入难度课程。
- 也可用 reward shaping、部分奖励、过程奖励。
- DAPO 的动态采样就是针对这个问题。
Q10:reward hacking 怎么缓解?¶
- KL 约束、reward 归一化/裁剪、长度惩罚、ensemble RM。
- 定期人工校准、held-out prompt、规则约束。
- 根本是让奖励与真实目标对齐;可验证任务优先用规则奖励。
Q11:RLAIF 是什么?¶
- 用 AI 反馈替代人工偏好,降低成本、提高规模。
- 风险:模型偏见自我强化、评审能力上限。
- 常与宪法 AI、规则校验结合。
Q12:如果让你在 8×A100 上做 7B GRPO,怎么配?¶
- 训练:LoRA/ZeRO-3、activation checkpointing、BF16。
- 推理:vLLM rollout、KV Cache、prefix caching、动态 batch。
- 算法:控制组大小与长度、过滤零梯度、token-level loss。
- 工程:训练/推理分池或分时复用,监控 MFU 与等待时间。
Q13:DPO 第 0 步的 loss 是多少?¶
- 若 \(\pi_\theta=\pi_{\mathrm{ref}}\),log-ratio 差为 0,\(z=0\),loss \(=-\log\sigma(0)=\log 2\approx0.693\)。
- 这是一个常用的 sanity check。
Q14:PPO 的 KL 系数过大/过小会怎样?¶
- 过大:策略几乎不动,reward 不涨,接近 SFT。
- 过小:策略漂移,reward hacking,输出退化。
- 观察 KL、reward、长度、熵,做自适应 KL(目标 KL 范围)。
Q15:为什么 DPO 会偏向长回答?¶
- 序列 log-prob 随长度累加,长回答的 log-ratio 绝对值更大。
- 偏好数据中长回答往往被偏好,形成长度偏置。
- 缓解:长度归一化(SimPO/R-DPO)、长度平衡数据、推理时长度控制。
本文档为面试复习资料,公式与数字建议结合原始论文复核(InstructGPT、DPO、DeepSeekMath/GRPO、DAPO、GSPO)。