第 14 讲:训练大语言模型——预训练、指令微调、训练数据与蒸馏

Agentic AI · Lecture 14。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应:Stanford CS224V Fall 2026 Lecture 16(11/18 Training LLMs);阅读清单第 1.1 节”Pretraining LLMs”、第 1.4 节”Distillation”。 关于材料来源:这次课的幻灯片尚未公开。课程表的描述是:“我们怎样创造 LLM?会遵循指令的模型;训练数据。“本讲依据阅读清单上的论文:Transformer(Vaswani 等,2017,必读)、GPT-3(Brown 等,2020)、InstructGPT(Ouyang 等,2022)、LLaMA(Touvron 等,2023)、DeepSeek-R1(2025)、s1(Muennighoff 等,2025)、OPSD(Zhao 等,2026);以及第 5 讲的 WikiChat 蒸馏结果。这门课的重点不是训练模型本身(那是 CS224N、CS336 的内容),而是理解训练给模型带来了什么、没带来什么,以及怎样把一个可靠的系统蒸馏成一个又小又快的模型。 配套代码:code/lecture14/(只用 Python 标准库,不需要 PyTorch) 预计阅读时间:3 小时左右(含运行代码)


0. 本讲导航

0.1 学完本讲,你应该能够

  1. 解释预训练的目标(预测下一个词)为什么能让模型学到语言和知识,以及为什么预训练的模型只会”续写”。
  2. 说明指令微调做了什么、没做什么(知识来自预训练,格式来自微调);InstructGPT 的三步(监督微调、奖励模型、强化学习);微调的代价(遗忘)。
  3. 描述推理模型是怎样训练出来的:DeepSeek-R1 的纯强化学习、可验证的奖励、GRPO;s1 用 1,000 个样本和”预算强制”做到测试时扩展。
  4. 讨论训练数据:来源、筛选、合成数据;“质量胜过数量”。
  5. 解释蒸馏:把一个大模型或一条复杂流水线的能力压缩进小模型;离线策略 vs 在线策略的蒸馏;OPSD 的思路;学生为什么会继承老师的错误。

0.2 先修知识

知识点用在哪里最低要求
第 1 讲第 1、2 节幻觉的来源:见得多的记得牢,没记住的会编;评分规则鼓励”猜”
第 5 讲第 4 节WikiChat 的多阶段流水线;蒸馏后的 WikiChat(LLaMA)
第 12 讲第 3、5 节改权重 vs 改 harness;GEPA 和 GRPO 的比较
概率与对数第 1 节知道 −log⁡p-\log p 在 pp 越大时越小
CS224N / CS234(可选)第 1~3 节Transformer 的细节、强化学习的基础;本讲只讲直觉

0.3 本讲地图

第1节  预训练:预测下一个词                              ← 代码 01 演示 1
第2节  指令微调与对齐                                    ← 代码 01 演示 2~5
第3节  推理模型:强化学习与测试时扩展(DeepSeek-R1、s1)
第4节  训练数据
第5节  蒸馏:把慢而准的系统压缩进小模型(含 OPSD)        ← 代码 02
第6节  讨论与边界
第7–11节 小结、与项目的关系、练习、延伸阅读、下一讲预告

0.4 本讲的玩具世界

  • fact_world.py:60 个虚构的人物(名字只有一个词,例如 mira、tobin),每人三个事实:出生的城市、职业、乐器(各有 8 种可能)。前 40 人的事实写成 80 篇”网页”(每人两篇,句式不同)——这是预训练语料;后 20 人的事实只在一个知识库里,预训练语料里没有。问答的格式是 question : where was mira born ? answer : kestavia,每种关系有两种问法。
  • tiny_lm.py:一个用纯 Python 写的迷你语言模型(约 8 万个参数,几秒钟训练完)。它的训练目标和真实的 LLM 完全相同——预测下一个词、最小化交叉熵、梯度下降——只是模型简单得多(见第 1.3 节)。

关于本讲的数字:论文里的真实数字会注明出处;模拟实验的数字都来自 01、02 号代码的实际输出。迷你模型不是 Transformer,它演示的是机制,不能说明真实 LLM 的规模效应和推理能力。


1. 预训练:预测下一个词

1.1 一个简单得惊人的目标

预训练只做一件事:给定前面的词,预测下一个词。在海量的文本上,对每一个位置,让”实际出现的下一个词”的概率尽可能大。损失函数是交叉熵:

L=−1N∑i=1Nlog⁡Pθ(wi∣w1,…,wi−1)\mathcal{L} = -\frac{1}{N}\sum_{i=1}^{N} \log P_\theta(w_i \mid w_1, \dots, w_{i-1})

