跳到主要内容

数据截至 (上游 commit eb980a5c9eea)

三条路线分岔 — 一台机器切三刀,谁赢了为什么

这一章讲三件事: 同一台机器为什么能切出三种模型;每种模型给自己出的「练习题」是什么、 为什么出成那样;以及为什么最后赢的那条路,在起跑时是三条里最不被看好的。 这一章是全书的分水岭。 读完你就知道「为什么今天所有大模型都长一个样」。

1. 先看现象:同样叫「模型」,能力差得很奇怪

你可能注意过一件怪事:

  • 有些模型你给它一句话,它只会输出一个标签(比如「这条评论是正面的」),它写不了文章;
  • 有些模型你给它半句话,它就接着往下写,但你要它做分类反而别扭。

这两种东西内部用的是同一个零件——注意力。 差别在于:造它的人把那台机器切掉了哪一半。

第 03 章讲的整机有两半:编码器负责读懂,解码器负责往下写。 于是有三种拆法,而 2018 到 2020 年间,三伙人各押了一注1:

拆法谁押的代表模型
只留编码器GoogleBERT
两半都留GoogleT5
只留解码器OpenAIGPT

这一章就是这三注的完整故事。

2. 顶层全景:分岔点不是结构,是「练习题」

在往下读之前,先把这一章真正的主线立起来。

三条路线在结构上的差别很小(切掉哪一半),真正拉开距离的是每条路线给模型出的练习题。

这里要先讲清一个词:预训练。

预训练 = 在海量没有人工标注的文本上,让模型先做一个自己就能出题、自己就能判分的练习。

关键在「自己出题自己判分」:从一段现成的文字里挖掉一部分,让模型猜挖掉的是什么, 答案就是原文。 不需要人来标注,所以互联网上所有文字都能拿来用。

这类练习题的正式名字叫预训练任务。三条路线的分岔,全在这道题怎么出:

一段现成的文字:「我 喜欢 你 因为 你 很 好」

├─ 完形填空(BERT): 「我 ▢ 你 因为 你 很 ▢」→ 猜两个 ▢
│ └ 猜的时候前后都能看 ⟹ 理解得准
│ └ 但真用的时候句子里没有 ▢ ⟹ 训练和使用不是一回事

├─ 挖掉一整段(T5): 「我 ▢▢ 因为 你 很 好」→ 把 ▢▢ 整段写回来
│ └ 输入是文字、输出也是文字 ⟹ 所有任务都能套进这个壳

└─ 接龙(GPT): 「我 喜欢」→ 猜「你」;「我 喜欢 你」→ 猜「因为」…
└ 只能往前看 ⟹ 理解得糙一点
└ 但训练时干的事和使用时干的事完全一样

图说:三道题决定了三种命运。结构上的差别只是为了配合这道题。

记住这张图,后面每一节都是在填它。

主走查:全章只用这七个字

三条路线的差别不在文字描述里,在同一句话被它们各自切成什么样。所以全章只用这一个输入:

「我 喜欢 你 因为 你 很 好」——七个词,从第 1 位数到第 7 位。

第 3、5、6 节讲到每条路线的练习题时,都会把这七个词按那条路线的规则真的处理一遍, 写出被遮的是第几个、遮成了什么、目标序列长什么样。七个词不换,只换规则。

先声明:下面这些小段里凡是「假设遮中第 2 个词」这类选择,都是为演示定死的 (真实训练里是随机的);比例(15%、80/10/10)和长度上限来自书里。

3. 路线一:只留编码器——BERT

BERT 是「预训练语言模型」这个时代的代表作,即使今天要理解大模型,它也绕不过去2

这里再讲清一个缩写,后面反复出现:

PLM = Pre-trained Language Model,预训练语言模型。 指的是「先在海量文本上做一遍上面那种练习、再拿去干具体活」的模型。 大模型(LLM)就是它的直系后代——差别在体量和由此带来的新能力,第 05 章讲。

3.1 它是怎么搭的

把编码器一层层堆起来,顶上加一个分类头。

「分类头」(书里写作 prediction_heads)其实就是一个线性层 加一道激活函数(第 03 章讲过的那类零件:像 ReLU 一样给模型引入「拐弯」能力的规则): 把模型算出来的一堆数,压成「各个类别的可能性」—— 两个类别就输出两个数3

两种规格4:

版本层数隐藏层维度参数量
base127681.1 亿
large2410243.4 亿

这张表里的两个词第 01、02 章都定死过,这里复述一遍就够: 「参数量」= 模型内部可调的数一共有多少个(这些可调的数也叫权重); 「隐藏层维度」= 每个标记在模型内部用多少个数表示,也就是这台机器有多宽。

三处它和原版 Transformer 不一样的地方:

