跳到主要内容

总装 — TransformerBlock 与完整模型

这一章讲三件事: 两块拼一层、N 层拼一台; 训练成果怎么存、怎么原样加载(checkpoint); 以及把全书欠的代价清单一次结清——算力、钱、数据量。读完这本拆解的「造」的部分就齐了: 剩下三章是喂它(第 10 章)、让它开口(第 11 章)、把它教成人用的助手(第 12 章)。

1. 先看现象:拼装的代码短得可疑

原书这章的开场用了「拼图」的比喻:前几章散落一地的零件,本章对上1。 真正的拼装代码短到不像话:

class TransformerBlock:
forward(x) = mlp( attn(x) ) ← 就这两行

class Transformer:
forward(tokens):
x = embedding(tokens) ← 编号 → 向量
for block in layers: ← 一层层过
x = block(x)
x = final_norm(x) ← 最后再捋一次稳
return output_proj(x) ← 256 维 → 词表打分

短,是因为麻烦都被前面的章收走了:残差和归一化藏在每个零件块内部(第 07、08 章), 形状全程不变(出口=入口),所以「堆一层」真的只是「再调用一次」2。 原书特意点破:这个简化版容易让人以为块没有残差/归一化——它们只是被封装进零件里了3

2. 主走查:一个 token 的完整旅程

这是全书「造模型」部分的总走查。设定(配置取自第 04 章;中间数字为演示编造): 词表 8,000,256 维,4 层。跟踪编号为 1523 的那个 token:

tokens [B, T]
│ ① 查表嵌入:embedding 是一张 8000×256 的大表,
│ 取第 1523 行 → 256 个数(纯查表,没有乘法,快)[^4]

x [B, T, 256]
│ ② 第 1 层:注意力块(读上下文)+ 前馈块(各自加工)
│ …… 第 2、3、4 层同样两步
│ 每层出口仍是 [B, T, 256],内容越来越「有语境」:
│ 浅层管句法搭配,深层管语义与远程关系[^5]

x [B, T, 256]
│ ③ 最终 RMSNorm:进输出层前最后捋稳一次

│ ④ output_proj:256 维 × [256×8000] 矩阵 → 8000 个打分(logits)[^6]

logits [B, T, 8000] ← 每个位置对每个可能的下一 token 各有一个分
│ (训练时接第 02 章的交叉熵;推理时取最后一个位置接第 11 章的采样)

「下一个 token」的完整可能性清单

图说:①②③④ 就是原书 Transformer.forward 的四行代码。
每吐一个 token,整台机器从头到尾跑一遍——这就是逐词生成慢的结构性原因。

3. 省一份嵌入表:权重绑定

第 ① 步的嵌入表(8000×256)和第 ④ 步的输出矩阵(256×8000)形状互为转置。 权重绑定(weight tying)就是让两者共用同一份参数:输入时当查表用,输出时当打分用4。 原书代码里就是一行:model.output_proj.weight = model.embedding.weight5

省参数是明面上的收益;隐性的收益是对称性:原书引用的解释是—— embedding 相似的词,产出相似(被预测时也更像被选中)6

4. 存与取:checkpoint 的两份文件

训练成果要能存下来、在任何机器上原样复活。原书的 save_checkpoint 存两份7:

文件内容为什么分开
model.pt全部参数值(权重与偏置)二进制、体积大;这才是「训了几个小时的东西」
config.json第 04 章那串配置人类可读;加载前必须先照它把模型造出来,权重才有地方放

加载(from_checkpoint)的顺序也是这个逻辑:读 config → 按它构造一台空模型 → 把权重灌进去 → 切到推理模式(eval(),关掉 dropout 等训练专用行为)8。 原书还给了一个工程细节:load_state_dict(strict=False) 允许「模型结构与权重文件对不上」的部分加载, 缺的参数保持随机初始化、多的被忽略——拿别处训好的模型接着用的场景(行话叫迁移学习)有用,但默认要开严格模式,免得以为自己加载了其实是空壳9

5. 结账:这台机器的三笔代价

前面每章都欠着「代价」的账,原书在这一章统一清点10:

对照物
计算复杂度注意力 O(n²)序列翻倍,计算翻四倍;消费级 24GB 显卡在几万 token 就撞墙11
钱与碳GPT-3 一轮训练约 3.14×10²³ 次浮点运算,时价约 460 万美元;碳排放约合 123 辆汽油车开一年一辆家用车一年约烧 2 吨汽油——大模型的一次训练是千吨级12
数据量GPT-3 吃 3000 亿 token、Chinchilla 1.4 万亿、Llama-2 2 万亿人类儿童到 10 岁听到的词约 1 亿——差四个数量级13