为什么这么简单的目标能学到这么多东西?因为要把下一个词预测准,模型必须”懂”很多东西:

  • 预测 “The capital of France is ___“,要知道事实;
  • 预测一个句子的下一个词,要懂语法;
  • 预测一段代码的下一行,要懂编程;
  • 预测一道数学题的答案,要会推理。

知识就是概率:模型”知道巴黎是法国的首都”,意思是在那个上下文里它给”巴黎”很高的概率。这也解释了第 1 讲的幻觉:见得少的事实,概率分布就散——模型仍然要选一个词,于是”编”了。

1.2 Transformer

今天的 LLM 都是 Transformer(Vaswani 等,2017,阅读清单的必读论文)。它的核心是自注意力:每个位置都可以”看”前面所有的位置,根据内容决定从哪些位置取信息。预测 “mira was born in ___” 时,模型可以直接”注意”到前面的 mira,而不管它隔了多远。几十层这样的结构叠起来,参数从几亿到几千亿。

GPT-3(Brown 等,2020)把这个方法推到 1,750 亿参数,发现了上下文学习:不需要更新参数,只要在提示里给几个例子,模型就能完成新任务(少样本学习)。LLaMA(Touvron 等,2023)证明只用公开的数据训练也能得到很强的模型(130 亿参数的 LLaMA 在大多数基准上超过了 GPT-3),并且开放了权重,开源模型的生态由此兴起——第 13 讲的 Qwen 2.5 VL、第 5 讲蒸馏 WikiChat 用的 LLaMA 都属于这个生态。

1.3 本讲的迷你模型

真实的 Transformer 太大,这里用一个”对数线性模型”代替:

特征(从前面的词里提取):
    p1 = 前一个词、p2 = 前两个词          → 局部的语法("was born in" 后面是一个城市)
    bag = 这段文字里出现过的内容词         → 把 "mira" 和 "kestavia" 联系起来(Transformer 用注意力做到这一点)
每个候选词的分数 = 各个特征对这个词的权重之和
概率 = softmax(分数);损失 = −log P(实际的下一个词)
梯度:对分数的梯度 = 概率 − 独热向量

最后一行是整个训练的核心:正确的词的分数被推高(梯度为负),其他词按它们当前的概率被压低。tiny_lm.py 的 step 函数一共十几行,就是这件事。

1.4 预训练的结果

代码 01 演示 1:在 80 篇”网页”(2,175 个词)上训练 8 轮:

每一轮的平均损失:1.99 → 0.77 → 0.50 → 0.36 → 0.28 → 0.23 → 0.20 → 0.19
词表 111 个词,706 个特征,一共 78,366 个参数

"mira was born in" 之后,概率最大的 5 个词:kestavia 0.73,veloria 0.07,brisa 0.06,dunmore 0.06,coralis 0.03(真实答案:kestavia)
提示:mira was born in
  → 续写:kestavia . mira plays the cello . by trade , mira is
提示:question : where was mira born ? answer :
  → 续写:plays the cello . by trade , mira is a sailor .
在 20 个人物的 120 个问题上:答对 0%,格式正确(给出一个答案就停下)0%

模型”知道” mira 出生在 kestavia(概率 0.73),但你问它,它不回答,而是接着写一篇关于 mira 的”网页”。这就是预训练模型(“基座模型”)的样子:它学会了续写训练数据里那种文本,没有学过”问题后面应该跟着答案,答完就停”。


2. 指令微调与对齐

2.1 监督微调(SFT)

指令微调用”指令 → 回答”的例子继续训练:同样是预测下一个词,只是数据换成了问答对。一个常见的细节是只在回答部分计算损失:问题部分是给定的,模型不需要学会”生成问题”。

代码 01 演示 2:只用前 20 个人物的问答对(120 个例子)微调,测试的是另外 20 个人物:

模型                         测试人物:答对   格式正确 │ 微调用过的人物:答对
预训练 + 指令微调                  82%       100% │          100%
只做指令微调(没有预训练)         13%       100% │          100%
  • 预训练 + 微调的模型,在从没见过问答的人物上答对 82%:这些人物的事实是预训练时学到的,微调只教会了它”怎样回答”;
  • 没有预训练、只做同样微调的模型,在测试人物上 13%——和瞎猜(8 选 1,12.5%)一样,但格式完全正确。

这就是”表层对齐假说”(LIMA 论文,Zhou 等,2023):模型的知识和能力几乎都来自预训练,指令微调主要教它用什么格式、什么风格和用户交流。LIMA 只用 1,000 个精心挑选的例子微调,就得到了很好的对话模型。

演示 3 看微调数据的多少:

