跳转至

对齐算法: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)\)。对齐目标:

\[ \max_{\pi_\theta}\ \mathbb{E}_{x\sim\mathcal{D},\,y\sim\pi_\theta(\cdot\mid x)}\big[r(x,y)\big] -\beta\,\mathbb{E}_{x\sim\mathcal{D}}\Big[\mathrm{KL}\big(\pi_\theta(\cdot\mid x)\,\|\,\pi_{\mathrm{ref}}(\cdot\mid x)\big)\Big] \]

其中:

  • \(\pi_{\mathrm{ref}}\) 是参考策略(通常是 SFT 模型),参数冻结;
  • \(\beta>0\) 控制偏离惩罚;
  • KL 项防止模型为了刷奖励而输出退化、重复、谄媚的内容。

1.1 最优策略的闭式解

对每个 \(x\) 单独优化,构造拉格朗日或直接使用变分:

\[ \pi^*(y\mid x)=\frac{1}{Z(x)}\,\pi_{\mathrm{ref}}(y\mid x)\exp\left(\frac{r(x,y)}{\beta}\right) \]
\[ Z(x)=\sum_{y}\pi_{\mathrm{ref}}(y\mid x)\exp\left(\frac{r(x,y)}{\beta}\right) \]

这个式子说明:最优策略是在参考策略上按“指数奖励”重新加权;\(\beta\) 越小,越偏向高奖励;\(\beta\to\infty\) 时退化为参考策略。

反解奖励:

\[ r(x,y)=\beta\log\frac{\pi^*(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)}+\beta\log Z(x) \]

这是 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 的一种常见写法:

\[ \tilde{r}_t=\mathbb{1}[t=T]\cdot R(x,y)-\beta\log\frac{\pi_\theta(y_t\mid s_t)}{\pi_{\mathrm{ref}}(y_t\mid s_t)} \]

这样 KL 被拆到每个 token,PPO 可以在 token 级别优化。

2.2 目标函数

重要性比:

\[ \rho_t(\theta)=\frac{\pi_\theta(a_t\mid s_t)}{\pi_{\theta_{\mathrm{old}}}(a_t\mid s_t)} \]

裁剪目标:

\[ L^{\mathrm{CLIP}}(\theta)=\mathbb{E}_t\Big[\min\big(\rho_t(\theta)A_t,\ \mathrm{clip}(\rho_t(\theta),1-\epsilon,1+\epsilon)A_t\big)\Big] \]

完整损失(最大化):

\[ L^{\mathrm{PPO}}=L^{\mathrm{CLIP}}-c_v\,\mathbb{E}_t\big[(V_\phi(s_t)-V_t^{\mathrm{target}})^2\big]+c_e\,\mathbb{E}_t\big[\mathcal{H}[\pi_\theta(\cdot\mid s_t)]\big] \]

其中 \(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 误差:

\[ \delta_t=r_t+\gamma V(s_{t+1})-V(s_t) \]

GAE:

\[ A_t^{\mathrm{GAE}}=\sum_{l=0}^{\infty}(\gamma\lambda)^l\delta_{t+l} \]
  • \(\lambda=0\):TD(0),偏差大、方差小;
  • \(\lambda=1\):Monte Carlo,偏差小、方差大;
  • 常用 \(\gamma=0.99\)、\(\lambda=0.95\)。

LLM 中常取 \(\gamma=1\)(回合制、无折扣),\(\lambda=0.95\)。

2.5 工程实现与坑

  1. 四个模型:policy(训练)、reference(冻结,算 KL)、reward(冻结)、value(训练)。显存约为 4 倍模型 + 优化器状态。
  2. token-level vs sequence-level:奖励通常在序列级,但 loss 在 token 级;需要广播与 mask。
  3. 长度归一化:按 token 平均还是按序列平均,会影响长回答的权重。
  4. 优势归一化:batch 内标准化可以稳定训练,但会改变不同 prompt 的相对权重。
  5. KL 估计器:\(k_1=\log(\pi/\pi_{\mathrm{ref}})\) 无偏但方差大;\(k_3=(\pi_{\mathrm{ref}}/\pi)-1-\log(\pi_{\mathrm{ref}}/\pi)\) 方差小但可能有偏。
  6. reward 归一化/裁剪:防止个别样本主导。
  7. 生成截断:超过最大长度时 reward 怎么给,会影响长度偏置。
  8. off-policy 程度:PPO 允许多个 epoch 复用 rollout,但 \(\pi_\theta\) 离 \(\pi_{\mathrm{old}}\) 太远时 clip 会失效。

面试表达:PPO 的稳定性来自“信任域”思想,clip 是简化版 TRPO;但它对超参、reward scale、KL 系数都敏感。

3. DPO:把奖励模型解析掉

3.1 从 KL 正则目标推导

由第 1 节:

\[ r^*(x,y)=\beta\log\frac{\pi^*(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)}+\beta\log Z(x) \]

Bradley-Terry 偏好模型:

\[ P(y_w\succ y_l\mid x)=\sigma\big(r^*(x,y_w)-r^*(x,y_l)\big) \]

代入 \(r^*\),\(\beta\log Z(x)\) 在差值中消掉:

\[ P(y_w\succ y_l\mid x)=\sigma\left(\beta\log\frac{\pi^*(y_w\mid x)}{\pi_{\mathrm{ref}}(y_w\mid x)}-\beta\log\frac{\pi^*(y_l\mid x)}{\pi_{\mathrm{ref}}(y_l\mid x)}\right) \]

用 \(\pi_\theta\) 替换 \(\pi^*\),得到 DPO 损失:

\[ \mathcal{L}_{\mathrm{DPO}}(\theta)=-\mathbb{E}_{(x,y_w,y_l)}\left[\log\sigma\left(\beta\log\frac{\pi_\theta(y_w\mid x)}{\pi_{\mathrm{ref}}(y_w\mid x)}-\beta\log\frac{\pi_\theta(y_l\mid x)}{\pi_{\mathrm{ref}}(y_l\mid x)}\right)\right] \]

3.2 梯度与直觉

令

\[ z=\beta\left(\log\frac{\pi_\theta(y_w)}{\pi_{\mathrm{ref}}(y_w)}-\log\frac{\pi_\theta(y_l)}{\pi_{\mathrm{ref}}(y_l)}\right) \]

则

\[ \nabla_\theta\mathcal{L}=-\beta\,\sigma(-z)\left(\nabla_\theta\log\pi_\theta(y_w)-\nabla_\theta\log\pi_\theta(y_l)\right) \]

直觉:

  • 当模型已经更偏好 \(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\}\)。