第三行值得停一下:同样的语言能力,儿童用一亿词、模型用两万亿词—— 数据效率差一万倍以上。这是「它抓统计规律、不做理解」(第 01 章)最硬的佐证: 统计规律要海量样本才稳,理解不用。

这台机器换来的

代价清单对面是收益,原书同样给了硬数14:对 RNN 的并行提速 50-100 倍; 预训练出的表示可以挪用(把 BERT 的参数冻结——不参与训练、直接拿来用——也能达到全量微调 85-90% 的效果)。

LoRA(给模型加一小块可训练的「补丁」、只训补丁的省法)这类参数高效微调,用小代价逼近全量微调。

顺手收下:可解释性的好消息与坏消息

原书用一节讲「注意力权重能不能当解释」:好消息是能看见分工——有头盯位置、有头盯句法、有头盯指代; 坏消息是注意力高不等于因果,后面的前馈层同样在改写结论,单看注意力矩阵会得出过分自信的解释15

6. 作者的判断与证据

说法书里的证据我们的标注
块的拼装=两行代码代码本体 + 「封装进零件」的说明3代码可复核
权重绑定省一半嵌入参数代码 + 对称性解释4领域通行做法(GPT-2 起常见)
训练成本与数据饥渴引 3.14×10²³ FLOPs、460 万美元、2 万亿 token 等口径10属二手转述的公开估计,原书未给一手来源
数据效率差四个数量级儿童 1 亿词 vs Llama-2 2 万亿 token 的对照13书里的类比口径,数量级可靠、精确倍数依赖语料统计

判断(我们的,不是书里的): 原书把「基本挑战」一节写得很全(复杂度、成本、数据、社会影响), 但真正的结构性瓶颈只有一个——O(n²)。钱和数据都是它的下游:注意力贵所以要用几千张卡分摊, 分摊后模型大了所以要更多数据喂饱。抓住这一条,这一章的清单就能记住。 如果错,会错在: 如果下一代架构(比如状态空间(state space)模型——顺着读、随身带笔记本,这另一种思路造的模型)把序列成本降到线性且质量不降, 钱与数据的账都要重算——原书 66 章自己也把这类「后 transformer 架构」列为未来方向16

7. 边界与局限

  • 本书模型是 4 层/256 维的教学尺寸;原书 62 节列的「现代实践」(RMSNorm、无偏置输出、RoPE、配置驱动)在它身上全部成立, 但规模相关的现象(涌现、上下文学习)它一个都演示不了——原书在第 10 章的翻车演示里承认了这一点17;
  • 「数百层」的说法在原书内部口径不一(第 07 章已注),本章取 12-100+ 的保守区间18;
  • 可解释性一节的方法(看注意力头)在带 GQA/滑窗的现代模型里已不完整:共享键值与窗口掩码都会改变头分工的形态,原书未展开。

8. 可带走的

  1. 一层 = 注意力块 + 前馈块,两行代码;深度只是一个「调几次」的配置数字;
  2. 完整前向四步:查表嵌入 → N 层 → 最终归一化 → 投影到词表打分;
  3. 每个 token 都让整台机器跑一遍——逐词生成慢,是结构使然,不是实现偷懒;
  4. 权重绑定:嵌入表和输出矩阵共用一份参数,省一半嵌入开销;
  5. checkpoint 两份文件:config 造模型、权重灌进去;加载后必须切推理模式;
  6. 严格加载是默认:静默的「缺参数」意味着你测的是一台半随机模型;
  7. 三笔代价:O(n²) 是根,百万美元账单与万亿 token 数据都是它的下游;
  8. 数据效率与人类差四个数量级——「抓统计规律」这条定性,数量级就是它的证据。

9. 原文地图