微调用的人物数   例子数   测试人物:答对
       1           6           12%
       3          18           25%
      10          60           53%
      20         120           82%

迷你模型本身很弱,要几十个例子才能把”问题里的词(born、city、play、instrument)“和”该回答哪一类信息”对应起来;真实的 LLM 在预训练时已经见过大量问答式的文本,需要的例子少得多。

2.2 InstructGPT:三步

InstructGPT(Ouyang 等,2022)是 ChatGPT 的前身,它的训练分三步:

  1. 监督微调:请标注员写示范回答,在上面微调 GPT-3;
  2. 训练奖励模型:让模型对同一个提示生成几个回答,请标注员排序,训练一个模型预测”人更喜欢哪个回答”;
  3. 强化学习:用 PPO 算法优化语言模型,让奖励模型给它的回答打高分,同时不要离原来的模型太远(KL 惩罚)。

结果:标注员更喜欢 13 亿参数的 InstructGPT 的回答,而不是 1,750 亿参数的 GPT-3 的——对齐(让模型按人的意图行事)比规模更重要。这套方法叫 RLHF(基于人类反馈的强化学习)。后来的 DPO(直接偏好优化)证明可以跳过奖励模型和强化学习,直接从偏好对上训练(细节见 CS234)。

2.3 微调的代价:遗忘

代码 01 演示 4:

模型                           网页上的损失   测试人物:答对
只做了预训练                        0.14             0%
+ 只用问答数据微调                  2.61            82%
+ 问答数据混入 40 篇网页            0.17            83%

只在问答数据上微调之后,模型在”网页”上的损失从 0.14 涨到 2.61——它几乎忘了怎样写网页:所有参数都被推向”回答问题”的方向。这叫灾难性遗忘。在微调数据里混入一部分预训练数据,问答能力差不多,原来的能力保住了。

InstructGPT 也遇到了同样的问题:强化学习之后,模型在一些公开的 NLP 基准上变差了(论文称之为”对齐税”)。他们的办法和演示 4 一样:在强化学习的更新里混入预训练的梯度(PPO-ptx)。

2.4 训练出来的幻觉

代码 01 演示 5:问微调后的模型关于后 20 个”新人物”的问题——他们的事实不在预训练语料里:

预训练里有的人物    答对  82%   格式正确 100%   答案的平均概率 0.54
预训练里没有的人物  答对   8%   格式正确 100%   答案的平均概率 0.26
例子:question : where was mila born ? answer : → dunmore(真实答案:coralis,模型没有读过关于 mila 的任何东西)

它照样给出一个格式完全正确的答案,只是几乎都是错的。它对这些答案的把握低一些(0.26 vs 0.54),但它不会说”我不知道”——微调数据里没有一个”我不知道”的例子,它被训练成总要给出一个答案。这就是第 1 讲幻觉的训练层面的来源。

能不能教它说”不知道”?练习 3 试了一下:在微调数据里加入关于 10 个新人物的问题、答案都是 unknown。结果模型对没见过的人物学会了说”不知道”(100%),但对见过的人物也有 35% 的时候说”不知道”,准确率从 82% 降到 65%。让模型”知道自己不知道”是一个难题——第 5 讲 WikiChat 的做法是把”知不知道”交给检索和程序,而不是指望模型自己判断。


3. 推理模型:强化学习与测试时扩展

3.1 思维链与测试时计算

阅读清单第 1.2 节的思维链(Wei 等)发现:让模型在回答之前先写出推理步骤,复杂问题的准确率大幅提高。自洽性(Wang 等)进一步:采样多条推理链,对答案投票。这些都是测试时计算:回答时多花一些计算,换来更好的结果。OpenAI 的 o1 证明了,训练模型去写很长的推理过程,可以得到能力强得多的”推理模型”。

3.2 DeepSeek-R1:纯强化学习

DeepSeek-R1(2025,阅读清单)公开了一种训练推理模型的方法。最引人注目的是 R1-Zero:直接在基座模型上做强化学习,不经过任何监督微调:

  • 奖励是规则写的(可验证的奖励):数学题的答案对不对、代码能不能通过测试,加上格式奖励(推理过程写在指定的标签里)——不需要奖励模型,也就不容易被”投机”;
  • 算法是 GRPO:对每道题采样一组回答,每个回答的”优势” = 它的奖励减去这组回答的平均奖励(再除以标准差);比组内平均好的回答被加强,差的被削弱——不需要单独训练一个价值模型;
  • 结果:AIME 2024 数学竞赛题的准确率(pass@1)从 15.6% 提高到 71.0%,多数投票后达到 86.7%;训练过程中,模型的回答自发地越来越长,出现了反思、验证、换一种方法重试的行为(论文称之为”顿悟时刻”)。

