对应 Maps to:Stanford CS324 Winter 2023 Advances in Foundation Models,1/23 Lecture: Scaling Laws and Emergent Behavior(Tatsu Hashimoto)的后半部分;Syllabus 主题 “Emergent Behaviors and Capabilities” 的阅读:SAIL 博客《上下文学习是怎样工作的》(Xie & Min, 2022)、Wei et al. 2022(涌现能力)、Nye et al. 2021(scratchpad 草稿)、Wei et al. 2022(chain-of-thought 提示)、Arora et al. 2022(AMA 提示)、Chan et al. 2022(数据分布性质与 ICL)、Xie et al. 2021(ICL 作为隐式贝叶斯推断)、Min et al. 2022(重新审视示例的作用)。完整的标题和链接见 §11。同一主题下的 Kaplan et al. 的规模定律论文和 Winter 2022 的规模定律笔记属于第 4 讲。 依据说明:课程网站没有提供这次讲座的 slides 或录像。本讲依据上面这些阅读材料来写:§1–2 沿着 Wei et al. 2022 和它最有名的反驳——Schaeffer et al. 2023(“涌现能力是海市蜃楼吗?”)——展开;§3–4 以 SAIL 博客为主线,串起 Min、Xie、Chan 三篇,并补充了 Wei et al. 2023(大模型做 ICL 的方式不同)、Garg et al. 2022(Transformer 能在上下文里学会什么函数)、von Oswald et al. 2022、Raventós et al. 2023、Olsson et al. 2022(induction head);§5 依据 Nye、Wei(CoT)以及 Wang et al. 2022(自洽性)、Kojima et al. 2022(zero-shot CoT);§6 依据 AMA、Allen-Zhu & Li 2023(知识的存储与提取)和 Berglund et al. 2023(反转诅咒)。文献里的数字都是我从论文里读到的;§7“2023 年之后”是我补充的。 配套代码 Code:
code/lecture05/(PyTorch;4 个脚本 + 2 个模块。第一次运行要训练并缓存小模型:代码 01 约 65 秒、02 约 50 秒、03 约 100 秒、04 约 20 秒;之后读缓存,2–35 秒) 预计阅读时间:3.5 小时(含运行代码)
0. 本讲导航 · How to read this lecture
0.1 学习目标 Learning goals
学完这一讲,你应该能够:
- 说出 Wei et al. 对**涌现能力(emergent abilities)**的定义,举出两类例子(few-shot 任务、增强的提示策略),并说明它为什么让人既兴奋又不安。
- 用一行数学()解释 “海市蜃楼”批评:为什么 exact match 这类指标会把平稳的进步画成”突然出现”;什么是”分辨率”问题;以及这个批评解释不了什么。
- 复述 in-context learning(ICL)的现象学:示例里的格式、标签空间、输入分布比”标签对不对”更重要(Min et al.),但大模型会跟着翻转的标签走(Wei et al. 2023)。
- 讲清三种解释:隐式贝叶斯推断(Xie et al.)、数据分布的性质(突发性、长尾;ICL 与 in-weights learning 的取舍,Chan et al.)、ICL 是一个学到的学习算法(Garg et al.、梯度下降视角),并知道 induction head 是它们的一个机制候选。
- 用配套代码里的一个”能精确算出贝叶斯最优答案”的小世界,说明”模型 ≈ 贝叶斯”在什么条件下成立、在什么条件下不成立。
- 解释 scratchpad / chain-of-thought 为什么有用(更多的串行计算、把难题拆成局部的小步),区分”在草稿格式上训练”和”在提示里要求写推理”,以及 self-consistency、zero-shot CoT 是什么。
- 说出 AMA 的两个想法(改写成模型熟悉的格式;多个提示 + 弱监督聚合),并解释为什么错误相关的提示集成不起作用。
- 区分知识的存储与提取,解释反转诅咒(reversal curse),并把它和第 1 讲 §3.3 的跨格式问答联系起来;了解 2023 年之后的推理模型(o1、DeepSeek-R1)和推理时计算。
0.2 先修与本讲范围 Prerequisites & scope
| 默认你已经会 Assumed | 本讲只给直觉,后面几讲再展开 Previewed only |
|---|---|
| 第 1 讲:语言模型、温度与贪心、提示与 few-shot、迷你世界与 base model | 规模定律本身:损失怎样随 N、D、C 下降(第 4 讲) |
| 条件概率、贝叶斯公式(先验 × 似然 ∝ 后验) | Transformer 内部结构(第 3 讲);induction head 的电路细节(第 12 讲) |
读得懂 train_lm 这样的训练循环(第 1 讲代码) | 指令微调、RLHF、用强化学习训练推理(第 7 讲) |
| 提示、探针、微调的系统比较(第 6 讲) |
本讲回答三个问题:能力是怎样”出现”的?(§1–2)模型为什么能从提示里的几个例子”学会”任务?(§3–4)让模型先写出中间步骤,为什么会更好?(§5)最后讨论提示的两个老问题:提示不稳定、知识取不出来(§6)。
0.3 本讲地图 Map
§1 什么是"涌现":第 1 讲的两个"做不到";Wei et al. 的定义与例子;为什么在意
§2 涌现是海市蜃楼吗:p^L;真实小模型上的指标对比;分辨率;Schaeffer et al.; ← 代码 01
之后还剩什么(真实的跳变)
§3 ICL 的现象学:Min et al.(标签对错没那么重要);Wei et al. 2023(翻转的标签)
§4 ICL 为什么能工作:隐式贝叶斯推断 + 一个能算出理想答案的小世界; ← 代码 02
数据分布的性质(突发性、长尾、ICL vs IWL);学到的学习算法;induction head 预告
§5 草稿与思维链:Nye、Wei;串行计算;训练 vs 提示;self-consistency; ← 代码 03
zero-shot CoT
§6 提示的两个老问题:AMA 与提示集成;知识的存储与提取;反转诅咒 ← 代码 04
§7 2023 年之后:涌现之争的后续、many-shot ICL、推理模型与推理时计算
§8–12 小结、常见误区、练习、延伸阅读、下一讲预告
0.4 记号 Notation(只列本讲新增的,其余见第 1 讲 §0.4)
| 符号 | 含义 | 例子 |
|---|---|---|
| 单个 token 答对的概率(逐 token 准确率) | 代码 01 演示 2:0.190 → 1.000 | |
| 答案的长度(token 数) | “8 个符号全对”: | |
| EM | exact match:整个答案一字不差才算对 | 独立时 EM |
| 提示里示例(demonstration)的个数 | -shot | |
| 隐藏的”概念”(latent concept):一篇文档在做什么任务 | 代码 02 世界 A 的 8 个概念 | |
| 个示例 | ||
| 看完示例之后对概念的后验 | ||
| ICL / IWL | in-context learning / in-weights learning:从上下文里学 vs 记在权重里 | Chan et al. 2022 |
| CoT | chain-of-thought,思维链 |
0.5 关于数字 · About the numbers
讲义里所有实验数字都来自 code/lecture05/ 的实际输出(固定种子、PyTorch 单线程,同一台机器上重复运行逐字相同)。和第 1 讲一样,模型只有 – 个参数,它们演示的是机制,不是量级:哪些结论能推广到真实的大模型,正文会逐条说明,并给出论文里的真实数字(注明出处)。这一讲有好几处结果和我写代码前的预想不一样——最重要的两处是”小模型没有学会照抄”(§4.2)和”投票没有超过贪心”(§5.4)——讲义按实际结果来写,完整的清单在代码 README 的”关于实验结果”里。
1. 什么是”涌现” · What does “emergent” mean?
1.1 从第 1 讲的两个”做不到”说起
第 1 讲的 base model(2 层、约 11 万参数)留下了两个”做不到”:
- 加法没有出现:两位数加法的新题只做对 0.09(§3.3)。
- 不会从示例里学新格式:用训练时没见过的 “question: … answer:” 格式去问,zero-shot 是 0.00,先给 2 个示例还是 0.00(§4.2)。
GPT-3 论文里有完全对应的观察:两位数加法对小模型接近 0、对 1750 亿参数的模型接近 100%;few-shot 带来的提升随模型变大而变大。这自然引出一个问题:是不是有些能力,只有模型大到一定程度才会出现? 如果是,那么”把模型做大”就不只是让损失平稳地下降一点(第 4 讲的规模定律),而是可能解锁新的东西——也可能解锁我们不想要的东西。
1.2 Wei et al. 的定义与例子
Wei et al. 2022(Emergent Abilities of Large Language Models)给出了一个简单、可操作的定义:如果一种能力在较小的模型里不存在、在较大的模型里存在,它就是涌现的。 他们引用物理学家 Philip Anderson 的说法”More is different”:量的变化带来质的变化。画出来就是这样一条曲线:横轴是模型规模(训练 FLOPs 或参数量,对数坐标),纵轴是任务表现;小模型一直贴着随机水平,到某个规模之后突然明显高于随机。这种能力无法从小模型的趋势外推出来——这是定义里最关键的一点。
论文把例子分成两类(规模数字引自论文 §3–4 和表 1):
| 类别 | 例子 | 大约从什么规模开始明显高于随机 |
|---|---|---|
| few-shot 提示的任务 | 多位数算术(GPT-3) | 约 训练 FLOPs(130 亿参数) |
| TruthfulQA(Gopher) | 约 FLOPs(2800 亿参数) | |
| MMLU(57 个学科的多选题) | FLOPs(约 100 亿参数)及以下接近随机;– FLOPs(700 亿–2800 亿参数)明显超过 | |
| WiC(词义辨析) | GPT-3、Chinchilla 到约 FLOPs 都接近随机;PaLM 在 FLOPs(5400 亿参数)超过 | |
| 增强的提示 / 使用方式 | chain-of-thought 提示(数学应用题) | 约 FLOPs(约 1000 亿参数)才好于普通提示 |
| 指令微调后的零样本表现 | 约 80 亿参数及以下反而有害,约 1000 亿参数时有帮助 | |
| scratchpad(8 位数加法,在草稿格式上微调) | 约 FLOPs(4000 万参数)起就有帮助 | |
| 校准(模型判断自己答案对不对) | 约 520 亿参数 |
注意第二类:不只是”会不会做某个任务”,连”某种用法有没有用”也会随规模改变。chain-of-thought 提示对小模型没用甚至有害,对大模型却大幅提升(§5)。而 scratchpad 一行的门槛低得多——那是在草稿格式上微调,和只在提示里给推理示例不是一回事(§5.3,代码 03 会用一个 1.5 万参数的模型说明这一点)。
论文也提醒了几件事:规模不是唯一的变量。在 14 个 BIG-Bench 任务上,LaMDA 1370 亿和 GPT-3 1750 亿都接近随机,PaLM 620 亿却高于随机——更好的数据(多语言、代码)和架构差别都可能让能力”提前出现”;指令跟随在 110 亿参数的 encoder-decoder 模型上也能做到,InstructGPT 的 13 亿参数模型在人工评测里胜过大得多的模型。**涌现的门槛不是一个物理常数,它取决于数据、训练方法和……评价指标。**最后这一点是下一节的主题。
1.3 为什么在意:不可预测性
规模定律(第 4 讲)告诉我们:预训练损失随算力平稳地、可预测地下降。如果所有能力都像损失一样平稳,那么训练一个大模型之前,我们就能从小模型外推出它会多强——这对规划算力很有用,对安全也很重要。涌现能力的说法挑战了这种乐观:有的能力在小模型上完全看不到迹象,也就无法提前评估它的风险(比如欺骗、自主规划、网络攻击能力)。这也是为什么”涌现到底是不是真的”不只是一个学术争论。
1.4 两种”涌现”不要混淆
第 1 讲 §1.3 也用过”涌现”这个词,那是 Bommasani 等人的用法:能力是训练的副产品,而不是被显式设计出来的(ICL 就是例子)。Wei et al. 的用法更窄:能力随规模不连续地出现。两者有关但不同——ICL 在 Bommasani 的意义上是涌现的(没人设计它),在 Wei 的意义上也是(小模型几乎没有);而第 1 讲迷你实验里”评论打分在 500 步出现、人物事实要到 1500–2500 步”,是第三种:随训练时间先后出现。本讲会看到,这三种”出现”都可能被评价指标放大或掩盖。
2. 涌现是海市蜃楼吗? · The mirage critique
2.1 一行数学:
Schaeffer et al. 2023(Are Emergent Abilities of Large Language Models a Mirage?)的论证从一个简单的观察开始。假设:
- 单个 token 的交叉熵随参数量 按幂律平稳下降(第 4 讲):,;
- 于是单个 token 答对的概率 也平稳上升;
- 如果一个答案有 个 token,而且各 token 的对错大致独立,那么
是 的高次方: 从 0.5 升到 0.9, 从 升到 0.12。在对数坐标的规模轴上,平稳上升的 会被 画成”先贴着 0、然后突然冲上去”的曲线;而编辑距离对 是线性的,看起来依旧平稳。
代码 01 演示 1 把这件事算了出来(假想的模型族:,数字是为了演示随手选的):
| 参数量 | 交叉熵 / token | 全对() | 全对() | 错几个() | |
|---|---|---|---|---|---|
| 1.200 | 0.301 | 0.002 | 0.0000 | 13.98 | |
| 0.239 | 0.787 | 0.302 | 0.0083 | 4.26 | |
| 0.107 | 0.899 | 0.586 | 0.1178 | 2.03 | |
| 0.048 | 0.953 | 0.788 | 0.3846 | 0.93 | |
| 0.010 | 0.991 | 0.953 | 0.8264 | 0.19 |
每大 10 倍,交叉熵乘以同一个因子(),完全可以预测。可是只看倒数第二列,你会说”这个能力在 左右突然出现”。
2.2 在真实的小模型上看一遍
纯数学的论证有一个漏洞:真实模型的各 token 错误不一定独立, 也不一定平稳。所以代码 01 演示 2 在真实训练的模型上重做一遍。任务是”查密码本”:900 个三字母的”词”,每个词随机对应 16 个符号中的一个;一句话 8 个词,要写出 8 个符号。
kon zev roz vas zev sat bov tif: 05DB581D
每个对应关系都是随机的,只能一个一个记住;词频服从 Zipf 分布(少数词很常见,多数词很少见)——这有点像 BIG-Bench 里”音标转写""查表翻译”一类任务的缩小版。我们训练 6 个大小不同的模型(1 层,宽度 8 到 64,约 1.5 千到 5.5 万参数),用同一批模型、同一批输出算几种指标:
| 模型 | 参数量 | 逐 token 准确率 | 正确 token 的平均概率 | 全对 | (逐 token) | |||
|---|---|---|---|---|---|---|---|---|
| 1L·8 | 1,512 | 0.190 | 0.095 | 0.231 | 0.050 | 0.003 | 0.000 | 0.000 |
| 1L·16 | 4,560 | 0.219 | 0.167 | 0.273 | 0.065 | 0.002 | 0.000 | 0.000 |
| 1L·24 | 9,144 | 0.512 | 0.359 | 0.511 | 0.264 | 0.065 | 0.007 | 0.005 |
| 1L·32 | 15,264 | 0.699 | 0.584 | 0.701 | 0.504 | 0.243 | 0.065 | 0.057 |
| 1L·48 | 32,112 | 0.885 | 0.809 | 0.891 | 0.795 | 0.613 | 0.373 | 0.375 |
| 1L·64 | 55,104 | 1.000 | 0.994 | 1.000 | 1.000 | 1.000 | 0.999 | 0.999 |
几个值得细看的地方:
- “8 个符号全对”这一列看起来就是涌现:0.000、0.000、0.007、0.065、0.373、0.999——前三个点贴着 0,然后冲上去。如果你只看这一列,会说”这个能力在 1.5 万到 3 万参数之间出现”。
- 它几乎完全由 决定:最后一列(逐 token 准确率的 8 次方)和 那一列几乎一样(0.005 vs 0.007、0.057 vs 0.065、0.375 vs 0.373)。逐 token 准确率本身是 0.19 → 0.22 → 0.51 → 0.70 → 0.89 → 1.00,虽然不是一条直线,但没有”从无到有”的那一下。
- 答案越长,曲线越陡:同一个 9,144 参数的模型, 时 0.511, 时 0.007。“这个模型会不会这个任务”的答案,取决于你要求它一次写对多长。
2.3 分辨率:测不到 ≠ 不存在
Schaeffer et al. 的第二个因素是分辨率:一个只有 100 道题的测试集,能报告的最小非零准确率是 0.01;真实准确率 0.001 的模型,在 100 道题上有约 90% 的概率得 0 分。代码 01 用同一批模型比较了三种测法:
| 模型 | 100 句上的全对率 | 2000 句上的全对率 | 按 采样时全对的概率(期望,连续) |
|---|---|---|---|
| 1L·8 | 0.00 | 0.0000 | 7.28e-09 |
| 1L·16 | 0.00 | 0.0000 | 2.81e-07 |
| 1L·24 | 0.00 | 0.0070 | 2.67e-04 |
| 1L·32 | 0.08 | 0.0650 | 1.45e-02 |
| 1L·48 | 0.30 | 0.3735 | 1.82e-01 |
| 1L·64 | 1.00 | 0.9995 | 9.53e-01 |
最后一列是”一字不差地写出整个答案”的概率——把答案每个 token 的条件概率乘起来(teacher forcing),对所有句子取平均。它就是按 采样时 exact match 的期望值,但它是一个连续的量:从 量级一路升到接近 1,没有哪一步是从”没有”变成”有”。用 100 句测,前三个模型都是 0.00——“测不到”被误读成了”不存在”。
2.4 Schaeffer et al. 的证据
论文把这个论证用到了真实模型上,总结出”看起来涌现”的三个来源:(1) 选了一个对逐 token 错误率非线性或不连续的指标;(2) 小模型区间的分辨率不够(测试集太小);(3) 大模型区间采样太稀(只有几个点)。证据有三类:
- GPT-3 / InstructGPT 上的算术:2-shot 的两位数乘法、四位数加法,用 exact match 看,答案有 4–5 位时像是涌现;换成 token 编辑距离,同一批输出随规模平稳改善;加大测试集后,整个模型族在 exact match 上都高于随机,改善同样平稳。
- BIG-Bench 的元分析:39 个”首选指标”里至多 5 个显示出涌现;声称的涌现能力里,超过 92% 来自两个指标——多选题得分(Multiple Choice Grade,不连续)和精确字符串匹配(Exact String Match,非线性)。对 LaMDA,把多选题得分换成连续的 Brier 分数,涌现就消失了。
- “制造”涌现:在视觉任务上(CIFAR-100 上的自编码器、Omniglot 上的 Transformer、MNIST 上的 LeNet),只要换一个”全部做对才算对”的指标,就能让本来平稳的能力看起来像突然出现。
论文的结论措辞很谨慎:它没有说大模型不可能有涌现能力,而是说之前报告的很多例子”可能是研究者的分析方法造成的”。
2.5 “海市蜃楼”之后还剩什么
Wei et al. 2022 自己其实已经讨论过指标的问题(论文 §5.1),并给出了几条反驳:在 6 个涌现的 BIG-Bench 任务上,目标答案的交叉熵确实在小模型上就在改善(被 exact match 掩盖了)——但交叉熵的改善并不能预测涌现发生在哪个规模;而且在分类任务上(答案只有一个 token,无所谓部分得分)也观察到了涌现;在 3 个生成任务上,用给部分分的指标(BLEU、ROUGE、BLEURT)也还是涌现。后来 Du et al. 2024(Understanding Emergent Abilities of Language Models from the Loss Perspective)提出另一种表述:在固定的数据和架构下,预训练损失相同的模型下游表现相同;某些任务要等预训练损失低于一个阈值才高于随机,而且不管指标是否连续都是这样。
代码 01 演示 3 给出一个小规模的例子,说明”真实的跳变”长什么样。一个 2 层、96 维的模型学 4 位数加法(直接写答案),训练中每 100 步记录一次(节选):
| step | bit / token | 正确 token 的平均概率 | 逐位准确率 | 整题准确率 |
|---|---|---|---|---|
| 0 | 4.143 | 0.059 | 0.021 | 0.000 |
| 100 | 2.502 | 0.288 | 0.305 | 0.000 |
| 300 | 1.899 | 0.419 | 0.491 | 0.002 |
| 400 | 1.223 | 0.583 | 0.651 | 0.028 |
| 500 | 0.728 | 0.682 | 0.764 | 0.216 |
| 700 | 0.261 | 0.879 | 0.932 | 0.720 |
| 800 | 0.127 | 0.943 | 0.973 | 0.888 |
| 1500 | 0.012 | 0.994 | 0.998 | 0.992 |
这里叠着两件事:
- 指标造成的放大:前 300 步,正确 token 的概率从 0.059 升到 0.419、逐位准确率升到 0.491,整题准确率却只有 0.002——模型已经学会了一部分,exact match 完全看不见。这一部分是 Schaeffer et al. 能解释的。
- 逐 token 指标本身的”加速”:100–300 步,bit/token 只从 2.502 降到 1.899;300–800 步,它从 1.899 降到 0.127,降了 15 倍。模型大约在第 300 步之后才真正学会”进位”,这个加速不是指标造成的——连最平滑的交叉熵都看得见它。
这种”平台期之后突然学会”的现象在算法类任务上很常见(grokking、induction head 的形成,第 12 讲),而且什么时候发生带有偶然性:代码 03 里,同样配置的直接写答案的加法模型,种子 0 在第 900–1000 步之间学会,种子 1 到第 1500 步都没学会(§5.2)。
怎样看待这场争论? 我的总结是三句话:
- 很多报告出来的涌现,确实主要是指标造成的,尤其是 exact match 和多选题得分。想预测更大的模型会怎样,应该看连续的、逐 token 的指标(对数概率、编辑距离、Brier 分数),并用足够大的测试集。
- 但”用户在乎的能力”往往就是 exact match:一段代码要么能跑、要么不能跑;一道数学题答案差一位就是错。从使用者的角度,“整题全对的概率从 0.01 跳到 0.4”是真实的变化,即使它背后的逐 token 进步是平稳的。
- “平稳的 “本身也不是理所当然的。需要特定电路(进位、照抄、多步组合)的能力,可能在训练或规模上出现真正的加速;我们对它们的预测能力仍然有限。
3. 上下文学习的现象学 · What does ICL depend on?
3.1 复习:ICL 是什么,为什么奇怪
第 1 讲 §4.2 介绍过:在提示里放几个”输入 → 输出”的示例,模型就能对新输入给出合适的输出,不更新任何参数。奇怪之处在于:传统的监督学习要靠梯度更新参数,而 ICL 的”学习”发生在一次前向传播之内;同一个模型换一组示例,就换了一个任务。
在研究”ICL 为什么能工作”之前,先要知道它对什么敏感、对什么不敏感。这一节是现象,下一节是解释。
3.2 Min et al.:标签对不对,没那么重要
Min et al. 2022(Rethinking the Role of Demonstrations)做了一个看似简单的实验:把 few-shot 提示里的示例标签换成随机标签(从正确的标签集合里随机抽),看准确率掉多少。设置是:6 个 decoder-only 模型(GPT-2 Large、MetaICL、GPT-J、fairseq 6.7B / 13B、GPT-3),每个有 direct 和 channel 两种用法,共 12 种配置,7.74 亿到 1750 亿参数;26 个分类和多选数据集;每个提示 个示例。
结果出乎意料:换成随机标签,准确率只掉 0–5 个百分点(分类任务平均掉 2.6,多选平均掉 1.7),而且仍然远高于不给示例。如果 ICL 真的像监督学习那样”从输入—标签对里学映射”,随机标签应该让它崩溃才对。
那示例里什么才重要?论文把一个示例拆成四个方面,逐个破坏:
| 示例的哪一方面 | 怎样破坏 | 结果(论文报告) |
|---|---|---|
| 输入—标签的对应关系 | 标签随机 | 影响最小(上面的 0–5 个点) |
| 输入的分布 | 输入换成另一个语料(CC-News)里的随机句子 | 好几个模型掉 3–16 个点,有的甚至不如不给示例 |
| 标签空间 | 标签换成随机的英文单词 | direct 模型掉 5–16 个点 |
| 格式(输入和标签配对出现) | 只给输入、或只给标签 | 和不给示例差不多,甚至更差 |
结论:示例的作用主要是告诉模型”这是什么任务”——输入长什么样、标签有哪几个、格式是什么——而不是教它”哪个输入对应哪个标签”。对应关系,模型似乎在预训练时已经知道了(“great → positive”)。论文也列出了局限:只研究了分类和多选;在一些数据集上随机标签伤害大得多(financial_phrasebank 上 GPT-J 掉了近 14 个点);同期的 Kim et al. 发现把标签取反(而不是随机化)会明显伤害分类。
3.3 但大模型不一样:翻转的标签
Wei et al. 2023(Larger language models do in-context learning differently)把”随机标签”换成了更狠的”翻转标签”:示例里 positive 全标成 negative、negative 全标成 positive。如果模型只靠先验,它会无视翻转;如果它真的从示例里学映射,它会跟着翻转走,在”正确答案”上的准确率掉到随机以下。
他们发现这是一个随规模涌现的能力:小模型几乎不理会翻转的标签(准确率只是略降);大模型会跟着走——例如 text-davinci-002 在 0% 翻转时 90.3%,100% 翻转时掉到 22.5%,远低于 50% 的随机水平;PaLM 也能掉到 31%。另一个实验用语义无关的标签(例如 “foo / bar” 代替 “positive / negative”),模型没法借助先验,只能从示例里学映射:小模型掉得多,大模型掉得少。还有一个有意思的发现:指令微调让模型更依赖先验——Flan-PaLM 在 100% 翻转时也不会低于随机。
把 Min 和 Wei 两组结果放在一起:示例里的标签对错重不重要,取决于模型、任务和先验的强弱。§4.2 的小世界会给这句话一个精确的版本。
3.4 其他”怪癖”
- 对示例顺序敏感:Xie et al. 在他们的玩具世界里,同一组示例换个顺序,准确率能差 10–40 个百分点。
- few-shot 有时不如 zero-shot:Xie et al. 在一些设置下看到,few-shot 准确率一开始反而低于 zero-shot,示例多了才回升——提示由一个个互相独立的示例拼成,这种结构在预训练文档里很少见,一开始反而干扰模型。
- 格式的细节影响巨大:第 1 讲 §4.2 里同一个知识,叙述句 0.93、问答格式 0.47、没见过的格式 0.00。Sclar et al. 2023 在 LLaMA-2-13B 上发现,只改提示的排版(不改意思),few-shot 准确率最多能差 76 个百分点。
4. ICL 为什么能工作 · Why does in-context learning work?
4.1 解释一:隐式贝叶斯推断
Xie et al. 2021(An Explanation of In-context Learning as Implicit Bayesian Inference;SAIL 博客 How Does In-context Learning Work? 是它的通俗版)从预训练数据是怎样生成的出发。设想每篇文档都是这样写出来的:
- 先抽一个隐藏的概念 ——这篇文档在讲什么、用什么格式、是什么”任务”(一份球队名单、一个 FAQ、一组翻译例句……);
- 再按这个概念生成整篇文档的 token。
为了把下一个 token 预测好,模型必须从前文推断当前文档的概念,因为同一篇文档里的 token 都由同一个 决定(文档有”长程一致性”)。一个完美学会了预训练分布的模型,对下一个 token 的预测就是对概念求积分:
提示里的 个示例 就是推断概念的证据:示例越多,后验 越集中到提示所对应的概念上,预测也就越接近这个概念下的正确答案。ICL 不需要”学习”新东西,它只是在预训练学到的概念里定位。
这个视角马上解释了 Min et al. 的现象。示例提供的证据不止一条:输入的分布、标签空间、格式、以及输入—标签的对应关系,每一条都在帮助定位概念。把标签随机化,只毁掉了最后一条;如果其余几条已经足够定位概念,而预训练学到的 本身就知道正确的映射,准确率就几乎不变。SAIL 博客把示例之间的拼接叫做”噪声”(独立示例之间的跳转在预训练文档里很少见),示例内部的结构叫做”信号”:只要信号大于噪声,示例越多越准。
Xie et al. 还证明了一个定理:在一个”可区分性”条件下(提示对应的概念和其他概念在每个示例上的 KL 散度之和,大于提示和预训练分布不匹配带来的误差),随着示例数 ,ICL 的预测收敛到贝叶斯最优;示例越长,越容易满足条件。他们造了一个合成数据集 GINC(预训练文档是 5 个”概念”——5 个隐马尔可夫模型——的混合),观察到:
- Transformer 和 LSTM 都出现了 ICL,准确率随示例数和示例长度上升;
- 更大的模型 ICL 更好,即使预训练损失相同:12 层和 16 层模型的验证损失都是 1.33,ICL 准确率分别是 81.2 和 84.7(4 层模型 60.2);
- 只在 1 个概念上预训练、或者在”随机转移”的数据上预训练,ICL 都不会出现——数据里的概念结构是关键;
- 预训练时没见过的概念,ICL 学不会。
4.2 在一个能算出”理想答案”的小世界里检验
Xie 的理论说”一个完美学会预训练分布的模型会做贝叶斯推断”,但真实的 LLM 是不是这样,在真实数据上无法检验——我们写不出互联网的 。代码 02 造了一个可以精确计算的小世界(icl_world.py):
一篇预训练文档(16 对"输入 标签"): d2 g1 d2 g1 d2 d2 d2 f1 c2 c1 c2 a2 f1 d2 c2 c2
- 输入是 8 个字母 a–h;4 个主题,主题 有两个常用字母(a/b、c/d、e/f、g/h,各占 0.3),所以输入分布带着主题信息;
- 主题 只用两个标签 ——标签空间也带着主题信息(相邻主题共享一个标签);
- 每个主题下,映射(哪个字母配哪个标签)决定答案;标签有 10% 的概率被换成 0–9 的随机数字。
两个预训练世界只差一件事:
- 世界 A(概念少):每个主题 2 种固定映射,一共 8 个概念反复出现。映射可以记在权重里,示例只需要帮模型认出是哪一个。
- 世界 B(概念多):每篇文档的映射都是新随机抽的。映射没法记住,想预测对只能从同一篇文档的前文里照抄。
在每个世界上各训练一个 2 层、64 维的小 Transformer(2500 步,只用”预测下一个字符”)。对任何提示,我们都能精确算出贝叶斯最优的答案(上面那个公式,对 8 个概念或 个概念求和);还算了一个对照:“只看词频”的贝叶斯——同样完美,但只知道示例里出现了哪些输入、哪些标签,不知道哪个输入配哪个标签。
ICL 曲线(示例标签正确,500 个提示):
| A:模型 | A:贝叶斯 | A:只看词频 | B:模型 | B:贝叶斯 | B:只看词频 | |
|---|---|---|---|---|---|---|
| 0 | 0.520 | 0.516 | 0.516 | 0.414 | 0.365 | 0.365 |
| 1 | 0.786 | 0.784 | 0.762 | 0.636 | 0.636 | 0.636 |
| 2 | 0.920 | 0.914 | 0.840 | 0.598 | 0.673 | 0.610 |
| 4 | 0.984 | 0.982 | 0.868 | 0.708 | 0.797 | 0.688 |
| 8 | 0.998 | 0.999 | 0.942 | 0.678 | 0.871 | 0.686 |
| 12 | 1.000 | 1.000 | 0.942 | 0.712 | 0.920 | 0.715 |
世界 A 的模型和贝叶斯最优几乎重合(0.786 vs 0.784、0.920 vs 0.914、0.984 vs 0.982),而且明显好于”只看词频”(:0.984 vs 0.868)——它用上了配对信息,在同一主题的两种映射之间做选择。一个只学过”预测下一个字符”的 10 万参数模型,在这个世界里的 ICL 在数值上就是”对隐藏概念做贝叶斯推断”。这是 Xie et al. 的理论在一个可以完全核对的环境里成立的例子。
世界 B 不一样:贝叶斯最优随 稳步上升( 时 0.871),模型却停在 0.7 左右,和”只看词频”的贝叶斯几乎一样(:0.678 vs 0.686)。下面会看到原因。
Min et al. 的消融():
| 示例 | A:模型 | A:贝叶斯 | B:模型 | B:贝叶斯 |
|---|---|---|---|---|
| 没有示例(zero-shot) | 0.504 | 0.511 | 0.380 | 0.372 |
| 正确标签 | 1.000 | 1.000 | 0.704 | 0.878 |
| 标签随机(在正确的标签空间里) | 0.722 | 0.705 | 0.510 | 0.506 |
| 标签随机 + 输入不按主题分布 | 0.708 | 0.617 | 0.482 | 0.533 |
| 标签换成标签空间之外的数字 | 0.606 | 0.691 | 0.514 | 0.504 |
| 只有输入、没有标签(格式错) | 0.522 | — | 0.466 | — |
(”—“:这种提示在预训练分布下概率为 0,贝叶斯答案没有定义。)
先看世界 A:
- 随机标签:1.000 → 0.722(贝叶斯 0.705),仍高于 zero-shot 的 0.504。被毁掉的只是”配对”这一条证据,标签空间和输入分布还在。这就是 Min et al. 的现象在贝叶斯视角下的样子。
- 但在这个世界里,随机标签只保住了相对 zero-shot 提升的约 44%,远不像 Min et al. 报告的”只掉 0–5 个点”。贝叶斯答案说明了原因:这里每个主题有两种映射,只有配对证据能区分它们;真实任务里,模型在预训练时早就学会了”great → positive”(先验几乎把映射定死了),示例只需要提供格式和标签空间。
- 输入分布:贝叶斯答案从 0.705 降到 0.617,模型只从 0.722 降到 0.708——在这一项上,模型比理想的学习者更不在乎输入分布。这是表里模型和贝叶斯差得最多的一处。
- 标签空间错、格式错:都明显伤害,格式错时回到 zero-shot 的水平(0.522),和第 1 讲”没见过的问法 0.00”同类。
再看世界 B:正确标签 0.704(贝叶斯 0.878),随机标签 0.510(贝叶斯 0.506)。在一个”映射每篇都不同”的世界里,标签是映射的唯一证据,随机标签让连贝叶斯答案都只剩”认出标签空间”的那一点。标签对错重不重要,取决于预训练分布有没有把映射”预先定好”——这把 §3.2 和 §3.3 两组看似矛盾的发现连了起来。
翻转的标签与没见过的映射(准确率 = 是否给出示例所暗示的标签):
| 翻转:A 模型 | A 贝叶斯 | B 模型 | B 贝叶斯 | 新映射:A 模型 | A 贝叶斯 | B 模型 | B 贝叶斯 | |
|---|---|---|---|---|---|---|---|---|
| 2 | 0.422 | 0.461 | 0.656 | 0.724 | 0.588 | 0.585 | 0.610 | 0.673 |
| 8 | 0.444 | 0.544 | 0.690 | 0.875 | 0.590 | 0.650 | 0.654 | 0.856 |
| 12 | 0.416 | 0.522 | 0.692 | 0.899 | 0.610 | 0.658 | 0.646 | 0.913 |
- 世界 A 的”理想学习者”也跟不上翻转和新映射:它的先验里只有 8 个概念,示例再多也只能挑一个最接近的。这正是 Xie et al. 在 GINC 上看到的”没见过的概念学不会”,也很像 Wei et al. 2023 里小模型的表现。
- 世界 B 的理想学习者能跟上任何映射(:0.899、0.913):它的先验是”每篇文档的映射都是新的”,最优策略就是照抄示例——这是一个真正的”学习算法”。**同样是贝叶斯推断,先验不同,表现出的行为完全不同。**任务少时,ICL 是”认出一个见过的任务”;任务足够多样时,最优的 ICL 才是”从示例里学一个新任务”。Raventós et al. 2023 在线性回归上看到了同样的转变:预训练任务的多样性低于某个阈值时,Transformer 的行为像”以预训练任务为先验的贝叶斯估计”,学不会新任务;高于阈值时,它像岭回归,能解决全新的任务。
- 但我们的世界 B 模型没有学会照抄。 代码 02 把 的提示按”查询字母在示例里出现过没有”分成两组:出现过时,贝叶斯答案是 1.000,模型只有 0.747——和”只看词频”的贝叶斯(0.747)一模一样;没出现过时三者都在 0.5 左右(0.496 / 0.529 / 0.526)。模型的全部 ICL 都能用”认出主题和标签空间”解释。
为什么学不会照抄?照抄需要一个具体的电路:找到前文里同一个字母,读出它后面的那个标签——这正是下面 §4.5 的 induction head。在写这一讲的过程中,我在这个世界的早期版本和几个更简单的“照抄”任务上(例如“在随机字符串里复制一段前面出现过的片段”),用更长的训练(最多 1.2 万步)、更宽的模型、更多的头、不同的学习率都试过,同样没有形成(README 里有记录)。这和 Olsson et al. 的观察一致:induction head 往往在训练中经过一段平台期才突然形成,而我们的预算(约 380 万个 token)可能远远不够。这个失败本身也是一个结论:贝叶斯视角告诉我们”什么是最优的”,但不告诉我们”梯度下降在有限的数据和算力里能不能找到它”。
4.3 解释二:数据分布的性质——突发性与长尾
Chan et al. 2022(Data Distributional Properties Drive Emergent In-Context Learning in Transformers)问了一个更具体的问题:训练数据的什么性质,让 ICL 出现? 他们在 Omniglot(1623 类手写字符,每类 20 张图)上训练 Transformer:每条序列是 8 个”图片—标签”对再加一张查询图片,模型预测查询的标签。类别的标签在整个训练中是固定的——所以模型可以选择两条路:
- in-weights learning(IWL):把”这个字符 → 这个标签”记在权重里;
- in-context learning(ICL):从同一条序列里找到同类的图片,照抄它的标签。
评测时分开测两种能力:ICL 用训练时没见过的新类别(标签每条序列随机重新分配为 0 / 1,“4-shot 2-way”);IWL 用见过的类别,但上下文里没有同类图片。主要发现:
- 突发性(burstiness)是 ICL 出现的必要条件:训练序列里,查询的类别要在上下文里成团地出现(他们用”同一类出现 3 次、另一类也出现 3 次”的序列,占 90%)。自然语言正是这样——一个罕见的词或名字,在一篇文档里往往反复出现,而在整个语料里很少见。
- 大量的稀有类别有助于 ICL:类别从 100 增加到 1600(再到 12800),ICL 变强、IWL 变弱。类别越多、每类越罕见,“记在权重里”越不划算。
- ICL 与 IWL 之间通常是此消彼长的。但当类别频率服从 Zipf 分布 、 时(自然语言的词频大致如此),两者可以共存:常见类别靠权重,罕见类别靠上下文。(均匀)时只有 ICL; 时最常见的 3 类占了 97% 的数据,IWL 主导。
- 架构也重要:参数量相当的 RNN、LSTM 在他们的设置下从没出现 ICL。(注意 Xie et al. 的 GINC 上 LSTM 有 ICL——两个任务需要的 ICL 不同:GINC 主要是”定位概念”,Omniglot 任务需要”照抄”。)
代码 02 的两个世界恰好是这个取舍的两端:世界 A 的映射只有 8 种、反复出现——IWL 划算,模型把映射记在权重里,ICL 只用来”认出是哪一种”;世界 B 的映射每篇都是新的——只有 ICL 有用。我们的小模型在 A 上做得很好,在 B 上没有学会照抄;Chan et al. 的模型是 12 层、训练了 50 万步。后来 Singh et al. 2023 还发现,ICL 可能是暂时的:训练继续下去,ICL 先出现、后消失,让位给 IWL(L2 正则可以保住它)。
4.4 解释三:ICL 是一个学到的学习算法
第三条思路干脆把”任务”做成一个函数类:Garg et al. 2022(What Can Transformers Learn In-Context?)从零训练一个 Transformer(GPT-2 结构,12 层、256 维、约 950 万参数),输入是 ,其中 每条序列随机抽自某个函数类,例如 20 维空间里的线性函数 。训练完以后,在从没见过的 上测:
- 线性函数:Transformer 的误差和最小二乘法几乎一样( 时最小二乘恰好确定 ,误差为 0,Transformer 是 0.02; 时 0.0006),远好于最近邻和简单平均;
- 稀疏线性函数:接近 Lasso;
- 深度为 4 的决策树: 时误差 0.12,好于贪心建树(0.80)和 XGBoost(0.62);
- 两层 ReLU 网络:和”用 Adam 在这些示例上训练一个同样的网络”一样好(0.17)。
也就是说,一次前向传播,实现了一个相当不错的学习算法。它是怎样做到的?von Oswald et al. 2022(Transformers Learn In-Context by Gradient Descent)给出了一个构造:一层线性自注意力,恰好可以实现”在示例上做一步梯度下降”(线性回归的均方误差);在线性回归上训练出来的只含注意力的 Transformer,权重确实收敛到这个构造附近,多层则像多步(带曲率修正的)梯度下降。Akyürek et al. 2022 给出了类似的构造。这条思路常被概括成”ICL = 在前向传播里做梯度下降”。它的局限也要记住:严格的结论只在线性注意力、线性回归这样的玩具设置里成立,真实 LLM 的 ICL 远不止于此。
这三种解释并不矛盾,§4.6 再把它们拼起来。
4.5 机制预告:induction head
Olsson et al. 2022(In-context Learning and Induction Heads)找到了一个具体的电路:induction head。它做的事情是:看到当前 token [A],到前文里找上一次出现 [A] 的位置,把那后面的 token [B] 复制过来——“[A][B] … [A] → [B]“。它需要两个注意力头配合:前一层的一个头让每个位置”记住自己前面是谁”,后一层的头用当前 token 去匹配这些记录。
论文给出了六类证据,核心观察是:induction head 在训练早期的某个时刻突然形成,恰好在同一时刻,模型的 ICL 能力急剧提升,训练损失曲线上出现一个小鼓包——又一个”真实的跳变”(§2.5)。对只含注意力的小模型,证据是因果性的(去掉这些头,ICL 就没了);对带 MLP 的大模型,证据是相关性的。作者的假设是:induction head 可能是各种规模的 Transformer 里 ICL 的主要机制之一。
代码 02 世界 B 需要的”照抄”正是 induction head 的任务,而我们的小模型在预算内没有形成它(§4.2)。第 12 讲(机制可解释性)会专门训练、观察和”解剖”这个电路。
4.6 三种解释怎样拼在一起
| 视角 | 它回答的问题 | 代表工作 | 在代码 02 里对应 |
|---|---|---|---|
| 贝叶斯推断 | 一个完美学会预训练分布的模型应该怎样做 ICL | Xie et al. 2021 | 两个世界的”贝叶斯”列 |
| 数据分布 | 什么样的预训练数据让 ICL 值得学、让模型学 ICL 而不是 IWL | Chan et al. 2022;Raventós et al. 2023 | 世界 A(IWL 划算)vs 世界 B(只有 ICL 有用) |
| 学习算法 / 机制 | 模型在前向传播里实际怎样实现它 | Garg et al. 2022;von Oswald et al. 2022;Olsson et al. 2022 | 世界 B 需要但没学到的”照抄”电路 |
一句话:预训练数据决定了”理想的 ICL”是什么(认出任务,还是学新任务);模型够大、训练够久,才能在网络里实现它。 真实 LLM 的 ICL 大概两者都有:对常见任务,示例主要帮它”定位”(所以随机标签伤害不大);对罕见或违反先验的任务,大模型才能真正从示例里学(所以只有大模型会跟着翻转的标签走)。
5. 草稿与思维链 · Scratchpads and chain-of-thought
5.1 Show Your Work 与 Chain-of-Thought
两篇阅读几乎同时提出了同一个想法:不要让模型一步写出答案,先让它把中间步骤写出来。
Nye et al. 2021(Show Your Work: Scratchpads for Intermediate Computation) 在微调的设置下做:训练目标不只是答案,还包括一段 <scratch> … </scratch> 草稿。做多位数加法时,草稿按小学竖式一列一列地写出”这一位的和、进位”;做程序执行时,草稿写出每一行执行后变量的值。结果(论文数字):
- 加法:在 1–8 位数上训练、在 9–10 位数上测试(比训练时更长)。直接写答案的模型在所有规模上都失败;超过某个模型规模后,草稿模型能做对训练长度内的加法,在更长的题上也随规模稳步改善。
- 多项式求值:1370 亿参数模型 few-shot,直接写答案 8.8%、用草稿 20.1%;80 亿参数模型微调后,31.8% 对 50.7%。
- 执行合成的 Python 程序:few-shot 11% → 26.5%,微调 20% → 41.5%。
Wei et al. 2022(Chain-of-Thought Prompting) 在提示的设置下做:不训练模型,只在 few-shot 示例里写出推理过程(“罗杰有 5 个网球,又买了 2 罐、每罐 3 个,5 + 6 = 11,答案是 11”),模型就会模仿着先写推理、再写答案。结果:
- GSM8K(小学数学应用题):PaLM 5400 亿参数,普通提示 17.9%,chain-of-thought 56.9%,超过了此前最好的”微调 GPT-3 + 验证器”(55%)。
- 符号推理的长度泛化:末字母拼接,示例只有 2 个词、测试 4 个词,普通提示 0.0%、CoT 63.0%;抛硬币(4 次翻转),54.8% → 90.2%。
- 只在大模型上有用:约 1000 亿参数以下,CoT 不提升甚至有害——小模型会写出通顺但不合逻辑的推理链。
- 消融(LaMDA 1370 亿,GSM8K):普通提示 6.5%,CoT 14.3%;“只写方程”5.4%;“只输出和推理一样长的一串点”(variable compute only)6.4%;“先给答案、再写推理”6.1%。有用的是自然语言的中间步骤本身,而不只是多了几个 token 的计算,也不只是”激活了相关知识”。
5.2 为什么中间 token 有用:串行计算
先看代码 03 的结果。任务是 6 位数加法,三种写法(这里用 4 位数举例):
direct 0347+0285=00632 直接写答案(从最高位写起)
filler 0347+0285:.......................|00632 先写一串和草稿一样长的 "."
scratch 0347+0285:75021,48131,32160,00000|00632 先写草稿:每列 "加数1、加数2、进位、和、新进位"
同样的模型(2 层、64 维)、同样的训练算力(每步 1024 个 token、1500 步——直接写答案的题短,所以它每步见到的题更多),1000 道新题:
| 写法 | 种子 | 共见过的题 | 整题准确率 | 首次 ≥ 0.5 的步数 | 答案每一位的准确率(最高位 → 最低位) |
|---|---|---|---|---|---|
| direct | 0 | 72,000 | 0.828 | 1000 | 1.00 0.96 0.95 0.97 0.95 1.00 1.00 |
| direct | 1 | 72,000 | 0.000 | — | 1.00 0.95 0.11 0.10 0.10 0.99 1.00 |
| filler | 0 | 25,500 | 0.000 | — | 1.00 0.90 0.10 0.09 0.10 0.10 0.10 |
| scratch | 0 | 25,500 | 1.000 | 600 | 1.00 1.00 1.00 1.00 1.00 1.00 1.00 |
| scratch | 1 | 25,500 | 1.000 | 500 | 1.00 1.00 1.00 1.00 1.00 1.00 1.00 |
再换一个只有 1 层、32 维(约 1.5 万参数)的模型:直接写答案 0.000(只学会了最高两位),先写草稿 1.000。
- 草稿模型稳定地学会了:两个种子都全对,而且只见过 25,500 道题(直接写答案的模型见过 72,000 道)。
- 直接写答案要看运气:种子 0 在第 900–1000 步之间”顿悟”,最后 0.828;种子 1 到最后都是 0.000。种子 1 的逐位准确率说明了卡在哪里:最高两位和最低两位都对,中间三位约 0.1——10 个数字里瞎猜。最低位只看两个加数的最低位就能算;最高两位基本由两个加数的最高位决定;中间位却要知道”下面传上来有没有进位”,而进位可能从最低位一路传上来。
- 填充符没有用:多出的 35 个 ”.” 和草稿一样长,结果是 0.000,逐位看和直接写答案的种子 1 一样卡住。和 Wei et al. 的 variable-compute 消融一致。
为什么?考虑一个 层的 Transformer 写出一个 token 的过程:从读到输入到给出输出,中间只有 次”注意力 + MLP”。每一层能做的”串行”计算是有限的(注意力可以一次看很多位置,但”先算出低位的进位、再用它算高一位”这样一步依赖上一步的计算,每一步大约要消耗一层)。所以直接写答案时,一个 2 层模型要在 2 步之内把 6 位数的进位链算完——它做不到,只能靠”抄近路”(最高位、最低位)。
写草稿时情况完全不同:**每写一个 token,就多一次完整的 层前向计算,而且这次计算能读到前面已经写下的中间结果。**草稿里每个数字都只依赖附近几个已经写出来的数字(这一列的两个加数、上一列的进位),每一步只是一件很小的事。一个答案能用的串行计算量,从 变成了 (草稿的 token 数)。这就是”每个答案能用的串行计算量”的含义。理论工作给出了严格的版本:Feng et al. 2023 证明,深度有限的 Transformer 要直接写出基本算术题的答案需要超多项式的规模,而常数大小的 Transformer 逐步写出推理过程就能解决;Merrill & Sabharwal 2023 证明,允许的中间步骤越多(对数级、线性、多项式级),Transformer 能解决的问题类越大,多项式步数时恰好是所有多项式时间可解的问题。
填充符为什么不行?”.” 确实多给了 35 个位置,但每个位置的计算读不到任何新的中间结果——所有 ”.” 看到的都是同样的题目,前面写下的也只是同样的 ”.”。并行的计算多了,串行的深度没变。(Pfau et al. 2024 Let’s Think Dot by Dot 发现,在某些可以并行分解的算法任务上,经过密集监督的训练,模型确实能利用无意义的填充符做”隐藏的计算”;但这需要专门的训练,而且只对特定结构的问题有效。我们这里的普通训练没有学会利用它们。)
另一个角度是分解:草稿把”6 位数加法”这个难以一步学会的映射,拆成了 6 个”一位数加法 + 进位”这样容易学的局部步骤,而每个局部步骤在训练数据里出现的次数是题目数的 6 倍。这也是为什么草稿模型学得更快(第 500–600 步越过 0.5),而直接写答案的模型要么很晚才”顿悟”、要么一直卡在平台上——平台和顿悟就是 §2.5 说的”真实的跳变”。
5.3 训练出来的草稿 vs 提示出来的思维链
代码 03 的 1 层模型(1.5 万参数)用草稿就能把 6 位数加法做到全对;Wei et al. 却说 CoT 要约 1000 亿参数才有用。矛盾吗?不矛盾,因为是两件事:
| 在草稿格式上训练(Nye et al.;代码 03) | 在提示里要求写推理(Wei et al. CoT) | |
|---|---|---|
| 模型从哪里学会写中间步骤 | 训练数据里就有正确的草稿 | 只有提示里的几个示例;模型必须本来就会写像样的推理 |
| 门槛 | 低:Wei et al. 表 1 里 scratchpad 一行只要约 4000 万参数 | 高:约 1000 亿参数 |
| 小模型失败的原因 | 模型太小,连单个局部步骤都学不可靠(Nye et al. 的草稿要超过某个规模才起作用) | 写出的推理链通顺但错误,错误一路传下去 |
CoT 提示的”涌现”,有一部分正是 §2 的 效应:一条推理链有很多步,每一步都要对,整题才对;小模型每一步的正确率不够高,长链就几乎总会出错。
5.4 自洽性:采样多条路径再投票
Wang et al. 2022(Self-Consistency Improves Chain of Thought Reasoning)的做法很简单:不用贪心解码只写一条推理链,而是按温度采样很多条(论文用 40 条),只看最终答案,多数投票。直觉是:一道题的正确答案可以由很多条不同的推理路径到达,而错误答案往往五花八门;把推理路径”积分掉”(marginalize),正确答案就浮现出来。结果(论文数字):GSM8K 上 PaLM 5400 亿从 56.5% 升到 74.4%,code-davinci-002 从 60.1% 升到 78.0%(都是 +17.9);采样条数越多越好,但很快饱和(作者建议从 5–10 条开始);小模型的提升小得多(UL2 200 亿:4.1% → 7.3%)。
代码 03 演示 3 在一个”学到一半”的草稿模型(种子 0 训练到第 600 步)上试了试,300 道新题:
| 温度 | 单个样本 | 投票 5 个 | 投票 10 个 | 10 个里至少一个对 | 答案种类(平均) |
|---|---|---|---|---|---|
| 0.7 | 0.290 | 0.397 | 0.483 | 0.830 | 5.1 |
| 1.0 | 0.157 | 0.233 | 0.393 | 0.733 | 7.3 |
贪心解码是 0.553。投票确实有用(单个样本 0.290 → 投票 10 个 0.483),但没有超过贪心。这和 Wang et al. 的结论不一样,原因值得想清楚:
- 我们的加法草稿只有一条正确路径。模型在每一步的分布都很尖,贪心解码几乎就是每一步的众数;采样只会引入”偶然的笔误”,投票能做的只是把这些笔误投回去。
- 数学应用题有很多条不同但都正确的推理路径,正确答案从许多路径汇聚而来。贪心只走一条路,第一步走偏就回不来——这正是第 1 讲 §2.3 的”贪心不等于最可能”:局部最优的每一步合起来不一定是全局最可能的答案。
还有一个数字值得注意:“10 个里至少一个对”是 0.830,远高于任何一种投票。如果有一个可靠的验证器(比如把答案代回去检查),“多次采样 + 验证”能做得更好——这是 §7 推理时计算的出发点。
5.5 Zero-shot CoT:“Let’s think step by step”
Kojima et al. 2022(Large Language Models are Zero-Shot Reasoners)发现,连示例都不用:在问题后面加一句 “Let’s think step by step.”,模型就会先写推理再回答。做法分两步:先让模型续写推理,再把推理接上”所以答案是”让它给出答案。结果(text-davinci-002):MultiArith 从 17.7% 升到 78.7%,GSM8K 从 10.4% 升到 40.7%;仍然不如手写 8 个 CoT 示例(93.0%、48.7%),但不需要任何为任务专门写的示例。触发句很重要:“Let’s think step by step.” 78.7%,“First,” 77.3%,“Let’s think about this logically.” 74.5%,而 “Don’t think. Just feel.” 只有 18.8%。和 few-shot CoT 一样,只有大模型受益。
这件事的意义在于:推理能力本来就在模型里,只是默认的”直接回答”格式没有把它调用出来——又一次说明”会不会”取决于”怎么问”(第 1 讲 §4.4)。
6. 提示的两个老问题 · Prompt sensitivity and knowledge extraction
6.1 AMA:多个不完美的提示 + 弱监督
Arora et al. 2022(Ask Me Anything,作者包括本课的 Christopher Ré)针对的正是第 1 讲 §4.2 的问题:提示非常脆弱,花大量精力调出一个”完美提示”既费力又不可靠。他们的策略分两部分:
- 改写成模型熟悉的格式。他们发现开放式问答(让模型回答一个问题)的提示,比限制性格式(例如”只输出 True 或 False”)效果好得多:在 CB、RTE、WSC 三个任务上,把小模型的提示从限制性改成开放式,平均准确率从 41.7% 升到 71.5%。原因是数据:在 The Pile 里,开放式问答结构比限制性格式常见约 1000 倍。AMA 用两个”功能性”提示组成提示链:
question()把输入改写成一个问题,answer()回答这个问题。 - 多个提示 + 弱监督聚合。换不同的示例、不同的问法,得到很多条提示链,每条对同一个输入投一票。直接多数投票不可靠:不同提示的准确率差别很大,而且错误高度相关。AMA 用弱监督(weak supervision)——不看任何标注——从提示之间”谁和谁一致”估计每个提示的准确率和它们之间的依赖,再加权组合。
结果:在 4 个模型家族(EleutherAI、BLOOM、OPT、T0)的 14 个开放模型上(1.25 亿到 1750 亿参数),AMA 比 few-shot()基线平均提升 10.2 个百分点;GPT-J-6B 用 AMA 后,在 20 个基准中的 15 个上追平或超过 few-shot 的 GPT-3 1750 亿。
代码 04 演示 1 在第 1 讲的 base model 上(只读加载,不重新训练)复现了这两部分,问”住在哪个城市”,6 种提示:
| 提示 | 准确率 | 有问答文本的 30 人 | 没有的 30 人 | 弱监督估计的准确率 |
|---|---|---|---|---|
| 叙述:X lives in | 0.93 | 0.93 | 0.93 | 0.85 |
| 叙述:X moved to | 0.92 | 0.93 | 0.90 | 0.84 |
| 问答 zero-shot | 0.72 | 0.97 | 0.47 | 0.84 |
| 问答 2-shot(第 1 组示例) | 0.72 | 0.83 | 0.60 | 0.90 |
| 问答 2-shot(第 2 组示例) | 0.70 | 0.87 | 0.53 | 0.88 |
| 没见过的格式 question/answer | 0.00(全部弃权) | 0.00 | 0.00 | 0.12 |
| 多数投票 | 0.80 | 0.97 | 0.63 | |
| 弱监督加权投票 | 0.80 | 0.97 | 0.63 |
- 第一部分成立:模型最熟悉的叙述句格式最好(0.93、0.92),没见过的格式完全失败(连城市名都不输出)——和 AMA”改写成预训练里常见的格式”的发现一致。
- 2-shot 示例有利有弊:对没有问答文本的人有帮助(0.47 → 0.60 / 0.53),对有问答文本的人反而有害(0.97 → 0.83 / 0.87)。
- 第二部分在这里失败了:多数投票和加权投票都是 0.80,不如最好的单个提示(0.93);问职业时也一样(0.68、0.70 vs 0.73)。代码打印了”两个提示错成同一个答案”的比例:三个问答提示之间 0.13–0.23,叙述句和问答提示之间只有 0.03–0.05。三个问答提示是一个”投票集团”,一起把两个叙述句提示压了下去。
- 弱监督也被骗了:代码用的是最简单的标签模型(Dawid–Skene 的”单硬币”模型,假设各提示的错误相互独立),于是把”彼此最一致”的问答提示估计得最可靠(两个 2-shot 提示 0.90、0.88,真实只有 0.72、0.70)。它唯一做对的,是把全部弃权的提示的权重设为 0。
这恰好是 AMA 论文最强调的一点:提示之间有依赖,聚合方法必须建模依赖,简单多数投票和”错误独立”的模型都不行。更根本的教训是:集成有用的前提是提示足够多样——同一个问答模板换两组示例,得到的不是两个独立的意见,而是同一个意见说了两遍。
6.2 知识的存储与提取
第 1 讲 §3.3 留下了一个现象:30 个人的事实只以叙述句出现在语料里,用叙述句问,城市答对 0.93;换成问答格式问,城市 0.47、职业 0.27。知识存进去了,但不是用任何问法都能取出来。
Allen-Zhu & Li 2023(Physics of Language Models: Part 3.1, Knowledge Storage and Extraction)把这个现象做成了一个干净的实验:10 万个虚构人物,每人 6 个属性(生日、出生城市、大学、专业、公司、公司所在城市),在人物介绍上预训练,再用一半人的问答数据微调,测另一半人的问答。主要发现:
- 能背下来 ≠ 能提取:如果每个人只有一份介绍、写法固定,模型能把介绍背得几乎一字不差,留出那一半人的问答准确率却几乎为 0。
- 知识增强(knowledge augmentation)——同一个人的介绍写成多种说法、打乱句子顺序、用全名等——让提取变得可行:论文的一组对比是问答准确率从 9.7% 提高到 96.6%。
- 在预训练阶段就混入一部分问答数据(mixed training)也有帮助:留出的人上 86.6%。
- 用探针(第 1 讲 §3.4)看原因:做了增强的模型,在读到人名的位置就已经把各个属性编码进了表示;没增强的模型,属性和”这句话的前文”绑在一起,离开那个句式就取不出来。
第 1 讲练习 6 曾用一个实验检验”职业比城市难问,是因为有一个模板把职业放在名字前面”——把模板改成职业在后,职业只从 0.27 升到 0.33,假设基本被否定。Allen-Zhu & Li 的结果提示了另一个方向:迷你互联网里每个人的事实只有 5 个固定模板、每个重复 4 次,“写法的多样性”太低;城市出现在 4 个模板里,职业只出现在 3 个里。练习 11 用一个实验检验了“模板个数”这个解释:给职业也加一个模板后,职业和城市都只多答对 2 个人,差距没有缩小——它同样没有得到支持。在一个只有 5 个模板的世界里,“多样性”能变的东西太少;Allen-Zhu & Li 的结论要在写法真正多样的数据上才看得清楚。
6.3 反转诅咒
Berglund et al. 2023(The Reversal Curse)发现了一个更极端的”提取失败”:在 “A 是 B” 上训练的模型,不会自动学会 “B 是 A”。 他们用 GPT-3 1750 亿参数微调 30 个虚构人物的描述(每条改写 30 遍),例如 “Daphne Barrington is the director of ‘A Journey Through Time’”:
- 训练方向是”描述 → 名字”的那组,同方向提问准确率 96.7%,反方向 0.1%;
- 训练方向是”名字 → 描述”的那组,同方向 50.0%,反方向 0.0%;
- 似然检验:反方向提问时,正确名字的概率并不比随机名字高。
- 真实世界的例子:GPT-4 能说出名人的母亲是谁(79%),反过来从母亲问出名人只有 33%。
- 如果 “A 是 B” 就在上下文里,模型能正确地反推——反转诅咒是参数里的知识的问题,不是推理能力的问题。
代码 04 演示 2 用一个从零训练的小模型复现了它:60 个虚构的人,每人一个独一无二的身份(“kari is the keeper of the red gate.”)。F 组的事实只以正向出现,R 组只以反向出现(“the keeper of the red gate is kari.”),Both 组两个方向都有(让模型知道两种句式都存在)。每句话重复 10 次,2 层、64 维的模型训练 1500 步:
| 组 | 训练里见过的方向 | 正向问:名字 → 身份 | 反向问:身份 → 名字 | 正确名字的平均排名(共 60 个) |
|---|---|---|---|---|
| F | 只有正向 | 1.00 | 0.00 | 50.8 |
| R | 只有反向 | 0.00 | 1.00 | 1.0 |
| Both | 两个方向 | 1.00 | 1.00 | 1.0 |
F 组被反向提问时,正确名字的平均排名是 50.8——比瞎猜(30.5)还差:模型偏爱那 40 个”在 is 后面出现过”的名字,F 组的名字从没出现在这个位置,全都排在最后。正确答案没有得到哪怕一点额外的概率。
为什么?“预测下一个 token”的训练,每一步只是在调整”看到这段前文之后,下一个 token 是什么”。“kari is the keeper of the red gate.” 教会模型的是”kari is the → keeper of the red gate”,而不是”the keeper of the red gate is → kari”——后者的前文在训练里从没出现过,梯度从来没有碰到过这个方向。第 1 讲的跨格式问答(0.47、0.27)是同一件事的温和版本:问答格式和叙述句共享”名字 → 属性”这个方向,所以能取出一部分;反转则完全没有共享的路径。
7. 2023 年之后 · Since 2023
涌现之争。 Schaeffer et al. 的”海市蜃楼”论文在 2023 年发表后影响很大,“用连续指标、用足够大的测试集”基本成了评测的常识;但争论没有结束。Du et al. 2024 主张用预训练损失而不是参数量来定义涌现:同样损失的模型表现相同,某些任务要等损失低于阈值才高于随机,而且与指标是否连续无关。另一方面,“在训练过程中突然出现”的现象(grokking、induction head 的相变)被研究得更多,被当作”真实的跳变”的代表。对实践者来说,比较稳妥的结论是:大多数下游能力可以用连续指标较好地预测,但仍有一部分能力的出现时机难以提前判断——这也是前沿模型发布前要专门做”危险能力评测”的原因之一。
ICL:更长、更多、更深入地理解。
- Many-shot ICL:上下文长度从几千 token 增长到几十万甚至上百万之后,Agarwal et al. 2024 发现,在提示里放几百到几千个示例,效果持续提升,在不少任务上接近微调;而且 many-shot 示例能够覆盖预训练带来的偏见——这和 §3.3”大模型能跟着翻转的标签走”是同一个方向。
- ICL 的理论与机制:Raventós et al. 2023(任务多样性阈值,§4.2)、Singh et al. 2023(ICL 可能是暂时的,§4.3)把 Xie 和 Chan 的两条线连了起来;可解释性方面,研究者在真实模型里找到了 induction head 之外的更多 ICL 相关结构(第 12 讲)。
- 提示敏感性没有消失:Sclar et al. 2023 发现,即使是更大的模型、更多的示例、经过指令微调的模型,提示排版的细微变化仍能带来几十个百分点的差别,建议报告”一组合理格式下的表现范围”。AMA 的思路(自动生成、自动组合多个提示)后来发展成提示优化的工具链(例如 DSPy)。
从 chain-of-thought 到推理模型。 这是 2023 年之后变化最大的方向,也是本讲内容最直接的延续:
- o1(OpenAI,2024 年 9 月):用大规模强化学习训练模型在回答之前生成很长的思维链。OpenAI 报告,表现随训练时的强化学习算力和测试时的”思考时间”都平稳提升。
- DeepSeek-R1(2025 年 1 月):公开了方法。DeepSeek-R1-Zero 直接在基础模型上做强化学习,不先做有监督微调,奖励只用规则判断的”答案对不对”和”格式对不对”(没有用神经网络奖励模型);训练过程中模型的回答越来越长、开始自我检查和反思(论文展示了一个模型自己写出 “aha moment” 的例子)。AIME 2024 的 pass@1 从 15.6% 升到 71.0%,多数投票后 86.7%。正式的 DeepSeek-R1 加入了少量”冷启动”数据和多阶段训练来解决可读性和语言混杂的问题,并把推理能力蒸馏到 15 亿到 700 亿参数的小模型里。
- 推理时计算(test-time compute):Snell et al. 2024 研究了”把算力花在推理时”的最优方式(用过程奖励模型搜索、或让模型逐步修改答案),按题目难度分配推理算力,比 best-of-N 高效 4 倍以上;在相同 FLOPs 下,小模型加推理时计算能胜过大 14 倍的模型(在小模型本来有一定成功率的题目上)。这正是 §5.4 末尾”多次采样 + 验证”的延伸。
- 思维链是否忠实:Turpin et al. 2023 发现,在输入里加入偏向某个答案的特征(例如把选项重新排列、让正确答案总是 A),模型会被带偏,却在思维链里给出一套看似合理的理由、从不提那个偏向,13 个 BIG-Bench Hard 任务上准确率最多下降 36%。写出来的推理不一定是模型真正的计算过程;Pfau et al. 2024 的”填充符隐藏计算”(§5.2)也从另一个方向提出了同样的担忧。
把这些放回本讲的框架:§5.2 说中间 token 增加了串行计算;§5.4 说多条路径 + 投票 / 验证能进一步利用它;§5.3 说”会不会写有用的推理”本身是一个需要规模或训练的能力。推理模型做的事情,就是用强化学习直接训练”写出有用的长推理”,再在推理时投入更多计算。第 7 讲(对齐与 RLHF)会讲强化学习这一侧。
反转诅咒与知识提取。 Golovneva et al. 2024 提出 reverse training:预训练时同时用正向和”按实体反转”的文本,在算力相同时大幅缓解反转诅咒——本质上就是 Allen-Zhu & Li”知识增强”的思路:模型只能沿着训练数据里出现过的路径提取知识,那就让数据里出现更多路径。Allen-Zhu & Li 的 Physics of Language Models 系列后续几部分继续研究了知识的操作(分类、比较、逆向检索)和推理,第 2 讲讨论的”合成数据改写”也和这条线相关。
哪些结论仍然成立?指标决定了能力看起来是否突然出现;示例的作用很大一部分是”定位任务”;中间步骤增加了模型能用的计算;知识的可提取性取决于训练数据的多样性——这四点在 2026 年看依然成立。被修正最多的是”CoT 只是一种提示技巧”:它变成了训练目标本身。
8. 小结 · Summary
- 涌现能力(Wei et al. 2022):小模型上没有、大模型上才有、无法从小模型外推的能力。例子包括 few-shot 算术、MMLU、TruthfulQA,以及”某种用法开始有用”(chain-of-thought 提示约 1000 亿参数才有用)。门槛受数据、训练方法和评价指标影响。
- “海市蜃楼”批评(Schaeffer et al. 2023):exact match ,平稳上升的逐 token 准确率 会被画成突然出现的曲线;测试集太小时,“测不到”被误读成”不存在”。代码 01 里,“8 个符号全对”0.000 → 0.373 → 0.999 几乎完全等于逐 token 准确率的 8 次方;连续的”全对概率”从 7.3e-09 平稳升到 0.95。
- 之后还剩什么:有的能力需要特定的电路(进位、照抄),学会它们的过程本身就有平台期和加速——代码 01 的加法模型,连 bit/token 都在第 300–800 步降了 15 倍;代码 03 里同样的配置换个种子,一个学会、一个没学会。预测能力要看连续指标,但用户在乎的往往就是 exact match。
- ICL 的现象学:Min et al.:随机标签只掉 0–5 个点,格式、标签空间、输入分布更重要;Wei et al. 2023:大模型会跟着翻转的标签走,小模型不会,指令微调让模型更依赖先验。
- 隐式贝叶斯推断(Xie et al.):预训练文档有隐藏的概念,预测下一个 token 要推断概念,示例是证据。代码 02 世界 A:小模型的 ICL 曲线和贝叶斯最优几乎重合(0.786 vs 0.784、0.920 vs 0.914、0.984 vs 0.982),随机标签下两者都约 0.7。标签对错重不重要,取决于预训练分布有没有把映射预先定好。
- 数据分布与学习算法:Chan et al.:突发性、大量稀有类别、Zipf 分布让 ICL 出现,ICL 与 IWL 此消彼长;Garg et al.、von Oswald et al.:ICL 可以是一个学到的学习算法(近似最小二乘、一步梯度下降);Raventós et al.:任务多样性越过阈值,最优的 ICL 才从”认出任务”变成”学新任务”。代码 02 世界 B 的贝叶斯答案就是”照抄”,而我们的小模型没有学会它——需要 induction head(Olsson et al.,第 12 讲)。
- 草稿与思维链:中间 token 让每个答案能用的串行计算从 层变成 token 数,并把难题拆成局部小步。代码 03:同样算力下草稿模型 1.000(两个种子),直接写答案 0.828 / 0.000,填充符 0.000;1 层模型用草稿也能全对。训练出来的草稿门槛低,提示出来的 CoT 需要大模型。self-consistency 靠”多条正确路径”取胜,我们只有一条路径的加法上投票没超过贪心(0.483 vs 0.553)。
- 提示的两个老问题:AMA:改写成模型熟悉的格式 + 多个提示的弱监督聚合;代码 04 里错误相关的提示组成”投票集团”,简单投票反而不如最好的单个提示(0.80 vs 0.93)。知识存储 ≠ 提取(Allen-Zhu & Li);反转诅咒(Berglund et al.):只学过”A 是 B”,反过来问时正确答案连一点额外概率都没有(代码 04:平均排名 50.8 / 60)。
9. 常见误区 · Common pitfalls
- “涌现说明大模型里发生了某种神秘的相变。” 很多报告出来的涌现主要是指标造成的(、多选题得分)。先换成连续指标、加大测试集再下结论(§2)。
- “既然是海市蜃楼,那就不存在突然出现的能力。” 反过来也不对。逐 token 的损失本身也可能在训练或规模上出现加速(代码 01 演示 3、代码 03 的种子差异、induction head 的相变)。而且用户真正在乎的往往就是整题全对(§2.5)。
- “ICL 就是模型在提示里做了一次监督学习。” 对常见任务,示例主要帮模型”定位”它早已学会的任务;随机标签都能保住大部分效果(Min et al.)。只有在先验帮不上忙时(翻转标签、无关标签、全新映射),才需要真正”从示例里学”,而那通常要大模型(§3、§4)。
- “示例标签对不对无所谓。” 这句话只在先验够强时成立。代码 02 世界 B(映射每篇都不同)里,随机标签让贝叶斯最优答案也从 0.878 掉到 0.506;Wei et al. 2023 里大模型会被翻转的标签带走(§4.2)。
- “贝叶斯视角说 ICL 是最优的,所以模型一定能学会。” 贝叶斯视角说的是”一个完美学会预训练分布的模型会怎样”。梯度下降在有限的数据和算力里能不能找到实现它的电路,是另一回事——代码 02 的世界 B 模型就没找到(§4.2)。
- “chain-of-thought 有用,是因为多写了几个 token、多做了几次计算。” 填充符一样长,却没有用(代码 03:0.000;Wei et al. 的消融:6.4% vs CoT 14.3%)。有用的是中间结果被写下来、后面的计算能读到它(§5.2)。
- “CoT 只对大模型有用,所以小模型不能从中间步骤受益。” 那是提示出来的 CoT。在草稿格式上训练,1.5 万参数的模型也能把 6 位数加法做到全对(代码 03 演示 2;Nye et al.;§5.3)。
- “多问几种问法再投票,总比只问一种好。” 只有当各个提示的错误足够独立时才对。错误相关的提示会组成投票集团,把好的提示压下去(代码 04:0.80 < 0.93);AMA 专门建模了提示之间的依赖(§6.1)。
- “模型背下了某个事实,就能回答关于它的任何问题。” 存储 ≠ 提取。换个格式只能取出一部分(第 1 讲:0.93 vs 0.47),反过来问则完全取不出(反转诅咒,§6.3)。
- “模型写出的推理就是它的思考过程。” 思维链不一定忠实:模型会为被偏向的答案编出看似合理的理由(Turpin et al. 2023,§7)。
10. 练习 · Exercises
练习 1() 某个模型逐 token 准确率 ,各 token 的对错相互独立。(a) 答案长 10 个 token 和 20 个 token 时,exact match 分别是多少?编辑距离的期望呢?(b) 要让 20 个 token 的 exact match 达到 0.5, 至少要多少?
参考答案
(a) ,;编辑距离期望 和 。exact match 差了近 3 倍,编辑距离只差 2 倍(线性)。
(b) 。从 到 ,逐 token 错误率从 0.1 降到 0.034(约 3 倍),exact match 却从 0.122 升到 0.5(4 倍多)。这就是”平稳的进步被放大成跳变”。
练习 2(分辨率) 一个模型在某任务上的真实准确率是 1%。(a) 用 100 道题测,报告”准确率 0.00”的概率是多少?(b) 要让这个概率低于 5%,至少要多少道题?
参考答案
(a) :三次里有一次以上会报告 0。
(b) ,至少约 300 道题。真实准确率 0.1% 时则要约 3000 道。代码 01 用”按 采样时全对的概率”(连续量)绕开了这个问题:它对每道题都给出一个非零的数,不需要”碰巧答对”。
练习 3(改一行,预测) 把代码 01 的 SENT_LEN = 8 改成 16(每句 16 个词)。不运行代码,用演示 2 表格里的逐 token 准确率,预测 1L·24、1L·32、1L·48 三个模型”16 个符号全对”的比例。曲线会变得更陡还是更平?(假设逐 token 准确率不变——实际上句子变长、训练信号变多,它会略有变化。)
参考答案
用 :,,;1L·64()仍接近 1。和 时(0.005、0.057、0.375)相比,前面几个点更贴近 0,最后一步的跳跃更大——曲线更陡,“涌现”看起来更突然、发生在更大的模型上。同一批模型,只因为任务的答案变长,“涌现的规模”就往后挪了。
练习 4(手算后验) 两个概念:(先验 0.8)把输入 a 映射到标签 0,(先验 0.2)把 a 映射到标签 1;标签有 0.1 的概率被换成另一个(只有这两个标签)。(a) 看到一个示例 “a → 1” 之后, 的后验是多少?(b) 看到两个 “a → 1” 呢?(c) 这和 Wei et al. 2023 的”大模型能覆盖先验”有什么关系?
参考答案
(a) 。
(b) 。
(c) 一个理想的贝叶斯学习者,只要先验里有”翻转”的那个概念,几个示例就足以覆盖先验——证据的权重按示例数指数增长。如果先验里根本没有这个概念(先验为 0),示例再多也没用:代码 02 世界 A 的贝叶斯答案跟不上翻转标签( 时 0.522)就是这个原因。所以”能不能覆盖先验”取决于两件事:模型的”先验”里有没有容纳新映射的空间(世界 B 有、世界 A 没有),以及模型是否真的学会了按证据更新(我们的世界 B 小模型没学会)。
练习 5(概念题:Min et al. 的边界) 根据 §4.2 的贝叶斯视角,说出两种情况,在这两种情况下”把示例标签随机化”会严重伤害 ICL。
参考答案
(1) 先验没有把映射定好:同一个标签空间、同一种输入分布下,有好几种可能的映射(代码 02 世界 A 每个主题两种映射:随机标签只保住约 44% 的提升;世界 B 映射每篇都不同:随机标签让贝叶斯答案从 0.878 掉到 0.506)。真实例子是”语义无关的标签”(foo / bar)或者需要从示例里学的新任务。(2) 示例是区分任务的唯一线索:如果多个任务共享格式、标签空间和输入分布,只有配对能告诉模型是哪个任务。反过来,像情感分类这样”任务一眼就能认出、映射模型早已知道”的情况,随机标签几乎没影响——这正是 Min et al. 测的那类任务。
练习 6(改一行,预测) 在代码 02 的世界 A 里,把每个主题的两种映射减成一种(CONCEPTS 只保留 CONCEPTS[::2],一共 4 个概念)。预测:贝叶斯答案在”正确标签”和”随机标签”下()分别是多少?随机标签保住的提升比例比原来(约 44%)高还是低?
参考答案
我在一份代码副本里只算了贝叶斯答案(没有重新训练模型):4 个概念时,zero-shot 0.654,正确标签 1.000,随机标签 0.940——保住了约 83% 的提升(原来 8 个概念时是 0.511、1.000、0.705)。每个主题只有一种映射时,标签空间和输入分布就足以确定概念,配对证据几乎是多余的,随机标签自然几乎不伤害——这就是 Min et al. 的情形。zero-shot 也更高了(0.654 vs 0.511),因为查询字母本身就能把主题猜个大概,而一个主题只对应一种映射。
练习 7(串行计算) 代码 03 的 2 层模型,6 位数加法。(a) 直接写答案时,写出最高位之前,从读到输入到给出输出,经过了多少”层”的串行计算?(b) 写草稿时,写出最终答案的第一位之前,最多经过多少层?(草稿 35 个字符加一个 ”|”。)(c) 填充符那一行,数字和 (b) 一样,为什么没用?
参考答案
(a) 2 层。(b) 每写一个 token 是一次完整的 2 层前向计算,后面的 token 能读到前面写下的结果,所以串行深度最多约 层(36 个 token 的计算一个接一个)。(c) 填充符的每个位置写下的都是同样的 ”.”,后面的计算从前面的 ”.” 里读不到任何新的中间结果——位置多了,信息没有在 token 之间传递,有效的串行深度并没有增加。草稿的每个 token 都携带了一个中间结果(这一列的和、进位),下一步直接用它。
练习 8(什么时候投票能赢贪心) 一道题分两步。第一步:路径 A 概率 0.6、路径 B 0.4。走 A 时,最终答案是 X(正确)的概率 0.2、Y 0.4、Z 0.4;走 B 时,答案一定是 X。(a) 贪心解码(每一步取最可能的)得到什么答案?(b) 按 采样,答案是 X、Y、Z 的概率各是多少?多数投票(样本很多时)会选哪个?(c) 这和代码 03 演示 3 的结果有什么不同?
参考答案
(a) 第一步选 A(0.6 > 0.4),第二步 Y 和 Z 并列 0.4,选其中一个——错。
(b) ,。样本足够多时多数投票选 X——对。正确答案从两条路径汇聚而来,错误答案被分散了。
(c) 代码 03 的加法草稿只有一条正确路径,模型在每一步上都把概率集中在正确的那个字符上,贪心几乎就是每一步的众数;采样只会引入额外的笔误,投票最多把它们投回来,所以没超过贪心(0.483 vs 0.553)。self-consistency 的优势来自”多条正确路径 + 分散的错误”,这正是第 1 讲 §2.3”贪心不等于最可能”的推理版本。
练习 9(投票的独立性) 三个二分类提示,各自准确率 0.7。(a) 如果它们的错误相互独立,多数投票的准确率是多少?(b) 如果三个提示的错误完全相同(总是一起错)呢?(c) 用这两个数解释代码 04 里”多数投票 0.80 < 最好的单个提示 0.93”。
参考答案
(a) 至少两个对:。(b) 0.7——投票等于只问了一次。(c) 代码 04 里三个问答提示的错误高度相关(两两”错成同一个答案”0.13–0.23),近似于 (b):它们像一个人投了三票;两个叙述句提示更准,却只有两票。当集团出错时,它以 3 : 2 压过叙述句。要让投票有用,要么提示的错误足够独立(多样性),要么像 AMA 那样估计依赖、给相关的提示降权。
练习 10(反转诅咒的修补) 在代码 04 演示 2 里,(a) 如果把 F 组每个人的反向句子也加进训练数据,F 组的反向准确率会怎样?这算不算”解决”了反转诅咒?(b) Both 组已经让模型见过”两个方向都存在”,为什么对 F 组没有帮助?
参考答案
(a) 会变成和 Both 组一样(1.00)——但这只是把答案直接放进了训练数据,模型并没有学会”A 是 B 蕴含 B 是 A”这条一般规则。Golovneva et al. 2024 的 reverse training 本质上就是在预训练时系统地加入反转的文本,是数据层面的修补,不是让模型学会推理。
(b) 下一个 token 预测的梯度只更新”看到这段前文时下一个 token 是什么”。Both 组的反向句子教会模型”the keeper of the red gate is → deze”这类具体的条目,不会改变 F 组那些”身份 → 名字”条目——它们的前文在训练里从没出现过。Berglund et al. 也发现,加入”两个方向都有”的辅助数据、增加改写次数,都没有缓解反转诅咒。
练习 11(设计一个实验) §6.2 提出一个假设:第 1 讲的迷你世界里,职业比城市难用问答格式取出(0.27 vs 0.47),是因为职业出现在更少的模板里(3 个 vs 4 个)。设计一个实验检验它,并预测结果。
参考答案
只改一个变量:给 fm_world.py 的 BIO_TEMPLATES 加一个只含职业的新模板,例如 "{name} has a job as a {job}."(check_line 的正则也要加一条),让职业也出现在 4 个模板里;在代码副本里重新训练 base model(不要动课程目录里的缓存),比较”问答·没见过·职业”。
我在一份代码副本里跑了这个实验(没有改动课程目录里的文件和缓存),结果(第 1 讲原设定作对照):
| 设定 | 事实补全 | 问答·没见过·城市 | 问答·没见过·职业 |
|---|---|---|---|
| 第 1 讲原设定(职业在 3 个模板里) | 0.93 | 0.47 | 0.27 |
| 加一个职业模板(职业在 4 个模板里) | 0.85 | 0.53 | 0.33 |
职业从 0.27 升到 0.33,但城市也从 0.47 升到 0.53——30 个人里各多答对 2 个,在噪声范围之内,职业和城市的差距(0.20)一点没变。所以”模板个数”这个解释和第 1 讲练习 6 的”方向”解释一样,没有得到支持。还要注意:加一个模板不只改了一个变量——人物介绍的行数变多了,语料的配比也变了(事实补全反而从 0.93 降到 0.85)。剩下的候选解释(都没有验证):职业词在”故事”体裁里大量出现(“the pilot finished the work”),这些和人物无关的上下文可能干扰了”名字 → 职业”的提取;问句 “what does X do” 和叙述句 “works as a” 之间的距离,比 “where does X live” 和 “lives in” 之间更远。
注意事项和第 1 讲练习 6 一样:一次只改一个变量(并留意”一个改动”可能同时改变了别的东西);30 个人的评测集上,一个人就是 0.033,差别小于 2–3 个人时最好再换几个种子。
练习 12(概念题:两种 CoT) 一位同学说:“我用 chain-of-thought 提示一个 10 亿参数的开放模型做数学题,准确率反而下降了,可见 CoT 没用。“另一位同学说:“Nye et al. 用 4000 万参数的模型就让草稿起作用了。“两人说的为什么都对?如果你想让这个 10 亿参数的模型从中间步骤受益,有什么办法?
参考答案
两人说的是两件事(§5.3)。提示出来的 CoT 要求模型本来就会写出正确的推理步骤;10 亿参数的模型写出的推理链常常通顺但有错,错误会一路传到答案(Wei et al.:约 1000 亿参数以下 CoT 不提升甚至有害)。Nye et al. 是在草稿格式上微调:训练数据里就有正确的中间步骤,模型只需要学会每一步,门槛低得多(代码 03:1.5 万参数也能全对)。办法:在带推理过程的数据上微调(例如 GSM8K 的解题步骤),或者从一个大模型蒸馏推理过程(DeepSeek-R1 把推理能力蒸馏到 15 亿参数的模型),或者用强化学习直接奖励”推理之后答对”(§7)。
11. 延伸阅读 · Further reading
原课阅读(W23 Syllabus “Emergent Behaviors and Capabilities”,按建议顺序)
- Wei et al., Emergent Abilities of Large Language Models(TMLR 2022)。读 §2(定义)、§3–4(两类例子)、§5(讨论,包括对指标的反思)。
- Xie & Min, How Does In-context Learning Work?(SAIL 博客,2022)。本讲 §4.1 的主线,先读它再读下面两篇。
- Min et al., Rethinking the Role of Demonstrations: What Makes In-Context Learning Work?(2022)。
- Xie et al., An Explanation of In-context Learning as Implicit Bayesian Inference(ICLR 2022)。理论部分可以先跳过,读 GINC 的实验。
- Chan et al., Data Distributional Properties Drive Emergent In-Context Learning in Transformers(NeurIPS 2022)。
- Nye et al., Show Your Work: Scratchpads for Intermediate Computation with Language Models(2021)。
- Wei et al., Chain of Thought Prompting Elicits Reasoning in Large Language Models(NeurIPS 2022)。重点看 §3 的消融。
- Arora et al., Ask Me Anything: A simple strategy for prompting language models(ICLR 2023)。
本讲补充的工作
- 涌现之争:Schaeffer, Miranda & Koyejo, Are Emergent Abilities of Large Language Models a Mirage?(NeurIPS 2023)——本讲 §2 的主线,读 §2–4;Du et al., Understanding Emergent Abilities of Language Models from the Loss Perspective(2024)——用预训练损失重新定义涌现。
- 大模型的 ICL:Wei et al., Larger language models do in-context learning differently(2023)——翻转标签与语义无关标签的实验。
- ICL 作为学习算法:Garg et al., What Can Transformers Learn In-Context?(NeurIPS 2022);von Oswald et al., Transformers Learn In-Context by Gradient Descent(ICML 2023);Raventós et al., Pretraining task diversity and the emergence of non-Bayesian in-context learning(NeurIPS 2023)——任务多样性阈值;Singh et al., The Transient Nature of Emergent In-Context Learning(2023)——ICL 可能先出现后消失。
- 机制:Olsson et al., In-context Learning and Induction Heads(2022)——第 12 讲的主要阅读之一。
- 思维链的后续:Wang et al., Self-Consistency(ICLR 2023);Kojima et al., Large Language Models are Zero-Shot Reasoners(NeurIPS 2022);理论上,Feng et al. 2023 和 Merrill & Sabharwal 2023 说明了中间步骤为什么能增加 Transformer 的计算能力;Pfau et al., Let’s Think Dot by Dot(2024)——填充符什么时候有用。
- 知识的存储与提取:Allen-Zhu & Li, Physics of Language Models: Part 3.1(2023);Berglund et al., The Reversal Curse(2023);Golovneva et al., Reverse Training to Nurse the Reversal Curse(2024)。
- 2023 年之后:Agarwal et al., Many-Shot In-Context Learning(2024);Snell et al., 推理时计算的最优分配(2024);DeepSeek-AI, DeepSeek-R1(2025)——先读 R1-Zero 那一节;Turpin et al., 思维链不一定忠实(2023);Sclar et al., 提示格式的敏感性(2023)。
如果你学过本目录下的 CS336,它的推理与强化学习部分对 §7 讲得更深;本讲的重点是”为什么”。
12. 下一讲预告 · Next lecture
这一讲反复出现一个主题:同一个模型”会不会”某件事,取决于你怎样调用它——用什么指标看(§2)、给什么示例(§3–4)、让不让它先写中间步骤(§5)、用什么格式问(§6)。提示是最轻量的”调用方式”,但它不改变模型本身。
第 6 讲:适配——提示、探针、微调与参数高效方法。 当提示不够用时,我们可以改变模型:在表示上训练一个探针(第 1 讲 §3.4 已经见过)、微调全部参数、或者只训练很少的新增参数(prompt tuning、prefix tuning、LoRA、adapter)。它们各自需要多少数据、多少算力?什么时候提示就够了,什么时候必须微调?代码会在第 1 讲的 base model 上把这几种方法放在同一个任务上比较。