主题原书章原文位置
拼图开场与块的骨架9. Transformer Block and Full Transformer Model—It’s Time to Put the Puzzle Togethertext/50-ch09-9-transformer-block-and-full-transformer-model-i.txt:15(搜「puzzle」) · text/50-ch09-9-transformer-block-and-full-transformer-model-i.txt:39(搜「skeleton」)
逐层精炼的例子9. Transformer Block and Full Transformer Model—It’s Time to Put the Puzzle Togethertext/50-ch09-9-transformer-block-and-full-transformer-model-i.txt:29(搜「The cat sat on the mat」)
TransformerBlock 两行代码Building the Transformers Block for Our LLM from Scratchtext/58-fm-building-the-transformers-block-for-our-llm-from.txt:15(搜「self.attn(x)」)
封装说明(残差/归一化在块内)The TransformerBlock Classtext/59-fm-the-transformerblock-class.txt:55(搜「simplified version」) · text/59-fm-the-transformerblock-class.txt:63(搜「encapsulate the full sub-layer logic」)
B/T/H 三维含义The TransformerBlock Classtext/59-fm-the-transformerblock-class.txt:41(搜「Batch Size」)
查表嵌入Transformer Class—The Complete Language Modeltext/60-fm-transformer-class-the-complete-language-model.txt:25(搜「lookup table」) · text/60-fm-transformer-class-the-complete-language-model.txt:27(搜「1523」)
ModuleList 与层分工Transformer Class—The Complete Language Modeltext/60-fm-transformer-class-the-complete-language-model.txt:15(搜「ModuleList」)
最终归一化与无偏置输出Transformer Class—The Complete Language Modeltext/60-fm-transformer-class-the-complete-language-model.txt:39(搜「output = input / RMS」) · text/60-fm-transformer-class-the-complete-language-model.txt:21(搜「bias=False」)
RoPE 在注意力内部Transformer Class—The Complete Language Modeltext/60-fm-transformer-class-the-complete-language-model.txt:99(搜「RoPE is applied within the attention」)
权重绑定Full Model Architecture and Training Dynamicstext/57-fm-full-model-architecture-and-training-dynamics.txt:7(搜「tied-embedding」)
checkpoint 两份文件from_checkpoint Class Method—Loading Pretrained Modelstext/61-fm-from-checkpoint-class-method-loading-pretrained-.txt:45(搜「Saving and loading configuration separately」) · text/73-fm-source-code-for-training-our-llm.txt:23(搜「save_checkpoint」)
strict 两档与 eval()from_checkpoint Class Method—Loading Pretrained Modelstext/61-fm-from-checkpoint-class-method-loading-pretrained-.txt:113(搜「two-tier validation」) · text/61-fm-from-checkpoint-class-method-loading-pretrained-.txt:131(搜「eval()」)
现代实践五条Architecture Design Choices and Modern Practicestext/62-fm-architecture-design-choices-and-modern-practices.txt:5(搜「RMSNorm Instead of LayerNorm」)
提速 50-100 倍Advantages, Challenges, and Broader Impacttext/63-fm-advantages-challenges-and-broader-impact.txt:9(搜「50-100」)
迁移与 LoRAAdvantages, Challenges, and Broader Impacttext/63-fm-advantages-challenges-and-broader-impact.txt:29(搜「85-90%」) · text/63-fm-advantages-challenges-and-broader-impact.txt:29(搜「LoRA」)
注意力头分工Interpretability and Mechanistic Understandingtext/64-fm-interpretability-and-mechanistic-understanding.txt:3(搜「Positional Heads」)
O(n²) 与显存墙Fundamental Challengestext/65-fm-fundamental-challenges.txt:5(搜「Achilles」) · text/65-fm-fundamental-challenges.txt:11(搜「24GB」)
GPT-3 成本与碳Fundamental Challengestext/65-fm-fundamental-challenges.txt:27(搜「3.14」) · text/65-fm-fundamental-challenges.txt:29(搜「123 gasoline cars」)
数据饥渴与儿童对照Fundamental Challengestext/65-fm-fundamental-challenges.txt:43(搜「300B tokens」) · text/65-fm-fundamental-challenges.txt:43(搜「four orders of magnitude」)
未来:后 transformer 架构Future Trajectoriestext/66-fm-future-trajectories.txt:27(搜「Liquid neural networks」)
教学模型演示不了的Why This Implementation Wasn’t Included in the Booktext/82-fm-why-this-implementation-wasn-t-included-in-the-b.txt:25(搜「100,000 times less」)