R1-Zero 的问题是可读性差、几种语言混在一起。正式的 R1 加了几步:先用少量高质量的长推理数据做”冷启动”的监督微调,再强化学习,再用强化学习得到的模型生成大量数据、筛选后做监督微调,最后再做一轮强化学习。论文还把 R1 蒸馏进了更小的 Qwen 和 Llama 模型,发现对小模型来说,蒸馏比直接对它们做强化学习效果更好。

3.3 GRPO 的代价

可验证奖励的强化学习(RLVR)很有效,但有几个代价(GEPA 和 OPSD 论文都讨论了):

  • 样本多:每道题要采样一组回答,训练常常要几万到几十万次运行(第 12 讲:GEPA 用少得多的运行达到了 GRPO 24,000 次运行的效果);
  • 奖励稀疏:只在最后给一个”对 / 错”,整段几千个词的回答共用一个信号,不知道哪一步写得好、哪一步写得坏;
  • 信号消失:一组回答全对或全错时,优势都是 0,这道题就没有提供任何学习信号。

3.4 s1:简单的测试时扩展

s1(Muennighoff 等,2025,阅读清单)问:达到”测试时扩展”(多想一会儿就更准)最简单的方法是什么?答案出人意料地简单:

  1. s1K 数据集:从 16 个来源收集了 59,029 道题,用推理模型(Gemini Thinking)生成推理过程和答案,再按三个标准筛选出 1,000 道:难度(太简单的不要)、多样性(覆盖不同的领域)、质量(格式正确、答案可靠);
  2. 监督微调:在这 1,000 个样本上微调 Qwen2.5-32B-Instruct,在 16 张 H100 上只要 26 分钟;
  3. 预算强制(budget forcing):推理时控制”想多久”——想太久了,就强行插入”思考结束”的标记,让模型给出答案;想得不够,就在模型想结束时把结束标记去掉,换成”Wait”,让它继续想。模型常常会因此重新检查自己的答案、改正错误。

结果:s1-32B 在竞赛数学(MATH、AIME24)上比 OpenAI 的 o1-preview 高最多 27%;用预算强制让它想得更久,AIME24 从 50% 提高到 57%。消融实验最有启发:随机挑 1,000 个、挑推理过程最长的 1,000 个、只按多样性挑,在 AIME24 上平均都差了约 30 个点;用全部 59,000 个样本训练,并没有比精挑细选的 1,000 个好多少。数据的质量和选择,比数量重要得多。

注意 s1 的推理过程来自另一个更强的模型——这本身就是蒸馏(第 5 节)。


4. 训练数据

4.1 预训练的数据

预训练的数据量以万亿个词元计,主要来源:网页(例如 Common Crawl 的网页抓取)、书籍、代码、学术论文、维基百科等。原始的网页抓取质量参差不齐,要经过大量处理:

  • 筛选:去掉低质量的页面(用规则或训练一个质量分类器)、有害的内容;
  • 去重:重复的文本会被模型过度记忆;第 13 讲的 CHURRO-DS 也用了同样的 MinHash 去重;
  • 配比:网页、代码、书籍、数学各占多少,会影响模型的能力;
  • 污染:评测题目如果出现在训练数据里,评测分数就不可信(第 2 讲的”泄漏”)。

数据的版权和许可也是一个现实的问题:LLaMA 论文强调只用公开可用的数据;第 13 讲的 CHURRO-DS 只收录许可证允许研究使用的数据集。

4.2 指令和偏好的数据

指令微调和偏好对齐的数据传统上由人标注(InstructGPT 雇了几十位标注员)。现在越来越多地用合成数据:用强模型生成指令和回答、生成推理过程(s1)、甚至用强模型当评委给偏好打分。合成数据便宜、可以大量生成,但会把生成它的模型的错误和偏差带进来(第 5.4 节)。

4.3 数据就是能力

这门课里反复出现的一个结论:专门的、高质量的数据,常常比更大的模型更重要。第 13 讲的 CHURRO 用整理好的 10 万页历史文献,让 30 亿参数的模型超过了最好的商业模型;s1 用 1,000 个精挑细选的样本得到了强推理模型;LIMA 用 1,000 个例子得到了好的对话模型。反过来,数据少的地方(CHURRO 的印刷中文只有 6 页训练数据),再好的方法也没用。


5. 蒸馏:把慢而准的系统压缩进小模型

5.1 什么是蒸馏

知识蒸馏(Hinton 等,2015):用一个大的”老师”模型的输出训练一个小的”学生”模型。对 LLM 来说,最常见的做法是序列级的蒸馏:让老师回答大量的问题,把”问题 → 老师的回答”当作监督微调的数据训练学生。

