跳转至

第六章 后训练:SFT、RLHF、DPO

导读

预训练产出的模型只会"续写"——你给它"中国的首都是",它能续出"北京",但你问"请用三句话介绍 Transformer",它可能续出更多类似问题而非答案。后训练(post-training)就是让模型学会"按指令行事"和"符合人类偏好"。

本章解释三个核心阶段:SFT(监督微调)→ RM(奖励模型)→ RLHF(强化学习)/ DPO(直接偏好优化)

6.1 为什么需要后训练

预训练模型的输出分布是 P(text)——给定前缀,续写最可能的后继。这有两个问题:

  1. 不会"回答"问题:可能续写出更多问题或无关内容;
  2. 不区分"好"与"坏":训练数据中既有高质量答案,也有垃圾内容,模型一视同仁学。

后训练的目标是改变输出分布为 P(helpful_text | instruction),让模型:

  • 听指令(instruction following);
  • 有用(helpful);
  • 无害(harmless);
  • 诚实(honest)—— HHH 三原则。

6.2 SFT:监督微调

SFT 是最直接的方式——用人标注的 (prompt, ideal_answer) 对来微调模型

# 数据格式
{
  "prompt": "用三句话介绍 Transformer",
  "completion": "Transformer 是 2017 年提出的深度学习架构..."
}

# 训练
logits = model(input_ids)
loss = cross_entropy(logits[:, :-1], target[:, 1:])   # 只对 completion 部分算 loss

关键点

  • 只对 completion 算 loss,不对 prompt 算——否则模型会学"模仿用户的提问";
  • 数据量小但质量极高:1K-100K 样本即可(vs 预训练 10T tokens);
  • 超参温和:lr 1e-5 ~ 5e-5(远小于预训练),1-3 epoch;
  • **数据多样性**比数量更重要——同一类问题不要重复太多。

SFT 数据来源

  • 早期:人工标注(Alpaca、Vicuna,成本 $2-5/样本);
  • 现代:合成数据(用更强的模型生成 + 人工筛选,Llama-3 主流路线);
  • Self-Instruct / Evol-Instruct:自动提升数据难度与多样性。

6.3 RLHF:经典三阶段

SFT-RLHF三阶段

阶段 1:SFT(已述)

阶段 2:训练奖励模型(RM)

数据格式:(prompt, chosen_response, rejected_response)

# RM 通常是 SFT 模型去掉 LM head,加一个标量输出
r_chosen  = reward_model(prompt, chosen)
r_rejected = reward_model(prompt, rejected)

# Bradley-Terry loss
loss = -log(sigmoid(r_chosen - r_rejected))

直觉:让 chosen 的奖励比 rejected 高。RM 学到的是"哪种回答更好"的偏好。

标注方式

  • 人工排序:给定 prompt + N 个回答,人工排序(成本高);
  • KTO / Pairwise:只标 2 个,更简单;
  • RLAIF(AI 反馈):用更强的模型(如 GPT-4)当裁判,成本极低,现代主流

阶段 3:PPO 强化学习

用 RM 当环境,让 policy(待训模型)生成回答,RM 给奖励,PPO 更新 policy:

# PPO 训练循环(伪代码)
response = policy.generate(prompt)              # 采样回答
r = reward_model(prompt, response)              # RM 打分
logratio = log π(response | prompt) - log π_ref(response | prompt)
kl = β * logratio                                # KL 散度约束
loss = -(r - kl).detach() * logratio             # PPO surrogate

KL 约束的作用:防止 policy 漂离 SFT 模型太远(否则会 reward hacking——例如输出乱码骗高分)。

RLHF 的问题

  • 显存大:policy + ref + RM + value 4 个模型同存;
  • 不稳定:lr、β、KL 系数难调;
  • 训练慢:每步要采样;
  • reward hacking:模型找 RM 漏洞。

6.4 DPO:简化版

DPO vs RLHF

DPO(Direct Preference Optimization, 2023) 的关键洞察:

RLHF 的最优解有闭式形式,可以直接从偏好数据推导出 loss,不需要 RM,也不需要 PPO

# DPO loss(伪代码)
logp_w = log π(chosen | prompt) - log π_ref(chosen | prompt)
logp_l = log π(rejected | prompt) - log π_ref(rejected | prompt)
loss = -log(sigmoid(β * (logp_w - logp_l)))

DPO 训练只需 policy + ref(frozen),显存降一半,超参更少,更稳定。

对比