Footnotes

  1. 出处:「9. Transformer Block and Full Transformer Model—It's Time to Put the Puzzle Together」第 15 段(text/50-ch09-9-transformer-block-and-full-transformer-model-i.txt:15,搜「puzzle」)。原文:前几章散落的零件——注意力、前馈、残差、归一化——本章拼成整体。

  2. 出处:「Building the Transformers Block for Our LLM from Scratch」代码(text/58-fm-building-the-transformers-block-for-our-llm-from.txt:15,搜「self.attn(x)」)。原文:forward 就是 attn(x) 后接 mlp(x),注释标注形状 [B, T, H] 全程不变。

  3. 出处:「The TransformerBlock Class」(Important architectural note)(text/59-fm-the-transformerblock-class.txt:55,搜「simplified version」;:63,搜「encapsulate the full sub-layer logic」)。原文:多数真实实现里残差是 x = x + self.attn(x);本书把它们封装进了 AttentionBlock 与 MLPBlock 内部。 2

  4. 出处:「Full Model Architecture and Training Dynamics」(tied-embedding 段)(text/57-fm-full-model-architecture-and-training-dynamics.txt:7,搜「tied-embedding」)。原文:权重绑定的输出投影与嵌入共享权重,减少参数并带来对称性——嵌入相似的 token 产出相似的概率。 2

  5. 出处:「Source Code for Training Our LLM」(text/73-fm-source-code-for-training-our-llm.txt:209,搜「output_proj.weight」)。原文代码:model.output_proj.weight = model.embedding.weight。

  6. 出处:同 [^7] 所引段(text/57-fm-full-model-architecture-and-training-dynamics.txt:7,搜「symmetry」)。原文:权重绑定「enforcing a symmetry: tokens with similar embeddings produce similar output probabilities」。

  7. 出处:「Source Code for Training Our LLM」(Part 11)(text/73-fm-source-code-for-training-our-llm.txt:23,搜「save_checkpoint」)。原文:存 model.pt(state_dict)与 config.json(asdict(config));并解释两份分开是标准做法——config 人类可读,加载前必须按 config 重建结构(text/61-fm-from-checkpoint-class-method-loading-pretrained-.txt:45,搜「Saving and loading configuration separately」)。

  8. 出处:「from_checkpoint Class Method」(text/61-fm-from-checkpoint-class-method-loading-pretrained-.txt:61,搜「Initialize Model Architecture」;:131,搜「eval()」)。原文:先建模型再灌权重;eval() 关 dropout、让归一化层进入推理模式。

  9. 出处:text/61-fm-from-checkpoint-class-method-loading-pretrained-.txt:95(搜「strict=False」)与 :113(搜「two-tier validation」)。原文:strict=False 允许缺参数(保持随机初始化)、忽略多余参数并告警;strict=True 是安全默认——「你可能不想在以为加载了完整模型时,实际让一部分参数保持随机」。

  10. 出处:「Fundamental Challenges」(text/65-fm-fundamental-challenges.txt:27,搜「3.14」)。原文:GPT-3(1750 亿参数)训练约消耗 3.14×10²³ FLOPs、按 2020 年价约 460 万美元算力成本。 2

  11. 出处:text/65-fm-fundamental-challenges.txt:5(搜「Achilles」)与 :7(搜「24GB」)。原文:存注意力矩阵要二次方内存;24GB 消费级显存的墙大约在几万 token 处(原文给的定位是「memory wall is hit around」加显存与序列量的口径)。

  12. 出处:text/65-fm-fundamental-challenges.txt:29(搜「123 gasoline cars」)。原文:GPT-3 训练的碳排放估计相当于 123 辆汽油车开一年。

  13. 出处:「Data Efficiency and Sample Complexity」(text/65-fm-fundamental-challenges.txt:43,搜「300B tokens」;:33,搜「four orders of magnitude」)。原文:GPT-3 训练用 3000 亿 token、Chinchilla 1.4 万亿、Llama-2 2 万亿;人类儿童到 10 岁接触的词约 1 亿——差四个数量级。 2

  14. 出处:「Advantages, Challenges, and Broader Impact」(text/63-fm-advantages-challenges-and-broader-impact.txt:9,搜「50-100」;:19,搜「85-90%」)。原文:12 层 transformer 训练比同规模 LSTM 快 50-100 倍;冻结 BERT 嵌入达到全量微调 85-90% 的 GLUE 成绩;LoRA 只改低秩增量。

  15. 出处:「Interpretability and Mechanistic Understanding」(text/64-fm-interpretability-and-mechanistic-understanding.txt:3,搜「attention weights offer interpretable glimpses」;:11,搜「Positional Heads」)。原文:注意力权重给了解释的线索、有头分工;但注意力不等于完整决策解释。

  16. 出处:「Future Trajectories」(text/66-fm-future-trajectories.txt:27,搜「Liquid neural networks」)。原文:液态网络、KAN 等新范式挑战 transformer 的主导地位。

  17. 出处:「Understanding the Output—An Educational Demonstration」(text/77-fm-understanding-the-output-an-educational-demonstr.txt:25,搜「attractor」)。原文:小模型在分布外提示下会滑回训练分布的「吸引子」——规模带来的能力差异在第 10 章展开。

  18. 出处:「Summary」(text/67-fm-summary.txt:11,搜「12 to 100+ layers」)。原文:堆叠块数 12 到 100+ 层(原书口径)。