5.5 强化学习对齐:RLHF 与 DPO
核心问题: 预训练模型已经很强大,为什么还不能直接用?
在线 Notebook
对应的交互式版本可在 Google Colab 打开,统一使用方式见 第0章说明。
预训练模型的能力与局限
预训练学到了什么
5.1节讲过,预训练的目标只有一个:预测下一个词。
输入:The quick brown fox
目标:jumps这个目标驱动模型读了几乎整个互联网——新闻、书籍、代码、论坛、百科全书。结果是,模型学到了惊人的语言能力和世界知识。
但"预测下一个词"和"成为有用的助手"之间,有一道鸿沟。
三个核心问题
问题1:模型会续写,不会回答
预训练模型看到"如何制作炸弹?",它的本能是续写——就像互联网上那些真实存在的有害内容一样。它没有理由拒绝,因为拒绝从来不是训练目标。
问题2:模型不听指令
用户:用一句话总结这段文字。
模型:(继续生成更多文字,而不是总结)预训练数据里充满了各种文体,模型学会了"续写",但没学会"服从指令"。
问题3:模型会说谎
预训练数据里有大量错误信息、过时信息、甚至虚构内容。模型学会了"听起来合理",而不是"说真话"。
类比:信号处理中的原始采集
这就像一个宽带接收机,它能接收所有频率的信号,但没有滤波器。原始信号里有你想要的,也有噪声、干扰、甚至恶意信号。对齐就是那个滤波器——让模型只输出"有用、无害、诚实"的内容。
SFT:监督微调
核心思想
SFT(Supervised Fine-Tuning,监督微调)的做法很直接:
- 雇佣人工标注员
- 让他们写出"好的对话"——用户问什么,助手应该怎么回答
- 用这些"指令-回答"对继续训练预训练模型
训练数据格式:
[指令] 用一句话解释什么是黑洞。
[回答] 黑洞是一种引力极强的天体,连光都无法逃脱,通常由大质量恒星坍缩形成。
[指令] 帮我写一封请假邮件,原因是发烧。
[回答] 尊敬的领导,您好。我因发烧身体不适,申请今日请假一天,望批准。谢谢!SFT 教会了模型什么
- 对话格式:知道自己是"助手",用户是"用户"
- 听从指令:看到"总结"就总结,看到"翻译"就翻译
- 拒绝有害请求:标注员写了大量"这个我无法帮助"的示例
SFT vs 第6章的微调
这里容易混淆,需要区分清楚:
SFT(本节):
预训练模型 → 通用助手
目标:让模型"变成助手"
数据:通用指令-回答对,覆盖各种任务
第6章微调:
通用助手 → 特定领域专家
目标:让助手"适配特定任务"
数据:特定任务的标注数据(如医疗问答、代码生成)SFT 是"从野生动物到家养宠物",第6章微调是"从普通宠物到导盲犬"。两者都是微调,但目的和起点不同。
SFT 的局限
SFT 之后,模型已经好用很多了。但还有一个问题:如何定义"好的回答"?
标注员可以写出好的示例,但很难穷举所有情况。更重要的是,对于同一个问题,可能有多个"还不错"的回答,但哪个更好?这需要更细粒度的人类偏好信号。
奖励模型:把人类偏好量化
排序比打分更可靠
直接让标注员给回答打分(1-10分)很难——每个人的标准不一样,同一个人前后也不一致。
但让标注员比较两个回答哪个更好,就容易多了。这是人类判断的自然方式。
问题:如何减肥?
回答A:少吃多动,保持健康饮食和规律运动。
回答B:你可以尝试极端节食,每天只吃500卡路里。
标注员选择:A 更好(B 的建议有健康风险)奖励模型的训练
收集大量这样的"(问题, 回答A, 回答B, 人类偏好)"数据后,训练一个奖励模型(Reward Model, RM):
输入:(问题, 回答)
输出:一个分数,表示这个回答有多好
奖励模型训练目标:
对于人类偏好 A > B 的样本,
确保 RM(问题, A) > RM(问题, B)奖励模型本质上是一个分类器,但它的输出是连续分数,代表"人类会有多喜欢这个回答"。
奖励模型的意义
这一步是整个对齐流程的关键:把难以量化的"人类偏好"变成了一个可以自动计算的数值。
有了奖励模型,就不需要人类实时参与每一次训练迭代了。奖励模型充当了"人类偏好的代理"。
RLHF:用强化学习优化语言模型
整体流程
RLHF(Reinforcement Learning from Human Feedback,基于人类反馈的强化学习)把前面的步骤串联起来:
第一步:预训练
大规模文本 → 预训练模型(有能力,但不对齐)
第二步:SFT
指令-回答对 → SFT模型(会听指令,但不够好)
第三步:训练奖励模型
人类偏好排序数据 → 奖励模型(能评分)
第四步:RL优化
用奖励模型的分数作为信号,用PPO算法优化SFT模型
→ 对齐后的模型(有用、无害、诚实)强化学习的直觉
把语言模型想象成一个"演员":
- 状态:当前的对话上下文
- 动作:生成下一个词
- 奖励:回答完成后,奖励模型给出的分数
演员的目标是最大化累积奖励——也就是生成奖励模型认为"好"的回答。
KL 散度约束:防止模型"钻空子"
这里有一个关键问题:如果只优化奖励分数,模型会学会欺骗奖励模型。
想象一下:奖励模型是用有限数据训练的,它有盲点。语言模型可能发现某些奇怪的输出能骗过奖励模型得高分,但这些输出对人类来说毫无意义。这叫奖励黑客(Reward Hacking)。
极端情况(没有约束):
模型发现重复"非常好非常好非常好..."能得高分
→ 奖励分数很高,但回答完全没用解决方案是加入 KL 散度约束:
优化目标 = 奖励分数 - β × KL(当前模型 || SFT模型)
KL散度衡量:当前模型的输出分布
与SFT模型的输出分布有多不同
β 是权衡系数:
β 大 → 模型不能偏离SFT太远(保守)
β 小 → 模型可以大幅改变(激进)类比信号处理:KL 约束就像一个正则化项,防止优化过程过拟合到奖励模型的噪声,保持模型的"基本面"不变。
PPO 算法
RLHF 通常用 PPO(Proximal Policy Optimization)算法来做 RL 优化。PPO 的数学细节放在扩展内容里,这里只需要知道:
- PPO 是一种稳定的策略梯度算法
- 它通过限制每次更新的幅度来保证训练稳定
- 对语言模型来说,"策略"就是"给定上下文,生成下一个词的概率分布"
DPO:更简单的对齐方法
RLHF 的复杂性
RLHF 效果很好,但工程上很复杂:
RLHF 需要同时维护:
1. SFT 模型(参考模型,用于 KL 约束)
2. 奖励模型(独立训练)
3. 当前策略模型(正在被优化的模型)
4. 价值函数模型(PPO 需要)
四个模型同时在 GPU 上,内存压力巨大。DPO 的思路
DPO(Direct Preference Optimization,直接偏好优化)的核心洞察是:
奖励模型和 RL 优化可以合并成一步。
数学上可以证明,RLHF 的最优解有一个闭合形式,可以直接用偏好数据来训练语言模型,不需要显式的奖励模型和 RL 循环。
RLHF 流程:
偏好数据 → 训练奖励模型 → RL 优化语言模型
DPO 流程:
偏好数据 → 直接优化语言模型DPO 的训练目标
DPO 的损失函数直接作用在偏好对上:
对于每个偏好对 (问题, 好回答, 差回答):
增大模型生成"好回答"的概率
减小模型生成"差回答"的概率
同时保持与参考模型(SFT模型)不要偏离太远这个目标直觉上很清晰:直接告诉模型什么好、什么不好,让它往好的方向走。
DPO vs RLHF
维度 RLHF DPO
----------- --------------- ---------------
训练复杂度 高(4个模型) 低(2个模型)
内存需求 很高 较低
训练稳定性 需要仔细调参 相对稳定
效果 强(GPT-4等) 接近RLHF
工程难度 高 低DPO 不是在所有情况下都优于 RLHF,但它大幅降低了对齐的工程门槛,让更多团队能够做对齐训练。
类比:两步法 vs 端到端
从信号处理的角度看:
- RLHF 像两级滤波器——先设计一个"人类偏好检测器"(奖励模型),再用它来驱动另一个系统(语言模型)
- DPO 像端到端优化——直接从输入(偏好数据)到输出(对齐模型),中间没有独立的中间模块
端到端方法通常更简单,但有时候两级方法的可解释性和可控性更好。
对齐的更大图景
Helpful、Harmless、Honest
对齐的目标通常概括为"3H":
Helpful(有用):能完成用户的合理请求
Harmless(无害):不生成有害内容,不帮助恶意行为
Honest(诚实):不编造信息,承认不确定性这三个目标有时候会冲突。比如,一个"极度有用"的模型可能会帮助用户做有害的事情;一个"极度无害"的模型可能会拒绝太多合理请求。对齐研究的很大一部分工作是在这三者之间找到平衡。
对齐不是一劳永逸
对齐训练完成后,模型仍然可能被"越狱"(jailbreak)——通过精心设计的提示绕过安全限制。这是一个持续的攻防过程,也是 LLM 工程实践中安全设计要考虑的内容。
宪法AI(Constitutional AI)
Anthropic 提出的另一种对齐方法:不依赖人类标注员来判断好坏,而是给模型一套"宪法"(一组原则),让模型自己评判自己的输出,然后用这些自我评判来训练。这减少了对人工标注的依赖,但需要模型本身已经足够强大。
代码实验

