第15讲 · CS336 语言建模从零开始|:中期训练与后训练
课程信息
| 课程 | Stanford CS336 Language Modeling from Scratch(Spring 2026) |
| 讲次 | Lecture 15 — Mid/Post-Training |
| 视频 | YouTube 链接,时长约 80 分钟 |
| 本讲主题 | 如何把一个 GPT-3 级别的基座模型,训练成接近 ChatGPT 的系统。下一讲继续从 ChatGPT 走到推理模型(GPT-o1 一类)。 |
对应讲次:第15讲(Stanford CS336 语言建模)
制作模型:deepseek-flash(vb compose,据 run.log)
说明:本讲字幕中涉及的后训练数据来源、标注流程等多为业界"保密知识",讲师本人在课上多次强调信息稀疏,部分内容带有编者推断,已在正文标注。
导览
这一讲老师想回答的核心问题
老师开篇就把问题摆得很清楚:到目前为止,课程里讲的能力足以让我们训练出一个"加强版的 GPT-3"——一个又大又强的基座模型。但基座模型的实用性有限。真正的转折发生在从 GPT-3 到 ChatGPT 的这一步。于是本讲的核心问题就是:
从 GPT-3 走到 ChatGPT,中间到底需要什么?
老师把这个问题拆成两个阶段: 1. 本讲:从 GPT-3(基座)走到 ChatGPT(会遵循指令的对话系统); 2. 下一讲:从 ChatGPT 走到推理模型(GPT-o1 等"思考模型")。
承接这两个阶段的整个过程,业内习惯称为 后训练(post-training)。
老师特别想强调"指令遵循(instruction following)"这件事有多不可思议:你可以输入一段很长、很复杂的提示,模型能一次性给回一个相当合理的答案。在 GPT-3 时代,这种细粒度的控制几乎不可能——你塞一堆 few-shot 示例进去,心里想"只要例子够好应该没问题",但实际上你对模型的操控能力非常有限。到了 GPT-3.5 / GPT-4,你开始能看到模型"一发命中"地处理整段程序般的提示。
难点在哪
本讲反复强调的一个字眼是"messy"(乱、杂、手工活)。老师直言:
- 预训练是基础,它像一锅"原始汤(primordial soup)",能力广泛而多样地铺在里面;
- 但要把你想要的行为从这锅汤里"提取"出来,需要更显式的数据收集、更显式的引导,以及大量杂乱的工程。
他还特别提醒:算法其实不是秘密武器,杠杆不在算法上,而在数据上。所以整讲的重心几乎全在数据——怎么收集、收集什么、要小心什么。
另一个难点在于信息本身的稀缺。老师明确说:一线实验室的后训练信息"相当稀疏"。他今天引用的很多材料其实很旧(ChatGPT 竞争白热化之前),例如 RLHF 论文 Learning to Summarize from Human Feedback(Stiennon 等)细节极其详尽,甚至包含标注指南;Anthropic 2022 年的 HH 论文 也如此。但竞争升温后,基本没有厂商愿意公开后训练流程——数据是商业秘密。开源配方又大量依赖蒸馏,和一线实验室的人类数据收集"性质很不一样"。
读者可能带着什么疑问进来
① 老师真正提出的问题(按他自己的顺序):
- 从 GPT-3 到 ChatGPT 需要什么?指令遵循为什么能成立?
- SFT 数据在过去几年是怎么演变的?每个阶段的方法论教训是什么?
- 收集 SFT 人类标注数据时,有哪些坑?(格式、知识量、数据点数、安全)
- 为什么蒸馏 / 模型标注成了主流?人类标注还有多大空间?
- 后训练用的是哪些算法?PPO 为什么要被 DPO 取代?
- RLHF 有哪些系统性的失败模式?
② 编者预判的读者疑问(编者预判,非老师原话):
- 已经有 SFT 了,为什么还要 RLHF?两者到底差在哪?
- "尾知识(tail knowledge)"是什么?为什么它会导致幻觉?
- 标注员是谁、拿多少钱、有什么偏见,这些真的会影响模型吗?
- DPO 的公式看起来只是一个"对了加分、错了减分"的损失,凭什么能替代 PPO?
- "过度优化""模式崩溃"这些词具体指什么?为什么到现在还没解决?
本讲路线
老师大致这样走:先用约 40 分钟讲 SFT(数据为主,算法一笔带过),其中穿插大量数据集的实例与坑;再花约 40 分钟讲 RLHF——先讲数据(标注员、人口统计学、模型标注)与一个重要的概念区分(拟合分布 vs 最大化奖励),再讲算法(PPO → DPO),最后落到两个系统性陷阱(过度优化、模式崩溃),并以"为什么下一讲的 RLVR 如此重要"作为收尾悬念。
读的时候请留意:老师讲的很多"结论"(比如少样本就能 steer、尾知识有害、DPO 够用)背后都挂着具体的实验、泄露的文档、或亲历的项目。这些是本书的骨架,不要跳过。
从预训练到后训练
(参考时间: 00:00:05)
我们现在要离开预训练,进入语言建模中——用老师的话说——"更乱"的部分。数据一直都很乱,但后训练以及与之相关的一切,在很多方面都是一种"手工艺(artisanal)"。
先设定舞台。到目前为止,本课程的知识足以让你做出一个"加强版 GPT-3":用更多算力、更多数据,你可以比 GPT-3 稍好一点。但一个很大的强基座模型,它最终能提供的实用性是有限的。
当我们从 GPT-3 走到 ChatGPT 时:如果你的第一印象来自 ChatGPT,你会觉得"哇,太神奇了";但如果你回头去和 GPT-3 交互,你会想:"这到底是什么东西?它有什么用?"你能用它做的,基本只是文案写作(copywriting)这类有趣但并不需要可靠性或指令遵循的小任务。
所以今天的任务,就是从 GPT-3 走到接近 ChatGPT 的状态。这是第一步。下一讲,我们再从 ChatGPT 走到 GPT-o1 / 各类思考模型。把我们从左推到右的这个过程,通常被称作后训练。
指令遵循为什么值得惊叹
老师想强调"能做到指令遵循"本身有多不可思议。指令遵循指的是:你输入一个相当长、相当复杂的提示,能拿回一个非常合理的答案。在 GPT-3 的层次上,对系统做细粒度控制基本不可能——你塞进一堆 few-shot 提示,心想"只要我的例子够好,就能得到合理结果"。但在实践中,你操控模型的能力是有限的。
一旦 GPT-3.5 和 GPT-4 出现,你开始看到很长的、程序式的提示,模型能"one-shot"整段提示。那么,要让这种指令遵循成立,到底需要什么?
预训练当然始终重要,它是一切的基础。如果忽略预训练、妄想靠后训练"取胜",我们会得到想要的东西——一个都得不到。预训练之所以关键,是因为它以非常多样、宽广的方式扩展。但一旦有了预训练,我们就必须从这个"预训练的原始汤"里,提取出我们想要的行为。为此,我们需要更显式的数据收集、更显式的引导,以及大量此前不必做的杂乱工程。
架构层面的东西你可能觉得乱,但它真的比不上真实世界的后训练之乱。
编者说明:老师用"原始汤(primordial soup)"这个比喻来描述预训练模型:它在大规模语料上学会了对世界做生成式建模,能力分散地潜伏在参数里,但并没有被"指向"任何一个具体任务。后训练的工作,本质上是在这锅汤里做"选择性提取",而不是从零注入能力。这个视角贯穿全讲。
一线后训练信息为什么稀疏
(参考时间: 00:03:30)
老师给整讲加了一个前言:关于一线实验室的后训练,公开信息在很多方面都相当稀疏。
- 他今天引用的材料很多其实是旧的,早于 ChatGPT 引发的竞争白热化。例如 RLHF 论文 Learning to Summarize from Human Feedback 极其详细,附录里甚至有细致的标注指南、如何指导人给模型反馈;Anthropic 2022 年的 HH 论文也一样。对感兴趣的同学,老师建议去读附录。
- 但竞争升温之后,基本没有厂商愿意公开后训练过程。数据是商业秘密。
- 我们确实有闭源、开源模型,但开源配方大量依赖蒸馏,其性质与一线实验室所做的人类数据收集"非常不一样"——后者是极其棘手、极其杂乱的事情。
老师举了一个他自己做讲座预研时发现的趣例(2023 年):Scale AI 的内部文件曾被泄露,其中有一堆关于后训练数据领域的坦率讨论。其中一个片段是:他们在努力让 Google Bard 变得更好,但搞不清为什么 GPT-4 强那么多。于是他们说,我们得逆向工程到底发生了什么,得让标注员产出比 GPT-4 更详细、更好的回答。这种竞争动力学一直在发生,也正是本讲会缺失很多细节的原因。
但算法层面,我们其实相当清楚在发生什么。 只是算法并非秘密武器,杠杆不在那里——杠杆在数据上。
后训练的两阶段总览
如果用 RLHF 论文看,配方非常直白,就两部分:
graph TD
A["预训练基座模型<br/>(GPT-3 级别)"] --> B["阶段一:SFT<br/>监督微调"]
B --> B1["收集演示数据<br/>(每个 prompt 配参考回答)"]
B --> B2["用标准的 next-token 预测做微调"]
B --> C["阶段二:RLHF<br/>人类反馈强化学习"]
C --> C1["用某种强化学习<br/>塑造模型行为更对齐"]
C --> C2["最终得到接近 ChatGPT 的系统"]
style A fill:#e8f0fe
style B fill:#fff3cd
style C fill:#d4edda
style C2 fill:#c3e6cb
第一部分:你去收集一些演示数据(demonstration data)——对每个 prompt,让标注员给出监督微调的参考回答,然后做微调。 第二部分:在此基础上做某种强化学习,把模型行为塑造成更"对齐"、更符合人类认为的好回答。
本讲先讲第一阶段 SFT。老师强调:这部分几乎完全关于数据。我们都知道怎么 SFT 一个模型——它和预训练基本一样,唯一真正的区别(除了一些小变化)就是训练数据。所以这部分几乎全程聚焦数据,方法只顺带讲一点。
监督微调(SFT)数据的发展史
(参考时间: 00:07:30)
老师按时间顺序(从左上到右下)梳理了 SFT 数据的演变。开源语言建模社区在多年里试过很多技巧,既为提升系统表现,也为搞清楚这类数据的哪些因素对训练有用。
下面这张图先给出全貌,随后逐项展开:
graph LR
A["FLAN<br/>多任务后训练<br/>(Google, T5)"] --> B["Self-Instruct<br/>用模型生成数据"]
B --> C["Alpaca / Vicuna<br/>蒸馏路线"]
C --> D["Open Assistant<br/>众包人工数据"]
D --> E["Wizard LM / Tulu 3<br/>复杂合成数据"]
E --> F["Agent / Tool Use<br/>智能体与工具调用数据"]
style A fill:#e8f0fe
style D fill:#fff3cd
style F fill:#d4edda
FLAN:多任务后训练的开创
(参考时间: 00:11:30)
最古老的、某种意义上也最有远见的是 FLAN,它被用来训练 Google 的 T5 模型。
它的核心想法是:NLP 研究者已经收集了一大堆有输入输出的监督数据集,我们干脆把它们全部拿来训练模型。这在当时是非常合理且聪明的想法——如果你要做下游任务,那就把所有下游任务收集起来一起训。
但当我们真正去看 FLAN 里有什么,会发现它是个有点奇怪的数据集。
📷 FLAN 数据集示例:把现有 NLP 数据集改写成指令格式,指令往往被奇怪地附在末尾
回到原视频 (00:11:52)
- 比如"这里是一封邮件",后面附上"为这封邮件写一个主题行",然后主题行放在右边。这非常奇怪——你大概从来没有这样提示过模型,更何况指令还放在最末尾。
- 为什么会这样?因为 FLAN 是从已有数据集生成的。有一份叫 Enron emails 的数据集,它本质上是把 Enron 邮件转成一个监督任务:因为邮件有正文和主题,你可以做一个"预测主题"的任务。
- 同样地,还有摘要任务(可能取自 CNN/DailyMail 或 XSum),"为这篇文章写要点",把文章的摘要放在右边。
但你立刻会注意到:和 ChatGPT 相比,这些摘要非常短。更仔细看,摘要经常是幻觉的——包含很多输入里没有的细节。
所以关键在于:FLAN 所依赖的原始 NLP 数据集本身质量就不高,训练时你会继承这些数据集的缺陷;而且这些数据集结构的不自然性也会一路传递下去。FLAN 用现有基准造出大数据集,是非常聪明的想法,但不自然性最终会反噬。
老师还补充了 FLAN 的一个历史背景(回到上一张幻灯片):FLAN 构建时,人们对后训练的理解是你需要规模(scale)。预训练需要规模,所以你可能会想后训练也需要大量规模来"解锁"能力。因此他们拿了很多数据集、很多数据,造了一个巨大的数据集。但我们后面会看到,这些数据集后来变得小得多却依然有效。从 FLAN 到后来数据集的核心转变之一,就是认识到:只要有一个足够强大的大预训练模型,你其实可以用很少的高质量示例,因为预训练的泛化会帮你走完相当一段路。所以 FLAN 在质量-数量权衡上,某种程度上站错了点——尽管在当时,不把这片空间探索完,是无法知道的。
Self-Instruct:用模型来生成数据
(参考时间: 00:08:30)
Self-Instruct 及其后续工作也极具前瞻性。它的想法是:为什么不用模型自身来生成数据呢? 模型一直在变好,它们甚至可能比某些标注员还好。为什么不训练模型去写出非常高质量的回答呢?这就是 Self-Instruct 的核心思路。
蒸馏路线:Alpaca 与 Vicuna
(参考时间: 00:08:55)
在此之后出现了一批蒸馏式方法:
📷 Alpaca 数据集示例:输入更自然、输出更长更"健谈",因为蒸馏自 ChatGPT
回到原视频 (00:14:45)
老师展示了一个 Alpaca 的样例:输入更自然、输出更长更"健谈",因为它是从 ChatGPT 蒸馏来的。他们发现,这类样例能可靠地诱导出类似 ChatGPT 的行为——但有个重要限定:只有在原始 Llama 模型上做才行。也就是说,预训练和后训练必须同时奏效。无论如何,这是"事情开始奏效"的转折点。人们由此意识到:如果有了这种聊天风格的数据,构建 ChatGPT 式系统其实并没有那么难。细节做对仍然很难,但走完大部分路可以。
Open Assistant:众包人工数据
(参考时间: 00:15:33)
ChatGPT 和 Alpaca 出现后,出现了一种巨大的乐观情绪:只要我们能收集到足够高质量、足够大的指令微调数据集,就能赶上一线闭源实验室。在这种背景下,Open Assistant 出现了——一个大规模众包的数据集构建努力。很多志愿者一起:
- 想出又难又有趣的 prompt;
- 给出高质量的回答;
- 并以类似 Wikipedia 的方式在规模上做到高质量。
这是一项非常值得钦佩的努力,也确实生成了不少数据(老师记不清是 1 万条还是更多),但作为一个项目最终停滞了。
📷 Open Assistant 数据集示例:聊天风格的输入 + 长篇、详细、高质量的专家回答
回到原视频 (00:15:40)
新一代:合成数据与智能体数据
(参考时间: 00:16:50)
Wizard LM / Tulu 3 这一代的想法是:我们知道语言模型是极强的合成数据生成器,那就设计越来越复杂的方式来生成指令遵循数据。
而最新一代的 SFT 数据,反映了领域和用户需求从纯聊天界面走向完整智能体系统的转变。我们不再只想要文本回答,还想要工具调用(tool calls)、待办清单(to-do lists)。如果你用过 Claude Code 或 Codex,你会知道它们会生成一个待办清单,一边做一边打勾。
📷 Nemotron 智能体 SFT 数据示例:除了 assistant 文本回答,还有可并行发生的工具调用
回到原视频 (00:16:55)
以 Nemotron(Nvidia 的开源努力)为例,其 SFT 数据里很大一块是智能体式(agentic)SFT 样例:不仅有回答(写在 assistant 字段里),还有可以与文本并行发生的工具调用。这是 SFT 数据,所以是被显式地监督进模型里的。于是数据的格式正越来越结构化。
SFT 数据演变的三个高层趋势
(参考时间: 00:17:55)
老师总结了三条我们需要内化的高层转变:
graph TD
T1["趋势一:Chattiness<br/>更健谈、更像人的回答"]
T2["趋势二:更高质标注者<br/>专家撰写 + 更多细节"]
T3["趋势三:工具调用<br/>确定接口 / API"]
T1 -.取代.-> C1["经典的 NLP 数据集<br/>(输入 → 程序式输出)"]
T2 -.取代.-> C2["低成本、随机众包标注"]
T3 -.取代.-> C3["纯文本聊天"]
style C1 fill:#f8d7da
style C2 fill:#f8d7da
style C3 fill:#f8d7da
- 健谈程度(chattiness):经典的 NLP 数据集,即便是高质量的,也大多是"输入 → 近乎程序式的输出"。但人们并不想和一个 NLP 基准对话,他们想和人对话。因此发生了向更详细、更像人的回答的转变。(老师也说这一点很难完全精确地表述。)
- 更高质量的标注者与更多细节:Open Assistant 是好例子——让专家来写回答。
- 工具调用:为这一切设计出正确的接口与 API,是最近一轮大转变。老师预计还会继续变。
收集 SFT 数据的坑与挑战
(参考时间: 00:19:05)
现在假设你被委派去为 SFT 收集人类标注数据,你需要注意什么?老师列了几类问题:格式问题、知识问题(回答里该放多少知识?要多少数据点?)、模型安全问题(该收集什么样的安全数据?)。
其中,老师特别想把长度和风格的变化单拎出来讲——它是后训练过程的很大一部分。
风格与长度的陷阱
人们会说"Claude 的腔调和 ChatGPT 不同""ChatGPT 太啰嗦"等等,这些都是数据收集团队有意识的决定。如果你去看各数据集中回答的长度分布,会发现差异巨大。
一个关键提醒:当你去评估偏好(preferences)时,这些风格因素影响极大。人们很容易(用"骗"不一定准确)选择:
- 带项目符号列表的回答;
- 或更长、更详细的回答。
这部分很自然,尤其当你在一个"给你两个样例、问哪个更好"的评估场景时。更长、更像列表的回答通常确实是好的——但这会给聊天机器人的腔调引入非常显式的扭曲,相对真人而言。
这里要小心的核心是:如果你看的是参与度信号(engagement signals)——大多数公司看的都是这个——你非常容易自欺欺人,以为自己在得到更好的数据,而实际上模型的能力并没有变化。
具体来说:
- 在不同后训练数据集上训练,你会在偏好评测(如右列的 Alpaca Eval)上看到很大差异;
- 但它不一定改变标准基准评测。
所以结论是:你要把"风格控制"和"能力控制"分开考虑。
编者拓展|长度偏好与它的后果 老师此处提到的"长度偏好"是后训练中一个被反复研究的现象。人类评估者(以及后来的模型评判者)倾向于给更长的回答更高分,即便内容质量相同。这一偏差会被 RLHF 放大成"长度刷分"行为——模型学会单纯地变长来拿奖励,而非真的更聪明。后面的幻灯片会给出直接的量化证据(
RLHF on length alone)。这也是为什么后来出现了长度归一化的 DPO 等变体。要点:偏好信号 ≠ 能力信号,评估时必须对风格做控制。
知识与幻觉:尾知识问题
(参考时间: 00:22:00)
这部分老师认为非常重要。他以 Open Assistant 为例(一个本意是高得多的、最高质量的努力),你会经常看到这样的回答:里面引用了一篇文章,比如 "J. Michelle L., The Pay of Corporate Executives..."。
如果你在这条数据上做 SFT,设身处地想:
- 你在做下一词预测,所以这在教模型"Bebchuk, J. 和 Michelle, L."这条引用;
- 它同时还在教模型干另一件事:当你给回答时,引用一条参考文献是个好做法。
于是这里同时发生了两种机制:你在教模型知识(好事,你希望模型博学),同时也在教模型输出详细的引用格式。这有时会出问题:模型会误泛化,把引用幻觉出来,而不是给出真正的参考文献。模型并不真的知道某条引用是真是假。
老师引用了一个(他认为不算错的)民间传说,且有不错的实证支持:
如果你训练模型——尤其是在 SFT 阶段——去输出它并不知道的事实,这会让它产生幻觉。
因为模型像我说的那样,在同时泛化两件事:泛化知识,也泛化格式。当你提供的训练数据里有格式、但知识是模型不知道的,你实际上是在教模型强行输出未知知识。有研究显示:如果在一块你并不真正知道的信息上训练,会导致幻觉和知识过拟合;反之,只在已知事实上训练则未必出现。
John Schulman(PPO 的作者)另有一个论证:这正是我们需要强化学习训练的原因。他不意外地是"强化学习派",但论证本身是站得住脚的——要教模型"知道自己知道什么、不知道什么",你必须让它是"策略依赖(policy dependent)"的。你不能让一个外人在旁边把知识硬塞进模型嘴里,如果你想让模型对自己的知识边界保持"校准"的话。
所以,把这一点合起来:
graph TD
A["SFT 训练数据<br/>含引用格式 + 未知事实"] --> B["模型同时泛化两件事"]
B --> C1["知识:这条引用本身"]
B --> C2["格式:回答要带引用"]
C2 --> D["误泛化:<br/>强行为未知领域编造引用 → 幻觉"]
C1 --> E["正面效果:模型更博学"]
style D fill:#f8d7da
style E fill:#d4edda
你可能并不想在最"高质量"的数据上训练,如果模型本来就不掌握那些知识的话。尾知识(tail knowledge)有时是有害的,可能诱发幻觉——尤其当它和
reference:这类标记绑在一起时,会迫使模型在标记后编造一条引用。
尾知识的定义(有同学追问):老师坦言没有形式化定义。他过去做过类似工作,用的是诸如维基百科文章长度作为"知名程度"的代理指标:训练在不为人熟知的东西上,确实会看到模型幻觉更多。但不存在一个"这个是尾知识、那个不是"的判定,因为知识本身无法被精确定义。
为什么 RL 能帮到幻觉(有同学追问):老师给了个"民间故事"式的解释。想象模型内部有一个"我知道这件事的方向"的激活方向。SFT 时,你可能被强迫从 SFT 数据里生成引用,于是不管三七二十一都生成引用。但在 RL 中,你会注意到:当你在"我知道"方向上生成引用时拿到好奖励,在"我不知道"方向上生成引用时拿到坏奖励。于是模型可能学会把"知道/不知道"的激活泛化为"是否输出引用"。
- 如果模型在某个层次上知道自己知道什么,RL 能帮你把这一点提取到输出策略里;
- 如果模型在任何层次上都不知道自己知道什么,RL 帮不了你——它无法解决"连一点校准都没有"的问题。
关于 SFT 是否在惩罚(同学追问细节):在 SFT 里,其实你隐式地惩罚了任何"不是这条引用"的输出——给任何非标准序列分配概率质量都会被罚。所以 SFT 本身没做错事,这条序列是正确序列。SFT 的问题在于它的泛化性质:你无法从这一个样例完美泛化,因为这里有两件纠缠在一起的事——一个是引用模板,另一个是知识的实际内容。如果我基于模板误泛化了,就麻烦大了。
编者拓展|为什么会"知道/不知道"变成可提取的信号 把一个"我知道/我不知道"的判别能力看作模型内部的一种隐变量判别方向,是理解 RLHF 校准作用的一个有用直觉:SFT 教会模型"某类格式该出现在某类场景",但它无法区分这个场景下知识是否真实存在;而 RL 的奖励信号是依赖于模型自身输出的(policy-dependent),因此可以对"在知道自己知道时输出断言、在不知道时保持谨慎"这类依赖模型内部状态的行为进行选择。一旦模型内部确实编码了这条信息,RL 就能把它"读出来"。反之若内部根本没有这条信息,任何外部监督都无从下手——这正是 Schulman 论证的要点,也是"知识校准"本质上很乱、很微妙的原因。
安全 SFT
(参考时间: 00:28:15)
另一个要谈的是安全。一旦进入后训练,我们就必须真正面对"人们会怎么用这个系统"的所有乱现实。
- 预训练的人活在"我们只是压缩世界"的象牙塔里;
- 后训练的人必须问:"如果人们用我们的系统做政治操纵和虚假信息怎么办?""如果我们看到个性化的鱼叉式钓鱼(spear phishing)怎么办?我们需要阻止它。"——你在某种程度上是系统被滥用之前的最后一道防线。
所以你要对系统施加安全控制,让它拒绝回应恶意输入。这就是这些公司实际执行安全控制的事实标准方式,而它落到后训练团队头上。
遗憾的是,安全 SFT 的公开信息比能力 SFT 还稀疏。老师以 Llama 2 的安全 SFT 描述为例(即便这是较详细的描述了),你会看到他们连用了多少条安全调优示例都没说——这在他看来相当离谱。
所有安全调优方法遵循的框架都是平衡两件事:
graph LR
A["违规率<br/>Violation Rate<br/>(坏查询被放行)"] --> C{"安全调优<br/>Pareto 权衡"}
B["误拒率<br/>False Refusal Rate<br/>(无害查询被拒)"] --> C
C --> D["构造各类<br/>定制数据来导航<br/>这个权衡"]
style C fill:#fff3cd
- 违规率:你让多少坏查询溜了过去;
- 误拒率:你不能过度拒绝。比如有人问"我该怎么杀掉一个 Python 进程?",如果机器人说"我不能让你杀任何东西",用户会非常恼火。
数据规模上,通常是几千到几万条示例。例如 Llama 2 里,这个过程大约用了几千条示例。
Tulu 3:一个相对可参考的后训练管线
(参考时间: 00:30:30)
如果只讲到这里,会让人不太满意,所以老师补充了细节。他认为如果你想看现在后训练怎么做,目前唯一好的参考大概就是 Tulu 3——Allen AI 为 Olmo 系列模型做的后训练管线。在普遍缺乏细节的现状下,这是少数能看到一个表现相当好的后训练管线在运转的地方。
它有安全组件,总共约 5 万条示例。它们都遵循一个相当简单的 SFT 数据生成策略:
- 在一个早期项目里,他们做了一个叫 WildChat 的东西:给一批人免费的 API / 聊天访问,换来他们在这些聊天里干了什么的数据;
- 由此,他们能大规模挖掘用户在这些聊天界面上尝试的不安全行为,以及人们尝试的越狱(jailbreak);
- 然后构造偏好回答:一种情况下是抵抗越狱,另一种情况下是拒绝。非常直白的做法。
老师认为,从各闭源公司的技术报告和模型卡看,类似的事情也在发生:你看使用信息、发现不安全行为、让标注员和这些坏行为打"地鼠游戏(whack-a-mole)"。
少样本就能 steer:一个反直觉的发现
(参考时间: 00:32:15)
最后一点,与前面"你需要多少 SFT 数据"相关,也是没玩过 SFT 的人会吃惊的:如果你的模型足够强,你其实不需要很多示例来 steer 系统。
比如做安全调优:如果你取500 条示例——找到或合成一批不安全的东西,写拒绝回答,喂进系统——你会发现,即便只有 500 条,模型遵循恶意指令、发表仇恨言论的比率也会急剧下降。500 条示例是对模型施加的非常小的一推,却能带来相当不错的、跨类别的安全改进。
一种理解方式是:预训练之后,模型内部已经有一个"我要当安全模型还是不安全模型"的开关,所以不需要很多示例就能把它拉出来。
但也要记住:能 steer 不等于更多示例没好处。如果你像 OpenAI / Anthropic 那样要对"什么安全、什么不安全"做非常细粒度的区分,你仍然需要非常大规模的数据收集。这一点没变。
编者说明:这里"500 条就能显著改变行为"和"细粒度区分需要大规模数据"并不矛盾。前者说的是全局行为的开关(安全 vs 不安全的总倾向),后者说的是边界情况的精确刻画。对初学者而言,可以把前者理解为"改变政策的整体偏置很便宜",把后者理解为"把政策在每一条边界上都校准到位很昂贵"。这也解释了为什么小团队能快速做出"会用、会拒"的模型,却常常在长尾、边缘案例上翻车。
SFT 阶段小结
SFT 最好的状态是:如果你在提取预训练已有的行为——它本来就在预训练里某处——你只想把正确的模式(modes)从模型里拉出来,那么指令微调非常有效:只要数据少而高质量,你就能让模型做你想要的事。
而且:
- 增加数据、或增加事实正确的数据,有时反而有害(至少在幻觉方面);
- 它不需要很多数据,所以你可以聚焦质量而非数量。
编者说明:关于"怎么知道某个行为是不是在预训练里"(有同学提问),老师坦承我们其实并不知道。我们能证明哪些东西不在预训练里——例如某些非常罕见的编程语言,SFT 很难学会;但我们不能证明比如"安全"就一定在预训练里。这正是这门学问"模糊"的地方。老师还提到一点:SFT 与 RL 在"摧毁/保留特征"上的界限其实很模糊,尤其当进入专家迭代(expert iteration)这类"加了花哨功能的 SFT"时,二者的核心区别更像是反馈类型的区别——SFT 是密集的老师监督,RL 是自教(self-taught)的策略监督;而且 RL 强化的是你自己策略产生的输出,所以在"被强化的内容"上偏离不会那么远。
SFT 的方法:其实很无聊
(参考时间: 00:35:55)
方法部分老师只用很短时间讲。在本课程大部分内容里,"方法"是最令人兴奋的部分;但在这里,它几乎是最无聊的——因为你就是做梯度下降,loss.backward() 基本上就完事了。老师放那张图几乎是当笑话用的。
但有一个细微之处很重要:把指令微调并入预训练的日益增长的趋势。
把指令微调混入预训练的衰减阶段
graph LR
A["标准预训练阶段<br/>大量互联网数据<br/>(低质量、通用)"] --> B["衰减 / 中期训练阶段<br/>(decay / mid-training)"]
B --> B1["Stack Exchange QA"]
B --> B2["UltraChat 等 SFT 数据"]
B --> B3["维基、书籍等高质量数据"]
B --> B4["降低通用预训练数据比例"]
style A fill:#e8f0fe
style B fill:#d4edda
过去人们认为预训练和后训练是两个分开的想法:在网页数据上预训练,之后再后训练。但人们意识到:为什么要分开,能混就混。于是大量高质量数据、乃至指令微调数据,现在被混入训练的尾端——通常是训练的衰减(decay)阶段。这让你可以:
- 扩大指令微调的规模;
- 强调更高质量的数据。
其影响非常戏剧性,据老师所知所有人都在这么做。你可以在大多数模型发布报告里看到,存在一个中期训练(mid-training)或"第二阶段预训练",使用不同的数据混合。
老师在这里提了一个他的"个人不满":现在当有人告诉你"这是一个基座模型"时,那基本是句谎话。因为所谓基座模型,通常是说"我在互联网数据上预测下一个词";但今天的基座模型实际上在 UltraChat 之类的数据上预训练过——那些是合成设计的、让你擅长聊天的聊天数据集。所以很难说它还是传统意义上的"基座模型"。
📷 两阶段训练的示意图:左半是标准预训练数据,右半切换到 Stack Exchange QA、UltraChat、SFT 数据等更高质、更健谈的数据,并降低通用预训练数据比例
回到原视频 (00:37:30)
老师以 MiniCPM 的两阶段训练为例(它很好地展示了数据混合的变化):第一部分是非常标准的预训练阶段,左边全是各类互联网数据;右边则切到更高质量、也更健谈的数据集——Stack Exchange QA、UltraChat、各种其他 SFT 数据,并降低了标准通用预训练数据的比例。
关于衰减阶段的数据质量(同学提问):直觉上你要的是相反的——衰减是训练中最重要的部分,因为: 1. 它最接近部署(在预训练范围内); 2. 它是学习率最低的部分。
所以也许你想把最高质量的东西放进衰减阶段。书籍、维基、Stack Exchange 通常都被认为是高质量数据。
关于数据混合怎么定(同学提问):既对预训练也对后训练而言,数据混合都是非常试错(trial and error)的。确实有算法(很多人写过相关论文),但老师认为它们相当不可靠,这个领域有大量的试错与直觉。
中期训练的好处是:它比完整预训练短得多。所以做中期训练的数据混合优化时,你可以在每一个"左边"配置(完整预训练)上跑大概 10 次这样的中期训练。这让你虽不能"暴力破解"这个问题,但能做很多消融。
通常的做法是:在衰减阶段做大量数据消融——它们便宜——然后得到数据质量估计,再把结论反映回第一阶段(预训练)的混合。也就是说,为了决定预训练混合,你常常在衰减上跑一堆消融,再回头决定怎么设置预训练混合。你为什么不能把预训练全设成高质量?因为你没有那么多 token——如果你让维基百科成为整个预训练语料,你根本不够用。
编者拓展|"混合怎么定"的一个真实例子 老师提到一个被泄露的有趣例子:当 Meta 因使用书籍被起诉时,法庭文件里有一堆文档,展示了研究者做消融、估计各个书籍子集有多大用处。这正是这类事情的真实做法:你先消融一个领域,对"哪个消融影响最大"做排序,再决定放什么进去。这既是数据混合的"方法论",也说明了为什么它更像统计工程而非纯理论。老师也强调,从"消融的下游差异"到"具体混合比例"这一步,很多是有系统性方法(比如拟合模型)但往往很脆。
从 SFT 到 RLHF:一个重要的概念区分
(参考时间: 00:42:05)
SFT 讲完了,算法部分很短。现在进入 RLHF——第二阶段。我们不再做监督微调,而要做一件和预训练很不一样的事:根据评分者(或有时是奖励模型)判断回答有多好,来上/下加权不同的模型输出。
但在进入算法之前,老师特意在概念层面停下来,讲一个他认为相当重要的区别。
graph TD
subgraph "拟合一个分布 (SFT / 预训练)"
A["有一堆序列<br/>预测下一个词"]
A --> A2["用你的'生成式建模大脑'<br/>去拟合某个分布"]
end
subgraph "最大化一个奖励 (RLHF)"
B["有一个策略 π"]
B --> B2["找到使下游奖励<br/>最大化的 π"]
B2 --> B3["我不在乎是否模仿了<br/>某个分布"]
B3 --> B4["我可以把分布<br/>坍缩到每个输入的单点!"]
end
style A fill:#e8f0fe
style B fill:#d4edda
style B4 fill:#fff3cd
- 预训练中:我们在做某个序列的生成式建模。有一批序列,你试图预测下一个词。
- SFT 也一样:你改变了分布,但仍然在预测下一个词。所以你可以用"生成式建模的大脑"去想它——纯粹是个生成式建模问题,你只是去拟合某个分布。
- 到了 RLHF(第二部分):我们就不再玩"拟合分布"的游戏了,而是在玩"最大化奖励"的游戏。我们想找一个分布(这现在是一个策略),使这个策略最大化某个下游奖励——这个奖励可能是"用户在你平台上的停留时长",可能是"你能解出多少数学题",总之有某种奖励。
- 关键点:我不在乎是否模仿了某个分布。在第二种世界里,我可以把分布完全坍缩成每个输入的一个单点——对每个 prompt,模型只给一个答案,而非一个分布——只要它能拿到好奖励,这完全 OK。
这是一个非常重要的概念区分,老师在进入后续内容前特别点出。
为什么需要强化学习
(参考时间: 00:44:05)
为什么我们要做强化学习,而不是永远收集 SFT 数据?一个重要的理由是:当我们试图优化"人类想要的"时,他们"说的想要的"和"他们实际生成的"之间有时存在巨大差异。
老师放了一个他一直觉得很逗的旧例子:他们让一批自由撰稿人总结新闻文档。结果发现,有几位标注员实际上更喜欢某个模型(ChatGPT 的前身)的输出,而不是他们自己写的。这很奇怪,于是他们去追问:"你们怎么不认真标注?"
他们回答:"我看了看,觉得 AI 写得确实挺好的。" 原来这些是职业写手,他们写得很好、质量很高(他们检查过质量);但当他们自己看到 AI 的输出时,会说"哦,我没想到这其实是更好的做法"。也就是说,人并不是最优系统。所以当人做判断时,结果可能不同。
正因为存在这个差距,你有时想让人去"评价输出",而非"生成演示"。
另一个理由:在某些领域,验证比生成容易得多。数学是典型例子(下一讲会谈得更多)——验证一个证明大概比生成一个证明容易得多。像 DeepSeek 做的一些工作就沿着这条路,用模型做自验证(self-verification)。这也是"用强化学习、让模型评判自己"是好主意的另一个场景。
编者说明:这里老师明确说,本讲不讲 RLVR("带可验证奖励的强化学习"),那是下一讲、也是另一个天地。下一讲会讲推理模型的激动人心之处,本讲则专注 RLHF。RLHF 有不同组成部分,老师会先讲数据(怎么收集),再讲算法(两大算法家族),最后讲一些坑。
RLHF 的数据收集
(参考时间: 00:46:22)
RLHF 的高层做法是:SFT 之后我们有一个不错的、能遵循一些指令的模型。现在把 prompt 喂进模型,模型采样出几个不同的输出——通常用 temperature 1 采样即可,因为 SFT 结束时模型还相当多样。然后:
graph TD
A["SFT 后的模型"] --> B["输入 prompt<br/>temperature=1 采样"]
B --> C["生成多个不同输出"]
C --> D["评分者对输出做<br/>排序 (ranking)<br/>有时是二元对比"]
D --> E["训练一个奖励模型<br/>(reward model)"]
E --> F["用标准 RL 技术<br/>最大化奖励模型给出的分数"]
F --> G["RLHF 更新后的模型"]
style D fill:#fff3cd
style E fill:#d4edda
评分者对这批示例打分、给出排序(有时甚至是二元排序,即"A 比 B 好")。然后基于这些排序训练一个模型(奖励模型),再用标准强化学习技术去最大化那个奖励模型给的分数。之所以走奖励模型这一步,是因为训练一个"验证者(verifier)"可能比直接训练一个"表现好的模型"更容易。
数据是怎么标注出来的
一般做法是成对评分(pairwise ratings)。
📷 成对评分标注界面:给出两个 AI 回答,标注员选择回答一或回答二更好
回到原视频 (00:47:26)
如果你真想深入研究真实公司的做法,老师建议去看 InstructGPT 的附录——这是我们最后一次能窥见工业界数据收集流程。
在 InstructGPT 的例子里,他们要求标注员按三个维度评价输出:有用(helpful)、真实(truthful)、无害(harmless)。
- 有用:表达是否清晰、是否对国际性敏感、是否避免过长回答等;
- 真实:不要胡编(幻觉);
- 无害:如果不安全,要指出来;要上加权那些对可疑 prompt 拒绝回答的回答。
这三个目标合起来,是训练聊天机器人的一个"大杂烩式综合目标"。
同样,Google Bard 的标注(被标注员泄露)结构非常相似——要求有用性、回答呈现要好。不过他们用的是 Likert 量表而非成对反馈。指令集不算很长,但你能感受到包括哪些内容——比如"不能含不准确信息""要连贯""要易读、对用户来说要短"。
编者说明:InstructGPT 的"有用、真实、无害"三维度,后来成为众多 RLHF 标注指南的事实模板。值得注意的一个内在张力:这三个维度彼此可能冲突(例如对一个危险问题,最"有用"的认真回答恰恰最"有害"),因此 RLHF 本质上在优化一个近似的、多目标折衷的标量奖励,而非单一的"正确"目标。这也是后面"过度优化""奖励黑客"问题的根源之一。
标注员的演变:更专业、更昂贵
(参考时间: 00:49:12)
总的来说,老师观察到一个大趋势:标注员的分布正在上移——更偏向专家、成本更高。这在薪酬上也能看出来。
📷 Scale AI 平台上标注员的学历分布:相当大比例拥有学士或硕士学位
回到原视频 (00:49:40)
以 Scale AI 平台的数据为例(不一定代表全部,但是一个合理子集):很大一部分标注员拥有学士或硕士学位,大概占这些标注员的七成多;众数年龄约 35 岁;他们做的任务往往是创意写作、技术写作等。
这还只是迈向专家的一步。过去一两年,还出现了定制化标注员(bespoke annotators)的增长,因为很多实验室正在把这些系统部署到真正的白领工作中。于是你想要医生、律师来标注回答、来给 SFT 数据。这些公司(如 OpenAI)内部有这样的项目,标注员按小时获得相当可观的报酬:
- 看中位工资,在各种主题上都高于 50 美元/小时;
- 看专家,有些人被支付上百美元甚至更多来做标注。
所以,如果你脑中"标注员"的形象是"某个海外的、低成本的、做成对反馈的人",那不是全貌。现在有大量非常定制、非常昂贵的标注在发生。但——它也是一个金字塔:低成本、可扩展的标注并没有消失。
数据收集为什么这么难
(参考时间: 00:51:22)
老师强调:拿到这类数据实际非常困难。这就是报酬高的原因,也是为什么有这么多数据收集创业公司。他认为现在的硬挑战是:
- 拿到可验证的标注员,尤其要确保他们没有在用 AI。如果你最近做过问卷研究或众包,你肯定发现有人在用 ChatGPT 回答问题或完成标注工作。阻止这一点极其极其困难。
- 在时间压力下拿到真正正确的回答。例如前面 Google Bard 的例子,那还牵扯到一场劳资纠纷——标注员说:我们得在一分钟内检查这些长聊天回答的正确性,这不可能做得到,我们绝无可能真正遵循这些指令。
- 专家数据在增长,但低薪标注群体依然庞大。Scale AI 早期做了不少这种外包低成本的标注,也惹了不少麻烦。就像现代经济有高低薪的两极分化,标注领域也出现了同样的情况。
标注员人口统计学的影响
(参考时间: 00:53:00)
老师特别强调一点:标注员对模型行为有惊人的影响力。后训练在某种意义上是对模型出厂前的最后一道塑形。所以如果你不精确控制标注员怎样 steer 模型,如果标注群体本身有偏见,你可能得到相当令人惊讶的行为。
老师讲了他和一位博后(在 Percy 与他之间)在指令微调早期做的一项研究:他们问语言模型一些标准民调问题,看它们最接近哪个人口统计群体。
- 基座模型(各种类型)在观点上更像 新教徒或罗马天主教徒,而远离佛教徒或印度教徒;
- 一旦后训练这些模型(右三列),它们就离新教徒和罗马天主教徒更远,变得更像佛教徒、印度教徒和无神论者。
他们当时很惊讶:"为什么是这三组?" 后来看 InstructGPT 论文附录,找到给这些模型做标注的标注员——正好对得上:大量东南亚人,以及美国西海岸的人,大致就是对应这几组人口统计。annotators 是谁,模型就像谁。
另一个补充:近年来有大量发现表明非常细微的偏差可以通过数据传递。一个例子是 emergent misalignment(涌现性错位):如果你有一份数据来自一个被训练成"我喜欢猫头鹰"的模型,你用这份看起来无害的数据去训练另一个模型,被训练的模型竟然会继承对猫头鹰的偏好。这类潜意识的迁移(subliminal transfer)效应很难察觉,要非常非常小心。
老师也坦承:整个"语言模型政治观点"这类研究有时相当脆弱和可疑。但标注员分布对模型可能犯的更实质的错误也很重要。
📷 Hosking 等人的研究:非专家众包标注更强调格式效应(红色),专家标注更强调事实性和不一致性
回到原视频 (00:55:45)
老师引用了一项他很喜欢的、由 Hosking 等人做的研究:他们对比真正的专家标注员(真心把活干好的人)与随机众包工人的标注差异。结果很显著:
- 非专家(平台上按件计酬的)喜欢强调格式效应——看这一行红色的,在非专家标注里被过度富集;
- 而事实性(factuality)或不一致性(inconsistency)这些在专家标注里被强调得多得多。
当然,测试事实性要难得多,所以不难理解:没有专家,你就不会真正去检查这些。这是标注员分布影响结果的又一种方式——不是人口统计学,而是他们有多在乎、以及他们的专业是什么。
关于"标注员质量"如何衡量(同学提问):老师认为不存在一个金标准规则能机械地判定"你是好标注员"。他给了两种思路: 1. 一份足够详细的标注指南应当(希望是)半客观的。例如你说"要符合事实",然后定义什么算事实,你甚至可以给出客观标准——比如"谷歌搜索前三页里找不到与之矛盾的内容"。如果标注员违反了指南,你就能说"你没遵守规则"。这是"好标注员"的一种定义。 2. 标注者间一致性(inter-annotator agreement)。它讲的是一组标注员的方差。问题在于:它不告诉你偏差(bias),只告诉你方差。而且有些任务天然有方差——"你喜欢这个吗?"方差就很大,一致性指标没用;"它符合事实吗?"方差应该更低,但即便为零,你也不知道你是否问对了问题——或者如果大家都用 ChatGPT 答,方差也会是零。所以即便有办法逼近这个问题,评估标注质量仍然非常困难。
关于"为什么招专家"(另一个同学追问):老师认为后者(某些任务只有专家能做)才是主因。比如你可能需要律师来判断一个 Bluebook 引用是否正确,这需要相当训练;还有各种默会知识(tacit knowledge)是你要提取的。当然,平台整体也在往更高质量标注员移动,即便对通用任务——很大原因是 LLM 变强了:如果你不现场监督,人们就会用最便宜的 LLM 生成看起来像样的答案。所以很多标注机构的卖点就是:"我们有真人干真事,我们会替你验证这是真的。"
基于模型的标注:一切走向蒸馏
(参考时间: 00:59:30)
有同学问:"用领域专用模型做标注有什么问题?" 老师拆成两个问题:
- 领域专用模型好不好? 有时候你很难拿到比强开源模型更好的领域专用模型,所以他不认为用领域专用模型标注有独特优势;
- 该不该用模型标注数据? 在总体上,基于模型的标注是好主意。如果你不在前沿,你想做的只是追赶前沿,那模型标注非常好——现代模型大概比你能找到的随机众包工人强得多。
于是老师顺势进入"基于模型的标注":
📷 LM 生成标注与人类标注对比:排序和一致性都相当好,成本低一个数量级
回到原视频 (01:00:20)
如果你看各类 LM 生成的标注,会发现这些模型出奇地好。GPT-4 出现时,老师和学生把 GPT-4 的标注与精心策划的人类标注做了对比:
- 比较系统排序,相当好;
- 比较人与模型之间的一致性(modes / 一致性),也相当好;
- 而成本要低一个数量级。
在 GPT-4 时代刚做这些时,还不清楚事情会往哪走——开源世界会走向昂贵的人类标注,还是一切都变成对更强模型的蒸馏?
几年过去了,答案已经清楚了:如果你只想追赶前沿能力,那人类收集的数据基本没有空间。老师讲了一个他觉得很有指导意义的例子:Hugging Face 想做开源模型 Zephyr 时,一度非常想完全不用任何模型蒸馏——不用任何模型标注、模型数据,而是花大量时间精力收集人类数据。他们去了 OpenAI 等公司也用的同一批供应商收集人类数据,结果发现:极其耗时、昂贵,而且结果并不比用模型标注更好。最终他们还是用了模型反馈。
这件事很有指导意义:他们用自己没有的资源认真试过,但最终还是用了 AI 反馈。情况一直如此:
- 对 SFT 和 RLHF,UltraChat、UltraFeedback 这些模型生成的数据现在非常标准;
- Tulu 3——老师提到的"旗舰级开源后训练流程"之一——其整条管线都使用模型标注。
所以,"是否用模型标注"的结论大体就是:用。模型很擅长遵循指令、非常可扩展,你可以收集你想要的正确类型的数据。当然,如果你想推动前沿,除了在有限情形下,你就不能玩这些游戏——你仍然非常依赖人类驱动的数据收集。
编者说明:老师也提醒,模型标注有个隐患——模型容易沾染和人类一样的偏见,有时甚至更严重。见下一段。
模型也有偏见:长度刷分的证据
(参考时间: 01:04:30)
模型也非常容易沾染和人类一样的偏见,有时甚至更严重。在模型生成数据这波浪潮出现后,有若干研究表明:
📷 长度刷分实验:把回答长度推得很长,模型评判的胜率就会持续上升
回到原视频 (01:05:10)
- 你只要把回答长度推得很长,模型评判的胜率就会持续上升。图中一个"离群点"是 ChatGPT-3.5——它表明"有些模型是真的更好,而不只是靠长度刷分"。
- 另一个很好的论文表明:你可以只在"长度"上进行 RLHF,就能在很多基准上表现相当好。
因此,模型标注虽然好用,但它会系统性地放大"长度"这类表面信号。
RLHF 数据小结
总的来说,这就是数据的故事:谁在收集数据、要警惕哪些事。老师用剩余时间讲算法。他只简略讲 PPO(既因为时间,也因为下一讲会更详细地处理),然后重点讲 DPO——"那个又酷又有趣的部分"。
RLHF 算法:从 PPO 到 DPO
目标:在策略下最大化奖励
(参考时间: 01:05:40)
记住我们现在处在 RLHF 阶段。目标是:在我的策略下,最大化我从该策略采样所得到的奖励。这是"婴儿级强化学习"——有人会说我们在玩"多臂老虎机(bandits)",这并不是真正的多轮、有趣的 RL。大致如此,所以我们的算法也会很简单。
这个"最大化奖励"的目标几乎原样出现在 InstructGPT 论文里。翻到公式 (2),你会看到我写下的那种形式:从 RL 策略采样,最大化奖励,s.t. 第二项——它其实就是一个 KL 散度。它说的是:我想和我的预训练模型保持接近,因为我不想走太远而变得退化(degenerate)。
用数学写出来:
$$ \max_{\pi_\theta}\ \mathbb{E}_{x \sim \mathcal{D},\ y \sim \pi_\theta(\cdot \mid x)}\big[\, r(x, y) \,\big] \;-\; \beta\, D_{\mathrm{KL}}\!\big(\pi_\theta(\cdot \mid x)\,\|\,\pi_{\mathrm{ref}}(\cdot \mid x)\big) $$
其中 $r(x,y)$ 是奖励(可来自人类的成对偏好),$\pi_{\mathrm{ref}}$ 是参考模型(通常就是 SFT 后的模型),$\beta$ 控制"别走太远"的力度。
在 Stiennon 等人的论文里也是同一件事。那篇里,奖励是一个成对反馈模型:你训练一个二元分类器,判断一对示例中哪个更好,然后在这个奖励上爬坡(hill climb)。结构非常简单。
策略梯度:看起来就像加权 SFT
(参考时间: 01:07:15)
怎么爬坡?用一个叫 PPO 的算法。如果你上过 RL 课,你当然知道 PPO;如果没上过,老师给了一个"婴儿版"描述(而且作业里也要理解它)。
最基础的起点是策略梯度恒等式(policy gradient identity)。我要最大化从策略采样的奖励,怎么优化?机器学习里一切都是梯度下降,所以取梯度:
$$ \nabla_\theta\, \mathbb{E}_{y \sim \pi_\theta}\big[r(x,y)\big] = \mathbb{E}_{y \sim \pi_\theta}\big[\, r(x,y)\, \nabla_\theta \log \pi_\theta(y \mid x) \,\big] $$
右侧就是"取对数概率的梯度,用奖励加权"。这看起来就像 SFT,只不过样本是加权的。
但策略梯度有个问题:每次想做一个优化步,就得采样一次。而采样非常昂贵——我们在系统部分讲过,推理往往复杂而困难,而训练是算术密集、很爽的。所以我想只 rollout 一次,然后复用多次。这就是所谓的 off-policy。
graph LR
A["策略梯度<br/>Policy Gradient"] -->|需要每次采样<br/>太贵| B["Off-policy<br/>一次 rollout, 多次复用"]
B -->|不能走太远<br/>否则奖励估计爆炸| C["TRPO<br/>带距离约束"]
C -->|约束难处理| D["PPO<br/>启发式裁剪 clipping"]
D -->|公式依然繁琐| E["DPO<br/>更简单, 像 SFT"]
style A fill:#e8f0fe
style D fill:#fff3cd
style E fill:#d4edda
- 做 off-policy,你想多走几步,但别走太远——因为走太远,你对局部奖励的估计会爆炸。这叫 TRPO。
- TRPO 的想法是:我要做策略梯度,但要靠近当前位置。为此做一个叫重要性加权修正的东西。
- 最后 PPO 说:TRPO 是好想法,但那个距离约束其实很难处理,所以我做一个启发式的裁剪(clipping),去阻止 RL 算法走到离原始策略太远的地方。
具体细节下一讲讲,不必现在担心。但主线的推进你要大致理解:策略梯度 → off-policy → PPO。
能不能干掉 PPO?
PPO 的公式看起来已经有点"难看"了。所以很多人多年来一直在问:能不能摆脱 PPO? 很多人想过很多好办法。老师把这些失败的尝试讲出来,是为了让同学别在自己的研究里重蹈覆辙:
graph TD
R["能否摆脱 PPO?"] --> A1["方案1: 对'好'样本前缀 good token,<br/>对'坏'样本前缀 bad token<br/>生成时只加 good"]
R --> A2["方案2: 只在'好'样本上训练"]
R --> A3["方案3: 用奖励模型筛选输出,<br/>只在筛选出的好样本上训练"]
A1 --> F1["❌ 不work"]
A2 --> F2["❌ 效果不好"]
A3 --> F3["⚠️ 有点用, 但不够好"]
style F1 fill:#f8d7da
style F2 fill:#f8d7da
style F3 fill:#fff3cd
- 把 RL 化简为 SFT:对"好"的那条样本前缀一个 good token,对"坏"的前缀一个 bad token;生成时只用
good前缀,模型就只生成好东西。不 work。 - 只在好样本上训练:也不太 work。
- 训练奖励模型、取 LM 输出、只挑奖励模型选中的来训练:也不太好用,虽然多少有点用。
很多人试了很多迭代。最终,我们确实有了一个比 PPO 简单得多、效果相当好、而且在很多方面看起来就像 SFT 的东西——这就是 DPO(Direct Preference Optimization,直接偏好优化)。
DPO 的推导
(参考时间: 01:10:20)
DPO 的算法非常简单。我们要去掉 PPO 里复杂的部分:
- 去掉奖励模型;
- 去掉一切和 on-policy 有关的东西。
去掉这两样,就能做出一个简单得多的 RLHF 算法。它依赖一个非常简单的直觉:深度学习里一切都是朝"好东西"的方向走梯度步。所以我们朝"好样本"的对数损失取梯度步,朝"坏样本"取负梯度步——换句话说,对任何坏东西的对数概率取反。
这是你能想到的最朴素的做法:一边做 SFT,一边对坏东西做"负 SFT"。结果发现:如果你恰当地给这两者加权,你会得到一个实际上相当好的算法。 老师给出了推导,因为全都非常简单。
推导步骤如下:
第 0 步:回顾目标。第一项是策略 $\pi_\theta$ 下的期望奖励,第二项是 KL 距离——我要让策略保持在参考模型附近(那是我预训练出来的)。
$$ \max_{\pi}\ \mathbb{E}_{y \sim \pi}\big[r(x,y)\big] - \beta\, D_{\mathrm{KL}}\big(\pi(\cdot\mid x)\,\|\,\pi_{\mathrm{ref}}(\cdot\mid x)\big) $$
第 1 步:做一个强假设——假设策略 $\pi$ 压根不是神经网络,而是所有可能的策略的集合,是一个非参数的东西,能逼近任何函数。
第 2 步:如果 $\pi$ 可以是任何东西,那上面那个问题就能解析求解!我知道最小化者是谁:
$$ \pi^*(y \mid x) = \frac{1}{Z(x)}\, \pi_{\mathrm{ref}}(y \mid x)\, \exp\!\Big( \tfrac{1}{\beta}\, r(x, y) \Big) $$
也就是说,最小化者是把参考策略按奖励做指数倾斜:每个回答按 $\exp(\tfrac{1}{\beta} r)$ 上下加权。这非常合理——奖励很差就指数级下压,奖励很好就指数级上压。
第 3 步:既然知道了这个"完美解" $\pi^*$,我们可以反解出隐含的奖励 $r$。把 $\pi$ 移到左边,解出奖励:
$$ r(x, y) = \beta \log \frac{\pi(y \mid x)}{\pi_{\mathrm{ref}}(y \mid x)} + \beta \log Z(x) $$
第 4 步:把这个隐含奖励代回原始 RLHF 目标,就得到 DPO 目标。标准形式(用成对偏好 $(y_w, y_l)$,$w$ 表示获胜、$l$ 表示落败)为:
$$ \mathcal{L}_{\mathrm{DPO}}(\theta) = -\,\mathbb{E}_{(x, y_w, y_l)}\!\left[\ \log \sigma\!\Big( \beta \log \tfrac{\pi_\theta(y_w \mid x)}{\pi_{\mathrm{ref}}(y_w \mid x)} - \beta \log \tfrac{\pi_\theta(y_l \mid x)}{\pi_{\mathrm{ref}}(y_l \mid x)} \Big)\ \right] $$
其中 $\sigma$ 是 logistic 函数。
编者拓展|为什么归一化项 $Z(x)$ 会消失 上面第 3 步里的 $\log Z(x)$ 只依赖于 prompt $x$、不依赖于具体回答 $y$。在 DPO 的成对比较中,两项 $\log Z(x)$ 完全相同、相减抵消。这正是 DPO 能"不需要奖励模型"的关键:只要奖励能用同一条 prompt 下两个回答的相对优劣表达出来,就有 $\log Z(x)$ 消掉,从而绕过显式的奖励建模和 RL 采样。
老师给出了他认为最直观的 DPO 形式——它的梯度:
对每一对标注过的样本: - 提高获胜样本的似然; - 降低落败样本的似然; - 步长由"隐含奖励模型错得有多离谱"来缩放。
也就是说:
- 如果模型已经给获胜样本很高奖励——就迈小步;
- 如果模型错得离谱(给两者几乎相等的概率)——就迈大步。
所以步长由概率差决定,作用在"差分对数概率目标"上。老师希望这样解释后,这个梯度目标的作用对大家就一目了然了。
这确实比 PPO 简单得多——你现在只是取梯度,而我们现在都知道怎么用标准流程取梯度。
DPO 够用吗?——与 PPO 的对比
(参考时间: 01:14:35)
DPO 效果相当好。曾有一段时间,人们非常执着于"DPO 是不是比 PPO 好、或者反过来"。老师认为现在的答案是:除非你在一线训练最好的模型,否则也许没那么重要。DPO 相当好,"对 Llama 够用,对我也够用"。
如果你打开 Llama 技术报告,会发现他们有一个不错的外层循环:模型先 SFT,然后 DPO,再用这个 DPO 模型生成候选、做拒绝采样(rejection sampling),然后重复这个过程。所以外面套了一个外层循环,但Llama 的核心 RLHF 原语就是 DPO。
过去一年里出现了很多 DPO 变体:
- SimPO:改变了加权方式,用 $\frac{1}{|y|}$ 之类的归一化替代 $\pi_{\mathrm{ref}}$;
- 长度归一化 DPO:按长度归一化,以避免某些长度刷分问题。
但老师认为,这些变体也许都没那么重要。
他说,一个他觉得很值得注意的现象是:这些结果非常依赖实验设置的具体细节。即便在 AI2,也曾有一篇论文说"从 DPO 换成 PPO 会得到更好结果",但又有一篇 Tulu 2 的论文说"如果你把 DPO 做对,可以比 PPO 更好"。所以取决于你怎么执行,一个可能比另一个更好。老师相信大家读深度学习论文时也有类似体验——结果非常脆弱。
所以也许这一大堆的收获是:这些 DPO 变体,其实已经足够接近正确的东西,在多数情况下能给出相当好的表现。其核心思想——朝好方向取梯度步、对坏东西取负梯度步——只要把步长设对,就相当好用。
RLHF 的两大陷阱
(参考时间: 01:16:35)
老师用最后几张幻灯片讲 RLHF 里要小心的事。
过度优化
这是最大的一件事。
历史背景:InstructGPT 出来时,人们非常兴奋,于是有一个很真实的问题——我们能不能靠 RLHF 一路冲到超级智能? 也许我们只要收集足够多的"赞/踩"就行了。结果发现这其实相当有挑战,因为:如果你试图把 RLHF 过程推得很猛,你会开始过拟合你学到的奖励模型。
正因如此,我之前讲的那个 KL 正则项在许多情况下非常关键——它阻止你的优化过程过拟合你的奖励模型(至少当你的优化过程很强时)。
graph LR
A["真实人类偏好"] -.近似.-> B["学到的奖励模型<br/>(reward model)"]
B --> C["RL 优化<br/>π 最大化奖励"]
C -->|优化越猛| D["过拟合奖励模型<br/>真实表现反而下降"]
C -->|KL 正则| E["防止过度优化<br/>保持在参考附近"]
style D fill:#f8d7da
style E fill:#d4edda
编者说明:"过度优化(over-optimization)"是奖励黑客(reward hacking)的经典表现:奖励模型只是人类偏好的有偏近似,一旦策略被推得足够远,就会钻那些"奖励模型高估、但人类并不喜欢"的空子。KL 正则项的作用,是限制策略偏离参考模型的程度,从而间接限制它钻奖励模型漏洞的空间。这也是"RLHF 不能无限刷"的根因。
模式崩溃与校准
(参考时间: 01:17:22)
另一个是模型崩溃(model collapse)。人们多次看到:RL 模型的多样性大幅下降,集中在少数几个可能输出上。这回到我前面讲的:RLHF 模型不再是在建模一个分布(分布本身自带固有多样性),而是一个策略——只要拿到好奖励,它就可以坍缩。所以 RLHF 模型近年来在这件事上很挣扎。
📷 RLHF 后的校准曲线:模型变得不校准,这是 OpenAI 当时列出的少数开放问题之一
回到原视频 (01:17:23)
老师说,熵与模式崩溃这件事至今仍相当重要。GPT-4 时代其实是 OpenAI 少数几处列出"我们还剩哪些开放问题"的地方之一,其中一个就是:"我们模型在做完 RLHF 后是不校准的(uncalibrated)"。你可以在图中看到。老师认为至今没有人真正解决它。Anthropic 的人也提出过论证:它天生就是不校准的,有时能重新校准,但不总是。
这一点在下一讲会非常重要——当我们谈 RLVR 时,熵和探索对于模型探索所有可能解、在一些极难问题上取得进展是至关重要的。
编者说明:为什么"模式崩溃 / 熵下降"对推理模型是关键问题?因为推理(尤其 RLVR)依赖模型在探索阶段产出多样化的中间路径,才可能在难题上偶遇正确解法并获得奖励。如果策略过早坍缩到单一短路径,探索就停摆。所以"如何维持熵 / 如何探索"与"如何校准"在这里是同一枚硬币的两面,也是下一讲 RLVR 的核心张力之一。
本讲总结
(参考时间: 01:18:50)
把一切串起来:
graph TD
P["预训练<br/>(基础, 原始汤)"] --> S["SFT<br/>(数据为王)"]
S --> R["RLHF<br/>(PPO / DPO)"]
R --> X["下一讲: 推理模型 / RLVR"]
S -.关键点.-> S1["质量 > 数量<br/>小心尾知识与幻觉"]
R -.关键点.-> R1["数据收集难<br/>PPO 复杂, DPO 够用"]
R -.陷阱.-> R2["过度优化 / 模式崩溃"]
style P fill:#e8f0fe
style S fill:#fff3cd
style R fill:#d4edda
style X fill:#c3e6cb
- RLHF 的数据收集也非常难。后训练之所以是个复杂杂乱的过程,很大一部分在于它要拿到好数据,而拿到好数据总是非常困难。
- RLHF 算法相当复杂,PPO 尤其难(下一讲会再讲一点)。幸好我们还有一个更简单的变体 GRPO 效果不错——你的作业里会用到的就是它。这是一个近期有很多发展的领域。
- RLHF 的一个大问题是过度优化。
- 下讲的过渡是:有没有一些奖励,我们不会过度优化它? 我们能不能只管堆算力,模型性能就单调地持续变好?这正是 RLVR(可验证奖励强化学习)如此有影响力的原因之一。
编者说明:老师最后一句"Thanks, see you all Thursday."是下课语。整讲从"预训练 → 后训练的动机"讲到 SFT 数据史、SFT 的坑、方法上的"中期训练"趋势,再转到 RLHF 的数据、概念区分、PPO → DPO 算法,最后落在过度优化与模式崩溃两个陷阱,并以 RLVR 作为下一讲的悬念。建议读者把这张总结图当作复习锚点:SFT 阶段记"质量 > 数量 + 尾知识幻觉";RLHF 阶段记"概念区分(拟合分布 vs 最大化奖励)+ DPO 的直观梯度 + 两个陷阱"。
附:参考与延伸阅读
编者补充
- Learning to Summarize from Human Feedback
- Alpaca
- Alpaca Eval
- Claude Code
- Codex
- FLAN
- HH 论文
- John Schulman
- Nemotron
- Olmo
- Open Assistant
- Self-Instruct
- SimPO
- T5
- Tulu 3
- Vicuna
- YouTube 链接
- Zephyr
已知疑点
本节集中列出本讲重构过程中不确定、听不清、或讲师表述含糊之处,供读者自行判断,也方便对照原始视频。
- 专有名词的听写与拼写:
- 老师提到的"Flon / FLAN",字幕写作 "Flon",但显然是 FLAN(Fine-tuned Language Net)。
- "Tulu 3 / Tulu 2",字幕中为 "Tulu",即 Allen AI 的 Tülu 系列;本讲正文统一写作 Tulu 3 / Tulu 2。
- "WildChat""UltraChat""UltraFeedback""Alpaca Eval""Nemotron"等,均按常见公开写法规范;字幕个别时刻拼写不完整。
- "minute CPM / MiniCPM",字幕作 "mini CPM",指 MiniCPM。
- "Stiennon et al."(字幕 "Stiennon"),指 Stiennon 等人 2020 年的 Learning to Summarize from Human Feedback。
- "John Schulman",字幕作 "John Schulman",即 PPO 的作者之一。
-
"Hosking et al.",字幕 "Hosking",指一项对比专家与众包标注的研究;具体论文出处本讲未给出,正文仅按讲师所述转述,未能核实到确切论文标题。
-
数字类:
- Open Assistant 的数据量,老师原话说"我记不清是 1 万条还是更多",正文据此谨慎表述,未给出确切数字。
- Llama 2 安全 SFT 的示例数,老师原话是"a few thousand",正文写作"几千条示例"。
- Tulu 3 安全组件规模,老师原话说"约 5 万条(50-ish thousand)",正文写作"约 5 万条"。
- 标注员学历比例,"七成多(70 some percent)",正文写作"七成多"。
-
专家标注时薪,"上千美元甚至上百美元"——老师原意是"上百美元甚至更多(more than $100)",正文据此修正为"上百美元甚至更多",此处字幕可能造成"上千"的误读,以正文为准。
-
讲师表述模糊或存疑之处:
- "尾知识"没有形式化定义——这是老师本人明确承认的(见正文),不是编者遗漏。教师用"维基百科文章长度"作为知名度的代理指标,属于他过往工作中的做法,并非公认标准。
- "SFT 是否摧毁特征、RL 是否删除特征":有同学提问后,老师回答两者界限"很模糊",尤其涉及专家迭代时;这段讨论他讲得较简略,正文按原话保留,未做理论补强。
- RL 为什么能减少幻觉:老师明确称之为"民间故事(folk story)",是一种直觉性解释,非严格论证。正文以"编者拓展"标注了其假设性质。
- "基座模型是句谎话":这是老师的个人观点 / "pet peeve",语气强烈,正文按其原意保留,并在语义上注明是老师的判断,而非客观事实陈述。
-
模型标注是否终将完全取代人类标注:老师的结论是"追赶前沿能力"时人类数据"基本没空间",但他同时强调"要推动前沿仍必须依赖人类数据收集"。这两句并不矛盾(针对不同目标),但初读易混,特此点明。
-
视频时间轴:
- 本讲视频总时长约 4794 秒(约 79.9 分钟),最后一段字幕时间戳为 01:19:48。文中所有
(参考时间: ...)与SCREENSHOT占位符 时间锚点均取自字幕时间戳,可能与视频中画面的实际出现时刻有数秒级偏差。 -
本讲插图包含官方 PDF 幻灯片(见文末「附录:官方幻灯片(全部)」)与视频帧;视频帧依据字幕中的"如图所示 / 看这个结果 / 这张图"等画面提示选取,具体画面内容以实际抽帧为准。
-
编者判断存疑处:
- 结尾"RLVR""GRPO 会用在作业里"等表述,来自讲师口头预告,本讲并未展开;正文仅作过渡性提及,未补充 RLVR / GRPO 的技术细节,以免越界到下一讲内容。
- 关于"尺寸 7B 现在很小"那段讨论(字幕 01:03:11 附近),上下文是评价 Hugging Face Zephyr 时的一句插话,字幕较破碎,正文按可辨识语义转述,细节可能不完整。
附录:官方幻灯片(全部)
🖼️ 第 1 页幻灯片 · Lecture 15
🖼️ 第 2 页幻灯片 · The class thus far
🖼️ 第 3 页幻灯片 · Instruction following is a remarkable form of control
🖼️ 第 4 页幻灯片 · Goal today: enable better, tighter controls over LM output
🖼️ 第 5 页幻灯片 · Caveat: post-training information is pretty sparse!
🖼️ 第 6 页幻灯片 · Where today’s lecture fits in
🖼️ 第 7 页幻灯片 · What are the ingredients in SFT?
🖼️ 第 8 页幻灯片 · Training data
🖼️ 第 9 页幻灯片 · Progression of SFT data (in the open world)
🖼️ 第 14 页幻灯片 · What’s varying across these?
🖼️ 第 15 页幻灯片 · What did we notice across the datasets?
🖼️ 第 16 页幻灯片 · Style variations in data and models
🖼️ 第 17 页幻灯片 · When evaluating by preferences, style matters.
🖼️ 第 18 页幻灯片 · What about benchmarks?
🖼️ 第 19 页幻灯片 · References, complex knowledge, and factuality
🖼️ 第 20 页幻灯片 · Knowledge extraction and alignment
🖼️ 第 21 页幻灯片 · Takeaways on knowledge extraction and alignment
🖼️ 第 22 页幻灯片 · Safety
🖼️ 第 23 页幻灯片 · Safety SFT in the wild
🖼️ 第 24 页幻灯片 · Pipeline with most details
🖼️ 第 25 页幻灯片 · Main safety approach – extract scenarios from users
🖼️ 第 26 页幻灯片 · Safety-tuning with just a little data
🖼️ 第 27 页幻灯片 · Putting it together – SFT Data
🖼️ 第 28 页幻灯片 · How to fine-tune
🖼️ 第 29 页幻灯片 · Turning instruction tuning into pretraining
🖼️ 第 31 页幻灯片 · The second part of RLHF
🖼️ 第 32 页幻灯片 · From imitation to optimization
🖼️ 第 33 页幻灯片 · Why optimize? G-V gap
🖼️ 第 34 页幻灯片 · Overview
🖼️ 第 35 页幻灯片 · RLHF Data
🖼️ 第 37 页幻灯片 · RLHF and data – instruct GPT guideline
🖼️ 第 38 页幻灯片 · Another old example – bard annotations
🖼️ 第 40 页幻灯片 · Large variation in compensation
🖼️ 第 41 页幻灯片 · RLHF and data - crowdsourcing
🖼️ 第 42 页幻灯片 · RLHF and data – crowdsourcing ethics
🖼️ 第 43 页幻灯片 · RLHF and data - demographics
🖼️ 第 46 页幻灯片 · RLHF and data - LM-generated
🖼️ 第 47 页幻灯片 · RLHF and data – Self-training
🖼️ 第 49 页幻灯片 · How do we RLHF?
🖼️ 第 50 页幻灯片 · From imitation to optimization
🖼️ 第 51 页幻灯片 · PPO in language modeling
🖼️ 第 52 页幻灯片 · More details and background from Stiennon
🖼️ 第 53 页幻灯片 · PPO – at a conceptual level
🖼️ 第 54 页幻灯片 · Can we get rid of PPO?
🖼️ 第 55 页幻灯片 · DPO – RLHF without tears?
🖼️ 第 56 页幻灯片 · DPO – derivation from the RLHF formula
🖼️ 第 57 页幻灯片 · DPO derivation 2
🖼️ 第 58 页幻灯片 · DPO updates and components
🖼️ 第 59 页幻灯片 · DPO in LLaMA (and other open models)
🖼️ 第 60 页幻灯片 · Variants
🖼️ 第 61 页幻灯片 · But PPO does too (and sometimes better?)
🖼️ 第 63 页幻灯片 · Thins to watch out for - Overoptimization
🖼️ 第 64 页幻灯片 · Things to watch out for - mode collapse
🖼️ 第 65 页幻灯片 · Recap of the lecture