这门课里的蒸馏有一个特别的用法:老师不一定是一个模型,也可以是一条复杂的流水线。第 5 讲的 WikiChat 有 7 个阶段,每个问题要调用很多次 GPT-4——准,但慢、贵。把它的输入和输出收集起来训练一个 LLaMA 模型,蒸馏后的 WikiChat 事实准确率 91.1%,仍然远高于直接使用 GPT-4 的 66.1%(第 5 讲第 7.4 节)。先用最好的模型和最复杂的流水线把事情做对,再把它蒸馏成一个快而便宜的模型——这是课程的一个基本策略。

5.2 蒸馏的演示

代码 02:老师是”检索知识库 + LLM 阅读”的流水线(每次运行调用大模型 3 次,阅读时有 8% 的概率读错);学生是 01 号文件里”预训练 + 指令微调”的迷你模型;任务是回答 20 个新人物的问题(学生从没读过他们)。

演示 1:蒸馏之前

老师(检索 + 阅读):答对 90%,每个问题调用大模型 3 次
学生(迷你模型):  答对 8%,每个问题调用小模型 1 次

演示 2:蒸馏(老师给 60 个事实各打一次标签)

训练数据                         例子数   新人物·问法 1   新人物·问法 2   老人物(测试)
蒸馏之前                              —            8%              8%             82%
只用问法 1                          60           90%             72%             79%
问法 1 + 问法 2                    120           90%             90%             70%
问法 1 + 问法 2 + 回放 60 条       180           90%             90%             83%
  1. 蒸馏之后,学生在新人物上和老师一样准(90%),每次只要一次小模型调用;
  2. 只用一种问法训练,换一种问法就掉到 72%——蒸馏数据要有多样性(同一个事实的不同问法),学生才学到事实本身,而不是死记一种句式;
  3. 蒸馏会让学生忘掉一部分原来的能力(老人物从 82% 降到 70%);混入一部分原来的指令微调数据(回放)就能保住——和第 2.3 节的遗忘是同一件事。

演示 3:学生的上限是老师

老师的标签里有 6 个是错的(60 个事实里);学生在这些事实上给出了和老师一样的错误答案:6 个
  where was piet born ?            老师:dunmore    学生:dunmore    真实:veloria
  ...

学生只能模仿老师:老师错的地方,学生原样学了过去。

演示 4:数据的质量

老师打标签的方式               老师调用   标签数   其中错的   学生在新人物上答对
回答一次                           180       60         6               90%
回答三次取多数                     540       60         1               98%
回答两次,只留一致的               360       51         0               87%
  • 让老师回答三次、取多数(第 1 讲的自洽性投票),错误的标签从 6 个降到 1 个,学生从 90% 提高到 98%,代价是三倍的老师调用——一次性的代价;
  • 只保留两次一致的标签,错误没有了,但 9 个事实被丢掉,学生在这些事实上只能瞎猜,准确率反而降到 87%。数据的质量和覆盖面都要考虑。

演示 5:成本(假设大模型调用 1 个单位、小模型调用 0.02 个单位)

回答     100 个问题:一直用老师       300    蒸馏(打标签 540 + 学生回答)       542
回答   1,000 个问题:一直用老师     3,000    蒸馏(打标签 540 + 学生回答)       560
回答  10,000 个问题:一直用老师    30,000    蒸馏(打标签 540 + 学生回答)       740
回答 100,000 个问题:一直用老师   300,000    蒸馏(打标签 540 + 学生回答)     2,540

问题足够多,蒸馏总会划算(这里还没算训练学生的成本)。但学生只会回答老师教过的那类问题:世界变了(新的人物、事实更新),就要重新蒸馏;而老师(检索)只要更新知识库。这就是第 5 讲说”检索解决新近的知识”、本讲说”蒸馏解决速度和成本”的分工。

5.3 离线策略 vs 在线策略

上面的蒸馏是离线策略(off-policy)的:学生模仿的是老师生成的序列。问题在于,推理时学生是在自己生成的前缀上继续写的;一旦它某一步写得和老师不一样,后面的上下文就是训练时从没见过的,错误会越积越多(暴露偏差)。

在线策略蒸馏(on-policy distillation)反过来:让学生自己生成回答,老师对学生生成的每一个位置给出”下一个词应该是什么”的概率分布,学生向老师的分布靠拢。这结合了两个好处:训练数据来自学生自己的分布(像强化学习),而反馈是每个词都有的密集信号(像监督学习,而不是强化学习那样只在最后给一个对错)。

5.4 OPSD:自己当自己的老师