图5.5a:RLHF 训练流程——SFT 预热、奖励模型训练、PPO 强化学习三阶段,以及 DPO 的简化对比。
代码文件: code/ch05_llm_basics/rlhf_pipeline.py
运行方式: python code/ch05_llm_basics/rlhf_pipeline.py
本节小结
对齐是"让预训练模型变成可用助手"的关键步骤:
预训练模型
↓ SFT(学会对话格式和听从指令)
SFT 模型
↓ 奖励模型训练(量化人类偏好)
↓ RLHF 或 DPO(用偏好信号优化模型)
对齐后的模型核心思路:
- 预训练给了能力:模型学会了语言和世界知识
- 对齐给了方向:模型学会了"有用、无害、诚实"地使用这些能力
- SFT 是基础,教会模型对话格式和基本指令遵循
- 奖励模型 是桥梁,把人类偏好转化为可优化的信号
- RLHF 是经典方法,效果强但工程复杂
- DPO 是简化方法,把两步合成一步,降低工程门槛
- KL 约束 是安全阀,防止模型为了高奖励而"钻空子"
对齐是一个活跃的研究领域,现有方法都不完美。但正是这些技术,让预训练模型从"能续写文本的系统"变成了"可以信赖的助手"。
下一节: 5.6 模型评估
扩展阅读: 对齐训练深度细节(PPO 流程、KL 散度数学、DPO 推导、GRPO/o1 推理强化学习)
