第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"(乱、杂、手工活)。老师直言:

他还特别提醒:算法其实不是秘密武器,杠杆不在算法上,而在数据上。所以整讲的重心几乎全在数据——怎么收集、收集什么、要小心什么。

另一个难点在于信息本身的稀缺。老师明确说:一线实验室的后训练信息"相当稀疏"。他今天引用的很多材料其实很旧(ChatGPT 竞争白热化之前),例如 RLHF 论文 Learning to Summarize from Human Feedback(Stiennon 等)细节极其详尽,甚至包含标注指南;Anthropic 2022 年的 HH 论文 也如此。但竞争升温后,基本没有厂商愿意公开后训练流程——数据是商业秘密。开源配方又大量依赖蒸馏,和一线实验室的人类数据收集"性质很不一样"。

读者可能带着什么疑问进来

① 老师真正提出的问题(按他自己的顺序):

② 编者预判的读者疑问(编者预判,非老师原话):

本讲路线

老师大致这样走:先用约 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)

老师给整讲加了一个前言:关于一线实验室的后训练,公开信息在很多方面都相当稀疏。

老师举了一个他自己做讲座预研时发现的趣例(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 数据集改写成指令格式,指令往往被奇怪地附在末尾

📷 FLAN 数据集示例:把现有 NLP 数据集改写成指令格式,指令往往被奇怪地附在末尾
回到原视频 (00:11:52)

但你立刻会注意到:和 ChatGPT 相比,这些摘要非常短。更仔细看,摘要经常是幻觉的——包含很多输入里没有的细节。

所以关键在于:FLAN 所依赖的原始 NLP 数据集本身质量就不高,训练时你会继承这些数据集的缺陷;而且这些数据集结构的不自然性也会一路传递下去。FLAN 用现有基准造出大数据集,是非常聪明的想法,但不自然性最终会反噬。

老师还补充了 FLAN 的一个历史背景(回到上一张幻灯片):FLAN 构建时,人们对后训练的理解是你需要规模(scale)。预训练需要规模,所以你可能会想后训练也需要大量规模来"解锁"能力。因此他们拿了很多数据集、很多数据,造了一个巨大的数据集。但我们后面会看到,这些数据集后来变得小得多却依然有效。从 FLAN 到后来数据集的核心转变之一,就是认识到:只要有一个足够强大的大预训练模型,你其实可以用很少的高质量示例,因为预训练的泛化会帮你走完相当一段路。所以 FLAN 在质量-数量权衡上,某种程度上站错了点——尽管在当时,不把这片空间探索完,是无法知道的。

Self-Instruct:用模型来生成数据

(参考时间: 00:08:30)

Self-Instruct 及其后续工作也极具前瞻性。它的想法是:为什么不用模型自身来生成数据呢? 模型一直在变好,它们甚至可能比某些标注员还好。为什么不训练模型去写出非常高质量的回答呢?这就是 Self-Instruct 的核心思路。

蒸馏路线:Alpaca 与 Vicuna

(参考时间: 00:08:55)

在此之后出现了一批蒸馏式方法:

Alpaca 数据集示例:输入更自然、输出更长更

📷 Alpaca 数据集示例:输入更自然、输出更长更"健谈",因为蒸馏自 ChatGPT
回到原视频 (00:14:45)

老师展示了一个 Alpaca 的样例:输入更自然、输出更长更"健谈",因为它是从 ChatGPT 蒸馏来的。他们发现,这类样例能可靠地诱导出类似 ChatGPT 的行为——但有个重要限定:只有在原始 Llama 模型上做才行。也就是说,预训练和后训练必须同时奏效。无论如何,这是"事情开始奏效"的转折点。人们由此意识到:如果有了这种聊天风格的数据,构建 ChatGPT 式系统其实并没有那么难。细节做对仍然很难,但走完大部分路可以。

Open Assistant:众包人工数据

(参考时间: 00:15:33)

ChatGPT 和 Alpaca 出现后,出现了一种巨大的乐观情绪:只要我们能收集到足够高质量、足够大的指令微调数据集,就能赶上一线闭源实验室。在这种背景下,Open Assistant 出现了——一个大规模众包的数据集构建努力。很多志愿者一起:

这是一项非常值得钦佩的努力,也确实生成了不少数据(老师记不清是 1 万条还是更多),但作为一个项目最终停滞了。

Open Assistant 数据集示例:聊天风格的输入 + 长篇、详细、高质量的专家回答

📷 Open Assistant 数据集示例:聊天风格的输入 + 长篇、详细、高质量的专家回答
回到原视频 (00:15:40)

新一代:合成数据与智能体数据

(参考时间: 00:16:50)

Wizard LM / Tulu 3 这一代的想法是:我们知道语言模型是极强的合成数据生成器,那就设计越来越复杂的方式来生成指令遵循数据。

而最新一代的 SFT 数据,反映了领域和用户需求从纯聊天界面走向完整智能体系统的转变。我们不再只想要文本回答,还想要工具调用(tool calls)、待办清单(to-do lists)。如果你用过 Claude Code 或 Codex,你会知道它们会生成一个待办清单,一边做一边打勾。

Nemotron 智能体 SFT 数据示例:除了 assistant 文本回答,还有可并行发生的工具调用

📷 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
  1. 健谈程度(chattiness):经典的 NLP 数据集,即便是高质量的,也大多是"输入 → 近乎程序式的输出"。但人们并不想和一个 NLP 基准对话,他们想和人对话。因此发生了向更详细、更像人的回答的转变。(老师也说这一点很难完全精确地表述。)
  2. 更高质量的标注者与更多细节:Open Assistant 是好例子——让专家来写回答。
  3. 工具调用:为这一切设计出正确的接口与 API,是最近一轮大转变。老师预计还会继续变。

收集 SFT 数据的坑与挑战

(参考时间: 00:19:05)

现在假设你被委派去为 SFT 收集人类标注数据,你需要注意什么?老师列了几类问题:格式问题、知识问题(回答里该放多少知识?要多少数据点?)、模型安全问题(该收集什么样的安全数据?)。

其中,老师特别想把长度和风格的变化单拎出来讲——它是后训练过程的很大一部分。

风格与长度的陷阱

人们会说"Claude 的腔调和 ChatGPT 不同""ChatGPT 太啰嗦"等等,这些都是数据收集团队有意识的决定。如果你去看各数据集中回答的长度分布,会发现差异巨大。

一个关键提醒:当你去评估偏好(preferences)时,这些风格因素影响极大。人们很容易(用"骗"不一定准确)选择:

这部分很自然,尤其当你在一个"给你两个样例、问哪个更好"的评估场景时。更长、更像列表的回答通常确实是好的——但这会给聊天机器人的腔调引入非常显式的扭曲,相对真人而言。

这里要小心的核心是:如果你看的是参与度信号(engagement signals)——大多数公司看的都是这个——你非常容易自欺欺人,以为自己在得到更好的数据,而实际上模型的能力并没有变化。

具体来说:

所以结论是:你要把"风格控制"和"能力控制"分开考虑。

编者拓展|长度偏好与它的后果 老师此处提到的"长度偏好"是后训练中一个被反复研究的现象。人类评估者(以及后来的模型评判者)倾向于给更长的回答更高分,即便内容质量相同。这一偏差会被 RLHF 放大成"长度刷分"行为——模型学会单纯地变长来拿奖励,而非真的更聪明。后面的幻灯片会给出直接的量化证据(RLHF on length alone)。这也是为什么后来出现了长度归一化的 DPO 等变体。要点:偏好信号 ≠ 能力信号,评估时必须对风格做控制。

知识与幻觉:尾知识问题

(参考时间: 00:22:00)

这部分老师认为非常重要。他以 Open Assistant 为例(一个本意是高得多的、最高质量的努力),你会经常看到这样的回答:里面引用了一篇文章,比如 "J. Michelle L., The Pay of Corporate Executives..."。

如果你在这条数据上做 SFT,设身处地想:

于是这里同时发生了两种机制:你在教模型知识(好事,你希望模型博学),同时也在教模型输出详细的引用格式。这有时会出问题:模型会误泛化,把引用幻觉出来,而不是给出真正的参考文献。模型并不真的知道某条引用是真是假。

老师引用了一个(他认为不算错的)民间传说,且有不错的实证支持:

如果你训练模型——尤其是在 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 中,你会注意到:当你在"我知道"方向上生成引用时拿到好奖励,在"我不知道"方向上生成引用时拿到坏奖励。于是模型可能学会把"知道/不知道"的激活泛化为"是否输出引用"。

关于 SFT 是否在惩罚(同学追问细节):在 SFT 里,其实你隐式地惩罚了任何"不是这条引用"的输出——给任何非标准序列分配概率质量都会被罚。所以 SFT 本身没做错事,这条序列是正确序列。SFT 的问题在于它的泛化性质:你无法从这一个样例完美泛化,因为这里有两件纠缠在一起的事——一个是引用模板,另一个是知识的实际内容。如果我基于模板误泛化了,就麻烦大了。

编者拓展|为什么会"知道/不知道"变成可提取的信号 把一个"我知道/我不知道"的判别能力看作模型内部的一种隐变量判别方向,是理解 RLHF 校准作用的一个有用直觉:SFT 教会模型"某类格式该出现在某类场景",但它无法区分这个场景下知识是否真实存在;而 RL 的奖励信号是依赖于模型自身输出的(policy-dependent),因此可以对"在知道自己知道时输出断言、在不知道时保持谨慎"这类依赖模型内部状态的行为进行选择。一旦模型内部确实编码了这条信息,RL 就能把它"读出来"。反之若内部根本没有这条信息,任何外部监督都无从下手——这正是 Schulman 论证的要点,也是"知识校准"本质上很乱、很微妙的原因。

安全 SFT

(参考时间: 00:28:15)

另一个要谈的是安全。一旦进入后训练,我们就必须真正面对"人们会怎么用这个系统"的所有乱现实。

所以你要对系统施加安全控制,让它拒绝回应恶意输入。这就是这些公司实际执行安全控制的事实标准方式,而它落到后训练团队头上。

遗憾的是,安全 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

数据规模上,通常是几千到几万条示例。例如 Llama 2 里,这个过程大约用了几千条示例。

Tulu 3:一个相对可参考的后训练管线

(参考时间: 00:30:30)

如果只讲到这里,会让人不太满意,所以老师补充了细节。他认为如果你想看现在后训练怎么做,目前唯一好的参考大概就是 Tulu 3——Allen AI 为 Olmo 系列模型做的后训练管线。在普遍缺乏细节的现状下,这是少数能看到一个表现相当好的后训练管线在运转的地方。

它有安全组件,总共约 5 万条示例。它们都遵循一个相当简单的 SFT 数据生成策略:

老师认为,从各闭源公司的技术报告和模型卡看,类似的事情也在发生:你看使用信息、发现不安全行为、让标注员和这些坏行为打"地鼠游戏(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 数据等更高质、更健谈的数据,并降低通用预训练数据比例

📷 两阶段训练的示意图:左半是标准预训练数据,右半切换到 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

这是一个非常重要的概念区分,老师在进入后续内容前特别点出。

为什么需要强化学习

(参考时间: 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 回答,标注员选择回答一或回答二更好

📷 成对评分标注界面:给出两个 AI 回答,标注员选择回答一或回答二更好
回到原视频 (00:47:26)

如果你真想深入研究真实公司的做法,老师建议去看 InstructGPT 的附录——这是我们最后一次能窥见工业界数据收集流程。

在 InstructGPT 的例子里,他们要求标注员按三个维度评价输出:有用(helpful)、真实(truthful)、无害(harmless)。

这三个目标合起来,是训练聊天机器人的一个"大杂烩式综合目标"。

同样,Google Bard 的标注(被标注员泄露)结构非常相似——要求有用性、回答呈现要好。不过他们用的是 Likert 量表而非成对反馈。指令集不算很长,但你能感受到包括哪些内容——比如"不能含不准确信息""要连贯""要易读、对用户来说要短"。

编者说明:InstructGPT 的"有用、真实、无害"三维度,后来成为众多 RLHF 标注指南的事实模板。值得注意的一个内在张力:这三个维度彼此可能冲突(例如对一个危险问题,最"有用"的认真回答恰恰最"有害"),因此 RLHF 本质上在优化一个近似的、多目标折衷的标量奖励,而非单一的"正确"目标。这也是后面"过度优化""奖励黑客"问题的根源之一。

标注员的演变:更专业、更昂贵

(参考时间: 00:49:12)

总的来说,老师观察到一个大趋势:标注员的分布正在上移——更偏向专家、成本更高。这在薪酬上也能看出来。

Scale AI 平台上标注员的学历分布:相当大比例拥有学士或硕士学位

📷 Scale AI 平台上标注员的学历分布:相当大比例拥有学士或硕士学位
回到原视频 (00:49:40)

以 Scale AI 平台的数据为例(不一定代表全部,但是一个合理子集):很大一部分标注员拥有学士或硕士学位,大概占这些标注员的七成多;众数年龄约 35 岁;他们做的任务往往是创意写作、技术写作等。

这还只是迈向专家的一步。过去一两年,还出现了定制化标注员(bespoke annotators)的增长,因为很多实验室正在把这些系统部署到真正的白领工作中。于是你想要医生、律师来标注回答、来给 SFT 数据。这些公司(如 OpenAI)内部有这样的项目,标注员按小时获得相当可观的报酬:

所以,如果你脑中"标注员"的形象是"某个海外的、低成本的、做成对反馈的人",那不是全貌。现在有大量非常定制、非常昂贵的标注在发生。但——它也是一个金字塔:低成本、可扩展的标注并没有消失。

数据收集为什么这么难

(参考时间: 00:51:22)

老师强调:拿到这类数据实际非常困难。这就是报酬高的原因,也是为什么有这么多数据收集创业公司。他认为现在的硬挑战是:

  1. 拿到可验证的标注员,尤其要确保他们没有在用 AI。如果你最近做过问卷研究或众包,你肯定发现有人在用 ChatGPT 回答问题或完成标注工作。阻止这一点极其极其困难。
  2. 在时间压力下拿到真正正确的回答。例如前面 Google Bard 的例子,那还牵扯到一场劳资纠纷——标注员说:我们得在一分钟内检查这些长聊天回答的正确性,这不可能做得到,我们绝无可能真正遵循这些指令。
  3. 专家数据在增长,但低薪标注群体依然庞大。Scale AI 早期做了不少这种外包低成本的标注,也惹了不少麻烦。就像现代经济有高低薪的两极分化,标注领域也出现了同样的情况。

标注员人口统计学的影响

(参考时间: 00:53:00)

老师特别强调一点:标注员对模型行为有惊人的影响力。后训练在某种意义上是对模型出厂前的最后一道塑形。所以如果你不精确控制标注员怎样 steer 模型,如果标注群体本身有偏见,你可能得到相当令人惊讶的行为。

老师讲了他和一位博后(在 Percy 与他之间)在指令微调早期做的一项研究:他们问语言模型一些标准民调问题,看它们最接近哪个人口统计群体。

他们当时很惊讶:"为什么是这三组?" 后来看 InstructGPT 论文附录,找到给这些模型做标注的标注员——正好对得上:大量东南亚人,以及美国西海岸的人,大致就是对应这几组人口统计。annotators 是谁,模型就像谁。

另一个补充:近年来有大量发现表明非常细微的偏差可以通过数据传递。一个例子是 emergent misalignment(涌现性错位):如果你有一份数据来自一个被训练成"我喜欢猫头鹰"的模型,你用这份看起来无害的数据去训练另一个模型,被训练的模型竟然会继承对猫头鹰的偏好。这类潜意识的迁移(subliminal transfer)效应很难察觉,要非常非常小心。

老师也坦承:整个"语言模型政治观点"这类研究有时相当脆弱和可疑。但标注员分布对模型可能犯的更实质的错误也很重要。

Hosking 等人的研究:非专家众包标注更强调格式效应(红色),专家标注更强调事实性和不一致性

📷 Hosking 等人的研究:非专家众包标注更强调格式效应(红色),专家标注更强调事实性和不一致性
回到原视频 (00:55:45)

老师引用了一项他很喜欢的、由 Hosking 等人做的研究:他们对比真正的专家标注员(真心把活干好的人)与随机众包工人的标注差异。结果很显著:

当然,测试事实性要难得多,所以不难理解:没有专家,你就不会真正去检查这些。这是标注员分布影响结果的又一种方式——不是人口统计学,而是他们有多在乎、以及他们的专业是什么。

关于"标注员质量"如何衡量(同学提问):老师认为不存在一个金标准规则能机械地判定"你是好标注员"。他给了两种思路: 1. 一份足够详细的标注指南应当(希望是)半客观的。例如你说"要符合事实",然后定义什么算事实,你甚至可以给出客观标准——比如"谷歌搜索前三页里找不到与之矛盾的内容"。如果标注员违反了指南,你就能说"你没遵守规则"。这是"好标注员"的一种定义。 2. 标注者间一致性(inter-annotator agreement)。它讲的是一组标注员的方差。问题在于:它不告诉你偏差(bias),只告诉你方差。而且有些任务天然有方差——"你喜欢这个吗?"方差就很大,一致性指标没用;"它符合事实吗?"方差应该更低,但即便为零,你也不知道你是否问对了问题——或者如果大家都用 ChatGPT 答,方差也会是零。所以即便有办法逼近这个问题,评估标注质量仍然非常困难。

关于"为什么招专家"(另一个同学追问):老师认为后者(某些任务只有专家能做)才是主因。比如你可能需要律师来判断一个 Bluebook 引用是否正确,这需要相当训练;还有各种默会知识(tacit knowledge)是你要提取的。当然,平台整体也在往更高质量标注员移动,即便对通用任务——很大原因是 LLM 变强了:如果你不现场监督,人们就会用最便宜的 LLM 生成看起来像样的答案。所以很多标注机构的卖点就是:"我们有真人干真事,我们会替你验证这是真的。"

基于模型的标注:一切走向蒸馏

(参考时间: 00:59:30)

有同学问:"用领域专用模型做标注有什么问题?" 老师拆成两个问题:

  1. 领域专用模型好不好? 有时候你很难拿到比强开源模型更好的领域专用模型,所以他不认为用领域专用模型标注有独特优势;
  2. 该不该用模型标注数据? 在总体上,基于模型的标注是好主意。如果你不在前沿,你想做的只是追赶前沿,那模型标注非常好——现代模型大概比你能找到的随机众包工人强得多。

于是老师顺势进入"基于模型的标注":

LM 生成标注与人类标注对比:排序和一致性都相当好,成本低一个数量级

📷 LM 生成标注与人类标注对比:排序和一致性都相当好,成本低一个数量级
回到原视频 (01:00:20)

如果你看各类 LM 生成的标注,会发现这些模型出奇地好。GPT-4 出现时,老师和学生把 GPT-4 的标注与精心策划的人类标注做了对比:

在 GPT-4 时代刚做这些时,还不清楚事情会往哪走——开源世界会走向昂贵的人类标注,还是一切都变成对更强模型的蒸馏?

几年过去了,答案已经清楚了:如果你只想追赶前沿能力,那人类收集的数据基本没有空间。老师讲了一个他觉得很有指导意义的例子:Hugging Face 想做开源模型 Zephyr 时,一度非常想完全不用任何模型蒸馏——不用任何模型标注、模型数据,而是花大量时间精力收集人类数据。他们去了 OpenAI 等公司也用的同一批供应商收集人类数据,结果发现:极其耗时、昂贵,而且结果并不比用模型标注更好。最终他们还是用了模型反馈。

这件事很有指导意义:他们用自己没有的资源认真试过,但最终还是用了 AI 反馈。情况一直如此:

所以,"是否用模型标注"的结论大体就是:用。模型很擅长遵循指令、非常可扩展,你可以收集你想要的正确类型的数据。当然,如果你想推动前沿,除了在有限情形下,你就不能玩这些游戏——你仍然非常依赖人类驱动的数据收集。

编者说明:老师也提醒,模型标注有个隐患——模型容易沾染和人类一样的偏见,有时甚至更严重。见下一段。

模型也有偏见:长度刷分的证据

(参考时间: 01:04:30)

模型也非常容易沾染和人类一样的偏见,有时甚至更严重。在模型生成数据这波浪潮出现后,有若干研究表明:

长度刷分实验:把回答长度推得很长,模型评判的胜率就会持续上升

📷 长度刷分实验:把回答长度推得很长,模型评判的胜率就会持续上升
回到原视频 (01:05:10)

因此,模型标注虽然好用,但它会系统性地放大"长度"这类表面信号。

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 → 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
  1. 把 RL 化简为 SFT:对"好"的那条样本前缀一个 good token,对"坏"的前缀一个 bad token;生成时只用 good 前缀,模型就只生成好东西。不 work。
  2. 只在好样本上训练:也不太 work。
  3. 训练奖励模型、取 LM 输出、只挑奖励模型选中的来训练:也不太好用,虽然多少有点用。

很多人试了很多迭代。最终,我们确实有了一个比 PPO 简单得多、效果相当好、而且在很多方面看起来就像 SFT 的东西——这就是 DPO(Direct Preference Optimization,直接偏好优化)。

DPO 的推导

(参考时间: 01:10:20)

DPO 的算法非常简单。我们要去掉 PPO 里复杂的部分:

去掉这两样,就能做出一个简单得多的 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 变体:

但老师认为,这些变体也许都没那么重要。

他说,一个他觉得很值得注意的现象是:这些结果非常依赖实验设置的具体细节。即便在 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 当时列出的少数开放问题之一

📷 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
  1. RLHF 的数据收集也非常难。后训练之所以是个复杂杂乱的过程,很大一部分在于它要拿到好数据,而拿到好数据总是非常困难。
  2. RLHF 算法相当复杂,PPO 尤其难(下一讲会再讲一点)。幸好我们还有一个更简单的变体 GRPO 效果不错——你的作业里会用到的就是它。这是一个近期有很多发展的领域。
  3. RLHF 的一个大问题是过度优化。
  4. 下讲的过渡是:有没有一些奖励,我们不会过度优化它? 我们能不能只管堆算力,模型性能就单调地持续变好?这正是 RLVR(可验证奖励强化学习)如此有影响力的原因之一。

编者说明:老师最后一句"Thanks, see you all Thursday."是下课语。整讲从"预训练 → 后训练的动机"讲到 SFT 数据史、SFT 的坑、方法上的"中期训练"趋势,再转到 RLHF 的数据、概念区分、PPO → DPO 算法,最后落在过度优化与模式崩溃两个陷阱,并以 RLVR 作为下一讲的悬念。建议读者把这张总结图当作复习锚点:SFT 阶段记"质量 > 数量 + 尾知识幻觉";RLHF 阶段记"概念区分(拟合分布 vs 最大化奖励)+ DPO 的直观梯度 + 两个陷阱"。


附:参考与延伸阅读

编者补充

已知疑点

本节集中列出本讲重构过程中不确定、听不清、或讲师表述含糊之处,供读者自行判断,也方便对照原始视频。

  1. 专有名词的听写与拼写:
  2. 老师提到的"Flon / FLAN",字幕写作 "Flon",但显然是 FLAN(Fine-tuned Language Net)。
  3. "Tulu 3 / Tulu 2",字幕中为 "Tulu",即 Allen AI 的 Tülu 系列;本讲正文统一写作 Tulu 3 / Tulu 2。
  4. "WildChat""UltraChat""UltraFeedback""Alpaca Eval""Nemotron"等,均按常见公开写法规范;字幕个别时刻拼写不完整。
  5. "minute CPM / MiniCPM",字幕作 "mini CPM",指 MiniCPM。
  6. "Stiennon et al."(字幕 "Stiennon"),指 Stiennon 等人 2020 年的 Learning to Summarize from Human Feedback。
  7. "John Schulman",字幕作 "John Schulman",即 PPO 的作者之一。
  8. "Hosking et al.",字幕 "Hosking",指一项对比专家与众包标注的研究;具体论文出处本讲未给出,正文仅按讲师所述转述,未能核实到确切论文标题。

  9. 数字类:

  10. Open Assistant 的数据量,老师原话说"我记不清是 1 万条还是更多",正文据此谨慎表述,未给出确切数字。
  11. Llama 2 安全 SFT 的示例数,老师原话是"a few thousand",正文写作"几千条示例"。
  12. Tulu 3 安全组件规模,老师原话说"约 5 万条(50-ish thousand)",正文写作"约 5 万条"。
  13. 标注员学历比例,"七成多(70 some percent)",正文写作"七成多"。
  14. 专家标注时薪,"上千美元甚至上百美元"——老师原意是"上百美元甚至更多(more than $100)",正文据此修正为"上百美元甚至更多",此处字幕可能造成"上千"的误读,以正文为准。

  15. 讲师表述模糊或存疑之处:

  16. "尾知识"没有形式化定义——这是老师本人明确承认的(见正文),不是编者遗漏。教师用"维基百科文章长度"作为知名度的代理指标,属于他过往工作中的做法,并非公认标准。
  17. "SFT 是否摧毁特征、RL 是否删除特征":有同学提问后,老师回答两者界限"很模糊",尤其涉及专家迭代时;这段讨论他讲得较简略,正文按原话保留,未做理论补强。
  18. RL 为什么能减少幻觉:老师明确称之为"民间故事(folk story)",是一种直觉性解释,非严格论证。正文以"编者拓展"标注了其假设性质。
  19. "基座模型是句谎话":这是老师的个人观点 / "pet peeve",语气强烈,正文按其原意保留,并在语义上注明是老师的判断,而非客观事实陈述。
  20. 模型标注是否终将完全取代人类标注:老师的结论是"追赶前沿能力"时人类数据"基本没空间",但他同时强调"要推动前沿仍必须依赖人类数据收集"。这两句并不矛盾(针对不同目标),但初读易混,特此点明。

  21. 视频时间轴:

  22. 本讲视频总时长约 4794 秒(约 79.9 分钟),最后一段字幕时间戳为 01:19:48。文中所有 (参考时间: ...) 与 SCREENSHOT 占位符 时间锚点均取自字幕时间戳,可能与视频中画面的实际出现时刻有数秒级偏差。
  23. 本讲插图包含官方 PDF 幻灯片(见文末「附录:官方幻灯片(全部)」)与视频帧;视频帧依据字幕中的"如图所示 / 看这个结果 / 这张图"等画面提示选取,具体画面内容以实际抽帧为准。

  24. 编者判断存疑处:

  25. 结尾"RLVR""GRPO 会用在作业里"等表述,来自讲师口头预告,本讲并未展开;正文仅作过渡性提及,未补充 RLVR / GRPO 的技术细节,以免越界到下一讲内容。
  26. 关于"尺寸 7B 现在很小"那段讨论(字幕 01:03:11 附近),上下文是评价 Hugging Face Zephyr 时的一句插话,字幕较破碎,正文按可辨识语义转述,细节可能不完整。


附录:官方幻灯片(全部)

第 1 页幻灯片 · Lecture 15

🖼️ 第 1 页幻灯片 · Lecture 15

第 2 页幻灯片 · The class thus far

🖼️ 第 2 页幻灯片 · The class thus far

第 3 页幻灯片 · Instruction following is a remarkable form of control

🖼️ 第 3 页幻灯片 · Instruction following is a remarkable form of control

第 4 页幻灯片 · Goal today: enable better, tighter controls over LM output

🖼️ 第 4 页幻灯片 · Goal today: enable better, tighter controls over LM output

第 5 页幻灯片 · Caveat: post-training information is pretty sparse!

🖼️ 第 5 页幻灯片 · Caveat: post-training information is pretty sparse!

第 6 页幻灯片 · Where today’s lecture fits in

🖼️ 第 6 页幻灯片 · Where today’s lecture fits in

第 7 页幻灯片 · What are the ingredients in SFT?

🖼️ 第 7 页幻灯片 · What are the ingredients in SFT?

第 8 页幻灯片 · Training data

🖼️ 第 8 页幻灯片 · Training data

第 9 页幻灯片 · Progression of SFT data (in the open world)

🖼️ 第 9 页幻灯片 · Progression of SFT data (in the open world)

第 14 页幻灯片 · What’s varying across these?

🖼️ 第 14 页幻灯片 · What’s varying across these?

第 15 页幻灯片 · What did we notice across the datasets?

🖼️ 第 15 页幻灯片 · What did we notice across the datasets?

第 16 页幻灯片 · Style variations in data and models

🖼️ 第 16 页幻灯片 · Style variations in data and models

第 17 页幻灯片 · When evaluating by preferences, style matters.

🖼️ 第 17 页幻灯片 · When evaluating by preferences, style matters.

第 18 页幻灯片 · What about benchmarks?

🖼️ 第 18 页幻灯片 · What about benchmarks?

第 19 页幻灯片 · References, complex knowledge, and factuality

🖼️ 第 19 页幻灯片 · References, complex knowledge, and factuality

第 20 页幻灯片 · Knowledge extraction and alignment

🖼️ 第 20 页幻灯片 · Knowledge extraction and alignment

第 21 页幻灯片 · Takeaways on knowledge extraction and alignment

🖼️ 第 21 页幻灯片 · Takeaways on knowledge extraction and alignment

第 22 页幻灯片 · Safety

🖼️ 第 22 页幻灯片 · Safety

第 23 页幻灯片 · Safety SFT in the wild

🖼️ 第 23 页幻灯片 · Safety SFT in the wild

第 24 页幻灯片 · Pipeline with most details

🖼️ 第 24 页幻灯片 · Pipeline with most details

第 25 页幻灯片 · Main safety approach – extract scenarios from users

🖼️ 第 25 页幻灯片 · Main safety approach – extract scenarios from users

第 26 页幻灯片 · Safety-tuning with just a little data

🖼️ 第 26 页幻灯片 · Safety-tuning with just a little data

第 27 页幻灯片 · Putting it together – SFT Data

🖼️ 第 27 页幻灯片 · Putting it together – SFT Data

第 28 页幻灯片 · How to fine-tune

🖼️ 第 28 页幻灯片 · How to fine-tune

第 29 页幻灯片 · Turning instruction tuning into pretraining

🖼️ 第 29 页幻灯片 · Turning instruction tuning into pretraining

第 31 页幻灯片 · The second part of RLHF

🖼️ 第 31 页幻灯片 · The second part of RLHF

第 32 页幻灯片 · From imitation to optimization

🖼️ 第 32 页幻灯片 · From imitation to optimization

第 33 页幻灯片 · Why optimize? G-V gap

🖼️ 第 33 页幻灯片 · Why optimize? G-V gap

第 34 页幻灯片 · Overview

🖼️ 第 34 页幻灯片 · Overview

第 35 页幻灯片 · RLHF Data

🖼️ 第 35 页幻灯片 · RLHF Data

第 37 页幻灯片 · RLHF and data – instruct GPT guideline

🖼️ 第 37 页幻灯片 · RLHF and data – instruct GPT guideline

第 38 页幻灯片 · Another old example – bard annotations

🖼️ 第 38 页幻灯片 · Another old example – bard annotations

第 40 页幻灯片 · Large variation in compensation

🖼️ 第 40 页幻灯片 · Large variation in compensation

第 41 页幻灯片 · RLHF and data - crowdsourcing

🖼️ 第 41 页幻灯片 · RLHF and data - crowdsourcing

第 42 页幻灯片 · RLHF and data – crowdsourcing ethics

🖼️ 第 42 页幻灯片 · RLHF and data – crowdsourcing ethics

第 43 页幻灯片 · RLHF and data - demographics

🖼️ 第 43 页幻灯片 · RLHF and data - demographics

第 46 页幻灯片 · RLHF and data - LM-generated

🖼️ 第 46 页幻灯片 · RLHF and data - LM-generated

第 47 页幻灯片 · RLHF and data – Self-training

🖼️ 第 47 页幻灯片 · RLHF and data – Self-training

第 49 页幻灯片 · How do we RLHF?

🖼️ 第 49 页幻灯片 · How do we RLHF?

第 50 页幻灯片 · From imitation to optimization

🖼️ 第 50 页幻灯片 · From imitation to optimization

第 51 页幻灯片 · PPO in language modeling

🖼️ 第 51 页幻灯片 · PPO in language modeling

第 52 页幻灯片 · More details and background from Stiennon

🖼️ 第 52 页幻灯片 · More details and background from Stiennon

第 53 页幻灯片 · PPO – at a conceptual level

🖼️ 第 53 页幻灯片 · PPO – at a conceptual level

第 54 页幻灯片 · Can we get rid of PPO?

🖼️ 第 54 页幻灯片 · Can we get rid of PPO?

第 55 页幻灯片 · DPO – RLHF without tears?

🖼️ 第 55 页幻灯片 · DPO – RLHF without tears?

第 56 页幻灯片 · DPO – derivation from the RLHF formula

🖼️ 第 56 页幻灯片 · DPO – derivation from the RLHF formula

第 57 页幻灯片 · DPO derivation 2

🖼️ 第 57 页幻灯片 · DPO derivation 2

第 58 页幻灯片 · DPO updates and components

🖼️ 第 58 页幻灯片 · DPO updates and components

第 59 页幻灯片 · DPO in LLaMA (and other open models)

🖼️ 第 59 页幻灯片 · DPO in LLaMA (and other open models)

第 60 页幻灯片 · Variants

🖼️ 第 60 页幻灯片 · Variants

第 61 页幻灯片 · But PPO does too (and sometimes better?)

🖼️ 第 61 页幻灯片 · But PPO does too (and sometimes better?)

第 63 页幻灯片 · Thins to watch out for - Overoptimization

🖼️ 第 63 页幻灯片 · Thins to watch out for - Overoptimization

第 64 页幻灯片 · Things to watch out for - mode collapse

🖼️ 第 64 页幻灯片 · Things to watch out for - mode collapse

第 65 页幻灯片 · Recap of the lecture

🖼️ 第 65 页幻灯片 · Recap of the lecture