在线策略蒸馏需要一个单独的、通常更大的老师模型。OPSD(On-Policy Self-Distillation,Zhao 等,2026,阅读清单)问:一个模型能不能自己当自己的老师?

灵感来自人怎样学习:做错了一道题之后,看一看标准答案,理解每一步为什么这样做,就知道自己错在哪里。论文的假设是:“解释一个给定的正确答案”比”自己生成答案”更容易。于是:

  • 学生:同一个模型,只看到题目,自己生成解答;
  • 老师:同一个模型,额外看到特权信息(经过验证的标准解答),对学生生成的每一个位置给出下一个词的分布;
  • 训练:让学生在自己生成的轨迹上,每个位置的分布向老师的分布靠拢(最小化逐词的散度);梯度只通过学生的部分。

论文的对比表:

监督微调 / 离线蒸馏GRPO在线策略蒸馏OPSD
训练数据来自学生自己✗✓✓✓
密集的(逐词的)学习信号✓✗✓✓
采样成本低✓✗✓✓
不需要外部的老师✓✓✗✓

结果:在三个竞赛级的数学推理任务上,OPSD 达到或超过了 GRPO,而每道题只采样一次、只用 1,024 个词元,在 100 步之内收敛;GRPO 每道题要采样 8 次、每次 16,000 个词元。在同样的数据上做监督微调反而让模型变差了——作者认为是因为标准解答的推理风格太简洁,模型模仿了风格而丢了推理。一个细节:风格性的词元(客套话、格式)会主导训练信号,所以论文对每个词的散度做了截断,防止它们淹没真正重要的数学推理的词。

OPSD 和第 5.2 节演示 3 的问题有关:普通蒸馏的学生上限是老师;OPSD 的老师看到了标准答案,它能给学生提供比它自己”闭卷作答”更好的指导。


6. 讨论与边界

6.1 什么时候训练,什么时候不训练

做法改变了什么适合
提示工程 / harness(第 3、12 讲)模型看到什么、怎样组织调用任务多变、需要快速迭代、不能训练模型
检索(第 5 讲)模型能读到的知识知识多、变化快、要可追溯
微调(本讲)模型的权重格式、风格、专门的能力(第 13 讲);有足够的好数据
蒸馏(本讲)小模型的权重,复制大系统的行为一个系统已经做对了,需要更快、更便宜、可以自己部署
强化学习(本讲)权重,按奖励优化有可靠的、可自动验证的奖励(数学、代码)

这门课的大部分系统选择了前两行:它们不需要训练、可解释、知识可以更新。训练是在系统已经做对之后,为了速度、成本、部署而使用的工具(WikiChat 的蒸馏、CHURRO 的微调)。

6.2 训练不能解决的问题

  • 知识的边界:模型只知道训练数据里有的东西;新的、私有的、长尾的知识要靠检索(第 1、5 讲);
  • 知道自己不知道:演示 5 和练习 3 说明,训练让模型”总要回答”,教它说”不知道”又会让它过度谨慎;
  • 奖励的漏洞:强化学习会利用奖励的漏洞(第 12 讲:改测试、写特例);可验证的奖励也只验证它验证的东西;
  • 老师的错误:蒸馏的学生继承老师的错误;合成数据继承生成它的模型的偏差。

6.3 本讲模拟的边界

迷你模型只有约 8 万个参数,“知识”存放在”名字 → 答案”的权重里,不是 Transformer,不会推理。它演示了预训练学知识、微调学格式、遗忘、蒸馏、学生继承老师的错误这些机制;第 3 节的推理模型、强化学习、测试时扩展没有配套代码,结论来自论文。


7. 本讲小结

  1. 预训练:在海量文本上预测下一个词(交叉熵)。为了预测得准,模型学到了语言、知识、推理;知识就是概率。预训练的模型只会续写(迷你模型:知道 mira 生在 kestavia,问它却接着写网页)。Transformer 用自注意力让每个位置看到前面所有的位置;GPT-3 发现了上下文学习,LLaMA 开启了开源模型的生态。
  2. 指令微调教的是格式和风格,知识来自预训练(迷你模型:微调 20 个人物,另外 20 个人物答对 82%;没有预训练只有 13%)。InstructGPT:监督微调 → 奖励模型 → PPO 强化学习,13 亿参数的 InstructGPT 胜过 1,750 亿参数的 GPT-3。微调会让模型遗忘(网页损失 0.14 → 2.61),混入预训练数据可以避免;训练让模型”总要回答”,这是幻觉的一个来源。
  3. 推理模型:DeepSeek-R1-Zero 用纯强化学习(GRPO + 规则写的可验证奖励),AIME 2024 从 15.6% 提高到 71.0%,长推理和反思自发出现;s1 只用 1,000 个精挑细选的样本(难度、多样性、质量)微调 26 分钟,加上”预算强制”,超过了 o1-preview。
  4. 训练数据:筛选、去重、配比、防污染;合成数据越来越重要;质量和选择胜过数量。
  5. 蒸馏把慢而准的系统压缩进快而便宜的模型(WikiChat 蒸馏进 LLaMA:91.1% vs GPT-4 的 66.1%)。学生的上限是老师,会继承老师的错误;用投票提高数据质量、用多种问法提高多样性、用回放防止遗忘。在线策略蒸馏解决暴露偏差;OPSD 让模型看着标准答案给自己当老师,用一次采样达到 GRPO 的效果。