维度 RLHF DPO
需训 RM
模型数 4 2
显存 小一半
稳定性 难调 较稳
性能 略高(理论上限) 接近
实现 复杂 简单

现代主流:SFT → DPO(可能多轮)→ 部署。少数 lab 仍用 RLHF 追求极致(如 GPT-4、Claude)。

6.5 现代后训练 pipeline

以 Llama-3 为例(公开技术报告):

  1. SFT:多轮、多语言、多任务,合成数据为主;
  2. DPO / RLHF:人类偏好 + RLAIF;
  3. Iterative DPO:在线采集偏好,循环多轮;
  4. Safety tuning:专项安全对齐(红队、越狱数据);
  5. Specialized:编码、数学、推理专项数据增强。

关键经验

  • 后训练数据量比预训练小 4-6 个数量级,但成本仍可观(Llama-3 后训练用了大量合成 + 人工标注,估数百万美元);
  • 后训练可以"小投入大改观":1M 样本即可显著提升指令遵循能力;
  • 但也容易"对齐过度"——模型变得过于谨慎、拒答合理问题(sycophancy 与 over-refusal)。

6.6 安全对齐

后训练除了"有用",还要"无害":

  • Red teaming:人工 + 自动构造攻击 prompt;
  • Safety SFT:让模型拒绝恶意请求;
  • Constitutional AI(Anthropic):用一组"宪法"原则让模型自我批评、自我修正;
  • RLHF with safety reward:RM 包含安全维度。

防御层次见第 14 章。

6.7 用 LoRA 做轻量后训练

业务场景通常不需要全参微调。LoRA(Low-Rank Adaptation) 是首选:

# LoRA:在原权重旁加一对低秩矩阵 A、B
# 原: y = W x
# LoRA: y = W x + B A x   (其中 A: r×d, B: d×r, r << d)
# 只训 A、B,原 W 冻结

from peft import LoraConfig, get_peft_model
config = LoraConfig(r=8, lora_alpha=16, target_modules=["q_proj","v_proj"])
model = get_peft_model(base_model, config)

优点

  • 训练参数量 < 1%;
  • 显存大幅下降(原模型 fp16 + LoRA 参数,单卡 24GB 可训 7B);
  • 多 LoRA 切换:同一基础模型挂多个业务 LoRA,动态切换;
  • QLoRA:基础模型 4bit + LoRA fp16,消费级 GPU 可微调

局限:极致性能仍需全参 SFT;对代码、数学等强知识任务,LoRA 提升有限。

6.8 评测后训练效果

  • 指令遵循:IFEval、MT-Bench;
  • 对话质量:AlpacaEval、LMSys Arena;
  • 安全:AdvBench、HarmBench;
  • 业务自建集:永远要建一套业务特定评测。

工程实战要点

  • 数据质量 >> 数量:1 万条精心标注胜过 10 万条粗标;
  • 合成数据是主流:用强模型生成 + 人工筛,但要小心"模型血统"——A 蒸馏 B,B 蒸馏 C,最终可能侵权或质量递减;
  • DPO 是默认选择:除非有专门 RL 团队;
  • LoRA 是业务首选:单卡可跑、多业务隔离;
  • 过对齐是真实风险:监控 over-refusal 比例;
  • 安全对齐不能省:哪怕没有恶意用户,监管合规也要求;
  • chat template 必须严格匹配:训练数据格式与推理格式必须一致。

小结

  • 预训练模型只会续写;后训练让其学会听指令、符合人类偏好;
  • SFT:监督微调,1K-1M 高质样本即可;
  • RLHF = SFT + RM + PPO,效果好但复杂、不稳;
  • DPO:直接从偏好对训策略,简化版,现代主流;
  • LoRA / QLoRA:业务场景首选,单卡可微调 7B;
  • 后训练易过对齐,要监控 over-refusal;
  • 安全对齐与指令对齐同等重要。

练习题

  1. 解释预训练模型为什么"不会回答问题"。
  2. SFT 训练时为什么只对 completion 算 loss?
  3. RLHF 三阶段分别是什么?每阶段数据格式是什么?
  4. PPO 中的 KL 约束有什么作用?没有会怎样?
  5. DPO 相对 RLHF 的关键简化是什么?为什么更稳定?
  6. LoRA 训练参数量大致是多少?为什么仍有效?
  7. "over-refusal" 是什么?怎么监控?
  8. 业务场景选 SFT、DPO 还是 LoRA?给出决策树。
  9. RLAIF 与 RLHF 的区别是什么?为什么 RLAIF 现代更主流?

下一章:第七章 量化与稀疏化