对齐三部曲:SFT → RLHF → DPO 到底在优化什么

18 分钟阅读

对齐三部曲: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.2
  • min(...):取两项的最小值,是 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 代替人类标注偏好数据。

流程:

  1. 写一份"宪法"(constitution):一堆自然语言规则,比如"不要有害"、"不要偏袒"
  2. 用 LLM 对每个回答做 critique("这个回答违反了哪些规则")
  3. 用 LLM 生成 revision("按规则重写")
  4. 拿 (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 会崩,长上下文外推的三种主流方案对比。

Zoe

Written by

Zoe

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

评论