LLM RL 核心算法:PPO、DPO、GRPO
这篇只聚焦三件事:PPO 是经典 online RLHF,DPO 是最常用的 offline preference optimization,GRPO 是 reasoning model 时代最该懂的 critic-free RL。其他变体可以之后单开一篇,这里先把主干打牢。
0. 先背这张表
| 算法 | 最短定位 | 数据从哪来 | 是否 online rollout | 是否需要 critic | 适合场景 |
|---|---|---|---|---|---|
| PPO | 经典 RLHF | reward model / rule reward / judge | 是 | 通常需要 | 通用对齐、reward model 已经有了 |
| DPO | 偏好对齐 | chosen / rejected pair | 否 | 不需要 | 指令风格、偏好数据、稳定省事 |
| GRPO | 推理 RL | 同题多采样后的 reward group | 是 | 不需要 | 数学、代码、可验证 reward 的 reasoning |
记忆法:
PPO = 在线采样 + reward model/function + critic baseline + KL/clip
DPO = 离线偏好对 + reference model + 分类式 loss
GRPO = 在线同题多采样 + 组内相对 reward + no critic
1. 共同底层:Policy Gradient
LLM 可以看成策略:
pi_theta(y | x)
给定 prompt x,模型生成答案 y。RL 的目标是最大化期望奖励:
maximize_theta E_{y ~ pi_theta}[R(x, y)]
最朴素的更新方向:
grad J(theta) ~= R(x, y) * grad log pi_theta(y | x)
直觉:
- reward 高的回答,增加生成概率。
- reward 低的回答,降低生成概率。
- 真正训练时要减方差、控 KL、处理长序列,所以才会演化出 PPO / GRPO 这类更稳定的目标。
2. PPO:经典 RLHF
PPO 的标准 RLHF pipeline:
SFT model
-> train reward model from preference data
-> online rollout with current policy
-> PPO update policy under KL constraint
LLM 版 PPO 常见奖励:
reward = reward_model_score - beta * KL(pi_theta || pi_ref)
PPO 训练时通常有四个角色:
| 角色 | 作用 |
|---|---|
| policy model | 正在被训练的 LLM |
| reference model | 通常是 SFT checkpoint,用来计算 KL,限制别跑飞 |
| reward model / reward function | 给完整回答或过程打分 |
| value model / critic | 估计 baseline / value,帮助算 advantage、降方差 |
PPO 的核心目标可以这样理解:
ratio = pi_theta(token) / pi_old(token)
objective = min(ratio * advantage, clip(ratio, 1-eps, 1+eps) * advantage)
为什么要 clip:如果新 policy 相对旧 policy 改太猛,就截断更新,避免一次梯度把模型推崩。
PPO 具体怎么 work
假设 prompt 是:
写一个 Python 函数,判断括号字符串是否合法。
当前 policy 采样出一个回答:
用栈扫描字符串;遇到左括号入栈,遇到右括号检查栈顶是否匹配。
训练时会发生这几步:
| 步骤 | 发生了什么 | 这个量用来干嘛 |
|---|---|---|
| 1. rollout | 当前 policy 真正生成一条答案 | 得到一条 token trajectory |
| 2. reward | reward model / unit test / judge 给答案打分,比如 0.86 |
告诉模型这条答案好不好 |
| 3. KL penalty | 如果新模型离 reference 太远,扣掉一点分,比如 0.06 |
防止为了 reward 把语言能力训坏 |
| 4. critic | value model 预测每个 prefix 未来大概能拿多少分 | 提供 baseline,降低方差 |
| 5. advantage | actual return - critic prediction |
判断这段生成比预期好还是差 |
| 6. PPO update | 用 clipped ratio 更新 token 概率 | 好的 token trajectory 概率上升,坏的下降 |
一个数字例子:
reward_model_score = 0.86
kl_penalty = 0.06
actual_return = 0.80
critic prediction at this prefix = 0.55
advantage = 0.80 - 0.55 = +0.25
这说明这段生成比 critic 预期更好,PPO 会提高这条回答里相关 token 的概率。但如果某个 token 的概率变化太猛:
ratio = pi_theta(token) / pi_old(token) = 1.35
clip range = [0.8, 1.2]
那 PPO 不按 1.35 * advantage 更新,而按 1.2 * advantage 更新。直觉就是:
可以朝高 reward 方向走,但一步不能迈太大。
如果另一个回答 reward 很低:
actual_return = 0.20
critic prediction = 0.55
advantage = -0.35
对应 token 的概率就会被压低。PPO 的重点不是只看 reward,而是看:
这个生成结果是否比 critic 原本预期更好?
新 policy 相对 old policy 改得是否过猛?
新 policy 是否离 reference model 太远?
PPO 的优点:
- online RL,能直接优化 reward。
- 适合 reward model 已经比较可靠的通用 RLHF。
- 有 critic 和 clipping,训练信号比裸 REINFORCE 稳。
PPO 的缺点:
- 工程重:policy / ref / reward / critic 多模型协同。
- critic 训练不稳会直接影响 advantage。
- 对超参、KL 系数、reward scale 比较敏感。
3. DPO:偏好优化,不是传统 online RL
DPO 直接使用偏好对:
prompt x
chosen answer y_w > rejected answer y_l
它不需要先训练一个显式 reward model,也不需要在线采样 rollout。核心是让模型相对 reference 更偏向 chosen、更远离 rejected:
log pi_theta(y_w | x) - log pi_ref(y_w | x)
should be larger than
log pi_theta(y_l | x) - log pi_ref(y_l | x)
DPO loss 的直觉版:
loss = -log sigmoid(
beta * [
log_ratio(chosen) - log_ratio(rejected)
]
)
这里的 reference model 仍然很关键:它不是 critic,而是“别离原模型太远”的坐标系。
DPO 具体怎么 work
DPO 不让模型在线试错,而是直接吃偏好数据。比如一条训练样本是:
Prompt:
解释 reward model 和 critic 的区别。
Chosen:
reward model 是裁判,给完整答案打分;critic 是预测器,估计当前状态未来能拿多少 reward。
Rejected:
reward model 和 critic 都是给模型打分的东西,差别不大。
DPO 看的是:当前模型相对 reference model,有没有更偏向 chosen。
假设当前 policy 的 log probability 是:
log pi_theta(chosen | x) = -120
log pi_theta(rejected | x) = -115
这说明当前模型反而更容易生成 rejected,因为 -115 比 -120 概率更高。
再看 reference model:
log pi_ref(chosen | x) = -118
log pi_ref(rejected | x) = -116
于是 DPO 比较的是两个 reference-relative ratio:
chosen_log_ratio = -120 - (-118) = -2
rejected_log_ratio = -115 - (-116) = +1
gap = chosen_log_ratio - rejected_log_ratio = -3
gap 是负的,说明当前模型相对 reference 更偏向 rejected。DPO loss 会推动:
increase log pi_theta(chosen | x)
decrease log pi_theta(rejected | x)
所以 DPO 的训练信号不是:
这个答案 reward = 0.8
而是:
同一个 prompt 下,chosen 应该比 rejected 更容易被模型生成。
它的关键优点是工程简单:没有 rollout、没有 reward model online 打分、没有 critic。缺点也来自这里:模型只在已有偏好对里学习,不会主动探索一个全新的更优答案。
DPO 的优点:
- 简单稳定,不用在线 RL 环境。
- 不需要单独 reward model 和 critic。
- 对现成 preference pair 数据非常友好。
DPO 的缺点:
- 不会主动探索新答案,只能从离线偏好数据里学。
- 对数学、代码这类可验证任务,常常不如 online RLVR 直接。
- 如果偏好数据覆盖不够,模型容易学到风格而不是能力。
4. GRPO:推理模型常用的 critic-free RL
GRPO 的核心是同一个 prompt 采样多个答案,然后组内比较。
Prompt x
├── answer A -> reward 0.9
├── answer B -> reward 0.7
├── answer C -> reward 0.2
└── answer D -> reward 0.0
用组内均值 / 标准差做 baseline:
mean = 0.45
A_adv = 0.9 - 0.45 = +0.45
B_adv = 0.7 - 0.45 = +0.25
C_adv = 0.2 - 0.45 = -0.25
D_adv = 0.0 - 0.45 = -0.45
所以它可以省掉 value model / critic:
PPO: reward function + critic baseline
GRPO: reward function + group-relative baseline
GRPO 具体怎么 work
假设 prompt 是一道数学题:
如果 3x + 5 = 20,求 x。
GRPO 不只采样一个答案,而是同一个 prompt 采样一组答案:
| 样本 | 模型回答 | reward |
|---|---|---|
| A | 3x=15,所以 x=5 |
1.0 |
| B | 3x=25,所以 x=8.33 |
0.0 |
| C | x=(20-5)/3=5 |
1.0 |
| D | x=15 |
0.0 |
组内平均 reward:
mean_reward = (1.0 + 0.0 + 1.0 + 0.0) / 4 = 0.5
于是每个回答的 advantage 可以近似理解成:
A_adv = 1.0 - 0.5 = +0.5
B_adv = 0.0 - 0.5 = -0.5
C_adv = 1.0 - 0.5 = +0.5
D_adv = 0.0 - 0.5 = -0.5
训练更新就很直观:
A / C 的 token 概率上升
B / D 的 token 概率下降
这里没有单独的 value model,因为 baseline 来自同一个 prompt 的 group mean / group std。也就是说:
PPO 问 critic: 这个 prefix 未来大概值多少分?
GRPO 问同组样本: 这个答案比同题其他答案强还是弱?
GRPO 还会保留 PPO 类似的 ratio / KL 控制,避免模型为了拿 reward 过度偏离 reference。它最适合数学、代码、选择题、格式可验证任务,因为 reward 可以自动算:
数学: 最终答案是否正确
代码: unit tests 是否通过
工具调用: 任务是否完成、证据是否满足
GRPO 特别适合 RLVR(reinforcement learning with verifiable rewards):
- 数学题:最终答案可校验。
- 代码题:unit test 可校验。
- STEM / reasoning:可以用 rule-based verifier 或 judge。
GRPO 的优点:
- 不训练 critic,显存和工程复杂度更低。
- 同题多样本天然产生相对比较信号。
- 在 DeepSeekMath / DeepSeek-R1 风格 reasoning RL 里很有代表性。
GRPO 的缺点:
- 需要 online rollout,采样成本高。
- reward 最好可验证;纯主观偏好任务不一定适合。
- group size、reward normalization、KL 控制都会影响稳定性。
5. Reward Model 和 Critic 不要混
| 项目 | Reward model / reward function | Critic / value model |
|---|---|---|
| 一句话 | 裁判 | 预测器 |
| 输出 | 这个回答得几分 | 当前状态未来大概能得几分 |
| 是否是优化目标 | 是,policy 要提高 reward | 不是,只是 baseline |
| PPO 需要吗 | 需要 reward 信号 | 通常需要 |
| GRPO 需要吗 | 需要 reward 信号 | 不需要 |
| DPO 需要吗 | 不显式需要 | 不需要 |
最容易被问的点:
reward model: answer -> score
critic: partial trajectory/state -> expected return
advantage: actual return - critic prediction
6. 怎么选算法
| 条件 | 优先选 |
|---|---|
| 只有 chosen/rejected 偏好对,想快速稳定对齐 | DPO |
| 有可靠 reward model,要做经典 RLHF | PPO |
| 数学/代码/推理,reward 可自动验证 | GRPO |
| 训练资源有限,不想维护 critic | DPO 或 GRPO |
| 想让模型在在线 rollout 里探索更优 reasoning | GRPO |
| 想最大化通用 reward,同时 reward model 已成熟 | PPO |
最实用的面试回答:
PPO 是传统 RLHF 主力,完整但重;DPO 是偏好对齐主力,离线、简单、稳定;GRPO 是 reasoning RL 主力,用组内相对 reward 替代 critic,适合数学/代码这类可验证任务。
7. 高频问答
DPO 算不算 RL?
广义上它来自 RLHF 目标的推导,狭义上不是传统 online RL。它没有 rollout、没有环境交互、没有 critic,更准确叫 offline preference optimization。
GRPO 为什么不需要 critic?
因为它对同一个 prompt 采样多个答案,用组内 reward 的均值 / 标准差构造 baseline。critic 的作用是提供 baseline,GRPO 用 group baseline 替代了它。
PPO 和 GRPO 最大区别?
PPO 通常训练 value model / critic 来估计 advantage;GRPO 用同题多样本的相对 reward 估计 advantage。PPO 更通用,GRPO 在可验证 reasoning 任务上更省、更直接。
三者共同点是什么?
都在控制“新模型相对旧模型/reference model 的概率变化”。PPO 用 ratio clipping 和 KL,DPO 用 reference-relative preference loss,GRPO 通常也会保留 KL 或 ratio clipping。
8. 最终速记
PPO:
online RLHF, reward model/function + critic + KL/clip
strongest general RLHF baseline, but expensive and sensitive
DPO:
offline preference optimization, chosen/rejected pair
no rollout, no reward model, no critic
simple, stable, good for alignment
GRPO:
online critic-free RL, group-relative advantage
no value model, good for verifiable reasoning rewards
central for modern reasoning RL