RLHF 对齐
预训练模型会预测下一个 token,但不区分该不该说。你问它「怎么做炸弹」,它照答不误——因为训练数据里确实有这些续写模式。怎么让模型学会「什么该说,什么不该说」?
这一节走完 RLHF 的完整流程:SFT 打底 → Reward Model 把偏好变成打分 → PPO 优化策略 → DPO 跳过打分直接学偏好。每步都用手算例子讲清楚。
语言模型的训练目标是「预测下一个 token」,但我们要的是「给出有帮助、诚实、无害的回答」。这两个目标之间的差距就是对齐(Alignment)要解决的问题。经典 RLHF 分三个 Stage:先用高质量对话数据做 SFT 打底,再训练一个 Reward Model 来模拟人类偏好,最后用 PPO 强化学习让模型朝高奖励方向优化。
DPO 是 2023 年提出的 简化方案——通过数学变换消掉显式的 Reward Model,把偏好数据直接转化为分类 loss。
SFT、Reward Model、PPO、DPO——每个阶段的损失函数和训练目标都不一样。这一节从 3H 原则出发,先用 SFT 打底,再逐步叠加更复杂的训练目标。
1. 为什么需要对齐
预训练模型的目标通常是 next-token prediction:给定前面 N 个 token,预测第 N+1 个 token。它在海量文本上学会了语言和知识的统计模式,但不等于天然知道在每个用户场景中什么回答最有帮助、最安全。
举个例子:
用户: 我最近心情不好,觉得活着没意思。
未对齐的 Base Model(续写模式,示例):
"她站在天台上,风吹过她的 头发,她想起那个背叛她的人...
楼下围满了看热闹的人,有人拿出了手机录像..."
↑ 模型在模仿网上看到的小说!模式统计上是对的——「心情不好」
后面确实经常接这种文学描写。但这个回答完全不合适。
已对齐的模型(Helpful + Harmless,示例):
"我很抱歉你正在经历这些。请记住:你并不孤单,
有很多人愿意帮助你。你可以拨打心理援助热线。
你愿意和我聊聊发生了什么吗?"
↑ 模型识别到这是求助,给出有帮助的回应。
这个对比揭示了对齐的本质问题:预训练让模型学会「这段话后面通常跟什么」,但对齐要让模型学会「在这种情况下应该回答什么」。前者是统计规律,后者是价值判断。
对齐的 3H 原则:
- Helpful(有帮助):回答问题,提供有用信息,不跑题
- Honest(诚实):不知道就说不知道,不编造听起来合理的假话
- Harmless(无害):拒绝有害请求,不助长危险行为
三个原则有时会冲突。比如用户问「我做的炸弹为什么不炸」,诚实回答会提供危险信息,有帮助于这个用户但有害于社会。对齐需要在三者之间找到平衡——通常无害优先。
2. 对齐全景图
整条链路分为几个阶段:
Base Model(预训练完,只会续写)
│
▼ Stage 1: SFT
┌─── ──────────────────────┐
│ 用高质量对话数据做监督学习 │
│ 教会「对话格式」和基本指令 │
└────────────┬────────────┘
▼
SFT Model(会对话了,但不会区分好坏)
│
┌─────┴─────┐
▼ ▼
Stage 2a: RLHF Stage 2b: DPO
(经典路线) (简化路线)
│ │
① 收集偏好数据 ① 收集偏好数据
② 训练 Reward Model ② 直接优化偏好
③ PPO 强化学习 (跳过 RM + PPO)
│ │
└──────┬───────────┘
▼
已对齐的模型 ✨
下面逐个阶段手算。
3. Stage 1:SFT
3.1 SFT 做了什么
用高质量对话数据做监督训练。训练数据长这样:
<|User|> 法国的首都是什么?
<|Assistant|> 法国的首都是巴黎。
<|User|> 为什么是巴黎?
<|Assistant|> 因为巴黎是法国最大的城市和政治中心,
自中世纪起就是法国的行政首都。
SFT 本质上和预训练一样——交叉熵 loss,预测下一个 token。区别只是数据从「互联网文本」换成了「对话」。
SFT 之后模型学会了:
- 对话格式(一问一答)
- 指令跟随的基本形式
- 「好回答」的表面特征