对应 Maps to:Stanford CS525 Winter 2026 Training Data for AI,2/2 客座讲座 Data for LMs: post-training(Etash Guha,61 页 slides,Posttraining: From Chatbots to Reasoning to Agents)的前半部分(“聊天机器人时代”);2/4 学生报告里的 Tulu 3(Simran Nayak)。阅读:FLAN、InstructGPT、Constitutional AI、Self-Instruct、Alpaca、UltraFeedback、Tulu 3。 依据说明:Guha 的 slides 分三个时代:聊天机器人(FLAN、InstructGPT、RLHF、Constitutional AI、DPO、合成数据)、推理(o1、DeepSeek-R1、开放复现)、智能体(SWE-Bench、OpenThoughts-Agent)。本讲覆盖第一个时代,后两个在第 9 讲。Tulu 3 依据学生报告的 slides(29 页)和论文摘要。各论文的关键数字核对过摘要;Self-Instruct 的 175 条种子任务和 ROUGE-L 阈值、DPO 的推导、LIMA 和 Gudibande et al. 是我根据论文正文补充的。第 8 节”统一的视角”和第 9 节”延伸与前沿”是我补充的。 配套代码 Code:
code/lecture08/(numpy;3 个脚本 + 1 个模块;每个几秒钟) 预计阅读时间:2.5 小时(含运行代码)
0. 本讲导航 · How to read this lecture
0.1 学习目标 Learning goals
- 说明预训练模型和助手的区别,以及后训练数据的三种形式:示范(SFT)、比较(偏好)、奖励(强化学习)。
- 解释 FLAN 的发现:把很多任务写成指令来微调,模型能在没见过的任务上零样本完成——任务的多样性是关键。
- 讲清楚 InstructGPT 的三阶段数据和 RLHF 的目标(含 KL 惩罚),以及”1.3B 的 InstructGPT 胜过 175B 的 GPT-3”说明了什么。
- 理解用模型生成指令数据(Self-Instruct、Alpaca)的做法和局限(模式坍缩、模仿更弱的老师)。
- 理解 AI 反馈(UltraFeedback、Constitutional AI)的好处和代价,奖励模型为什么会被”钻空子”,以及 DPO 怎样绕开奖励模型。
- 了解一个完全开放的后训练配方(Tulu 3)在数据上做了哪些选择、发现了什么。
0.2 先修与本讲范围 Prerequisites & scope
| 默认你已经会 Assumed | 本讲不展开 Not covered |
|---|---|
| 第 6–7 讲:预训练数据、语言模型是”预测下一个 token” | 推理轨迹、可验证奖励的强化学习、智能体数据(第 9 讲) |
| 逻辑回归、交叉熵 | PPO 的细节;强化学习的一般理论 |
| 评测数据的污染(第 14 讲);安全与隐私(第 18 讲) |
0.3 本讲地图 Map
§1 从"续写"到"助手":后训练数据是什么
§2 FLAN:把任务写成指令 ← 代码 01 演示 1
§3 InstructGPT 与 RLHF:示范、比较、强化学习 ← 代码 01 演示 2;代码 03 演示 1–2
§4 让模型自己生成指令:Self-Instruct、Alpaca;少而精 vs 多而杂 ← 代码 02 演示 1–2;代码 01 演示 3
§5 AI 反馈:UltraFeedback、DPO、Constitutional AI ← 代码 03
§6 完全开放的配方:Tulu 3 ← 代码 02 演示 3
§7 怎样评测聊天模型
§8 一个统一的视角
§9 延伸与前沿
§10–14 小结、常见误区、练习、延伸阅读、下一讲预告
0.4 关于数字
论文的数字来自 slides 和论文摘要。代码的数字来自两个合成世界:
- 指令世界(
instruct_world.py):12 个任务簇 × 4 种任务;每条指令是一个向量 = 所有指令共有的”这是一条指令”方向 + 任务簇的方向 + 任务的特点 + 措辞噪声。学生模型 = “去不去回答”(一个逻辑回归)ד做得对不对”(每种任务一个能力值,来自预训练,大模型高)。一个重要的设定:指令微调主要改变”去不去回答”,对能力只做小幅修改(往示范的正确率挪一小步)——这是把”表面对齐假说”直接写进了模型,代码 01 演示 3 和代码 02 演示 2 的结论依赖它。 - 回答世界(代码 03 里):每个回答有对不对、有没有帮助、凑字数的程度、长度;人和 AI 评委比较两个回答;奖励模型只能看到嘈杂的”表面迹象”。
代码固定了随机种子,同一台机器上重复运行输出逐字相同。
1. 从”续写”到”助手”
1.1 预训练模型不听指令
预训练的目标是预测下一个 token,模型学会了语法、事实、推理的模式——但它的本能是续写,不是回答。给 GPT-3 一句”把这句话翻译成法语:……”,它可能接着写更多的翻译题,或者写一段关于翻译的文章。
有两种办法让它完成任务:
- 少样本(few-shot):在提示里先给几个例子(“cat → chat,dog → chien,hello → ?”),模型通过上下文学习照着做。有效,但费 token,而且很依赖例子的选择。
- 零样本(zero-shot):只给指令。这需要模型从指令本身理解要做什么——预训练模型做得很差,指令微调过的模型擅长这个。
1.2 后训练数据的三种形式
| 形式 | 数据长什么样 | 教会模型什么 | 代表工作 |
|---|---|---|---|
| 示范(SFT) | (提示, 理想的回答) | 回答的格式、风格、“去回答”的意愿 | FLAN、InstructGPT 的 SFT、Alpaca |
| 比较(偏好) | (提示, 好的回答, 差的回答) | 什么样的回答更好 | InstructGPT 的 RM、UltraFeedback、DPO |
| 奖励(强化学习) | 提示 + 一个打分的函数(奖励模型或验证器) | 在打分上越来越高 | RLHF(PPO)、RLAIF、RLVR(第 9 讲) |
和预训练数据相比,后训练数据量小得多(几万到几百万条,而不是几万亿 token),每一条都更贵(人写的示范、人做的比较),也更”有意图”——它直接编码了”我们想要什么样的助手”。
1.3 三个时代(Guha 的框架)
- 2021–22,聊天机器人:FLAN、InstructGPT、RLHF——本讲;
- 2023–24,推理:o1、DeepSeek-R1、思维链——第 9 讲;
- 2025 起,智能体:SWE-Bench、OpenHands——第 9 讲。
2. FLAN:把任务写成指令
2.1 做法
FLAN(Wei et al. 2021,Finetuned Language Models Are Zero-Shot Learners)的想法很简单:NLP 领域有大量现成的有标注数据集(翻译、问答、摘要、情感分析、自然语言推理……),把每个数据集的样本用自然语言指令的模板改写(“这段影评是正面还是负面的?”),然后在这些”指令化”的数据上微调一个预训练模型。Guha 的 slides:62 个 NLP 数据集、12 个任务簇;论文摘要:60 多个用指令模板改写的 NLP 任务,137B 参数的模型。
评测的关键:为了检验”零样本泛化”,每次评测一个任务簇时,训练里去掉整个簇——模型从没见过这一类任务。
2.2 结果和消融
FLAN 在 25 个评测任务里的 20 个上零样本胜过 175B 的 GPT-3 的零样本(Guha 的 slides 说在很多任务上甚至胜过 GPT-3 的少样本)。摘要列出了三个关键因素:
- 微调用的数据集(任务簇)的数量:越多,留出的任务上越好;
- 模型规模:在他们的实验里,指令微调对足够大的模型才有帮助,小模型在留出的任务上反而可能变差;
- 自然语言指令:只用任务的输入、不写指令来微调,效果明显更差。
2.3 在指令世界里
代码 01 演示 1:示范总数固定为 2000 条,训练用的任务簇数从 1 增加到 9,在 3 个从没见过的任务簇上评测(5 组随机选簇的平均):
| 训练数据 | 去回答 | 小模型·答对 | 大模型·答对 |
|---|---|---|---|
| 基础模型(不微调) | 0.182 | 0.076 | 0.139 |
| 1 个任务簇 | 0.194 | 0.081 | 0.146 |
| 2 个任务簇 | 0.342 | 0.140 | 0.257 |
| 4 个任务簇 | 0.457 | 0.187 | 0.345 |
| 9 个任务簇 | 0.537 | 0.218 | 0.403 |
| 9 个任务簇,不写成指令 | 0.269 | 0.107 | 0.201 |
机制:只看过少数几类任务,模型学到的”这是一条指令”混杂着这几类任务各自的特点;任务越多样,它越能抓住所有指令共有的东西,举一反三到没见过的任务上。不写成指令(去掉所有指令共有的方向),模型学会了做这 9 类任务,却没学会”听指令”这件事本身。
能力和意愿是两回事:两种尺寸”去回答”的比例相同(这个世界里它只取决于指令数据),大模型答对得多——指令微调主要改变的是意愿和格式,能力来自预训练。(FLAN 关于”小模型反而变差”的发现,这个世界没有模拟。)
3. InstructGPT 与 RLHF
3.1 三阶段的数据
InstructGPT(Ouyang et al. 2022)是 ChatGPT 的前身。它的数据分三步:
- 示范:标注员写的提示和 OpenAI API 上用户提交的提示;标注员为它们写理想的回答。用这些(约 1.3 万条,Guha 的 slides)对 GPT-3 做监督微调(SFT)。
- 比较:对同一个提示,模型生成几个回答,标注员给它们排序;用这些比较(约 3.3 万对)训练一个奖励模型(RM)——输入一个回答,输出一个分数。
- 强化学习:用 PPO 优化模型,让它的回答在奖励模型上得分更高。
约 40 位标注员。数量不大,但每一条都很贵——这是 Self-Instruct、UltraFeedback 想解决的问题。
3.2 SFT 和 RL 的细节(Guha 的 slides)
SFT:把 (提示, 回答) 拼成一个序列(例如 [INST] 提示 [/INST] 回答),用交叉熵训练,只在回答的 token 上算损失(提示部分不算),通常 1–3 个 epoch、学习率 1e-5 到 5e-5。
RL 的循环:从数据集抽一个提示 → 当前的模型(“策略”)生成回答 → 奖励模型打分 → 更新策略,让高分回答的概率变大。PPO 的目标:
KL 惩罚让模型不要离原来的模型太远:保持连贯、避免模式坍缩、减少对奖励模型的”钻空子”。 越大越保守。
3.3 结果
在人工评测里,1.3B 参数的 InstructGPT 的回答比 175B 的 GPT-3 更受欢迎——参数少了 100 倍。InstructGPT 更真实、更少有毒,在公开的 NLP 数据集上几乎没有退步;但它”仍然会犯简单的错误”。2022 年 11 月,同样的技术用在 GPT-3.5 上,支持多轮对话——ChatGPT 两个月有了 1 亿用户。RLHF 被证明能在生产中规模化,聊天成了大模型的主要界面。
代码 01 演示 2:
| 模型 | 平均效用 | 胜过大模型(基础) |
|---|---|---|
| 小模型(基础) | 0.121 | 0.477 |
| 大模型(基础) | 0.159 | 0.500 |
| 小模型 + 指令微调 | 0.615 | 0.736 |
| 大模型 + 指令微调 | 0.781 | 0.806 |
(效用:没去回答 0,回答了但错 0.3,回答且对 1。)大模型”会”得多,但大多数时候在续写;对齐解锁了能力,但不创造能力。
3.4 奖励模型:从比较里学分数
奖励模型的标准形式是 Bradley–Terry 模型:
用比较数据做逻辑回归。代码 03 演示 1:单条人工比较和”真正更好的那个”一致的比例是 85%(InstructGPT 报告的标注员之间的一致率约 73%);用 1000 到 25.6 万对比较训练线性奖励模型,准确率在 1000 对时就基本到顶了(约 0.737–0.740)——它的上限由它能看到什么决定:它看得到”看起来对不对”这样的表面迹象,看不到真正的对错。更多的比较消除的是标签的噪声,消除不了”看不见”。
3.5 奖励模型会被”钻空子”
奖励模型只是”人的偏好”的一个代理。优化压力越大,代理和真正目标之间的缝隙被利用得越彻底(Goodhart 定律)。
代码 03 演示 2:从 个回答里挑奖励模型分数最高的(best-of-n,一种最简单的”优化”):
| 人标 RM·效用 | 人标 RM·长度 | AI 标 RM·效用 | AI 标 RM·长度 | 完美 RM·效用 | |
|---|---|---|---|---|---|
| 1 | 0.898 | 472 | 0.898 | 472 | 0.898 |
| 4 | 1.499 | 385 | 1.073 | 609 | 1.783 |
| 16 | 1.752 | 344 | 1.173 | 729 | 2.150 |
| 64 | 1.867 | 316 | 1.141 | 821 | 2.335 |
| 256 | 1.939 | 294 | 1.149 | 872 | 2.416 |
用”偏爱长回答”的 AI 评委的标签训练的奖励模型,在 之后不再变好、略有下降,挑出的回答越来越长——它在奖励”长”,而最长的回答往往是凑字数的。人标的奖励模型一直在进步,但离”完美的奖励模型”越来越远。强化学习的优化压力比 best-of-n 还大,这就是 KL 惩罚存在的原因。
4. 让模型自己生成指令
4.1 Self-Instruct
人写的数据很贵(InstructGPT:40 位标注员,数百万美元的标注成本)。能不能让模型自己生成? Self-Instruct(Wang et al. 2022):
- 从 175 条人写的种子任务出发;
- 每次给模型看几条已有的指令当例子(6 条种子 + 2 条已生成的),让它写一条新指令;
- 生成这条指令的输入和输出;
- 过滤:去掉和已有指令太像的(ROUGE-L ≥ 0.7)和无效的;
- 用生成的数据(约 5.2 万条)微调模型自己——“从自己的生成里自举”。
结果:在 Super-NaturalInstructions 上比原始 GPT-3 绝对提高 33%,和 InstructGPT-001 相当;在专家写的新任务上的人工评测里,和 InstructGPT-001 还差 5%。
4.2 Alpaca
Stanford 的 Alpaca(2023)照此用更强的老师(text-davinci-003)生成了 5.2 万条指令数据,微调 LLaMA 7B,花费不到 600 美元。它的意义在于证明了”用强模型生成数据、微调开源小模型”这条路——此后大量的开源聊天模型都是这样来的。
4.3 在指令世界里
代码 02 演示 1:从 8 条种子(只覆盖 2 个任务簇)出发生成 1500 条,在从没生成过的 3 个任务簇上评测:
| 学生的训练数据 | 种子簇的占比 | 留出簇·去回答 | 留出簇·答对 | 普通文本·误答 |
|---|---|---|---|---|
| (不微调) | — | 0.182 | 0.076 | 0.182 |
| 只用 8 条种子 | 1.00 | 0.345 | 0.139 | 0.213 |
| Self-Instruct,不过滤 | 0.85 | 0.397 | 0.162 | 0.058 |
| Self-Instruct,去掉太像的 | 0.68 | 0.538 | 0.219 | 0.076 |
| 同样多条人写的(9 个簇均匀) | 0.22 | 0.585 | 0.238 | 0.084 |
生成的数据确实有用;但老师主要在模仿上下文里的例子,生成的指令严重偏向种子所在的簇(模式坍缩)。“去掉太像的”过滤器把这个偏向降下来,留出簇上的表现明显提高——更多样的指令教会了更通用的”听指令”(和 FLAN 同一个机制)。合成数据的瓶颈在多样性。
4.4 老师的水平,以及”模仿的虚假承诺”
代码 02 演示 2:同样的生成过程,换不同水平的老师:
| 老师 | 老师的能力 | 学生·全部答对 | 学生·能力(大) | 学生·能力(小) |
|---|---|---|---|---|
| 弱老师(和学生一样的小模型) | 0.432 | 0.315 | 0.745 | 0.432 |
| 大模型当老师 | 0.768 | 0.332 | 0.767 | 0.454 |
| 很强的老师(95% 正确) | 0.950 | 0.344 | 0.780 | 0.467 |
(学生自己的能力:小模型 0.432,大模型 0.768。)比学生强的老师把学生的能力拉高一些;比学生弱的老师把它拉低(大模型学生跟着小模型老师学,能力从 0.768 降到 0.745)。但不管老师多强,学生的能力都只挪了一小步——这是这个世界的设定(§0.4)。Gudibande et al.(2023,The False Promise of Imitating Proprietary LLMs)在真实模型上发现了类似的现象:用 ChatGPT 的输出微调的开源模型学会了它的风格,人工评测时看起来很像,但在事实性、推理等需要能力的评测上几乎没有缩小差距。
4.5 少而精 vs 多而杂
LIMA(Zhou et al. 2023)只用 1000 条精心挑选的示范微调 65B 的 LLaMA,效果和用大得多的数据训练的模型相当。他们提出表面对齐假说:模型的知识和能力几乎都来自预训练,对齐只是教它用什么格式和风格说话,所以少量高质量的示范就够了。
代码 01 演示 3(大模型):
| 示范数据 | 见过的·答对 | 没见过的·答对 | 见过的·能力 |
|---|---|---|---|
| (基础模型) | 0.140 | 0.139 | 0.770 |
| 1000 条精选(95% 正确,9 个簇均匀) | 0.714 | 0.392 | 0.776 |
| 5 万条嘈杂(55% 正确,9 个簇均匀) | 0.644 | 0.422 | 0.704 |
| 5 万条精选,但只覆盖 2 个簇 | 0.363 | 0.047 | 0.783 |
| 5 万条精选(95% 正确,9 个簇均匀) | 0.755 | 0.425 | 0.824 |
- 1000 条精选已经接近 5 万条精选的效果——学会”听指令”不需要很多数据;
- 5 万条嘈杂的示范把能力从 0.770 拉低到 0.704(模仿一个更弱的老师);
- 只覆盖 2 个簇的 5 万条示范,在没见过的任务上比不微调还差(0.047 vs 0.139):它学到的”该回答”几乎只认这两类任务。
后训练数据的三角:质量、多样性、数量。在这个世界里,前两者比数量重要得多。
5. AI 反馈
5.1 UltraFeedback:用 GPT-4 代替人来比较
UltraFeedback(Cui et al. 2023):约 6.4 万个提示(来自 ShareGPT、UltraChat、Evol-Instruct、FLAN、TruthfulQA 等),每个提示由不同的模型生成 4 个回答,让 GPT-4 按帮助性、诚实、指令遵循、真实性等维度打分;摘要的说法是”25 万段对话上超过 100 万条 GPT-4 反馈”。没有人工标注员。它训练出了 Zephyr、Notus 等开源模型。这是”离线”的偏好数据:预先收集好,不需要在线的强化学习循环。
AI 反馈的取舍:便宜、一致、可扩展;代价是评委自己的偏好被写进了奖励里。代码 03 演示 1:偏爱长回答的 AI 评委训练出的奖励模型学到了”长 = 好”,准确率明显更低,而且不随数据增多而改善——系统偏差不会因为数据多而消失。
5.2 DPO:不要奖励模型
RLHF 的管线是 SFT → 奖励模型 → PPO → 最终模型,复杂、昂贵、不稳定。DPO(Direct Preference Optimization,Rafailov et al. 2023)发现可以跳过奖励模型。推导的关键一步:KL 正则的目标
有一个解析解:
反过来,奖励可以用策略表示:。把它代入 Bradley–Terry 模型,常数抵消,就得到一个直接在偏好对上训练策略的损失:
其中 是被偏好的回答, 是不被偏好的。数据格式:(提示, 被选中的回答, 被拒绝的回答)。管线变成 SFT → DPO → 最终模型:更简单、更稳定、不需要奖励模型。代码 03 演示 3 直接用了这个解析解来”训练”模型(练习 1 看 的作用)。
5.3 Constitutional AI
Constitutional AI(Bai et al. 2022,Anthropic)想解决的问题:用人工的无害性标签训练出的助手常常回避——对任何敏感的问题都只说”我不能帮你”。它的做法分两个阶段:
- 监督阶段:让模型对有害的提示(红队提示)生成回答,再让它按一组原则批评自己的回答、然后修改;用修改后的回答微调模型。
- 强化学习阶段:让微调后的模型生成成对的回答,让模型按原则判断哪个更好;用这些 AI 偏好训练偏好模型,再做强化学习——RLAIF(从 AI 反馈的强化学习)。
人只提供了一份原则清单(“宪法”),例如”选择最不有害的回答”、“选择最有帮助、同时诚实的回答”——没有一条人工的有害性标签。结果是一个无害但不回避的助手:它会处理有害的请求,解释自己为什么反对。论文还发现思维链式的推理能提高 AI 判断的质量和透明度。
代码 03 演示 3(对有害请求的三种回答:照做、回避式拒绝、解释原因并给出安全的替代):
| 偏好数据 | 照做 | 回避式拒绝 | 解释并给替代 | 真正效用 |
|---|---|---|---|---|
| (基础模型) | 0.55 | 0.35 | 0.10 | −1.11 |
| 只看”有没有帮助”的人工比较 | 1.00 | 0.00 | 0.00 | −2.00 |
| 只看”无不无害”的人工比较 | 0.00 | 1.00 | 0.00 | −0.20 |
| Constitutional AI 的原则 | 0.00 | 0.24 | 0.76 | +0.41 |
对只看无害性的标注员来说,“我不能帮你”最保险;按原则(先无害,再在无害的回答里选更有帮助、会解释的)比较,模型学会了解释原因。注意:这个演示里”原则”是我们写进打分函数的——AI 反馈的好坏取决于原则写得好不好、AI 能不能可靠地执行它们。
6. 完全开放的配方:Tulu 3
6.1 为什么重要
学生报告的开场:闭源模型有先进的多阶段后训练、数百万条数据,但透明度很低;Tulu 3 之前的开源后训练配方更简单、数据有限、往往过时,能力落后。Tulu 3(Lambert et al. 2024,Allen AI + 华盛顿大学)是一个完全开放的后训练配方:数据、模型、训练代码、评测框架全部公开;在 Llama 3.1 的 8B、70B、405B 基础模型上,结果超过了 Llama 3.1、Qwen 2.5、Mistral 的 instruct 版本,甚至超过了 GPT-4o-mini 和 Claude 3.5 Haiku。
6.2 四个阶段
- 数据整理:
- 提示来自公开数据集,兼顾多样性(WildChat、Open Assistant 这样的真实用户对话,让模型适应不常见的输入、避免遗忘)和目标能力(复杂推理、编程、精确的指令遵循、拒绝与安全;例如 OpenMathInstruct、TableGPT),并注意数据来源和许可;
- 合成数据:生成多样、高质量的数据并不容易(语言模型容易模式坍缩)。Tulu 3 用人设驱动的方法:以 Persona Hub 的约 25 万个人设为条件,针对目标能力生成——约 22 万道数学题、3.5 万道编程题、3 万条精确指令遵循;用 GPT-4o 和 Claude 3.5 生成;
- 去污染:用 8-gram 匹配;一条训练样本和一条测试样本的 token 重叠超过 50% 算”显著重叠”;如果一个训练集有显著重叠的样本超过开发 / 未见评测集的 2%,就判为污染,删掉整个数据集或者相关的样本。
- SFT:约 94 万条指令-回答对,针对落后于最强模型的能力精心混合。8B 模型在 32 张 H100 上训练 6 小时,70B 在 64 张 H100 上训练 50 小时。
- DPO:约 35 万条偏好对,混合了在策略(on-policy,SFT 模型自己的生成)和离策略的数据;用长度归一化的 DPO。
- RLVR(可验证奖励的强化学习):在答案能被确定性地检查的任务上(GSM8K、MATH、IFEval 的约束),答对才给奖励。
6.3 发现
SFT:
- 去掉多样的真实对话(WildChat),大多数评测指标都下降;
- 人设驱动的合成数据提升了目标能力;
- 数据越多越好,但用到完整混合的约 75% 之后收益递减;
- 安全数据提升了安全指标,而不损害一般表现;
- 对话模板的细节也有一点影响。
DPO:
- 增加不同提示的数量能提升效果;
- 用同样来源的新提示,比重复使用 SFT 阶段的提示略好;
- 加入在策略的数据(SFT 模型自己的生成)能提升效果;
- 当评委时,GPT-4o 略好于 Llama 405B 和 GPT-4 Turbo;
- 长度归一化的 DPO 好于原始的 DPO 和 SimPO;
- 他们最好的偏好数据混合好于 UltraFeedback。
RLVR(8B):GSM8K 84.3% → 87.6%,MATH 42.0% → 43.7%,IFEval 81.1% → 82.4%。价值模型用一个通用奖励模型初始化效果最好,但训练时只用可验证的奖励。
没有成功的尝试:在线 DPO(不断用当前模型生成新的偏好数据)在 GSM8K 和 MATH 上没有提升甚至变差;拒绝采样(生成 n 个回答、用奖励模型挑最好的再训练)只有很小的提升。
评测:Tulu 3 区分”开发评测集”(训练时用来做决定)和”未见评测集”(只在最后用一次)。发现:很多模型在 IFEval 上过拟合了;Tulu 3 在未见的评测上泛化得不错。这和第 1 讲”测试集反复使用”的问题是同一回事。
6.4 在指令世界里:人设
代码 02 演示 3:以随机人设为条件生成(每个人设关心 3 种任务),vs 模仿上下文例子生成:
| 生成方式 | N = 30 | N = 100 | N = 300 | 最多的簇占比 |
|---|---|---|---|---|
| 模仿上下文例子(Self-Instruct) | 10 种任务 | 18 种任务 | 29 种任务 | 0.44 |
| 以随机人设为条件 | 26 种任务 | 33 种任务 | 36 种任务 | 0.14 |
用 300 条生成的数据训练小模型,留出簇上的答对率:模仿上下文 0.136,人设驱动 0.246。人设是一个廉价的多样性来源:给语言模型一个具体的角色,能把它推到分布的不同角落。
7. 怎样评测聊天模型
FLAN、Super-NaturalInstructions 这样的任务有标准答案;“一个好的聊天助手”没有。常用的办法是两两比较的胜率(AlpacaEval、MT-Bench):模型回答一组测试提示,和参照模型(例如 GPT-4)的回答比较,由人或 LLM 评委判断哪个更好,胜率 = 被偏好的比例。Guha 的 slides 列了一组 AlpacaEval 的胜率(2024):GPT-4 Turbo 50.0%、Claude 3 Opus 40.5%、Llama 3 70B 34.4%、GPT-3.5 9.0%、Alpaca 7B 5.9%。
问题和 §5.1 一样:LLM 评委有偏差——最明显的是偏爱长回答。AlpacaEval 后来推出了”长度控制”的版本来校正这一点。用 LLM 评委评测、再用同一类 LLM 评委的偏好训练模型,偏差会被放大(代码 03 演示 2)。第 14 讲会系统地讨论评测数据。
8. 一个统一的视角(补充)
把这一讲放在一起,后训练数据的演变是信号来源的演变:
| 信号 | 例子 | 好处 | 代价 |
|---|---|---|---|
| 现成的任务数据 | FLAN | 便宜、量大、有标准答案 | 格式单一、不像真实的用户请求 |
| 人写的示范和比较 | InstructGPT | 最接近”人想要什么” | 贵、慢、有噪声(一致率约 73%) |
| 模型生成的示范 | Self-Instruct、Alpaca、Tulu 3 的人设数据 | 便宜、可以定向补能力 | 模式坍缩、学生上限受老师限制 |
| AI 的比较 | UltraFeedback、Constitutional AI | 便宜、一致、可以写成原则 | 评委的偏差被写进奖励 |
| 可验证的结果 | RLVR(Tulu 3;第 9 讲) | 没有”钻空子”的评委(如果验证器可靠) | 只适用于答案能检查的任务 |
和预训练一样,三个维度反复出现:质量(示范对不对)、多样性(覆盖多少种任务和请求)、数量。和预训练不同的是:后训练的数据直接编码了价值判断——“有帮助”、“无害”、“诚实”由谁定义、怎样权衡,都写在数据里。
9. 延伸与前沿 · Beyond the original lecture
本节是我补充的。
- 在策略 vs 离策略的偏好数据。Tulu 3 发现加入模型自己的生成有帮助;理论上,DPO 的推导假设偏好数据来自参考策略附近,离得太远的数据会让优化失真。后续的很多方法(迭代 DPO、在线 RL)都在处理这个问题。
- 奖励模型的扩展律。Gao et al.(2022)系统地研究了”对奖励模型过度优化”:真实的奖励随优化强度先升后降,奖励模型越大、数据越多,转折点来得越晚。
- 偏好数据里的价值观。谁来标注、按什么标准,直接决定了模型的价值取向;Constitutional AI 把标准写成了可读的原则,是让这个选择更透明的一种尝试(第 19 讲)。
- 从后训练到推理。Tulu 3 的 RLVR 只用了最简单的可验证任务;第 9 讲的 DeepSeek-R1 把同样的思路推到了数学、代码的长推理上,并发现模型能”自己学会思考”。
10. 小结 · Summary
- 后训练数据有三种形式:示范(SFT)、比较(偏好)、奖励(RL);量小、贵、直接编码”我们想要什么样的助手”。
- FLAN:把 60 多个 NLP 数据集写成指令微调 137B 模型,零样本在 25 个任务里的 20 个上胜过 GPT-3;任务簇越多、写成自然语言指令,泛化越好。
- InstructGPT:约 1.3 万条示范 + 3.3 万对比较 + PPO(带 KL 惩罚);1.3B 的 InstructGPT 胜过 175B 的 GPT-3——对齐解锁能力,不创造能力。
- 合成指令数据:Self-Instruct(175 条种子 → 5.2 万条,+33%)、Alpaca(不到 600 美元);瓶颈是多样性(模式坍缩),学生的能力受老师限制。LIMA:1000 条精选示范就够——“表面对齐假说”。
- AI 反馈:UltraFeedback(GPT-4 打分)、Constitutional AI(原则 + RLAIF,无害而不回避);便宜可扩展,但评委的偏差会被写进奖励;奖励模型会被”钻空子”。
- DPO:KL 正则 RL 的解析解 让偏好可以直接训练策略。
- Tulu 3:完全开放的四阶段配方(数据整理 → SFT 94 万条 → DPO 35 万对 → RLVR);多样的真实对话、人设驱动的合成数据、在策略的偏好数据、去污染、开发 / 未见评测的区分。
11. 常见误区 · Common pitfalls
- “指令微调让模型变聪明了。” 主要改变的是意愿和格式;能力来自预训练(LIMA、代码 01 演示 2–3)。
- “示范越多越好。” 嘈杂的示范会把能力拉低;覆盖窄的示范会伤害泛化(代码 01 演示 3)。
- “用最强的模型生成数据,学生就能追上它。” 学生学到风格,不一定学到能力(Gudibande et al.)。
- “奖励模型的分数越高,回答越好。” 优化压力大了,奖励模型会被钻空子(代码 03 演示 2)。
- “AI 反馈和人的反馈差不多。” AI 评委有系统偏差(偏爱长回答等),数据多了也不会消失。
- “无害就是拒绝。” 只奖励无害会训练出回避的助手;Constitutional AI 的目标是无害而不回避。
- “DPO 不需要偏好数据的质量。” DPO 绕开的是奖励模型,不是数据:偏好对的来源(在策略 / 离策略)、长度偏差同样重要。
- “在 IFEval 上分数高就是会听指令。” Tulu 3 发现很多模型在 IFEval 上过拟合了——要有未见过的评测。
12. 练习 · Exercises
练习 1(KL 正则的最优解) 一个模型对有害请求的三种回答的初始概率是 (照做、回避、解释),奖励模型给的分数是 。(a) 用 算 时的最优策略。(b) 越小会怎样?越大会怎样?(c) 为什么 时”回避”仍然是最常见的回答,尽管”解释”的奖励更高?
参考答案
(a) :(0.001, 0.321, 0.678);:(0.042, 0.539, 0.419);:(0.192, 0.549, 0.259);:(0.352, 0.474, 0.174);:(0.510, 0.377, 0.113)。
(b) :完全按奖励选,只剩奖励最高的那种回答(KL 很大,1.26)——如果奖励模型有偏差,偏差会被完全放大。:几乎不动,保持原来的模型(KL ≈ 0.003)。 是”相信奖励模型多少”和”相信原来的模型多少”之间的旋钮。
(c) 因为初始概率差得多: vs 。KL 正则让模型”尽量少改”——一个原来很少出现的行为,需要足够大的奖励优势(或足够小的 )才能成为主流。这也是为什么 Constitutional AI 先做一轮 SFT(用修改后的回答),把”解释”的初始概率提上来。
练习 2(Bradley–Terry 和标签噪声) 代码 03 里,人的标签是 。(a) 两个回答的真正效用差 时,标注员选对的概率是多少? 呢?(b) 如果你想用多个标注员投票把 的这对比较判对的概率提高到 90%,大约要几个人?(c) 这对设计比较数据有什么启示?
参考答案
(a) ;。
(b) 每人正确的概率 ,多数投票正确的概率随人数 增加:近似地,需要 使 (正态近似的 90% 分位),, 人。
(c) 差别很小的比较几乎是噪声,花很多人力也很难判准;与其在难以区分的对上反复标注,不如让候选回答之间差别更大(例如来自不同的模型、不同的采样温度——UltraFeedback 用 4 个不同的模型生成回答),或者只用一个人标、靠大量不同的提示来平均(奖励模型从大量嘈杂的比较里学方向,代码 03 演示 1)。
练习 3(少而精,但不多样) 代码 01 演示 3 里,1000 条精选示范(9 个簇均匀)在没见过的任务上是 0.392。如果这 1000 条只覆盖 2 个簇呢?先预测,再看在代码副本里运行的结果。
参考答案(实际运行结果)
1000 条精选、只覆盖 2 个簇:见过的任务(9 个簇)上 0.340,没见过的任务上 0.049——比不微调(0.139)还差,和”5 万条精选、只覆盖 2 个簇”(0.047)几乎一样。精选解决了质量,解决不了多样性;而在泛化到新任务这件事上,多样性才是瓶颈。LIMA 的 1000 条示范之所以有效,一个重要原因是它们被刻意挑选成覆盖多种多样的请求。
练习 4(Self-Instruct 的模式坍缩) 代码 02 演示 3 里,模仿上下文例子生成的 300 条指令只覆盖 29 种任务,最多的簇占 44%。(a) 用”每一步以概率 想出一种随机的新任务、否则模仿一个上下文例子”解释为什么覆盖得慢。(b) Self-Instruct 的”去掉太像的”过滤器和 Tulu 3 的人设,分别从哪个环节增加了多样性?(c) 你还能想到什么办法?
参考答案
(a) 只有约 15% 的生成是”探索”,其余 85% 都在复制池子里已有的任务——而池子里种子任务占多数(上下文的 8 条里 6 条是种子)。所以生成的分布被种子”锁住”,新任务只能以每步约 0.15 × (没见过的任务的比例) 的速度慢慢加进来。
(b) 过滤器在接受环节:太像的生成被扔掉,相当于压低了”模仿”的权重(但它浪费了大量生成,代码里阈值太严时甚至凑不够数)。人设在生成环节:直接改变了老师”想写什么”的分布,从源头上更均匀。
(c) 例如:按任务类型 / 话题做分层抽样再生成(Tulu 3 针对目标能力分别生成);用真实用户的提示做种子(WildChat);在生成后按嵌入聚类、对稀少的簇上采样;让老师在每一步看到”已经有哪些类型、还缺什么”。
练习 5(设计) 你要为一个编程助手收集偏好数据。列出:(a) 用人工比较、AI 比较、可验证的信号(单元测试)各自适合标注什么;(b) 每种信号可能有的偏差;(c) 你会怎样检测奖励模型被钻空子。
参考答案(要点)
(a) 单元测试:代码能不能跑、结果对不对(最可靠,但只覆盖有测试的部分);AI 比较:代码风格、可读性、注释、解释是否清楚(便宜、量大);人工比较:对真实开发者最重要但难以形式化的东西(是否理解了需求、是否过度设计、安全隐患),以及校准 AI 评委。
(b) 单元测试:测试不全时,“通过测试”不等于”正确”(第 9 讲 SWE-smith 的演示);AI 评委:偏爱长代码、多注释、自己熟悉的写法;人工:标注员水平不一,偏爱看起来专业的代码,对难题的判断噪声很大。
(c) 留一个”金标准”评测(人工仔细检查或更完整的测试)定期抽查;监控回答长度、注释比例、测试覆盖的”可疑”变化;对比”奖励模型分数上升”和”金标准分数”的走势(Gao et al. 的过度优化曲线);在强化学习里用 KL 惩罚并调 。
13. 延伸阅读 · Further reading
原课阅读
- Wei et al., Finetuned Language Models Are Zero-Shot Learners(FLAN,2021):arXiv:2109.01652。
- Ouyang et al., Training language models to follow instructions with human feedback(InstructGPT,2022):arXiv:2203.02155。
- Bai et al., Constitutional AI: Harmlessness from AI Feedback(2022):arXiv:2212.08073。
- Wang et al., Self-Instruct: Aligning Language Models with Self-Generated Instructions(2022):arXiv:2212.10560。
- Taori et al., Alpaca: A Strong, Replicable Instruction-Following Model(Stanford CRFM 博客,2023)。
- Cui et al., UltraFeedback: Boosting Language Models with High-quality Feedback(2023):arXiv:2310.01377。
- Lambert et al., Tulu 3: Pushing Frontiers in Open Language Model Post-Training(2024):arXiv:2411.15124。
本讲补充
- Rafailov et al., Direct Preference Optimization: Your Language Model is Secretly a Reward Model(2023)。
- Zhou et al., LIMA: Less Is More for Alignment(2023)。
- Gudibande et al., The False Promise of Imitating Proprietary LLMs(2023)。
- Gao et al., Scaling Laws for Reward Model Overoptimization(2022)。
- Ge et al., Scaling Synthetic Data Creation with 1,000,000,000 Personas(Persona Hub,2024)。
和本目录其他课程的联系
- CS336 第 15 讲(SFT 与 RLHF):后训练算法的实现细节。
- CS324 第 7 讲(指令微调与对齐)。
14. 下一讲预告 · Next lecture
聊天机器人在复杂任务上碰到了天花板:数学竞赛、编程竞赛、博士水平的科学题、多步规划。答案是让模型先思考、再回答——而思考的数据从哪里来?
第 9 讲:后训练数据 II——推理轨迹、智能体数据与强化学习环境。 OpenAI o1 和 DeepSeek-R1:用可验证的奖励做强化学习,模型自己学会了长推理;开放的复现走两条路——强化学习和蒸馏推理轨迹(s1 的 1000 条精选、OpenThoughts 的上千次消融:问题来源、老师选择、过滤、每题几个答案);Llama-Nemotron、OLMo 3 的开放推理模型;智能体的数据:SWE-Bench、SWE-Gym 的真实代码仓库任务,SWE-smith 自动合成任务环境。代码会造一个可验证的推理任务世界,研究 GRPO 的”难度过滤”、老师的选择,并真的用 Python 的语法树给一个小代码库注入 bug、用测试来验证——亲手做一个迷你的 SWE-smith。