对齐三部曲:SFT → RLHF → DPO 到底在优化什么
对齐三部曲:SFT → RLHF → DPO 到底在优化什么
前情说明:技术深度 D1。《大模型原理面试冲刺》系列第 3 篇。上一篇讲了 GPT 演进和 Scaling Law,其中"从 GPT-3 到 ChatGPT"跳过了对齐这一段——这一篇补上。 对齐是面试必被追问的话题。因为它同时涉及 RL 基础(PPO)、损失函数设计(DPO)、和最新趋势(Constitutional AI、RLAIF)。答不好会被追问到崩溃,答好了能拉开明显区分度。
为什么对齐这一环这么关键
GPT-3(2020)就已经存在,但 ChatGPT(2022 底)才引爆——中间差的两年,全在对齐这个词里。
Base model 学会了"预测下一个 token",但它并不"想帮你"。给它一个问题,它可能:
- 继续问一个类似的问题(因为训练语料里问题后面常跟问题)
- 输出一段乱七八糟的续写
- 拒绝回答但给不出好的拒绝理由
对齐做的事就是把一个"能生成文本的语言模型"变成"能听话的助手"。
面试常见问法:
- SFT / RLHF / DPO 分别在做什么,能不能只做一步?
- PPO 的 loss 长什么样,为什么加 KL penalty?
- DPO 为什么能省掉 reward model?公式怎么来的?
- RLHF vs RLAIF vs Constitutional AI 的区别?
这一篇给你可以照抄的答案骨架。
一、三阶段总览:一张图先记住
对齐的经典 pipeline 是三段式:
Pretrain Base Model
↓
[Stage 1] Supervised Finetuning (SFT)
用高质量 (prompt, ideal answer) 对做 next-token
↓
[Stage 2] Reward Modeling (RM)
人类标注 pairwise 偏好,训一个打分模型
↓
[Stage 3] RL with PPO
用 RM 当奖励信号,PPO 优化 policy,加 KL 防跑飞
每一阶段解决的问题不同:
| 阶段 | 目标 | 数据 | 数量级 |
|---|---|---|---|
| SFT | 学会"回答问题"的格式 | (prompt, response) | 万级到十万级 |
| RM | 学会"什么答案更好" | (prompt, chosen, rejected) | 十万级到百万级 |
| RL | 优化生成使 RM 打分高 | prompt only | 百万级 rollout |
能不能只做 SFT? 可以,效果就是 Vicuna、Alpaca 那批早期开源模型。缺点:模型只学"什么答案是好的",学不到"什么答案是坏的"。对比学习信号缺失是 SFT-only 的核心短板。
二、Stage 1:SFT,最简单也最容易踩坑
SFT 本质就是继续 next-token prediction,只是数据换成 (prompt, response) 对。技术上没啥新东西,但工程上有几个必知的坑:
坑 1:只对 response 部分算 loss
如果你对 prompt 部分也算 loss,模型会试图学习"重现 prompt",浪费容量。正确做法:把 prompt 部分的 label 设成 -100(PyTorch 的 ignore_index),只反传 response 部分的 loss。
坑 2:SFT 数据质量 >> 数量
LLaMA-2 的 SFT 只用了 27k 条精挑细选的数据,效果打得过用几十万条乱数据训的模型。学界公认结论:"Less is More for Alignment"(LIMA 论文标题就是这个)。
坑 3:SFT 会让模型丢失多样性
SFT 太多轮会让输出模式化——所有回答都是"当然可以!让我详细为你解释..."这种。这是为什么后面还要 RLHF 或 DPO 来找回一点多样性。
三、Stage 2:Reward Model,看似简单实则最难
Reward Model 的目标:给定 (prompt, response) 输出一个标量分数,越高代表越"好"。
3.1 怎么训 RM
关键 insight:直接问人"这答案几分"是不靠谱的(每个人尺度不同)。改成 pairwise 偏好:给两个答案 A 和 B,让人选哪个更好。这是 Bradley-Terry 模型的思路。
Loss 长这样:
L = -log σ(r(x, y_chosen) - r(x, y_rejected))
r(x, y)是 reward model 对 (prompt, response) 的打分(一个标量)- σ 是 sigmoid
- 目标是让 chosen 的分比 rejected 高得多
架构上 RM 就是一个 base model 后面接一个 scalar head(一个 linear 层输出 1 维),通常从 SFT 模型继续训。
3.2 RM 的三大痛点
痛点 1:Reward Hacking
RM 是个学出来的近似函数,policy 优化时会钻它的漏洞——找到 RM 打分高但人类觉得垃圾的答案。典型症状:模型输出越来越长(因为 RM 学到"长 = 详细 = 好"的假相关)。
痛点 2:分布漂移
RM 训练用的是 SFT 模型的输出分布。RL 训练几步后,policy 已经漂移到 RM 训练时没见过的分布,RM 打分就不准了。这是为什么 RLHF 通常需要在线迭代——用当前 policy 采样新数据、重新标注、重训 RM。
痛点 3:人类标注不一致
同一对答案,不同标注员意见可能相反。行业经验是标注员间一致率 60-70% 就算 acceptable。这是 RLHF 效果上限的天花板。
四、Stage 3:PPO——让 policy 追 RM,别追飞
有了 RM,剩下的问题是:怎么更新 policy 让它输出高 RM 分的答案?
Naive 想法:用 RM 打分当 loss,梯度上升。问题:RM 是不可微的(它是个 argmax + 打分,policy sample 出的 token 是离散的)。
RL 的解法:用采样代替微分。让 policy 采样 → RM 打分 → 用打分做梯度加权。这就是 policy gradient。PPO 是 policy gradient 的一个稳定版本。
4.1 PPO 在 RLHF 里的完整 loss
面试问"PPO 的 loss 长什么样",你要能写出这一坨:
L_PPO(θ) = E[
min(
r_θ(x, y) · A(x, y),
clip(r_θ(x, y), 1-ε, 1+ε) · A(x, y)
)
] - β · KL(π_θ || π_ref)
拆解:
r_θ(x, y) = π_θ(y|x) / π_old(y|x):新 policy 和采样时 policy 的概率比A(x, y):advantage,可以近似为reward - baseline(baseline 通常是 value function 估计)clip(r, 1-ε, 1+ε):clip 项防止一步更新太大跑飞,ε 通常 0.2min(...):取两项的最小值,是 PPO 相对于 vanilla policy gradient 的核心改进KL(π_θ || π_ref):当前 policy 和参考 policy(一般是 SFT 模型)的 KL 散度,β 是权重
为什么加 KL penalty? 这是 RLHF 最容易被追问的点。
答案:防止 policy 为了追 RM 高分把模型能力搞坏。如果不加 KL,policy 会走向 RM 的 argmax,输出可能是重复"当然可以"或者奇怪的乱码——这些在 RM 空间里可能高分(因为 RM 也没见过这种),但明显不是好答案。KL penalty 把 policy 拉回 SFT 附近,保证输出还在正常语言分布里。
β 怎么选? 太小 → reward hacking;太大 → 学不动。工程上一般 0.01-0.1 之间调,或者用 KL controller 动态调整。
4.2 为什么 PPO 这么难调
RLHF PPO 有以下痛点(这也是 DPO 出现的原因):
- 需要维护 4 个模型:policy、ref policy、reward model、value model。显存和实现复杂度都高
- 超参数敏感:ε、β、learning rate、rollout batch size 一堆都要调
- 训练不稳定:几个坏 batch 就能让模型崩掉,需要频繁 checkpoint 和监控
- 需要在线采样:不能像 SFT 那样离线数据集训,每 step 都要采样、打分、更新
OpenAI 的原始 InstructGPT/RLHF pipeline 是这么跑的,工程门槛极高。开源社区(除了 Meta、Anthropic 少数玩家)几乎跑不通。
五、DPO:绕开 Reward Model 的美丽解法
DPO(Direct Preference Optimization,Rafailov 2023)是 2023 年最漂亮的对齐工作。核心 insight:
如果我们的目标是 argmax 一个由 pairwise preference 定义的 reward,那么这个优化问题有一个封闭解——不需要显式训练 reward model 和 PPO。
5.1 推导的直觉
RLHF 的目标可以写成:
max_π E[r(x, y)] - β · KL(π || π_ref)
这个带 KL 约束的优化问题,数学上有一个解析解:
π*(y|x) = π_ref(y|x) · exp(r(x, y) / β) / Z(x)
也就是说,最优 policy 和 reward 是一一对应的。反过来解出 r:
r(x, y) = β · log(π*(y|x) / π_ref(y|x)) + β · log(Z(x))
把这个代入 Bradley-Terry 的 preference loss(RM 训练的那个),Z(x) 项抵消掉了(因为 loss 里是 r 的差),得到 DPO Loss:
L_DPO = -log σ(
β · [log π_θ(y_c|x) - log π_ref(y_c|x)]
- β · [log π_θ(y_r|x) - log π_ref(y_r|x)]
)
翻译成人话:
直接用 policy 自己的 log-prob 差异去拟合 preference,不需要单独训 reward model,也不需要 PPO 那一套 RL 循环。
5.2 DPO 的优势
- 只需要 2 个模型(policy + ref),不需要 RM 和 value model
- 离线训练,像 SFT 一样跑,代码几十行搞定
- 训练稳定,超参数少(就一个 β)
- 和 SFT 完全兼容,可以在 SFT 之后直接接 DPO
这就是为什么 2024 年之后开源社区几乎都改用 DPO——Llama-3、Qwen-2、Mistral 都在用。
5.3 DPO 的局限
DPO 不是万能的:
- 需要预先收集好的偏好数据(离线的),不能像 PPO 那样在线迭代
- 无法自我修正——如果 preference 数据有系统偏差,DPO 会放大它
- 理论最优 = π_ref 分布 + reward reshape,如果 SFT 模型(π_ref)本身太差,DPO 上限也低
DPO 之后还有一堆变种:IPO(防过拟合)、KTO(不需要 pairwise,只需要 good/bad 二分类标签)、ORPO(把 SFT 和 preference 合成一个 loss)、SimPO(不需要 ref model)。工业界 2026 年主流还是 DPO 或它的直接变种。
六、Constitutional AI / RLAIF:让 AI 标注 AI
Anthropic 的 Constitutional AI(2022)走了另一条路——用另一个 LLM 代替人类标注偏好数据。
流程:
- 写一份"宪法"(constitution):一堆自然语言规则,比如"不要有害"、"不要偏袒"
- 用 LLM 对每个回答做 critique("这个回答违反了哪些规则")
- 用 LLM 生成 revision("按规则重写")
- 拿 (original, revised) 当 preference pair,训 RM 或直接 DPO
好处:标注成本近乎为零,规则明确可迭代(改宪法就行,不用重招标注员)。
现在业界普遍用 RLAIF(RL from AI Feedback)这个更通用的名字。GPT-4/Claude 大概率都用了 RLAIF——纯人类标注根本 scale 不上去。
面试可以说:现代大模型的对齐是 SFT + DPO/PPO + RLAIF 的混合,纯 human preference 已经不够了,AI 标注 AI 是必然趋势。
七、一张对比表:SFT / RLHF-PPO / DPO / RLAIF
| 维度 | SFT | RLHF-PPO | DPO | RLAIF |
|---|---|---|---|---|
| 需要什么数据 | (prompt, ideal) | pairwise preference | pairwise preference | AI 生成的 pairwise |
| 需要几个模型 | 1 | 4 (policy/ref/RM/value) | 2 (policy/ref) | 2-4 |
| 训练稳定性 | 很稳 | 差,需要精调 | 稳 | 中等 |
| 显存开销 | 1x | 4x+ | 2x | 2-4x |
| 能否在线迭代 | 否 | 是 | 否(离线) | 是 |
| 对齐能力上限 | 低 | 高(理论上) | 中高 | 高 |
| 工业界现状 | 必做 | Anthropic/OpenAI | 开源主流 | 主流补充 |
面试锚点
Q1: RLHF 三阶段分别在做什么?能不能只做其中一步?
A: (1) SFT 学"怎么回答",用 (prompt, response) 对做 next-token;(2) RM 学"什么答案更好",用 pairwise preference 训 Bradley-Terry;(3) PPO 让 policy 追 RM 的高分方向。可以只做 SFT,但缺少对比学习信号,模型不知道"什么是坏答案",效果有天花板(早期 Alpaca 就是这种)。
Q2: PPO loss 里为什么要加 KL penalty?
A: 防止 policy 为了追 RM 高分把语言能力搞坏。RM 是学出来的近似,policy 会去钻它的漏洞(reward hacking),输出可能高分但不是好答案。KL(π_θ || π_ref) 把当前 policy 拉回 SFT 附近,保证输出还在正常语言分布里。β 太小会 reward hacking,太大学不动,工程上 0.01-0.1 之间调。
Q3: DPO 为什么能省掉 reward model?
A: 因为带 KL 约束的 RL 目标 max E[r] - β·KL(π||π_ref) 有解析解 π* ∝ π_ref · exp(r/β)。反解得到 r 可以用 log(π/π_ref) 表达。把这个代入 Bradley-Terry preference loss,Z(x) 归一化项在 pairwise 差分中抵消,得到只用 π 和 π_ref 表达的 loss,不再需要显式训 RM。
Q4: DPO 相比 PPO 的优势和劣势?
A: 优势:只需 2 个模型(省显存)、离线训练(稳定)、超参数少(就一个 β)、代码简单几十行。劣势:不能在线迭代、不能自我纠错、上限受限于 SFT 模型质量、需要预先准备好偏好数据。所以工业界(OpenAI/Anthropic)大概率还是 PPO 或它的改进版,开源社区几乎全 DPO。
Q5: Reward Hacking 是什么?怎么缓解?
A: Policy 在优化时钻 RM 的漏洞,找到 RM 打分高但人类觉得差的答案。典型症状:输出越来越长(RM 学到"长 = 好"的假相关)、输出越来越啰嗦、开头总是"当然可以!"。缓解:(1) KL penalty 约束 policy;(2) 在线迭代重训 RM;(3) 多个 RM 集成;(4) 用 length-normalized reward。
Q6: RLAIF 是什么?为什么会流行?
A: 用 LLM 代替人类做偏好标注(Anthropic 的 Constitutional AI 是代表)。写一份自然语言"宪法",让 LLM 自我 critique 和 revise,生成 preference pair。好处是成本近乎为零、规则可迭代(改宪法即可)、scale 无限。现代大模型的对齐几乎都是 human + AI 混合标注,纯人类根本 scale 不上去。
Q7(进阶): Constitutional AI 和普通 RLHF 有什么本质区别?
A: 数据来源不同。RLHF 的 preference 由人类标注,成本高、慢、规则难以精确表达;CAI 的 preference 由 LLM 根据显式的"宪法"规则生成,成本低、快、规则可解释。CAI 本质是把"隐式的人类偏好"变成"显式的自然语言规则 + LLM 自动应用"。代价是需要一个"够聪明的" critic LLM——早期模型跑不了 CAI。
Q8(进阶): 如果让你从零对齐一个新模型,你会怎么做?
A: (1) 收集 5-30k 条精选 SFT 数据(quality > quantity)先做 SFT;(2) 用 RLAIF 快速生成偏好数据 bootstrap(几十万条);(3) 上 DPO(比 PPO 好训好多);(4) 观察 eval,如果 reward hacking 严重就上 online DPO 或 IPO 变种;(5) 后期如果预算够可以加入少量高质量人类标注做校准。核心思路:能用 DPO 不用 PPO,能用 AI 标注不用人类标注,能用少量高质量不用大量低质量。
一句话记住这一篇
对齐不是训练技巧,是"让模型学会人类偏好"的完整工程栈。SFT 教格式,Reward Model + PPO 教偏好,DPO 用数学把 RM 融进 policy loss 里省掉一整环,RLAIF 用 AI 代替人类把标注成本降到近零。工业界的现代 pipeline 是 SFT + DPO/PPO + RLAIF 混合。
系列下一篇:《Long Context 的三条路:RoPE 外推 / YaRN / Ring Attention》——为什么直接扩 max_len 会崩,长上下文外推的三种主流方案对比。

Written by
Zoe
AI Infra Engineer · LLM Serving · GPU/RDMA · 造工具的偏执狂