改了什么怎么改的代价
分词方法WordPiece——把词拆成子词(playingplay + ##ing),中文则按单个汉字切5
激活函数从 ReLU 换成 GELU。ReLU 是「负的一律归零」,GELU 则是根据这个数本身的大小来决定留下多少6计算稍复杂
位置编码不用第 03 章那个正余弦公式,改成一张可训练的表7完全处理不了比训练时更长的输入——BERT 最长只能吃 512 个标记

最后一行那个代价值得记住。 正余弦编码能「现算第 21 位」,查表法不能—— 表里只有 512 行,第 513 个标记压根没有对应的行。 「上下文长度」这个今天天天被提起的数字,限制的源头之一就在这。

3.2 练习题之一:完形填空

先说它要解决什么问题。

在 BERT 之前,最自然的预训练任务是接龙(书里叫 LM,Language Model 的缩写): 用上文猜下文。它的好处是对任何文本都成立,所以互联网上所有语料都能用8

但书里点出了它的一大缺陷:它只拟合从左到右的关系,忽略了双向的语义关系9

为什么「双向」重要: 「他把苹果放进了 ▢」——只看左边,你猜不出是「篮子」还是「嘴里」; 而如果右边还有「,然后咬了一口」,答案立刻就定了。 理解一句话,右边的信息和左边一样有用。

于是问题变成:有没有一种练习题,既能用海量无标注语料,又能让模型学到双向关系?

答案是完形填空,正式名字叫掩码语言模型(MLM,Masked Language Model)10:

输入:I <MASK> you because you are <MASK>
答案:第一个 <MASK> 是 love,第二个是 wonderful

图说:被遮住的位置,模型可以同时利用它左边和右边的信息去猜。
「双向」这三个字,就是这么来的。

主走查:那七个词在 BERT 这道题里长什么样

先算遮几个。 七个词,遮 15%:

7 × 15% = 1.05 个 → 四舍五入,这一条样本只遮 1 个词

图说:一条七个词的短句只出一道题。BERT 训练时喂的是 512 个标记的长片段,
15% 就是 76 个左右——所以一条样本里其实藏着几十道题。

假设这一次随机遮中的是第 2 个词「喜欢」(真实训练里遮哪个是随机的,这里定死是为了往下走):

原句: 我 喜欢 你 因为 你 很 好
这一条:我 <MASK> 你 因为 你 很 好
要猜的: 第 2 位那个词是什么?正确答案是「喜欢」

模型能用的线索:左边有「我」,右边有「你 因为 你 很 好」—— 两边都能看。
图说:换成只能往前看的接龙,第 2 位能看到的只有「我」一个字,
「我 ▢」后面填什么都通顺。右边那五个字才是把答案钉死的那部分。

3.3 完形填空自带一个别扭,以及一个很妙的补丁

别扭在哪: 训练时句子里有 <MASK> 这个人造记号,真正用的时候没有。 模型在两种不一样的输入分布上工作,书里的说法是「预训练和微调的不一致, 会极大程度影响模型在下游任务微调的性能」11

补丁是这样打的——随机选 15% 的标记来遮,但这 15% 里12:

比例怎么处理为了什么
80%换成 <MASK>正常做题
10%换成一个随机的别的词逼模型不知道哪个位置需要预测,只好每个位置都认真理解
10%原样不动让训练时也出现「没有记号」的情况,消除不一致

中间那 10% 的设计尤其值得记住。 如果全部换成 <MASK>,模型只需要在有记号的位置用功,其余位置可以摆烂; 掺入随机词之后,它无法确定哪个位置会被考,只能保持对每个位置的理解12

主走查:那一个被选中的词,三种命运

上一节选中的是第 2 位的「喜欢」。这 80/10/10 说的就是它接下来会被怎么处理:

抽到哪一档这条样本实际长什么样要猜的答案
80%——换成记号<MASK> 你 因为 你 很 好喜欢
10%——换成随机词西瓜 你 因为 你 很 好喜欢
10%——原样不动喜欢 你 因为 你 很 好喜欢
注意第二行和第三行:句子表面上没有任何记号,模型却仍然要在第 2 位交出答案。
└ 第二行还额外要求它看出「西瓜」放在这儿不对
└ 第三行看起来什么都没变,可它事先并不知道这一位没被改过

图说:三行的正确答案都是「喜欢」,变的只有输入。
所以模型没法靠「找记号」偷懒——记号只在八成的情况下存在。
(「西瓜」这个随机词是为演示挑的;80/10/10 这三个比例来自书里。)

判断(我们的,不是书里的): 这个 80/10/10 是一个很好的例子,说明 「训练时的输入」和「使用时的输入」不一致会带来实打实的损失,而且补丁常常很土。 这条经验在今天仍然有效:任何时候你在训练里加了一个真实场景没有的东西 (特殊记号、固定模板、故意掺进去的干扰),都要问一句「用的时候没有它会怎样」。 如果错,会错在: 如果某个训练技巧带来的收益远大于分布不一致的损失 (比如今天大量使用的对话模板——就是把一段对话排成固定格式的那套写法, 它在训练和使用时都存在),这条担心就不成立。

3.4 练习题之二:判断两句话是不是连着的

完形填空是在标记这个层面学关系。但有些任务要的是句子和句子之间的关系:

  • 问答匹配:给一个问题和若干个回答,挑出真正的答案;
  • 自然语言推理(一项标准任务的名字,考的是逻辑上的推断):给一个前提和一个推断,判断推断成不成立13

于是 BERT 加了第二道题,叫 NSP(Next Sentence Prediction,下一句预测): 给两句话,判断它们在原文里是不是连着的13

A: I love you. B: Because you are wonderful. → 1(连着)
A: I love you. B: Because today's dinner is so nice. → 0(不连着)

图说:正例从语料里随便截两句连着的;负例把句子打乱随便配。
所以这道题也有无限量的训练数据。

为了做这道题,BERT 在每个输入序列开头插了一个特殊标记 <CLS>, 用它在最顶层的那串数来代表整句话的意思14

主走查:同样是那七个词,NSP 怎么用

把那七个词从中间断开,当成两句话:

正例: <CLS> 我 喜欢 你 <SEP> 因为 你 很 好 → 标签 1(原文里就是连着的)
负例: <CLS> 我 喜欢 你 <SEP> 今天 晚饭 真 香 → 标签 0(从别处随便截来的)

怎么出结果:整条序列过完 12 层编码器之后,只取 <CLS> 这一位的那串数
└ 768 个数 → 过一个线性层 → 2 个数 → 谁大就判谁
└ 比如 [2.7, -1.4] ⟹ 第一个大 ⟹ 判 1 ⟹ 和正例的标签对上了

图说:注意 <CLS> 这一位本身不对应任何一个词,它是专门留出来「装整句话的意思」的空位。
整句话的判断只从这一位出,其余七位不参与。
(2.7 和 -1.4 是为演示编的,不是真实数值;12 层和 768 来自上面那张规格表。)

3.5 代价:这场练习有多贵

项目数字
语料8 亿词的图书语料 + 25 亿词的英文维基,共 13GB、约 33 亿标记15
训练量批大小(一次同时喂进去多少条)256,训练 100 万步(相当于把全部语料过 40 遍)15
硬件base 版 16 块 TPU、large 版 64 块 TPU,各跑 4 天16

这里有一个对照值得记住,书里特意点了: 大模型时代一般只把语料过一遍, 而且批大小远大于 25615为什么会有这个转变,第 05 章第 9.2.1 节把两笔账拆开算。

3.6 微调:BERT 真正的历史贡献

BERT 最大的意义不是任何一个技术细节,是它把「预训练 + 微调」两阶段确立成了标准做法17

「微调」是什么: 拿一个已经预训练好的模型,在你自己的少量标注数据上继续训练一小会儿。 书里的定义很朴素——和预训练时更新参数的策略完全一致,只是任务更专、数据更少、 批更小、每次调整的幅度更小18

一次预训练(贵,几天几十张卡)
├→ 微调成情感分类器 (便宜,几百条标注数据)
├→ 微调成实体识别器 (便宜)
└→ 微调成问答系统 (便宜)

图说:贵的那一步只做一次,后面每个任务都便宜。这是这个范式全部的经济学。

成绩:BERT 一出手就在十一项任务上刷新纪录19。 之后三年,自然语言理解这条赛道上更好的模型,基本都是在 BERT 基础上改出来的。

吞吐就是单位时间能处理多少条。

而且书里给了一个很少有人说的判断: 即使到了大模型时代, 对某些特定的、标注数据丰富、又强调高吞吐的任务,BERT 比大模型更实用19

为什么会这样: BERT 只有一亿参数,一次前向就出结果; 大模型要一个标记一个标记地吐。做每天几千万条的评论分类,这个差距是几百倍。

4. 同一路线上的两次改良:RoBERTa 与 ALBERT

这两个模型的价值不在它们本身,在它们各自证明了一件事。

4.1 RoBERTa 证明了:BERT 训得根本不够

RoBERTa 的架构和 BERT 完全一样,只改了三件事20:

改了什么具体做法结论
去掉 NSP设了四组对照实验,结果去掉 NSP 的两组显著更好,其中「一条样本只从一个文档里取」的那组最好21NSP 这道题太简单,做了没用甚至有害
换成动态遮挡BERT 在准备数据时就把要遮的位置定死了,四十遍训练里只换过四次;RoBERTa 改成每一遍训练现场随机遮22实验里优势很微弱,但更高效、更好写,后来都这么做了
加数据、加批、加步数语料从 13GB 加到 160GB(十倍);批从 256 加到 8K;一共训 50 万步23效果显著更好

顺带还把词表从 3 万扩到 5 万,分词方法从 WordPiece 换成 BPE24

代价:1024 块 V100 显卡训一天25——对照上一节 BERT 的开销: large 版是 64 块 TPU 跑 4 天。卡数多了十六倍,时间只压到四分之一。

这一条是后来一切的伏笔: RoBERTa 用同样的架构、更多的数据和算力就刷掉了 BERT。 书里明说,这也是大模型诞生的基础之一26—— 它第一次把「加数据加算力」证明成了一条可靠的路。

4.2 ALBERT 证明了:参数少不等于跑得快

ALBERT 走的是反方向:能不能用更少的参数保住能力27。三招:

第一招,把查表层的参数拆开。 查表层的矩阵是「词表大小 × 隐藏层维度」。词表 3 万、隐藏层维度 1024,就是 3000 万个参数; 要是想把隐藏层维度加到 2048,这一层立刻涨到 6100 万28

而书里给了一个很好的观察:词向量并不需要那么宽——Word2Vec 用 100 维就够好了29。 所以 ALBERT 把查表层的输出定成 128 维,再加一个小矩阵把它升到隐藏层维度

原来: 词表30000 × 1024 = 3072 万个参数
改后: 词表30000 × 128 = 384 万
+ 128 × 1024 = 13 万 ⟹ 合计约 397 万

图说:中间插一道「窄腰」,参数量掉了将近八倍。
代价是多一次矩阵乘法。

第二招,所有层共用一套参数。 ALBERT 发现各层参数高度相似,于是只初始化一层,然后让数据在这一层里过 24 遍30。 效果:24 层、隐藏层维度 2048 的版本只有 5900 万参数,却比 3.4 亿参数的 BERT 更好31

第三招,把 NSP 改难。 RoBERTa 是直接删掉 NSP,ALBERT 选择改造它,叫 SOP(句子顺序预测)。 该判成「是」的那些样本,行话叫正例;SOP 的正例和 NSP 一样,还是两句连着的。

改的是另一半:该判成「否」的那些样本,行话叫负例。 SOP 的负例不再另找一句,而是把这两句的顺序颠倒过来32

NSP 的负例:A「我爱你」 B「今天的晚饭真好吃」 ← 一眼看出不相关,题太简单
SOP 的负例:A「因为你很好」 B「我爱你」 ← 内容相关,只有顺序错了

图说:SOP 逼模型学「顺序」而不只是「相关不相关」。
实验证明它比只做完形填空好,更比配 NSP 好。

但 ALBERT 最终没能取代 BERT,原因很实在: 参数虽然少了,计算量一点没少——还是要过 24 遍。 所以训练和推理速度比 BERT 还慢33

这是一条非常值钱的教训:「参数少」和「算得快」是两回事。 参数量决定显存占用,计算量决定速度。动手改进之前,先问清楚你缺的是哪一个。

4.3 顺带把「推理」这个词一次性说清

刚才那句「推理速度」里的「推理」,和你在别处见到的「模型的推理能力」根本不是一回事。 中文把两个不相干的英文词都译成了「推理」,这是这一行最容易读岔的一个词。

说的是哪一个意思本书怎么写
英文的 inference拿一个练好的模型算出结果,和「训练」相对一律叫推理(上面那句「推理速度」就是这个意思)
英文的 reasoning一步步想、由已知推出未知,人做数学题那种一律写成逻辑推理,不单说「推理」

往后本书按这一栏区分,不再解释。 别处的材料没有这个约定,看到「推理」两个字, 先看它是在说速度和成本(第一种),还是在说想得对不对(第二种)。

5. 路线二:两半都留——T5 和「大一统」

T5 的技术细节不多,但它提出的那个主张影响极深远。

5.1 结构:老老实实保留编码器和解码器

T5 的全称是 Text-To-Text Transfer Transformer,Google 提出34。 结构上它最接近原版 Transformer:编码器读输入,解码器写输出, 中间靠第 03 章讲的交叉注意力连接35

它改了一处:层归一化换成 RMSNorm「均方根」就是:把一组数各自平方、取平均、再开方,得到一个衡量这组数整体有多大的量; 书里的原话是「计算每个神经元的均方根来归一化」,好处是参数更简单,只有一个可学参数36

和第 03 章那个层归一化比,它省掉了「减平均值」这一步。 (为什么省掉这一步是安全的、后来所有模型都跟着这么做了,第 06 章讲。)

5.2 练习题:也是完形填空,但挖一整段

T5 的预训练任务书里叫 BERT-style 目标:随机遮蔽 15% 的标记让模型预测37。 差别在于输入和输出都是纯文字——被遮的部分用占位符替代,而被遮的内容序列就是训练目标37

主走查:同样是那七个词,T5 怎么挖

BERT 遮的是一个词,T5 挖的是一整串。 假设这次挖掉的是第 2、3 两个词:

原句: 我 喜欢 你 因为 你 很 好
编码器读: 我 <X> 因为 你 很 好 ← 两个词被一个占位符 <X> 顶掉了
解码器写: <X> 喜欢 你 ← 目标序列就是被挖走的那一串

图说:和 BERT 比,两处不一样——
① 挖走的两个词只占了一个位置,所以模型还得自己猜「这里原本有几个词」;
② 输出不是「第 2 位填什么」这种位置判断,而是一段现写的文字。
第 ② 条就是「文字进、文字出」的由来。
(挖第 2、3 两个词是为演示定死的,真实训练里挖哪几个是随机的。)

语料是它自己造的 C4(Colossal Clean Crawled Corpus,「巨型清洗爬取语料」), 从公开网页里提取并清洗出来的英文文本,750GB38—— 是 BERT 那份 13GB 语料的近六十倍,也是 RoBERTa 那份 160GB 的四倍多。

5.3 大一统:这才是 T5 真正的贡献

主张只有一句话:所有的自然语言处理任务,都可以写成「输入一段文字,输出一段文字」39

做法是在输入前面加一句任务说明40:

任务输入输出
分类classify: 这是一个很好的产品正面
翻译translate English to French: How are you?Comment ça va?
摘要summarize: ……摘要文本

为什么这件事重要: 在这之前,每种任务都要配一个专门的输出层—— 分类要分类头、标注要标注头、生成要解码头。T5 之后,一个模型、一种格式,全部搞定。

这个主张是今天所有大模型的用法的直接祖先。 你今天对着对话框打字、它回你一段文字——这就是「文字进、文字出」。 只不过 T5 还需要一个固定前缀来指明任务,而大模型可以直接读懂你用自然语言写的要求。 中间发生了什么,第 05 章的「指令遵循」那一节讲。

6. 路线三:只留解码器——GPT

这条路线起步最早、当时最不被看好、最后赢下全部。

6.1 一个容易被忽略的事实

书里点了一句很重要的话:学界普遍把 BERT 当作预训练时代的代表, 但首先明确提出「预训练 + 微调」这个思路的其实是 GPT41

GPT 2018 年发布,比 BERT 早;但因为性能略输于随后发布的 BERT,没能引起轰动, 也没能让「只留解码器」成为学界主流41

6.2 结构:它其实更像编码器

这里有一个反直觉的点,值得讲清楚。

第 03 章说过,原版解码器有两个注意力层:一个掩码自注意力,一个连接编码器的交叉注意力。 但 GPT 没有编码器,所以那个交叉注意力没有东西可连——直接删掉。

于是 GPT 的「解码器层」反而更像编码器层:只有一个注意力层加一个前馈层42。 唯一的差别是那个注意力层带掩码——只能看见自己前面的标记。

原版解码器层: 掩码自注意力 → 交叉注意力 → 前馈层
GPT 的层: 掩码自注意力 → ────────── → 前馈层
└ 就这一处掩码,决定了它和 BERT 的全部差别

图说:结构上 GPT 和 BERT 只差一块遮布;而这块遮布决定了两条完全不同的命运。

其余细节:12 层,位置编码沿用了正余弦公式(不像 BERT 用可训练的表), 层归一化被提到了注意力之前(也就是第 03 章说的 Pre-Norm), 前馈层用的是一维卷积核而不是线性层(书里说效果上没有太大区别)43

6.3 练习题:接龙

正式名字叫因果语言模型(CLM,Causal Language Model; 书里把 Causal 拼成了 Casual,这是中文材料里很常见的一处笔误,后者的意思是「随意的」)—— 根据前面所有的标记预测下一个标记,不断重复44

「因果」这两个字的意思是:只能由前推后,不能由后推前。 和第 02 章那块掩码是同一件事。

输入:今天天气 输出:今天天气很
输入:今天天气很 输出:今天天气很好

图说:书里的例子。要生成 256 个标记,就要这样跑 256 次。

主走查:同样是那七个词,GPT 拆出六道题

这道题不需要挖任何东西——把结尾遮住就是一道题,遮在哪儿就是第几道:

第几题输入要猜的
1喜欢
2我 喜欢
3我 喜欢 你因为
4我 喜欢 你 因为
5我 喜欢 你 因为 你
6我 喜欢 你 因为 你 很
七个词 → 六道题。一个人造记号都没用上,一条标注都不用人写。
└ 对比 BERT:同样七个词只出了 1 道题(15% 四舍五入),而且题面里带着 <MASK>
└ 对比 T5: 同样七个词出了 1 道题,还要多带一个 <X>

图说:同一句话,这条路线榨出的题目是另外两条的六倍,而且题面就是原文本身。
「练的和用的完全一样」「题目无限供给」这两条优势,落到数上就是这张表。
六道题靠第 02 章那块掩码可以一次性并行算完,不必真跑六遍。

它和完形填空的三个差别,每一个都在为后来的胜利埋伏笔45:

完形填空(MLM)接龙(CLM)
训练和使用一不一致不一致(用的时候没有 <MASK>)完全一致
和下游任务的关系要另接一个头直接就是「往下写」这件事
天然性人为设计的题和人写字的习惯天生契合

6.4 三代的演进:一条「加大」的直线

书里给的表格46:

层数前馈层维度注意力头数隐藏层维度参数量语料
GPT-1(2018)123072127681.2 亿5GB
GPT-2(2019)48640025160015 亿40GB
GPT-3(2020)964915296122881750 亿570GB

GPT-1: 规模和 BERT-base 相当,但表现不如它。这就是这条路线当年不被看好的原因47

GPT-2: 结构几乎没变,只是把 Post-Norm 改成 Pre-Norm—— 因为层数变多后梯度消失和爆炸的风险变大了,要让梯度更稳48。 (「梯度」就是训练时决定每个参数往哪调、调多少的那个量;梯度消失就是它变得太小、模型学不动。)

GPT-2 真正的突破是提出了零样本(zero-shot)49:

不给任何训练样本,直接用自然语言把问题描述给模型,让它解决。

这是对「预训练 + 微调」范式的一次根本挑战:传统做法要收集几百上千条标注数据再微调, 零样本连一条都不要。但 GPT-2 时代模型能力还撑不住,效果不好49

GPT-3: 参数量涨到 1750 亿。结构基本没改,只是因为体量太大而用了稀疏注意力(就是不再让每个位置都去看所有其他位置,只看一部分,以此避开那条平方关系)来代替普通注意力50。 数据是按一定比例从各大语料集里抽了 45T 出来、清洗后剩 570GB; 训练需要 1024 张 A100 显卡跑一个月50—— 同样是 1024 张卡,上一节那个 RoBERTa 只要跑一天(见第 4.1 节),这里要跑三十天。

6.5 GPT-3 真正的创新:少样本

少样本就是:在提问里塞进三五个例子,让模型照着做。

而模型「现场看几个例子就学会」的这种本事,有个专门的名字,叫上下文学习。

光是「大」还不足以让 GPT-3 成为分水岭。 真正的创新是少样本(few-shot)51

研究者发现:哪怕大到 1750 亿,零样本仍然不好使。 于是折中——在提问里塞进三到五个例子,教它这道题怎么做:

零样本:请你判断「这真是一个绝佳的机会」的情感是正向还是负向,正向输出 1,否则输出 0

少样本:请你判断「这真是一个绝佳的机会」的情感是正向还是负向,正向输出 1,否则输出 0。
你可以参考以下示例来判断:
「你的表现非常好」——1;「太糟糕了」——0;「真是一个好主意」——1。

图说:两段话的区别只有后面那几个例子,而效果差距巨大。
注意:模型的参数一个都没有被改动。

这件事有个正式名字:上下文学习(In-context Learning)—— (提示就是你交给模型的那一整段输入文字——你的问题、你给的例子、你提的要求,全算在里面。)

让模型从提示里给出的示例中,现场学会这道题怎么解52

为什么这是分水岭: 如果绝大部分任务都能靠人为写三五个例子解决, 那它的效率就远高于「标一千条数据 + 训一次」的老范式。 书里的判断是:这意味着自然语言处理的进一步落地应用成为可能——而这正是大模型的核心优势52

6.6 最后一步:ChatGPT

指令微调就是拿成对的「要求 → 回复」接着训模型,教它照着人的要求答。 比如喂它一条「把下面这句翻译成英文:今天天气真好 → Today is a nice day!」, 它学到的不是这一句怎么翻,而是「看到一条要求,该照着办」这件事本身。

再往后还有一步,叫强化学习——让模型不断尝试,再根据外部给的好坏反馈来调整自己的做法, 和上面那种「给它标准答案照着学」完全是两种教法。

在 GPT 系列的基础上,引入「预训练 → 指令微调 → 人类反馈强化学习」三阶段训练, 就得到了 ChatGPT53这三个阶段各是什么,是第 05 章的主线。

7. 今天的两个主角:LLaMA 与 GLM

这两个是书里额外展开的,因为一个是全球开源生态的地基,一个是中文开源的起点。

7.1 LLaMA:开源模型的通用底座

Meta 出品,架构和 GPT 系列一样是只留解码器54。书里给的三代演进55:

时间规模语料关键变化
LLaMA-12023.027B / 13B / 30B / 65B超过 1 万亿标记开源 + 性能好,迅速成为社区最受欢迎的模型;65B 那版用 2048 张 A100 训了近 21 天
LLaMA-22023.077B / 13B / 34B / 70B2 万亿标记上下文长度从 2048 翻倍到 4096;引入分组查询(就是让好几个查询头共用同一组中间结果)注意力,英文缩写 GQA
LLaMA-32024.048B / 70B超过 15 万亿标记支持 8K 长文本;词表从 3.2 万扩到 12.8 万

「7B」这类写法读作「70 亿参数」(B = billion,十亿)——也就是这台机器里有 70 亿个可调的数。

分组查询注意力(GQA)是第 06 章的重点之一,这里只需要知道它是省显存的手段。

7.2 GLM:三处小改,一个大胆的融合

GLM 系列由智谱开发,ChatGLM-6B 是 2023 年国内最早的开源中文大模型56

结构上和 GPT 只有三处细微差异57:

改动内容书里给的理由
用 Post-Norm先做残差相加,再做归一化更能防止参数长得过大过偏,因此更稳健;GLM 论文说这样可以避免数值错误——但书里同时承认主流仍然用 Pre-Norm
输出层用单个线性层而不是多层更简单更稳健,把参数省下来放进模型本体
激活函数换成 GELU而不是 ReLU它对接近 0 的那一段做了平滑处理,不像 ReLU 那样在 0 处硬拐一下,所以输出更连续

它真正的创新是练习题:自回归(就是「拿前面已经有的推下一个」,也就是接龙)空白填充58

思路是把完形填空和接龙缝在一起:

输入:I <MASK> because you <MASK>
答案:第一个 <MASK> = love you;第二个 <MASK> = are a wonderful person

① 遮的不是单个标记,而是一整串;
② 猜这一串时,要用到它前后的上下文 ← 这是完形填空的部分
③ 而这一串内部,要一个标记一个标记地往下写 ← 这是接龙的部分

图说:一道题同时练「读懂」和「往下写」。设计得很精巧。

换成本章那七个词,就更容易和前面几节对着看:

输入:我 <MASK> 因为 <MASK>
要写回来的第一串:喜欢 你 ← 猜它时能看到右边的「因为」,这是完形填空那一半
要写回来的第二串:你 很 好 ← 写「很」时要先写出「你」,这是接龙那一半

图说:和第 5.2 节的 T5 比,挖的方式几乎一样;差别在「被挖走那一串内部也要按顺序写」。
和第 6.3 节的 GPT 比,能看到的上文多了「因为」右边那部分。
(这几个词的挖法是照书里那个英文例子改的,挖哪几处是为演示定死的。)

但书里给了一个很坦率的评价:这是一次失败的尝试59

原因是:进入大模型时代之后,把体量和语料一起放大之后,接龙训练出来的生成模型(专门用来往下写的那种) 在理解能力上也能超过完形填空训练出来的理解模型。 所以 ChatGLM 只有第一代用了这套思路,从第二代起就回归了传统接龙,架构也回归了 LLaMA60

书里同时肯定了它的历史意义:精巧的设计,以及第一时间产出了中文开源的原生大模型59

GLM 家族的演进61:

版本时间上下文长度关键点
ChatGLM-6B2023.032K第一个中文开源大模型,1 万亿标记语料
ChatGLM2-6B2023.0632K回归 LLaMA 架构和接龙训练
ChatGLM3-6B2023.10架构没变,靠数据和训练策略提升;开始支持函数调用(让模型自己决定该调用哪个现成的程序函数)与代码解释器
GLM-42024.01128K未开源,只开源了轻量版 GLM-4-9B

8. 为什么最后是「只留解码器」赢了

这一节是全章的落点。

三条路线在 2018 年起跑时,BERT 领先一个身位,GPT 垫底。 三年后完全反过来。 书里没有把原因单独归纳成一节,我们把它拼出来:

原因具体是什么
训练与使用一致接龙训练时干的事和使用时干的事完全一样,没有 <MASK> 这种真实场景不存在的东西45
练习题可以无限供给任何一段文字,把结尾遮住就是一道题;互联网上所有文本都能直接用45
直接就是下游任务写作、问答、翻译、总结本来就是「往下写」;而 BERT 每个任务都要另接一个头
它能受益于「加大」RoBERTa 已经证明加数据加算力有效;而只留解码器的路线没有 512 长度这种硬上限
上下文学习是它独有的它天生把「例子」和「问题」放在同一段文字里;完形填空没有对应的用法

一句话总结:

赢的不是更聪明的结构,是更省事、更能规模化的练习题。

判断(我们的,不是书里的): 这一章最值得带走的思维方式是—— 技术路线的胜负,常常不在「哪个当下更强」,而在「哪个能吃下更多资源」。 BERT 在 2018 年的成绩明显更好,但它的练习题需要人造记号、结构有长度上限; GPT 那条路虽然当时更弱,却对「无限文本 + 无限算力」完全敞开。 判断一条路线有没有未来,先问:给它十倍资源,它接得住吗。 如果错,会错在: 如果某条路线的瓶颈不是资源而是别的东西 (比如受限于可得数据的总量,或者受限于某个物理约束),那么「能不能接住十倍资源」就问错了问题。

9. 作者的判断与证据

这一节把「书里给了证据的」和「书里只是这么说的」分开。

说法书里给了什么该怎么看
去掉 NSP 更好给了四组对照实验的设置和结论可以采信,这是原论文的实验结论
动态遮挡更好明说「仅有很微弱的优势」,并说明后来普及的真正原因是高效易实现书在这里很诚实,值得肯定
ALBERT 参数少但更慢给了机制解释(共享参数不减少计算次数)可以采信
SOP 比 NSP 好给了实验结论的方向,没给具体数字结论正确,证据只到「实验证明」这一层
大模型时代 CLM 全面胜过 MLM只给了结论,没有引用任何对比实验这是全章最需要留神的一条——它是当下的共识,但书没给依据
GLM 的预训练任务是「失败的尝试」给了理由(被 CLM 的规模效应压过),并给了佐证(ChatGLM2 起就放弃了)这是作者的评价,证据是间接的
BERT 在某些任务上比大模型更实用只给了结论我们认为成立(见上文关于吞吐的解释),但书里没有展开

10. 边界与局限

① 书里几乎没给出处

这一章涉及八个模型、七篇原始论文,但正文里一次都没有说「这是谁哪年提出的、当时的主张是什么」。 参考文献列在章末,正文和文献之间没有对应关系。 我们在脚注里逐一补上了核对过的一手来源。

② 三个模型的实际时间线,书里排得不太准

书里正文写「BERT 由 Google 团队在 2018 年发布」「Transformer 是 2017 年发表」,这些都对; 但参考文献里 BERT 标的是 (2019)、Transformer 标的是 (2023)。 那是论文在预印本平台上最后修订的年份,不是首次公开的年份。 引用年份的时候别照抄这本书的参考文献表。

③ 我们动过书里一张表的列名,这里说明一下

第 6.4 节那张 GPT 三代对照表,书里的列名是「Hidden_size 3072 / 注意力维度 768」62这两列标反了: 3072 是前馈层那一段中间被拉宽到的维度,768 才是每个标记 从头到尾被表示成的那串数的长度(也就是隐藏层维度)。 GPT-1 的隐藏层维度是 768、注意力切成 12 个头,这在书里同一段的正文里也写着。

我们按正确的含义把这两个列名对调了过来,写成「前馈层维度 3072 / 隐藏层维度 768」,数字一个没动。 本章其余每一处书里的疏漏都在这一节逐条点名了,这一处也不例外—— 改了不说,读者拿我们的表去对书里的表就会以为自己看错了。

④ 完全没提的三件事

缺什么为什么重要
BERT 之后的编码器路线仍在演进书只提了 ERNIE、DistilBERT、XLM 的名字就带过了63
T5 的那套系统性对比实验T5 原论文真正的贡献是把架构、目标、数据都做了对照实验,书只讲了结论
非 Transformer 的路线书用一个括号提了 RWKV、Mamba 就再没出现64它们是今天唯一活跃的非注意力路线

⑤ 这一章的时间坐标停在 2024 年年中

LLaMA-3 之后的事情,书里一个字都没有。 最重要的两条:

  • 混合专家(把前馈层换成很多个「专家」,每次只让其中少数几个干活;英文缩写 MoE)——今天主流开源模型大量采用,书里完全没提;
  • 推理模型(reasoning model,指专门把「一步步想」这件事练强的那一类模型)—— 用强化学习直接激励模型的逻辑推理能力这条路,前言里提到了 DeepSeek-R1 的名字, 但正文没有任何内容65

11. 可带走的

  1. 一台 Transformer 有两半,于是有三种拆法:只留编码器、两半都留、只留解码器;
  2. 「预训练」= 在无标注文本上做一道自己出题自己判分的练习,所以能用互联网上所有文字;
  3. 三条路线的真正差别不在结构,在练习题怎么出;
  4. BERT = 编码器 + 完形填空,双向看上下文,理解得最准;十一项任务同时刷新纪录;
  5. 完形填空的先天别扭:训练时有 <MASK>,用的时候没有;补丁是 80% 遮 / 10% 换随机词 / 10% 不动;
  6. BERT 用可训练的位置表,所以最长只能吃 512 个标记——「上下文长度」这个限制的源头之一;
  7. BERT 真正的历史贡献是把「预训练 + 微调」确立成标准:贵的一步只做一次,后面每个任务都便宜;
  8. RoBERTa 证明了 BERT 训得根本不够——同样架构,十倍数据就刷掉它;这是大模型的直接伏笔;
  9. ALBERT 证明了「参数少」不等于「算得快」:共享参数省显存,但计算次数一次不少;
  10. T5 的主张是「所有任务都能写成文字进、文字出」——今天你用对话框的方式,祖先就在这里;
  11. GPT = 解码器 + 接龙;结构上它和 BERT 只差一块掩码,命运却完全不同;
  12. 首先提出「预训练 + 微调」的其实是 GPT,不是 BERT;
  13. GPT-3 的分水岭不是 1750 亿参数,是「上下文学习」——在提问里塞几个例子,参数一个不改;
  14. 赢的不是更聪明的结构,是更省事、更能规模化的练习题;
  15. 判断一条技术路线有没有未来,先问:给它十倍资源,它接得住吗。

12. 原文地图

主题原书章原文位置
三条路线的分岔3.1 Encoder-only PLMtext/07-ch03-01-3-1-encoder-only-plm.txt:9(搜「Masked Language Model」) · text/07-ch03-01-3-1-encoder-only-plm.txt:13(搜「T5模型」)
BERT 的历史地位3.1 Encoder-only PLMtext/07-ch03-01-3-1-encoder-only-plm.txt:20(搜「Bidirectional Encoder Representations」) · text/07-ch03-01-3-1-encoder-only-plm.txt:27(搜「BERT 也是⽆法绕过的⼀环」)
BERT 的结构与两种规格3.1 Encoder-only PLMtext/07-ch03-01-3-1-encoder-only-plm.txt:56(搜「prediction_heads」) · text/07-ch03-01-3-1-encoder-only-plm.txt:65(搜「110M」)
WordPiece、GELU、可训练位置编码3.1 Encoder-only PLMtext/07-ch03-01-3-1-encoder-only-plm.txt:69(搜「WordPiece」) · text/07-ch03-01-3-1-encoder-only-plm.txt:86(搜「GELU」) · text/07-ch03-01-3-1-encoder-only-plm.txt:100(搜「512 个 token」)
接龙任务的优点与缺陷3.1 Encoder-only PLMtext/07-ch03-01-3-1-encoder-only-plm.txt:117(搜「互联⽹上所有⽂本语料都可以被」) · text/07-ch03-01-3-1-encoder-only-plm.txt:119(搜「忽略了双向的语义关系」)
完形填空与 80/10/103.1 Encoder-only PLMtext/07-ch03-01-3-1-encoder-only-plm.txt:126(搜「完形填空」) · text/07-ch03-01-3-1-encoder-only-plm.txt:140(搜「预训练和微调的不⼀致」) · text/07-ch03-01-3-1-encoder-only-plm.txt:142(搜「15%」)
NSP 与 <CLS>3.1 Encoder-only PLMtext/07-ch03-01-3-1-encoder-only-plm.txt:155(搜「NSP 任务的核」) · text/07-ch03-01-3-1-encoder-only-plm.txt:188(搜「CLS」)
BERT 的训练开销3.1 Encoder-only PLMtext/07-ch03-01-3-1-encoder-only-plm.txt:173(搜「BooksCorpus」) · text/07-ch03-01-3-1-encoder-only-plm.txt:175(搜「1M 步」) · text/07-ch03-01-3-1-encoder-only-plm.txt:179(搜「16块 TPU」)
预训练-微调范式与成绩3.1 Encoder-only PLMtext/07-ch03-01-3-1-encoder-only-plm.txt:183(搜「预训练-微调的两阶段思想」) · text/07-ch03-01-3-1-encoder-only-plm.txt:191(搜「所谓微调」) · text/07-ch03-01-3-1-encoder-only-plm.txt:197(搜「11个赛道」)
RoBERTa 的三处优化3.1 Encoder-only PLMtext/07-ch03-01-3-1-encoder-only-plm.txt:231(搜「单⽂档的 MLM 组」) · text/07-ch03-01-3-1-encoder-only-plm.txt:237(搜「动态遮蔽」) · text/07-ch03-01-3-1-encoder-only-plm.txt:245(搜「160GB」) · text/07-ch03-01-3-1-encoder-only-plm.txt:266(搜「50K」)
ALBERT 的三招与代价3.1 Encoder-only PLMtext/07-ch03-01-3-1-encoder-only-plm.txt:283(搜「30K」) · text/07-ch03-01-3-1-encoder-only-plm.txt:288(搜「Word2Vec 仅使」) · text/07-ch03-01-3-1-encoder-only-plm.txt:302(搜「24次计算」) · text/07-ch03-01-3-1-encoder-only-plm.txt:306(搜「59M」) · text/07-ch03-01-3-1-encoder-only-plm.txt:320(搜「顺序反过来」)
T5 的结构与 RMSNorm3.2 Encoder-Decoder PLMtext/08-ch03-02-3-2-encoder-decoder-plm.txt:21(搜「Text-To-Text Transfer」) · text/08-ch03-02-3-2-encoder-decoder-plm.txt:60(搜「RMSNorm」)
C4 语料与大一统3.2 Encoder-Decoder PLMtext/08-ch03-02-3-2-encoder-decoder-plm.txt:80(搜「750GB」) · text/08-ch03-02-3-2-encoder-decoder-plm.txt:113(搜「classify:」) · text/08-ch03-02-3-2-encoder-decoder-plm.txt:115(搜「translate English to French」)
GPT 的结构与因果语言模型3.3 Decoder-Only PLMtext/09-ch03-03-3-3-decoder-only-plm.txt:26(搜「⾸先明确提出预训练-微调思想」) · text/09-ch03-03-3-3-decoder-only-plm.txt:49(搜「12层解码器层」) · text/09-ch03-03-3-3-decoder-only-plm.txt:67(搜「Casual Language Model」)
三代 GPT 的参数与语料3.3 Decoder-Only PLMtext/09-ch03-03-3-3-decoder-only-plm.txt:99(搜「0.12B」) · text/09-ch03-03-3-3-decoder-only-plm.txt:117(搜「40GB」) · text/09-ch03-03-3-3-decoder-only-plm.txt:131(搜「1024张 A100」)
零样本、少样本与上下文学习3.3 Decoder-Only PLMtext/09-ch03-03-3-3-decoder-only-plm.txt:120(搜「zero-shot」) · text/09-ch03-03-3-3-decoder-only-plm.txt:141(搜「few-shot:请你判断」) · text/09-ch03-03-3-3-decoder-only-plm.txt:144(搜「Incontext」)
LLaMA 三代3.3 Decoder-Only PLMtext/09-ch03-03-3-3-decoder-only-plm.txt:193(搜「1T token」) · text/09-ch03-03-3-3-decoder-only-plm.txt:205(搜「GQA」) · text/09-ch03-03-3-3-decoder-only-plm.txt:213(搜「15T token」)
GLM 的三处改动与空白填充3.3 Decoder-Only PLMtext/09-ch03-03-3-3-decoder-only-plm.txt:236(搜「Post Norm ⽽⾮ Pre Norm」) · text/09-ch03-03-3-3-decoder-only-plm.txt:247(搜「GeLUs」) · text/09-ch03-03-3-3-decoder-only-plm.txt:258(搜「⾃回归空⽩填充」) · text/09-ch03-03-3-3-decoder-only-plm.txt:275(搜「失败的尝试」)
GLM 家族的发展3.3 Decoder-Only PLMtext/09-ch03-03-3-3-decoder-only-plm.txt:284(搜「ChatGLM2」) · text/09-ch03-03-3-3-decoder-only-plm.txt:293(搜「GLM-4」)

Footnotes

  1. 出处:「3.1 Encoder-only PLM」第 9 段(text/07-ch03-01-3-1-encoder-only-plm.txt:9,搜「Masked Language Model」)与第 13 段(text/07-ch03-01-3-1-encoder-only-plm.txt:13,搜「T5模型」)。原文的说法是:Google 只选了编码器层堆叠、提出掩码语言模型,打造了 BERT;OpenAI 选了解码器层、沿用原有的语言模型任务,打造了 GPT 系列;还有一种思路是两者都保留,例如 T5。

  2. 出处:「3.1 Encoder-only PLM」第 20 段(text/07-ch03-01-3-1-encoder-only-plm.txt:20,搜「Bidirectional Encoder Representations」)与第 27 段(text/07-ch03-01-3-1-encoder-only-plm.txt:27,搜「BERT 也是⽆法绕过的⼀环」)。补充(不在书里):BERT 的原始出处是《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》,作者 Jacob Devlin、Ming-Wei Chang、Kenton Lee、Kristina Toutanova,首次公开于 2018 年 10 月 11 日。摘要里报告的成绩包括 GLUE 提升到 80.5%(+7.7 个百分点)、MultiNLI 86.7%、SQuAD v1.1 的 F1 值 93.2。来源:https://arxiv.org/abs/1810.04805(查阅于 2026-08-25)。

  3. 出处:「3.1 Encoder-only PLM」第 56 段(text/07-ch03-01-3-1-encoder-only-plm.txt:56,搜「prediction_heads」)与第 73 段(text/07-ch03-01-3-1-encoder-only-plm.txt:73,搜「线性层加上激活函数」)。

  4. 出处:「3.1 Encoder-only PLM」第 65 段(text/07-ch03-01-3-1-encoder-only-plm.txt:65,搜「110M」)。

  5. 出处:「3.1 Encoder-only PLM」第 69 段(text/07-ch03-01-3-1-encoder-only-plm.txt:69,搜「WordPiece」)。原文说 WordPiece 的合并依据是「最大化语言模型的似然度」,对中文等没有空格的语言则把单个汉字当作原子单位。补充(不在书里):WordPiece 这个名字最早出现在 Google 的神经机器翻译系统论文《Google's Neural Machine Translation System: Bridging the Gap between Human and Machine Translation》里,首次公开于 2016 年 9 月 26 日,第一作者 Yonghui Wu;摘要里的说法是把词切成「有限的一组常见子词单元」,兼顾字符级模型的灵活与词级模型的效率。来源:https://arxiv.org/abs/1609.08144(查阅于 2026-08-25)。

  6. 出处:「3.1 Encoder-only PLM」第 86 段(text/07-ch03-01-3-1-encoder-only-plm.txt:86,搜「GELU」)。原文明说「关于 GELU 的原理与核心思路,此处不再赘述」。补充(不在书里):GELU 的原始出处是《Gaussian Error Linear Units (GELUs)》,作者 Dan Hendrycks 与 Kevin Gimpel,首次公开于 2016 年 6 月 27 日;摘要里的关键区别是它「按输入的数值大小加权,而不是像 ReLU 那样按符号来开关」。来源:https://arxiv.org/abs/1606.08415(查阅于 2026-08-25)。

  7. 出处:「3.1 Encoder-only PLM」第 97 段(text/07-ch03-01-3-1-encoder-only-plm.txt:97,搜「可训练的参」)与第 100 段(text/07-ch03-01-3-1-encoder-only-plm.txt:100,搜「512 个 token」)。原文的权衡是:可训练的位置编码比正余弦能拟合更丰富的相对位置信息,但增加了模型参数,而且完全无法处理超过训练长度的输入。

  8. 出处:「3.1 Encoder-only PLM」第 117 段(text/07-ch03-01-3-1-encoder-only-plm.txt:117,搜「互联⽹上所有⽂本语料都可以被」)。

  9. 出处:「3.1 Encoder-only PLM」第 119 段(text/07-ch03-01-3-1-encoder-only-plm.txt:119,搜「忽略了双向的语义关系」)。原文举的对照是双向 LSTM 在语义表征上往往优于单向 LSTM。

  10. 出处:「3.1 Encoder-only PLM」第 126 段(text/07-ch03-01-3-1-encoder-only-plm.txt:126,搜「完形填空」)。

  11. 出处:「3.1 Encoder-only PLM」第 140 段(text/07-ch03-01-3-1-encoder-only-plm.txt:140,搜「预训练和微调的不⼀致」)。

  12. 出处:「3.1 Encoder-only PLM」第 142 段(text/07-ch03-01-3-1-encoder-only-plm.txt:142,搜「15%」)与第 144 段(text/07-ch03-01-3-1-encoder-only-plm.txt:144,搜「10% 保持不变」)。原文对随机替换的解释是:若全部遮蔽,模型仅需处理被遮蔽的位置;引入随机标记后模型无法确定要预测哪个,从而被迫保持每一个位置的上下文表征。 2

  13. 出处:「3.1 Encoder-only PLM」第 155 段(text/07-ch03-01-3-1-encoder-only-plm.txt:155,搜「NSP 任务的核」)与第 155 段(text/07-ch03-01-3-1-encoder-only-plm.txt:155,搜「是否是连续的上下⽂」)。原文同时说明正例可从语料里随机抽连续句子、负例打乱后随机抽,因此训练数据几乎无限。 2

  14. 出处:「3.1 Encoder-only PLM」第 188 段(text/07-ch03-01-3-1-encoder-only-plm.txt:188,搜「CLS」)。

  15. 出处:「3.1 Encoder-only PLM」第 173 段(text/07-ch03-01-3-1-encoder-only-plm.txt:173,搜「BooksCorpus」)与第 175 段(text/07-ch03-01-3-1-encoder-only-plm.txt:175,搜「1M 步」)。原文同时给了那句关键对照:「相较而言,LLM 一般都只会训练一个 Epoch,且使用远大于 256 的 batch size」。 2 3

  16. 出处:「3.1 Encoder-only PLM」第 179 段(text/07-ch03-01-3-1-encoder-only-plm.txt:179,搜「16块 TPU」)。补充(不在书里,来自通用知识):TPU 是 Google 自研的、专门用来跑神经网络运算的芯片,作用和显卡类似。

  17. 出处:「3.1 Encoder-only PLM」第 183 段(text/07-ch03-01-3-1-encoder-only-plm.txt:183,搜「预训练-微调的两阶段思想」)。

  18. 出处:「3.1 Encoder-only PLM」第 191 段(text/07-ch03-01-3-1-encoder-only-plm.txt:191,搜「所谓微调」)。

  19. 出处:「3.1 Encoder-only PLM」第 197 段(text/07-ch03-01-3-1-encoder-only-plm.txt:197,搜「11个赛道」)与第 199 段(text/07-ch03-01-3-1-encoder-only-plm.txt:199,搜「更具有可」)。原文:「对于某些特定、训练数据丰富且强调高吞吐的任务,BERT 比 LLM 更具有可用性」。 2

  20. 出处:「3.1 Encoder-only PLM」第 220 段(text/07-ch03-01-3-1-encoder-only-plm.txt:220,搜「与 BERT 完全⼀致」)。补充(不在书里):RoBERTa 的原始出处是《RoBERTa: A Robustly Optimized BERT Pretraining Approach》,第一作者 Yinhan Liu,首次公开于 2019 年 7 月 26 日;摘要里最核心的一句正是「BERT 训练得明显不足」。来源:https://arxiv.org/abs/1907.11692(查阅于 2026-08-25)。

  21. 出处:「3.1 Encoder-only PLM」第 231 段(text/07-ch03-01-3-1-encoder-only-plm.txt:231,搜「单⽂档的 MLM 组」)。四组实验的设置见第 224 至 229 段(text/07-ch03-01-3-1-encoder-only-plm.txt:224,搜「段落构建的」)。

  22. 出处:「3.1 Encoder-only PLM」第 237 段(text/07-ch03-01-3-1-encoder-only-plm.txt:237,搜「动态遮蔽」)。原文:动态遮蔽「仅有很微弱的优势优于静态遮蔽,但由于动态遮蔽更高效、易于实现,后续 MLM 任务基本都使用了动态遮蔽」。

  23. 出处:「3.1 Encoder-only PLM」第 245 段(text/07-ch03-01-3-1-encoder-only-plm.txt:245,搜「160GB」)与第 249 段(text/07-ch03-01-3-1-encoder-only-plm.txt:249,搜「500K Step」)。

  24. 出处:「3.1 Encoder-only PLM」第 266 段(text/07-ch03-01-3-1-encoder-only-plm.txt:266,搜「50K」)与第 258 段(text/07-ch03-01-3-1-encoder-only-plm.txt:258,搜「BPE,即 Byte Pair」)。BPE 的具体机制第 07 章讲。

  25. 出处:「3.1 Encoder-only PLM」第 254 段(text/07-ch03-01-3-1-encoder-only-plm.txt:254,搜「1024 块 V100」)。

  26. 出处:「3.1 Encoder-only PLM」第 270 段(text/07-ch03-01-3-1-encoder-only-plm.txt:270,搜「LLM 诞⽣的基础之⼀」)。

  27. 出处:「3.1 Encoder-only PLM」第 273 段(text/07-ch03-01-3-1-encoder-only-plm.txt:273,搜「ALBERT 模」)。补充(不在书里):ALBERT 的原始出处是《ALBERT: A Lite BERT for Self-supervised Learning of Language Representations》,第一作者 Zhenzhong Lan,首次公开于 2019 年 9 月 26 日;摘要里说的正是「两种参数削减技术」加上「一个聚焦句间连贯性的自监督损失」。来源:https://arxiv.org/abs/1909.11942(查阅于 2026-08-25)。

  28. 出处:「3.1 Encoder-only PLM」第 283 段(text/07-ch03-01-3-1-encoder-only-plm.txt:283,搜「30K」)。原文给的数字:词表 30K、隐藏层维度 1024 时查表层是 30M 参数;隐藏层维度加到 2048 时会膨胀到 61M。

  29. 出处:「3.1 Encoder-only PLM」第 288 段(text/07-ch03-01-3-1-encoder-only-plm.txt:288,搜「Word2Vec 仅使」)。

  30. 出处:「3.1 Encoder-only PLM」第 302 段(text/07-ch03-01-3-1-encoder-only-plm.txt:302,搜「24次计算」)。

  31. 出处:「3.1 Encoder-only PLM」第 306 段(text/07-ch03-01-3-1-encoder-only-plm.txt:306,搜「59M」)。

  32. 出处:「3.1 Encoder-only PLM」第 320 段(text/07-ch03-01-3-1-encoder-only-plm.txt:320,搜「顺序反过来」)与第 335 段(text/07-ch03-01-3-1-encoder-only-plm.txt:335,搜「SOP 预训练任务对模型效果」)。

  33. 出处:「3.1 Encoder-only PLM」第 309 段(text/07-ch03-01-3-1-encoder-only-plm.txt:309,搜「训练效率却只略微优于」)。原文明说这是「ALBERT 最终没能取代 BERT 的一个重要原因」。

  34. 出处:「3.2 Encoder-Decoder PLM」第 21 段(text/08-ch03-02-3-2-encoder-decoder-plm.txt:21,搜「Text-To-Text Transfer」)。补充(不在书里):T5 的原始出处是《Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer》,第一作者 Colin Raffel,首次公开于 2019 年 10 月 23 日;摘要里的核心表述是「把所有基于文本的语言问题都转成文本到文本的格式」,并介绍了它创建的 C4 语料。来源:https://arxiv.org/abs/1910.10683(查阅于 2026-08-25)。

  35. 出处:「3.2 Encoder-Decoder PLM」第 49 段(text/08-ch03-02-3-2-encoder-decoder-plm.txt:49,搜「Encoder-Decoder Attention」)。

  36. 出处:「3.2 Encoder-Decoder PLM」第 60 段(text/08-ch03-02-3-2-encoder-decoder-plm.txt:60,搜「RMSNorm」)。补充(不在书里):RMSNorm 的原始出处是《Root Mean Square Layer Normalization》,作者 Biao Zhang 与 Rico Sennrich,首次公开于 2019 年 10 月 16 日;摘要提出的假设是「层归一化里的重新居中不变性是可有可无的」,去掉之后在不同模型上省下 7% 到 64% 的运行时间。来源:https://arxiv.org/abs/1910.07467(查阅于 2026-08-25)。第 06 章会详细讲它。

  37. 出处:「3.2 Encoder-Decoder PLM」第 85 段(text/08-ch03-02-3-2-encoder-decoder-plm.txt:85,搜「BERT-style」)与第 89 段(text/08-ch03-02-3-2-encoder-decoder-plm.txt:89,搜「⽂本到⽂本」)。 2

  38. 出处:「3.2 Encoder-Decoder PLM」第 80 段(text/08-ch03-02-3-2-encoder-decoder-plm.txt:80,搜「750GB」)与第 92 段(text/08-ch03-02-3-2-encoder-decoder-plm.txt:92,搜「Colossal Clean Crawled Corpu」)。

  39. 出处:「3.2 Encoder-Decoder PLM」第 107 段(text/08-ch03-02-3-2-encoder-decoder-plm.txt:107,搜「⼤⼀统思想」)。

  40. 出处:「3.2 Encoder-Decoder PLM」第 113 段(text/08-ch03-02-3-2-encoder-decoder-plm.txt:113,搜「classify:」)与第 115 段(text/08-ch03-02-3-2-encoder-decoder-plm.txt:115,搜「translate English to French」);任务前缀的说明见「3.3 Decoder-Only PLM」第 3 段(text/09-ch03-03-3-3-decoder-only-plm.txt:3,搜「任务描述前缀」)。

  41. 出处:「3.3 Decoder-Only PLM」第 26 段(text/09-ch03-03-3-3-decoder-only-plm.txt:26,搜「⾸先明确提出预训练-微调思想」)与第 28 段(text/09-ch03-03-3-3-decoder-only-plm.txt:28,搜「性能略输于」)。补充(不在书里):GPT-1 的原始出处是《Improving Language Understanding by Generative Pre-Training》,作者 Alec Radford 与 Karthik Narasimhan 等,2018 年由 OpenAI 发布;书里在参考文献第 321 段(text/09-ch03-03-3-3-decoder-only-plm.txt:321,搜「Generative Pre-Training」)列出了它,但没有给出正式的期刊或会议出处——这篇论文确实没有在会议或期刊上发表过。 2

  42. 出处:「3.3 Decoder-Only PLM」第 50 段(text/09-ch03-03-3-3-decoder-only-plm.txt:50,搜「更像 Encoder 层」)与第 55 段(text/09-ch03-03-3-3-decoder-only-plm.txt:55,搜「掩码注意⼒也是⾃注意⼒计算」)。

  43. 出处:「3.3 Decoder-Only PLM」第 45 段(text/09-ch03-03-3-3-decoder-only-plm.txt:45,搜「Sinusoidal 位置编码」)、第 49 段(text/09-ch03-03-3-3-decoder-only-plm.txt:49,搜「12层解码器层」)、第 60 段(text/09-ch03-03-3-3-decoder-only-plm.txt:60,搜「⼀维卷积核」)。

  44. 出处:「3.3 Decoder-Only PLM」第 67 段(text/09-ch03-03-3-3-decoder-only-plm.txt:67,搜「Casual Language Model」)与第 69 段(text/09-ch03-03-3-3-decoder-only-plm.txt:69,搜「N-gram 语⾔模型是基于前 N」)。注意书里把 Causal 拼成了 Casual,这是这个词在中文材料里非常常见的一处笔误。

  45. 出处:「3.3 Decoder-Only PLM」第 85 段(text/09-ch03-03-3-3-decoder-only-plm.txt:85,搜「更加直接,可以在任何」)。原文:因果语言模型「天生和人类书写自然语言文本的习惯相契合,也和下游任务直接匹配,相对于 MLM 任务更加直接,可以在任何自然语言文本上直接应用」。 2 3

  46. 出处:「3.3 Decoder-Only PLM」第 99 段(text/09-ch03-03-3-3-decoder-only-plm.txt:99,搜「0.12B」)、第 101 段(text/09-ch03-03-3-3-decoder-only-plm.txt:101,搜「40GB」)、第 103 段(text/09-ch03-03-3-3-decoder-only-plm.txt:103,搜「570GB」)。补充(不在书里):GPT-3 的原始出处是《Language Models are Few-Shot Learners》,第一作者 Tom B. Brown,首次公开于 2020 年 5 月 28 日;摘要里的自我定位是「1750 亿参数的自回归语言模型,是此前任何非稀疏语言模型的 10 倍」。来源:https://arxiv.org/abs/2005.14165(查阅于 2026-08-25)。

  47. 出处:「3.3 Decoder-Only PLM」第 107 段(text/09-ch03-03-3-3-decoder-only-plm.txt:107,搜「BooksCorpus 数据集上预训练」)。

  48. 出处:「3.3 Decoder-Only PLM」第 111 段(text/09-ch03-03-3-3-decoder-only-plm.txt:111,搜「Pre-Norm(也就是先进」)。补充(不在书里,来自通用知识):梯度是训练时决定每个参数往哪个方向调、调多少的量;梯度消失指它在反向传递中变得过小、导致模型学不动,梯度爆炸则相反。

  49. 出处:「3.3 Decoder-Only PLM」第 120 段(text/09-ch03-03-3-3-decoder-only-plm.txt:120,搜「zero-shot」)与第 124 段(text/09-ch03-03-3-3-decoder-only-plm.txt:124,搜「模型能⼒还不⾜够⽀撑」)。 2

  50. 出处:「3.3 Decoder-Only PLM」第 129 段(text/09-ch03-03-3-3-decoder-only-plm.txt:129,搜「稀疏注意⼒」)与第 131 段(text/09-ch03-03-3-3-decoder-only-plm.txt:131,搜「1024张 A100」)。书里没有解释稀疏注意力的具体做法,「只看一部分位置」这层解释是我们补的(补充,不在书里,来自通用知识)。 2

  51. 出处:「3.3 Decoder-Only PLM」第 133 段(text/09-ch03-03-3-3-decoder-only-plm.txt:133,搜「few-shot 的」)与第 141 段(text/09-ch03-03-3-3-decoder-only-plm.txt:141,搜「few-shot:请你判断」)。

  52. 出处:「3.3 Decoder-Only PLM」第 144 段(text/09-ch03-03-3-3-decoder-only-plm.txt:144,搜「Incontext」)与第 146 段(text/09-ch03-03-3-3-decoder-only-plm.txt:146,搜「进⼀步落地应⽤成为可能」)。注意书里因为排版把 In-context 断成了 Incontext。 2

  53. 出处:「3.3 Decoder-Only PLM」第 149 段(text/09-ch03-03-3-3-decoder-only-plm.txt:149,搜「指令微调-⼈类反馈强化学习」)。

  54. 出处:「3.3 Decoder-Only PLM」第 158 段(text/09-ch03-03-3-3-decoder-only-plm.txt:158,搜「LLaMA模型也是基于Decoder-Only」)。补充(不在书里):LLaMA 的原始出处是《LLaMA: Open and Efficient Foundation Language Models》,第一作者 Hugo Touvron,首次公开于 2023 年 2 月 27 日;摘要里最有分量的一句是它「只用公开可得的数据集」就做到 13B 版本在多数基准上胜过 1750 亿参数的 GPT-3。来源:https://arxiv.org/abs/2302.13971(查阅于 2026-08-25)。LLaMA-2 的出处是《Llama 2: Open Foundation and Fine-Tuned Chat Models》,首次公开于 2023 年 7 月 18 日,来源:https://arxiv.org/abs/2307.09288(查阅于 2026-08-25)。

  55. 出处:「3.3 Decoder-Only PLM」第 193 段(text/09-ch03-03-3-3-decoder-only-plm.txt:193,搜「1T token」)、第 203 段(text/09-ch03-03-3-3-decoder-only-plm.txt:203,搜「4,096」)、第 205 段(text/09-ch03-03-3-3-decoder-only-plm.txt:205,搜「GQA」)、第 211 段(text/09-ch03-03-3-3-decoder-only-plm.txt:211,搜「128K」)、第 213 段(text/09-ch03-03-3-3-decoder-only-plm.txt:213,搜「15T token」)。

  56. 出处:「3.3 Decoder-Only PLM」第 226 段(text/09-ch03-03-3-3-decoder-only-plm.txt:226,搜「最早的开源中⽂ LLM」)。

  57. 出处:「3.3 Decoder-Only PLM」第 236 段(text/09-ch03-03-3-3-decoder-only-plm.txt:236,搜「Post Norm ⽽⾮ Pre Norm」)、第 244 段(text/09-ch03-03-3-3-decoder-only-plm.txt:244,搜「单个线性层实现最终 token」)、第 247 段(text/09-ch03-03-3-3-decoder-only-plm.txt:247,搜「GeLUs」)。

  58. 出处:「3.3 Decoder-Only PLM」第 258 段(text/09-ch03-03-3-3-decoder-only-plm.txt:258,搜「⾃回归空⽩填充」)与第 264 段(text/09-ch03-03-3-3-decoder-only-plm.txt:264,搜「are a wonderful person」)。补充(不在书里):GLM 的原始出处是《GLM: General Language Model Pretraining with Autoregressive Blank Infilling》,第一作者 Zhengxiao Du,首次公开于 2021 年 3 月 18 日;摘要里的两个技术点是「二维位置编码」和「允许以任意顺序预测被挖掉的片段」。来源:https://arxiv.org/abs/2103.10360(查阅于 2026-08-25)。

  59. 出处:「3.3 Decoder-Only PLM」第 275 段(text/09-ch03-03-3-3-decoder-only-plm.txt:275,搜「失败的尝试」)。原文完整的评价是:「虽然从 LLM 的整体发展路径来看,GLM 预训练任务似乎是一个失败的尝试,但通过精巧的设计将 CLM 与 MLM 融合,并第一时间产出了中文开源的原生 LLM,其思路仍然存在较大的借鉴意义」。 2

  60. 出处:「3.3 Decoder-Only PLM」第 272 段(text/09-ch03-03-3-3-decoder-only-plm.txt:272,搜「CLM 展现出远超 MLM 的优势」)与第 285 段(text/09-ch03-03-3-3-decoder-only-plm.txt:285,搜「回归了 LLaMA 架构」)。

  61. 出处:「3.3 Decoder-Only PLM」第 281 段(text/09-ch03-03-3-3-decoder-only-plm.txt:281,搜「23年 3⽉」)、第 284 段(text/09-ch03-03-3-3-decoder-only-plm.txt:284,搜「ChatGLM2」)、第 291 段(text/09-ch03-03-3-3-decoder-only-plm.txt:291,搜「实现 Agent 开发」)、第 293 段(text/09-ch03-03-3-3-decoder-only-plm.txt:293,搜「GLM-4」)。

  62. 出处:「3.3 Decoder-Only PLM」第 97 段(text/09-ch03-03-3-3-decoder-only-plm.txt:97,搜「Hidden_size」)——这是书里那张表的表头。同一节第 106 段(text/09-ch03-03-3-3-decoder-only-plm.txt:106,搜「768 的隐藏层维度」)的正文写的是 GPT-1「使用了 12 层 Decoder Block 和 768 的隐藏层维度」,和表头里 Hidden_size 那一列的 3072 直接冲突,可见标反的是表头而不是正文。顺带一提,「隐藏层维度」这个叫法本身就是书里的用词,我们全书统一用它。

  63. 出处:「3.2 Encoder-Decoder PLM」第 6 段(text/08-ch03-02-3-2-encoder-decoder-plm.txt:6,搜「DistilBERT」)。原文只列了名字就说「本文就不再一一赘述」。

  64. 出处:「3.3 Decoder-Only PLM」第 16 段(text/09-ch03-03-3-3-decoder-only-plm.txt:16,搜「Mamba」)。原文用括号提了一句「RWKV、Mamba 等非 Transformer 架构除外」,此后再没出现。

  65. 出处:「前言」第 22 段(text/04-fm.txt:22,搜「DeepSeek-R1」)。补充(不在书里):DeepSeek-R1 的论文《DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning》首次公开于 2025 年 1 月 22 日,后发表于《自然》杂志;它的主张是模型的推理能力可以通过强化学习被激励出来,而不必依赖人工标注的推理过程。来源:https://arxiv.org/abs/2501.12948(查阅于 2026-08-25)。