8. 与项目的关系

  • 课程项目一般不需要从头训练模型。但如果你的系统已经能做对一件事,蒸馏是让它可以部署的好办法:用你的流水线生成数据(多种问法、投票提高质量),微调一个开源的小模型,在独立的测试集上和原来的流水线比较。
  • 微调之前,先看看是不是格式和风格的问题(少量例子就够),还是知识的问题(应该用检索)。
  • 如果你考虑强化学习:你的奖励能自动、可靠地验证吗?有没有可以被”投机”的漏洞?第 12 讲的教训同样适用。
  • 用合成数据时,抽查质量;记住学生会继承老师的错误。

9. 练习

练习 1(动手:只在答案部分计算损失)。在 01 号文件里,指令微调时不做掩码(mask_prefix=None,问题部分也计算损失)。测试人物的准确率、网页上的损失各怎样变化?

参考答案

实测:不做掩码,测试人物答对 82%(做掩码时 82%),网页上的损失 2.23(做掩码时 2.61)。在这个小实验里,掩码对准确率几乎没有影响;不做掩码时遗忘得反而少一些——问题部分(“where was mira born ?”)和网页的句子很像,在它们上面计算损失,相当于顺便复习了一点”写网页”。

真实的 LLM 微调通常只在回答部分计算损失,理由是:问题部分来自用户、风格各异、有时有错误,模型不需要学会生成它们;只学回答部分,有限的训练信号都用在了”怎样回答”上。但这个选择并不总是重要,要在自己的数据上测——这也是本讲的一个教训:很多”标准做法”的效果取决于具体情况。

练习 2(动手:更差的老师)。把 02 号文件的 TEACHER_ERROR 改成 0.2,比较”回答一次”和”回答三次取多数”两种打标签的方式。

参考答案

实测:

老师的错误率打标签的方式老师调用错误的标签学生答对
8%回答一次180690%
8%回答三次取多数540198%
20%回答一次1801477%
20%回答三次取多数540395%

老师越差,投票的收益越大(20% 时从 77% 提高到 95%)。三次独立运行里有两次出同样的错,概率远小于一次出错(如果错误是独立的)。这就是第 1 讲”可靠性的算术”:独立的错误可以通过投票互相抵消。注意前提是错误独立:如果老师在某个事实上系统性地读错(例如知识库本身写错了),投票也救不了。

练习 3(动手:教模型说”不知道”)。在 01 号文件的指令微调数据里,加入关于前 10 个新人物的所有问题,答案都是 unknown。微调后,模型对另外 10 个新人物会说”不知道”吗?对预训练里有的测试人物呢?

参考答案

实测:对用于训练的 10 个新人物和另外 10 个没见过的新人物,模型都 100% 回答 unknown——它学会了”名字我不认识 → 不知道”;但对预训练里有的测试人物,它也有 35% 的时候回答 unknown,准确率从 82% 降到 65%。

原因:在这个模型里,“不认识的名字”意味着名字的特征权重是 0,于是问题里的其他词(where、born……)决定了答案,而这些词在训练时有一部分被推向了 unknown。对认识的人物,名字的权重和”unknown”的倾向在拔河,弱一些的记忆就输了。真实的 LLM 也有同样的权衡:训练模型拒绝回答没把握的问题,会让它在有把握的问题上也变得过度谨慎。WikiChat 的思路是把”知不知道”交给检索(检索不到证据就不说),而不是指望模型自己判断。

练习 4(思考:为什么指令微调这么”便宜”)。InstructGPT 用几万个标注的例子,LIMA 用 1,000 个,s1 也用 1,000 个,而预训练要用几万亿个词元。为什么后训练需要的数据少这么多?演示 2 和演示 3 的哪个结果支持你的解释?

参考思路

