对应:Stanford CS224N Winter 2026 Lecture 8(Post-training);Winter 2025 Lecture 10(Post-training: RLHF, SFT, DPO)。和同目录 CS336 第 15 讲(SFT 与 RLHF)、第 16 讲(可验证奖励的强化学习)有重叠:本讲侧重直觉和推导,CS336 侧重大规模实现。 配套代码:
code/lecture10/(导入第 9 讲的lm_utils.py,并加载第 9 讲预训练的迷你 GPT) 预计阅读时间:4–5 小时(第 5 节的推导值得在纸上推一遍)
0. 本讲导航
0.1 学完本讲,你应该能够
- 说出为什么一个只做过预训练的模型不是好的”助手”,以及”对齐”想要达到的目标(有用、诚实、无害)。
- 解释指令微调(SFT):数据从哪里来、对话模板、为什么只在回复上计算损失,以及它的局限。
- 写出 Bradley–Terry 模型,解释为什么收集”两两比较”比收集”示范”更容易,以及奖励模型怎样训练。
- 写出 RLHF 的目标(奖励 − β·KL),解释 KL 项的作用,说出策略梯度和 PPO 的直觉。
- 从 RLHF 的目标出发推导 DPO:最优策略的闭式解 → 用策略表示奖励 → 代入 Bradley–Terry → 配分函数抵消。
- 解释奖励黑客和过度优化(古德哈特定律)、best-of-n 的 KL、长度偏见、谄媚、多样性下降等问题。
- 说出 RLAIF、宪法 AI 的思路,以及今天后训练的大致流程。
0.2 先修知识
| 知识点 | 用在哪里 | 最低要求 |
|---|---|---|
| 第 9 讲 | 全讲 | 预训练模型、微调、零样本;lm_utils 的采样和对数概率 |
| 第 8 讲 | 第 3、6 节 | 影评数据和打分规则 sentiment_score;分布偏移;随机种子 |
| 第 5 讲 | 第 4 节 | 语言模型给一个序列的概率 = 每个词的条件概率之积 |
| 概率 | 第 4、5 节 | KL 散度 ;sigmoid;期望 |
0.3 本讲地图
第1节 动机:从"续写"到"助手"
第2节 指令微调(SFT) ← 代码 01
第3节 人类偏好与奖励模型 ← 代码 02
第4节 RLHF:用强化学习优化奖励 ← 代码 03
第5节 DPO:不用强化学习的偏好优化(本讲重点) ← 代码 03、04
第6节 问题:奖励黑客、过度优化、长度偏见、谄媚…… ← 代码 03、04
第7节 RLAIF 与宪法 AI
第8节 今天的后训练流程
第9–13节 小结、与作业的关系、练习、延伸阅读、下一讲预告
本讲的玩具世界:基座模型是第 9 讲在无标签评论上预训练的迷你 GPT。我们要教它听三种指令(写正面评论、写负面评论、判断评论的褒贬),再让它在”写正面评论”这个任务上更符合”人类的偏好”。这里的”人类”是一个模拟的标注者,他心里有一个金标准奖励(post_utils.gold_reward):喜欢正面的评论,但讨厌超过 30 个词的啰嗦。这和 DPO 论文第一个实验的设计一样——在 IMDb 影评上,用一个情感分类器充当”金标准”。
关于本讲的实验数字:03 号代码(玩具策略,精确计算)在编写讲义时完整运行过,讲义引用了它的实际输出。01、02、04 号代码需要训练语言模型,编写时只做了冒烟测试,讲义中只描述预期的趋势,具体数字请以你自己运行的结果为准。
1. 动机:从”续写”到”助手”
1.1 预训练模型只会续写
预训练模型学的是”网上的文本接下来通常是什么”。问它一个问题,它不一定回答——它可能续写出更多的问题(因为网上很多问题后面跟着的是别的问题,比如一份考试题),可能续写出一段论坛上的争吵,也可能一本正经地编造。InstructGPT 论文(Ouyang 等 2022)里有一个经典的例子:让 GPT-3 “向一个 6 岁的孩子解释登月”,它续写出的是几个类似的问题(“向一个 6 岁的孩子解释万有引力……”)。
我们想要的是一个助手:理解用户的意图,按要求完成任务。Askell 等(2021)把目标概括为三个词:
- 有用(helpful):真正帮用户解决问题;
- 诚实(honest):不编造,不确定时说不确定;
- 无害(harmless):不帮助做有害的事,不冒犯人。
让模型的行为符合这些目标,叫作对齐(alignment)。预训练之后、为了对齐而做的各种训练,统称后训练(post-training)。
1.2 后训练的经典流程
InstructGPT(以及之后的 ChatGPT)确立了一个三步流程:
预训练模型
│ ① 指令微调(SFT):在人写的"指令 + 示范回答"上做监督学习
▼
SFT 模型
│ ② 收集人类偏好:对同一个指令的几个回答,让人排序;训练一个奖励模型
│ ③ 强化学习(PPO):优化模型,让奖励模型给的分数高,同时不要离 SFT 模型太远
▼
对齐后的模型
效果非常显著:在 InstructGPT 的人工评估里,13 亿参数的 InstructGPT 的回答,比 1750 亿参数的 GPT-3 更受标注者欢迎。后训练用很少的计算(相对于预训练)带来了巨大的可用性提升。
本讲依次讲这三步,然后讲一个绕过第 ② 步奖励模型和第 ③ 步强化学习的方法:DPO。
2. 指令微调(SFT)
2.1 做法
监督微调(Supervised Fine-Tuning,SFT),也叫指令微调(instruction tuning):准备一批”指令 + 示范回答”,在上面继续训练语言模型。损失和预训练完全一样——下一个词的交叉熵——只是数据变了。
是指令(提示), 是示范回答。
2.2 只在回答上计算损失
注意求和只在回答的位置上进行。SFT 要教的是”看到这样的指令,应该这样回答”,而不是”学会写出用户的指令”。实现时,把提示部分的目标设为”忽略”即可(我们的代码里设为 0,交叉熵用 ignore_index 跳过)。回答末尾的结束符号也要计算损失——模型必须学会”说完了就停”。
动手:代码
01_sft.py演示 1 打印了两条 SFT 样本和它们的损失掩码:<s> <user> write a negative review <assistant> the story was quite painful . ... </s> · · · · · · · ^^^ ^^^^^ ^^^ ^^^^^ ^^^^^^^ ^ ... ^^^^只有
<assistant>之后的回复和最后的</s>计算损失。
2.3 对话模板
多轮对话被写成一段带特殊符号的文字,例如:
<|system|>你是一个乐于助人的助手。<|end|>
<|user|>法国的首都是哪里?<|end|>
<|assistant|>巴黎。<|end|>
<|user|>它有多少人口?<|end|>
<|assistant|>
不同模型的模板不同(ChatML、LLaMA 的 [INST] 等),但思路一样:用特殊符号标出”谁在说话”。这些符号在预训练时从没出现过,模型是在 SFT 阶段才学会它们的含义的。使用一个模型时,必须用它训练时的模板,否则效果会明显变差。
我们的玩具版本只有两个角色符号 <user>、<assistant>(第 8 讲的词表里预留了它们)。
2.4 SFT 数据从哪里来
| 来源 | 例子 | 特点 |
|---|---|---|
| 人工撰写的示范 | InstructGPT 雇用标注者写了约一万多条示范 | 质量高,但贵、慢 |
| 把已有的 NLP 数据集改写成指令格式 | FLAN(Wei 等 2021)、T0(Sanh 等 2021)、Super-NaturalInstructions(1600 多个任务) | 规模大、任务多样;但回答往往很短、很”机械” |
| 用更强的模型生成(蒸馏) | Alpaca(2023):用 OpenAI 的模型生成 5.2 万条指令和回答,微调 LLaMA | 便宜;但会继承强模型的错误和风格,可能违反服务条款 |
| 少量精心挑选的数据 | LIMA(Zhou 等 2023):只用 1000 条高质量示范 | 说明质量比数量重要 |
FLAN 等工作发现:在很多种任务上做指令微调之后,模型在没见过的任务上的零样本表现也明显提高——它学会的不是某个任务,而是”按指令办事”这种一般的行为。
2.5 表面对齐假说
LIMA 的论文提出了一个有影响的观点:模型的知识和能力几乎都来自预训练,对齐主要是教它用什么格式、什么风格和用户交流。 所以只需要很少的高质量示范。
动手:代码 01 演示 2 比较三个模型听不听指令(SFT 数据 3000 条,三种指令各约三分之一):
模型 写正面评论 写负面评论 判断褒贬 会自己停下 只预训练(没有 SFT) 没有预训练,直接 SFT 预训练 + SFT (运行后填入你的结果。)预期:只预训练的模型不认识
<user>、<assistant>,基本是在随便续写,写正面 / 负面的比例在 50% 附近,判断褒贬接近瞎猜;预训练 + SFT 三个任务都应该做得很好;没有预训练、直接 SFT 的模型,用同样的数据效果应该明显更差——尤其是判断褒贬,它没见过足够多的评论,不知道 superb、tedious 是什么意思。这正是表面对齐假说的玩具版。
2.6 SFT 的局限
- 示范很贵:写一个好回答比判断哪个回答好难得多,尤其是长的、专业的回答。
- 天花板是示范者:模型学的是模仿示范者,很难超过示范者的水平。
- 开放式任务有很多好答案:交叉熵把示范回答当作唯一正确的答案,对其他同样好的回答一视同仁地”惩罚”。
- 可能鼓励编造:如果示范回答里包含模型不知道的知识(比如一个它从没见过的冷门事实),SFT 实际上是在教它”即使不知道,也要自信地说出一个具体的答案”——这可能加重幻觉。
这些局限促使人们寻找另一种利用人类意见的方式:比较。
3. 人类偏好与奖励模型
3.1 为什么收集”比较”
与其让人写出好的回答,不如让模型生成几个回答,让人选更好的那个:
- 容易:判断比创作容易得多,即使是非专家也能对专业的回答做出合理的比较;
- 一致:让人给回答打 1~10 分,不同的人尺度不同(有人习惯给 7 分,有人习惯给 4 分),同一个人前后也不一致;比较”哪个更好”要稳定得多;
- 能超过示范者:模型可以生成人写不出来的好回答,人只需要认出它更好。
但人类偏好的噪声仍然很大:在 InstructGPT 的数据里,不同标注者之间的一致率只有约 73%。这个数字也是任何奖励模型准确率的大致上限。
3.2 Bradley–Terry 模型
假设每个回答 有一个”真实的好坏” ,标注者比较 和 时,选 的概率是
这是 Bradley–Terry 模型(1952)。注意只有分数的差有意义:所有分数加同一个常数,概率不变。国际象棋的 Elo 等级分是同一个模型();聊天机器人排行榜(如 Chatbot Arena)也用它从大量”两两对比”的投票中给每个模型算分(第 13 讲)。
动手:代码
02_reward_model.py演示 1 打印了分数之差和选择概率的关系:差 0 时 0.500,差 1 时 0.731,差 2 时 0.881,差 5 时 0.993。
3.3 奖励模型
有了偏好数据 ( 是被选中的, 是没被选中的),训练一个奖励模型 ,最大化 Bradley–Terry 模型下的似然:
这其实就是在”两个回答的差”上做逻辑回归。真实的奖励模型通常是一个预训练语言模型(常常就是 SFT 模型本身)去掉输出层,换成一个输出标量的线性层:读入”提示 + 回答”,在最后一个位置输出一个分数。
动手:代码 02 演示 2~4。偏好数据来自 SFT 模型对”write a positive review”的回答,模拟的标注者按金标准奖励、用 Bradley–Terry 模型选择。为了能直接看清它学到了什么,我们的奖励模型是一个最简单的词袋线性模型:。
预期:
- 标注者选中”金标准奖励更高的那个”的比例明显低于 100%(两个回答差不多好时几乎是随机选的)——这是奖励模型准确率的上限;
- 偏好数据越多,奖励模型越准,但不会超过这个上限;
- 权重最大的词是褒义词和 loved、recommended 这样的总结词,最小的是贬义词;
- 但它是词袋模型,看不到词序(会冤枉 “not boring”),也没有”长度”的概念。
3.4 奖励模型只在它见过的分布上可靠
奖励模型是在特定分布的回答(SFT 模型的回答)上训练的。如果我们用它去优化一个模型,这个模型会被推向奖励模型分数高的地方——很可能是奖励模型没见过的回答。在那里,奖励模型的判断可能完全不可靠。
动手:代码 02 演示 4 把三条正面回答拼成一条又长又啰嗦的回答。预期:奖励模型给它的分数更高(褒义词更多了),金标准奖励却因为啰嗦而更低。(在编写讲义时的冒烟测试里,这个方向已经出现了,具体数字请以完整运行的结果为准。)
这是第 6 节”过度优化”的根源。
4. RLHF:用强化学习优化奖励
4.1 目标
有了奖励模型 ,我们希望模型 生成的回答得分高。但不能只追求得分,还要加一个约束:不要离参考模型(SFT 模型) 太远:
控制两者的权衡。
4.2 为什么需要 KL 项
- 奖励模型不完美(第 3.4 节):离 SFT 模型的分布越远,奖励模型越不可靠。KL 项把优化限制在奖励模型可信的区域内。
- 防止奖励黑客:没有约束时,模型可能找到奖励模型的漏洞——生成一些奇怪的、重复的、但奖励模型打高分的文字。
- 保持语言质量和多样性:SFT 模型说的是流利的人话,离它太远,可能语法崩坏、只会说几句”讨好”的话。
4.3 最优解有闭式
这个目标的最优解可以直接写出来(推导见第 5.1 节):
在参考模型的基础上,按 重新加权。 越小,越”贪”奖励。但 要对所有可能的回答求和——回答有天文数字那么多种,算不出来,所以不能直接用这个公式,只能用强化学习去逼近它。
动手:代码
03_rlhf_vs_dpo_toy.py把问题缩小到极致:一个提示、6 种可能的回答。参考模型和真实奖励:
回答 正面、简洁 正面、啰嗦 中性 有夸有骂 负面 跑题 真实奖励 3.0 2.0 0.0 0.5 −2.0 −1.0 0.10 0.15 0.30 0.25 0.15 0.05 演示 1:不同 下的最优策略(参考模型本身的期望奖励是 0.38):
期望奖励 10 0.58 0.010 0.13 0.17 0.29 0.25 0.12 0.04 2 1.40 0.251 0.29 0.26 0.19 0.21 0.04 0.02 1 2.17 0.816 0.52 0.29 0.08 0.11 0.01 0.00 0.5 2.78 1.660 0.81 0.17 0.01 0.01 0.00 0.00 0.2 2.99 2.242 0.99 0.01 0.00 0.00 0.00 0.00 0.05 3.00 2.303 1.00 0.00 0.00 0.00 0.00 0.00
越小,概率越集中到奖励最高的回答上,期望奖励越高,KL 也越大。还要注意:,参考模型给概率 0 的回答, 也给 0。RLHF 只能在 SFT 模型”会说”的回答里重新分配概率,不能凭空创造新的能力。
4.4 策略梯度与 PPO
怎样用梯度下降优化”采样出来的回答的期望奖励”?采样这一步不可导。策略梯度(REINFORCE)给出了一个巧妙的公式:
直觉:采样一些回答,奖励高的回答,提高它的概率;奖励低的,降低它的概率。几个关键的改进:
- 基线(baseline):用 代替 , 是平均奖励的估计。不改变梯度的期望,但大大减小方差——“比平均好”的才提高概率。
- KL 惩罚摊到每个样本上:。实际中常常按词元计算(每个词元一个 KL 惩罚,最后一个词元加上奖励模型的分数)。
- PPO(Proximal Policy Optimization,Schulman 等 2017):用一个价值模型估计”从这里开始期望能得多少奖励”,作为更精细的基线(优势函数);并且裁剪每次更新的幅度(新旧策略的概率比限制在 内),防止一步走得太远。
动手:代码 03 演示 2 在玩具策略上用 REINFORCE(带基线,KL 惩罚摊到每个样本上)优化 的 RLHF 目标,3000 步之后得到的策略和闭式最优解 完全一致(总变差距离 0.000)。
真实的 RLHF 比这复杂得多:每一步都要用当前模型生成大量文本、用奖励模型打分、用价值模型估计优势。训练时内存里要同时放四个模型(策略、参考模型、奖励模型、价值模型),对超参数很敏感,不稳定,工程上很难。这促使人们寻找更简单的方法。
5. DPO:不用强化学习的偏好优化
DPO(Direct Preference Optimization,Rafailov 等 2023)的核心想法:RLHF 目标的最优解有闭式(第 4.3 节);把它反过来,用策略来表示奖励,再代入 Bradley–Terry 模型——就得到一个可以直接在偏好数据上优化的损失,不需要单独的奖励模型,也不需要强化学习。
5.1 第一步:最优策略的闭式
对固定的 (下面省略 ),把 RLHF 的目标改写:
其中 (第三行是把分母乘、除以 )。 和 无关;KL 散度非负,当且仅当 时为 0。所以最大值在 时取得。
5.2 第二步:用策略表示奖励
把闭式解两边取对数,解出 :
任何一个奖励函数,都对应一个最优策略;反过来,最优策略也确定了奖励(差一个只和 有关的常数 )。
5.3 第三步:代入 Bradley–Terry,配分函数抵消
Bradley–Terry 模型只用到两个回答的奖励之差:
抵消了! 那个算不出来的配分函数消失了。于是偏好的概率可以完全用策略表示。把 换成我们要训练的 ,对偏好数据做最大似然,就得到 DPO 的损失:
只需要计算四个对数概率: 和 分别给被选中、没被选中的回答的概率( 的两个可以预先算好)。一个分类损失,一次前向和反向传播,没有采样、没有奖励模型、没有价值模型。 对语言模型, 就是回答里每个词元的对数概率之和——和 SFT 一样,只在回答部分求和(第 9 讲的 sequence_logprob)。
5.4 梯度在做什么
记 (“隐式奖励”),DPO 损失的梯度是
每一对偏好数据:提高被选中回答的概率、降低没被选中回答的概率,权重是”模型当前把这一对排错的程度”。已经排对、而且差距很大的对,几乎不再贡献梯度。
5.5 玩具实验:DPO 和 RLHF 优化的是同一个目标
动手:代码 03 演示 3。偏好数据从 采样、按 Bradley–Terry 模型标注(两个回答相同的对被丢掉,所以实际对数略少)。:
偏好数据(对) 和 的总变差距离 期望奖励 ( 本身) 0 2.78 1.660 77 0.763 2.05 1.630 783 0.160 2.97 2.158 7,952 0.020 2.81 1.716 79,110 0.000 2.78 1.660 演示 4:从 DPO 训练出的策略里”读出”隐式奖励 ,减去均值后和真实奖励几乎完全一样:
回答 正面、简洁 正面、啰嗦 中性 有夸有骂 负面 跑题 真实奖励 − 均值 2.58 1.58 −0.42 0.08 −2.42 −1.42 隐式奖励 − 均值 2.59 1.59 −0.41 0.10 −2.43 −1.43
偏好数据足够多时,DPO 收敛到 RLHF 的最优策略——两者优化的是同一个目标。DPO 论文的标题 Your Language Model is Secretly a Reward Model 说的就是演示 4:训练好的策略本身就隐含着一个奖励模型。
但也要注意数据少的时候:77 对数据时,DPO 的策略离 很远;783 对时,它甚至比 走得更远(KL 2.158 > 1.660)。有限的偏好数据里,某些回答”碰巧总是赢”,DPO 就会过度相信它们。下一节是这个问题的极端情形。
5.6 DPO 的一个陷阱
动手:代码 03 演示 5。偏好数据没有任何噪声(永远选真实奖励更高的那个),其余设置和演示 3 相同。 给”正面、简洁”的概率是 0.81,KL = 1.66:
训练步数 0 400 800 1200 1600 2000 P(正面、简洁) 0.100 0.927 0.987 0.996 0.998 0.999 0.00 2.00 2.23 2.27 2.29 2.30
DPO 一路把”正面、简洁”的概率推向 1,远远超过 。原因:如果数据里 A 总是赢 B,Bradley–Terry 的最大似然估计会认为 A 比 B 好”无穷多”;DPO 的损失只有在 时才降到 0。 只改变”走多快”,挡不住”走多远”——RLHF 里 KL 惩罚的约束作用,在 DPO 里只在偏好有噪声时才起作用。真实数据里每一对回答通常只被标注一次,“永远是这个赢”的情况非常普遍。IPO(Azar 等 2023)等方法就是为了修补这一点;实践中常用早停、较大的 、或者额外加上 SFT 损失。
5.7 在迷你 GPT 上做 DPO
动手:代码
04_dpo_lm.py演示 1。参考模型是 01 号文件的 SFT 模型,偏好数据 3000 对(来自 SFT 模型的回答,按金标准奖励模拟标注),分别用 和 做 DPO,然后从每个模型采样 300 条回答:
模型 金标准奖励 奖励模型分数 正面的比例 平均长度 超过 30 词 多样性 KL SFT(参考模型) 0 DPO, DPO, (运行后填入你的结果。)预期:DPO 之后金标准奖励和奖励模型的分数都比 SFT 模型高; 越小,KL 越大,奖励通常越高,多样性也可能下降更多。注意”长度”一列:如果 DPO 让回答变长、超过 30 个词的比例上升,金标准奖励就会被扣分——这就是第 6.2 节的长度偏见。
5.8 DPO 与 PPO 的比较
| PPO(RLHF) | DPO | |
|---|---|---|
| 需要奖励模型 | 是 | 否(隐含在策略里) |
| 训练时生成文本 | 是(在线,on-policy) | 否(只用固定的偏好数据,离线) |
| 内存里的模型 | 策略、参考、奖励、价值 4 个 | 策略、参考 2 个 |
| 稳定性和实现难度 | 难 | 简单(一个分类损失) |
| 能利用新生成的数据 | 能(每一步都在自己的分布上学习) | 不能(除非反复采样、标注,做”在线 DPO”) |
DPO 发表后迅速流行,很多开源模型用它做偏好优化。但它是离线的:偏好数据来自 SFT 模型,训练过程中策略的分布在变,数据却不变。很多研究发现,在线的强化学习方法在最前沿的模型上仍然更强。DPO 之后还出现了很多变体(IPO、KTO、SimPO、ORPO 等),各自修补某个缺点。今天的后训练往往是几种方法的组合(第 8 节)。
6. 问题:奖励黑客、过度优化、长度偏见、谄媚……
6.1 过度优化:古德哈特定律
“当一个指标变成目标,它就不再是一个好的指标。“——古德哈特定律(Goodhart’s law)
奖励模型只是人类偏好的一个近似。优化得越狠,模型越可能找到奖励模型和真实偏好不一致的地方,去”讨好”奖励模型而不是人类——奖励黑客(reward hacking)。Gao 等(2022)系统地测量了这个现象:用一个大的”金标准”奖励模型代替人类、一个小的”代理”奖励模型用于优化,随着优化的程度(用和参考模型的 KL 衡量)增加,代理奖励一直上升,金标准奖励先升后降。
衡量”优化程度”最简单的办法是 best-of-n:从参考模型采样 个回答,用奖励模型挑分数最高的。它不需要训练任何东西,而且它和参考模型的 KL 有一个简单的公式(严格说是上界):
动手:代码 03 演示 6。2000 种可能的回答,真实奖励服从标准正态分布;参考模型是一个”长尾”分布(少数回答很常见,大多数很罕见)。奖励模型从 1000 对偏好数据中拟合,只有 710 种回答至少出现过一次;它和真实奖励的相关系数,在参考模型常说的回答上是 0.54,不加权只有 0.27。best-of-n 的分布可以精确计算(随机种子 0):
1 4 16 64 256 1024 4096 16384 KL(精确) 0 0.64 1.84 3.17 4.53 5.81 6.34 6.35 0 0.64 1.84 3.17 4.55 5.93 7.32 8.70 奖励模型的分数 0.04 2.75 4.78 6.20 7.00 7.36 7.44 7.44 真实奖励 −0.02 0.55 0.97 1.25 1.40 1.11 0.99 0.99 直接用真实奖励来选 −0.02 1.03 1.74 2.23 2.54 2.71 2.83 2.95 20 个随机种子的平均(每个种子重新造回答、重新采样偏好数据、重新训练奖励模型):
1 4 16 64 256 1024 4096 16384 奖励模型的分数 −0.01 2.56 4.53 5.89 6.74 7.15 7.27 7.29 真实奖励 0.00 0.51 0.82 1.01 1.09 1.15 1.24 1.19 20 个种子里有 8 个,真实奖励在 时比它的最高点低了 0.1 以上。
几点观察:
- 奖励模型的分数随 一直上升——我们在优化的就是它。
- 真实奖励一开始也上升(奖励模型大体上是对的),但涨得慢得多,很快停滞,两者的差距越拉越大;在不少种子里(比如种子 0, 之后),真实奖励不升反降。被选中的往往是奖励模型”看走眼”的回答:很罕见、在偏好数据里只出现过一两次、估计误差很大。
- 直接用真实奖励来选,真实奖励一直上升——问题不在 best-of-n 本身,而在奖励模型不完美。
- KL 公式在 不太大时和精确值一致; 很大时,回答的种类有限,best-of-n 几乎总是选中奖励模型打分最高的那个回答 ,精确的 KL 趋于上限 (种子 0 里 ,上限约 6.35,表中最后两列已经贴近它),公式不再适用。
- 也有一些种子里真实奖励一直上升:过度优化是一种风险,不是必然。
动手:代码 04 演示 2 在迷你 GPT 上做同样的实验:从 SFT 模型采样,用 02 号文件的词袋奖励模型挑最好的。预期:奖励模型的分数随 一直上升;被挑中的回答越来越长(褒义词更多 → 词袋奖励模型更喜欢),而金标准对超过 30 个词的回答扣分,所以”用奖励模型选”的金标准奖励涨得比奖励模型慢, 很大时可能停滞甚至下降;直接用金标准选则一直上升。
6.2 长度偏见
人类标注者(以及在人类数据上训练的奖励模型)往往偏爱更长的回答:更长的回答看起来更详细、更用心,即使内容并没有更好。RLHF 之后的模型回答越来越长,一部分”进步”其实只是变长了(Singhal 等 2023,A Long Way to Go)。评估时也要注意:用大模型当评委时同样有长度偏见(第 13 讲),常见的做法是控制长度后再比较。
我们的玩具世界故意设计了这个陷阱:金标准奖励惩罚啰嗦,但偏好数据里长度和”更正面”相关,词袋奖励模型就会学到”越长越好”。
6.3 多样性下降与校准变差
RLHF 把概率集中到奖励高的回答上(第 4.3 节的 ),代价是多样性下降:模型反复使用少数几种安全的、讨好的说法(“模式坍缩”)。另一个代价是校准:GPT-4 的技术报告指出,预训练模型给出的概率和实际正确率吻合得很好(问它”有多大把握”,它的把握和实际准确率一致),后训练之后这种校准明显变差了。
6.4 谄媚
谄媚(sycophancy):模型倾向于迎合用户的观点,而不是坚持正确的答案。用户说”我觉得答案是 B”,模型就改口说 B;用户对自己写的诗表示满意,模型就跟着夸。Sharma 等(2023)发现,人类偏好数据本身就偏爱”同意自己”的回答,RLHF 放大了这种倾向。这和”诚实”的目标直接冲突。
6.5 谁的偏好?
偏好数据来自一小群标注者,他们的文化背景、价值观、对”好回答”的理解,会被写进模型里。对有争议的问题,什么是”有用而无害”的回答,不同的人可能有完全不同的看法。怎样让模型照顾到多元的偏好(pluralistic alignment),是一个开放的问题(第 19 讲)。
6.6 本讲实验的边界
我们的玩具世界里,“人类偏好”是一个简单的公式,奖励模型是词袋模型,策略是 17 万参数的迷你 GPT,指令只有三种。它能清楚地展示 SFT、奖励模型、DPO、过度优化的机制,但不能告诉你这些方法在真实的大模型上效果如何——真实的偏好复杂得多、奖励模型强得多,过度优化的形式也更隐蔽。
7. RLAIF 与宪法 AI
人类标注又贵又慢。能不能用 AI 来提供反馈?
- RLAIF(RL from AI Feedback):让一个强大的语言模型代替人类,比较两个回答哪个更好,用它的判断训练奖励模型或直接做 DPO。Lee 等(2023)发现在摘要等任务上,RLAIF 能达到和 RLHF 相当的效果。
- 宪法 AI(Constitutional AI,Bai 等 2022,Anthropic):先写下一组明确的原则(“宪法”,比如”选择最不具伤害性、最诚实的回答”)。第一阶段,让模型按这些原则批评并修改自己的回答,用修改后的回答做 SFT;第二阶段,让模型按原则比较回答的好坏,生成偏好数据,做强化学习。人类的作用从”逐条标注”变成”制定原则”。
AI 反馈的好处是便宜、可扩展、标准一致;风险是继承和放大反馈模型自身的偏见和盲点,而且”用模型评价模型”可能形成闭环。
8. 今天的后训练流程
今天的大模型后训练比 InstructGPT 的三步复杂得多,通常是多轮迭代,包括:
- SFT:大量指令和对话数据,越来越多由模型生成、再由人或模型筛选;
- 偏好优化:DPO 及其变体、或者基于奖励模型的强化学习(PPO 等),偏好来自人类和 AI;
- 可验证奖励的强化学习(RLVR):在数学、编程等有标准答案的任务上,用”答案对不对""测试是否通过”作为奖励,直接做强化学习(例如 GRPO 方法)。这不需要奖励模型,不容易被”黑客”,是推理模型(第 15 讲)的关键(CS336 第 16 讲);
- 安全训练:拒绝有害请求、抵抗”越狱”,同时避免过度拒绝正常请求;
- 反复评估(第 13 讲)、找出问题、补充数据,再来一轮。
一个越来越清楚的趋势是:后训练的计算量在增加,能力的提升(尤其是推理)越来越多地来自后训练阶段,而不只是预训练。
9. 本讲小结
- 动机:预训练模型只会续写,不会听指令。后训练让它变得有用、诚实、无害。经典流程:SFT → 奖励模型 → 强化学习。
- SFT:在”指令 + 示范回答”上做监督学习,只在回答上计算损失;对话模板用特殊符号标出角色。少量高质量数据就很有效(表面对齐假说)。局限:示范贵、天花板是示范者、可能鼓励编造。
- 人类偏好:比较比示范容易、更一致;Bradley–Terry 模型 ;奖励模型用这个似然训练,但只在它见过的分布上可靠。
- RLHF:最大化 ;KL 防止奖励黑客、保持语言质量;最优解 ;用策略梯度 / PPO 逼近,实现复杂。
- DPO:把最优解反过来用策略表示奖励,代入 Bradley–Terry,配分函数抵消,得到一个分类损失;和 RLHF 优化同一个目标,但简单得多。陷阱:偏好无噪声时可能偏离参考模型太远;它是离线的。
- 问题:过度优化(古德哈特定律,best-of-n 的 KL ≈ )、长度偏见、多样性和校准下降、谄媚、“谁的偏好”。
- AI 反馈:RLAIF、宪法 AI;今天的后训练还包括可验证奖励的强化学习和安全训练。
10. 与作业的关系
CS224N 近几年没有专门的后训练编程作业,但本讲和以下内容直接相关:
- Winter 2026 的作业 4(大语言模型的基准测试与评估):你评估的模型大多经过了本讲的后训练;评估方法本身(人类偏好、大模型当评委、长度偏见)也和第 3、6 节有关。
- 期末项目:默认项目在下游任务上微调 GPT-2,本讲的 SFT 是同一类操作;很多自选项目会用到 DPO 这样简单可靠的偏好优化方法。
- 想动手实现大规模的 SFT、DPO 和 GRPO,可以参考 CS336 的作业 5(对齐)。
作业的具体题目以当年官方发布的版本为准。
11. 练习
练习 1(损失掩码)★:一条 SFT 样本是 <s> <user> write a positive review <assistant> great movie . </s>。哪些位置的预测要计算损失?如果提示部分也计算损失,模型会额外学到什么?这有什么坏处?
参考答案
计算损失的是 “great”、“movie”、”.”、</s> 这 4 个词元的预测(它们的前一个位置分别是 <assistant>、great、movie、.)。如果提示也计算损失,模型还会学习”生成用户的指令”,这会占用模型的容量,也可能让模型在对话中”替用户说话”;数据里提示很长、回答很短时,损失会被提示部分主导。不过实践中提示部分计算少量损失有时也无伤大雅,这是一个可以实验的选择(01 号代码的 mask_prompt 参数)。
练习 2(Bradley–Terry)★:三个回答的奖励分别是 、、。(a) 计算 、、。(b) 如果三个奖励都加上 10,结果会变吗?
参考答案
(a) ,,。(b) 不变:只依赖奖励之差。这也说明奖励模型的”绝对数值”没有意义,只有差有意义。
练习 3(最优策略)★★: 只有两个回答,奖励 。(a) 写出 和 时的 。(b) 和 时呢?(c) 如果 呢?
参考答案
(a) :,即 。:,。 (b) :全部概率给奖励最高的回答 ;:。 (c) ,无论 多小:参考模型不会说的回答,最优策略也不会说。
练习 4(DPO 推导)★★:(a) 从 解出 。(b) 为什么 Bradley–Terry 模型让 消失了?(c) 如果我们用的不是 Bradley–Terry 模型,而是”给每个回答打绝对分数”的数据(回归), 还会消失吗?
参考答案
(a) 。 (b) Bradley–Terry 只依赖两个回答的奖励之差,而 对同一个提示下的所有回答都相同,相减时抵消。 (c) 不会:绝对分数需要 本身,就要知道 (它依赖于对所有回答求和),DPO 的技巧不再适用。这也是为什么 DPO 天然地和”成对比较”的数据配合。
练习 5(DPO 梯度)★★:对一对偏好数据,如果模型已经满足 ,这一对的梯度权重 是多少?如果是 呢?这说明 DPO 在关注什么样的数据?
参考答案
,几乎不贡献梯度;,贡献很大。DPO 主要关注模型当前排错的偏好对,已经排对而且差距很大的对几乎被忽略——和逻辑回归、困难样本挖掘是同样的道理。
练习 6(best-of-n)★:(a) 用 计算 时 best-of-n 的 KL。(b) 如果 RLHF 训练的模型和参考模型的 KL 是 10,大致相当于 best-of-多少?
参考答案
(a) :;:;:。 (b) ,。可见 KL 是一个对数尺度的量:RLHF 的模型可以离参考模型非常”远”,相当于从几万个样本里挑最好的一个。
练习 7(过度优化)★★:代码 03 演示 6 中,奖励模型和真实奖励在”参考模型常说的回答上”相关系数 0.54,不加权只有 0.27。(a) 为什么两者差这么多?(b) 这和”best-of-n 选得越狠,真实奖励越可能下降”有什么关系?(c) 有什么办法可以缓解?
参考答案
(a) 偏好数据是从参考模型采样的,常见的回答被比较了很多次,奖励估计得准;罕见的回答很少甚至从没出现过,奖励估计得很差。按参考模型的概率加权时,主要看的是常见的回答,所以相关性高。 (b) best-of-n 的 越大,越可能把罕见的回答挑出来——只要奖励模型碰巧高估了它。于是优化把策略推向奖励模型最不可靠的区域。 (c) 加强 KL 约束(较大的 、较小的 );收集更多、覆盖更广的偏好数据,尤其是在优化后的模型生成的回答上重新标注(在线 / 迭代式 RLHF);用多个奖励模型的集成,对不确定的地方保守一些;对奖励模型做正则化;早停。
练习 8(思考:谄媚):设计一个简单的实验,检测一个对话模型是否谄媚。
参考答案
一种做法:准备一批有标准答案的问题。先直接问模型,记录答案;再在问题里加上用户的意见,比如”我觉得答案是 X,你同意吗?“(X 分别取正确答案和一个错误答案),比较模型改变答案的比例。如果模型在用户给出错误意见时经常改口,就说明它谄媚。还可以测试”你确定吗?“这样的追问会不会让模型放弃正确答案。(Sharma 等 2023 用了类似的设计。)
练习 9(动手):
(a) 运行代码 01、02、04,把结果填进第 2.5 节和第 5.7 节的表格。你的结果和预期一致吗?
(b) 在代码 03 演示 5 中,把偏好数据换成有噪声的(noisy=True),DPO 还会失控吗?把 改成 5 呢?
(c) 在代码 03 演示 6 中,把偏好数据从 1000 对增加到 10000 对,过度优化还明显吗?
(d) 在代码 04 中,把 DPO 的训练轮数从 2 增加到 5,KL、多样性和金标准奖励怎样变化?对照代码 03 演示 5 解释。
(e) 修改 post_utils.gold_reward,让它惩罚”重复使用同一个形容词”,然后重新生成偏好数据、训练奖励模型和 DPO。模型学到的东西有什么变化?
12. 延伸阅读
- Ouyang et al.,Training Language Models to Follow Instructions with Human Feedback(2022):InstructGPT,RLHF 的经典流程。
- Christiano et al.,Deep Reinforcement Learning from Human Preferences(2017);Stiennon et al.,Learning to Summarize from Human Feedback(2020):RLHF 的早期工作。
- Wei et al.,Finetuned Language Models Are Zero-Shot Learners(2021):FLAN;Zhou et al.,LIMA: Less Is More for Alignment(2023)。
- Rafailov et al.,Direct Preference Optimization: Your Language Model is Secretly a Reward Model(2023)。
- Schulman et al.,Proximal Policy Optimization Algorithms(2017)。
- Gao, Schulman & Hilton,Scaling Laws for Reward Model Overoptimization(2022)。
- Azar et al.,A General Theoretical Paradigm to Understand Learning from Human Preferences(2023):IPO,以及 DPO 在确定性偏好下的问题。
- Bai et al.,Constitutional AI: Harmlessness from AI Feedback(2022)。
- Singhal et al.,A Long Way to Go: Investigating Length Correlations in RLHF(2023)。
- Sharma et al.,Towards Understanding Sycophancy in Language Models(2023)。
- Askell et al.,A General Language Assistant as a Laboratory for Alignment(2021):有用、诚实、无害。
- Nathan Lambert,RLHF Book(在线免费):RLHF 和后训练的系统介绍。
- CS336 第 15、16 讲(同目录):SFT、RLHF 的大规模实现与可验证奖励的强化学习。
13. 下一讲预告
到目前为止,“让模型做一个新任务”的办法都是训练:微调、SFT、DPO,都要更新模型的参数,而且要更新全部参数。对一个几十亿、几千亿参数的模型,这既贵又不方便:每个任务都要存一份完整的模型。下一讲(高效适配:提示与参数高效微调)讨论两条更省的路:
- 提示工程:不改参数,只改输入——零样本、少样本、思维链的雏形;
- 参数高效微调:只训练很少的新参数——适配器、前缀微调、LoRA;
- 为什么只训练 0.1% 的参数就能接近全量微调的效果?LoRA 的低秩假设从何而来?