组内标准化优势:

\[ \hat A_i=\frac{r_i-\mathrm{mean}(\mathbf{r})}{\mathrm{std}(\mathbf{r})} \]

(也有实现不做 std 归一化,见 Dr.GRPO。)

token 级重要性比:

\[ \rho_{i,t}(\theta)=\frac{\pi_\theta(o_{i,t}\mid q,o_{i,<t})}{\pi_{\theta_{\mathrm{old}}}(o_{i,t}\mid q,o_{i,<t})} \]

目标:

\[ \mathcal{J}_{\mathrm{GRPO}}(\theta)=\mathbb{E}\left[\frac{1}{G}\sum_{i=1}^{G}\frac{1}{|o_i|}\sum_{t=1}^{|o_i|} \min\big(\rho_{i,t}\hat A_i,\ \mathrm{clip}(\rho_{i,t},1-\epsilon,1+\epsilon)\hat A_i\big) -\beta\,\mathrm{KL}(\pi_\theta\|\pi_{\mathrm{ref}})\right] \]

4.3 为什么省显存

方法 模型数 是否需要 critic 是否需要在线采样
PPO 4 是 是
GRPO 3(policy/ref/reward)或 2(规则奖励) 否 是
DPO 2(policy/ref) 否 否

GRPO 用组内均值作为基线,替代 value 函数;组内标准差进一步归一化奖励尺度。

4.4 工程坑

  1. 全对/全错组:优势全为 0,没有梯度;需要动态采样或过滤。
  2. 组大小 \(G\):太小优势估计噪声大,太大采样成本高;常见 8–64。
  3. 长度偏置:按 token 平均会让短回答权重高;按序列求和会让长回答主导。
  4. reward 设计:规则奖励(答案匹配、单测)比 RM 更稳,但要防格式刷分。
  5. KL 项:有的实现去掉 KL(DAPO),靠 clip 和 reward 约束;要说明取舍。
  6. 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)主要改动:

  1. Clip-Higher:上下界解耦,\(\epsilon_{\mathrm{low}}\) 小、\(\epsilon_{\mathrm{high}}\) 大,鼓励探索。
  2. 动态采样:过滤全对/全错的组,保证有梯度。
  3. Token-level loss:对所有 token 的损失求和再除以总 token 数,避免长度偏置。
  4. Overlong reward shaping:对超长回答做软惩罚,减少截断噪声。
  5. 去掉 KL:部分实现不再显式加 KL,依赖 clip 与奖励。

5.2 GSPO

GSPO(Group Sequence Policy Optimization)把重要性比从 token 级提升到序列级:

\[ s_i(\theta)=\left(\frac{\pi_\theta(o_i\mid q)}{\pi_{\theta_{\mathrm{old}}}(o_i\mid q)}\right)^{1/|o_i|} \]

用序列级 ratio 做 clip,减少 token 级方差,对 MoE 模型更稳定。

5.3 RLOO

REINFORCE Leave-One-Out:对每个样本用其他样本的平均奖励作为基线:

\[ A_i=r_i-\frac{1}{G-1}\sum_{j\ne i}r_j \]

不需要 critic,也不需要 std 归一化;实现简单,但方差仍受采样影响。

6. RLVR 与推理模型

6.1 什么是 RLVR

RLVR(Reinforcement Learning with Verifiable Rewards)用可验证的规则给奖励,而不是训练一个 RM:

  • 数学:答案与标准答案匹配(需做格式归一化);
  • 代码:单元测试通过;
  • 指令:格式/长度/关键词约束;
  • 工具:调用结果是否正确。

奖励通常写成:

\[ r(x,y)=r_{\mathrm{correct}}(x,y)+\alpha\,r_{\mathrm{format}}(y)-\gamma\,r_{\mathrm{length}}(y) \]

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)。