预训练要学的是语言、世界知识、推理能力——极其庞大的东西;后训练只是在这些能力的基础上选择一种行为方式(回答问题而不是续写、用某种格式、遵循指令、写长推理)。表层对齐假说认为,这些行为在预训练时就已经”潜伏”在模型里了(网上有大量问答、教程、解题过程),后训练只是把它们调出来。

演示 2 支持这个解释:微调只用了 20 个人物,模型就能回答另外 20 个人物的问题——知识不是微调教的;没有预训练的模型格式学得一样好,却答不对。演示 3 也部分支持:迷你模型需要几十个例子,因为它的预训练里没有任何问答式的文本,“问题 → 回答”这个映射要从头学;真实的 LLM 读过大量问答,所以需要的例子少得多。s1 在这一点上更进一步:长推理的能力也是”调出来”的,但需要精挑细选的高质量样本。

练习 5(思考:设计一次蒸馏)。你的项目有一条 GPT 级大模型驱动的多阶段流水线(例如第 9 讲的 SLIDERS 或第 5 讲的 WikiChat),效果很好但每个问题要几十秒、几毛钱。你要把它蒸馏进一个 70 亿参数的开源模型。写一个计划:数据从哪里来、怎样保证质量和多样性、怎样评估、要警惕什么。

参考思路

数据:(1) 收集真实用户的问题,或者用 LLM 按真实问题的分布生成大量问题(覆盖头部、长尾、新近的话题——第 5 讲的评估框架);(2) 让流水线回答,保存每个阶段的输入输出(WikiChat 的蒸馏就是对流水线的每一步分别训练,而不只是”问题 → 最终回答”);(3) 同一个意图用多种问法(演示 2)。

质量:对关键的输出做多次运行投票或核查(演示 4);丢掉流水线自己标记为”没把握”的样本,或者把”我不知道”也作为训练目标;抽查一部分人工审核。

评估:留出流水线没见过、蒸馏数据里也没有的测试问题;和原来的流水线逐项比较(事实准确率、对话性、延迟、成本);单独看长尾和新近的问题;检查遗忘(学生原来的通用能力)。

警惕:学生继承老师的错误和偏差(演示 3);学生只学会了训练数据覆盖的那类问题;知识过时(检索的部分最好保留,学生只负责其他阶段);如果蒸馏数据里有用户的隐私数据,要处理。可以考虑在线策略蒸馏:让学生自己生成,大模型逐词评判,减少暴露偏差。


10. 延伸阅读

课程阅读清单

  • Vaswani 等. Attention Is All You Need. NeurIPS 2017. 必读
  • Brown 等. Language Models are Few-Shot Learners(GPT-3). NeurIPS 2020.
  • Ouyang 等. Training language models to follow instructions with human feedback(InstructGPT). NeurIPS 2022.
  • Touvron 等. LLaMA: Open and Efficient Foundation Language Models. 2023.
  • DeepSeek-AI. DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning. 2025.
  • Muennighoff 等. s1: Simple test-time scaling. 2025. arXiv 2501.19393.
  • Zhao 等. Self-Distilled Reasoner: On-Policy Self-Distillation for Large Language Models(OPSD). 2026. arXiv 2601.18734.
  • Wei 等. Chain-of-Thought Prompting Elicits Reasoning in Large Language Models;Wang 等. Self-Consistency Improves Chain of Thought Reasoning in Language Models.

背景

  • Hinton、Vinyals、Dean. Distilling the Knowledge in a Neural Network. 2015.
  • Zhou 等. LIMA: Less Is More for Alignment. NeurIPS 2023.
  • Rafailov 等. Direct Preference Optimization: Your Language Model is Secretly a Reward Model. NeurIPS 2023.
  • Agarwal 等. On-Policy Distillation of Language Models: Learning from Self-Generated Mistakes. ICLR 2024.
  • Semnani 等. WikiChat(第 5 讲):把 GPT-4 驱动的流水线蒸馏进 LLaMA。
  • 同目录的 CS224N、CS336、CS234 讲义:Transformer 的细节、从零训练语言模型、RLHF 与 DPO。

11. 下一讲预告

这门课的每一讲都在评估:事实准确率、执行准确率、任务完成率、归一化的相似度、隐藏测试、新闻价值……也反复遇到评估的陷阱:标注错误、评委偏差、指标的漏洞、样本太少。第 15 讲(拓展)把评估方法系统地整理一遍,并为期末项目做准备:

  • 评估的几种方式:自动指标、LLM 当评委(位置偏差、长度偏差、自我偏好)、模拟用户、真实用户研究;
  • 统计:置信区间、配对比较、需要多少样本、从两两比较得到排名(Chatbot Arena);
  • 期末项目:从领域出发还是从技术出发;提案、演示、论文的结构。
← 返回课程目录