跳到主要内容

大纲 — Build a Large Language Model (From Scratch) 拆解

切分:10 章。对原书结构:01=ch1;02=ch2;03=ch3 上半;04=ch3 下半;05=ch4;06=ch5 上半;07=ch5 下半;08=ch6;09=ch7;10=附录 A+D+E。 按新词密度切:原书第 3 章(注意力)和第 5 章(预训练)各拆两章;三个技术附录并成一章。

每章七段骨架固定(讲什么/顶层全景/核心原理/作者判断与证据/边界与局限/可带走的/原文地图)。 下面每行是大章内「核心原理」层的节线:进来时以为… → 出去时知道…(两头的知识状态)。

01 这本书要造什么(原书 ch1)

  • §3.1 进来时以为「大模型是个黑箱」 → 出去时知道它就是一个「猜下一个词」的神经网络,以及「大」到底指什么(参数+数据)
  • §3.2 进来时以为「训练就是人工标数据」 → 出去时知道预训练不用标注(自监督),以及预训练/微调两段式各自干什么
  • §3.3 进来时以为 Transformer 和 LLM 是一回事 → 出去时知道 2017 年原始架构是编码器+解码器做翻译,GPT 只留了解码器,BERT 只留了编码器
  • §3.4 进来时以为 GPT-3 是凭空厉害 → 出去时知道它读了多少字、花了多少钱,以及「会翻译」这类涌现能力没人专门教过
  • §3.5 进来时不知道全书怎么走 → 出去时拿到三阶段施工图(造架构→预训练→微调),知道每一章站在哪
  • 主走查:GPT-3 数据表 + 成本数字;「下一个词」任务从一句话怎么长成训练样本

02 文字变成数字(原书 ch2)

  • §3.1 进来时以为文字可以直接喂给模型 → 出去时知道神经网络只认一串数,词要变成「嵌入」向量,而且让模型自己学这份对照表
  • §3.2 进来时以为切词就是按空格 → 出去时知道标点/大小写/空白的取舍,以及词表外词会让简单分词器直接报错
  • §3.3 进来时以为生词只能标成「未知」 → 出去时知道 BPE 把任何生词拆成子词,词表 50,257 是怎么来的
  • §3.4 进来时以为训练样本是一句话 → 出去时知道滑窗+右移一位怎么把一本书变成几十万对「上文→下一个词」
  • §3.5 进来时以为嵌入层在「计算」 → 出去时知道它其实是一张查表,以及为什么还要再加一份「位置」向量
  • 主走查:「The Verdict」20,479 字符 → 4,690 词 token → BPE 5,145 token → [290,4920,2241,287] → 6×3 嵌入矩阵查表 → +位置向量

03 注意力:让每个词去检索其他词(原书 ch3 §3.1–3.4)

  • §3.1 进来时以为老模型也能翻译长句 → 出去时知道 RNN 要把整句压进一个向量,这就是注意力要解决的瓶颈
  • §3.2 进来时以为注意力很神秘 → 出去时知道它就是「打分→归一→加权混合」三步,全程用真实数走一遍
  • §3.3 进来时以为点积只是数学 → 出去时知道点积在这里当「相似度」用,softmax 为什么比直接除好
  • §3.4 进来时以为打分用的就是词向量本身 → 出去时知道 Q/K/V 三个矩阵是学出来的投影,以及为什么要除以 √d
  • 主走查:「Your journey starts with one step」6 词 × 3 维,从点积分数 [0.9544…] 走到上下文向量 [0.4419, 0.6515, 0.5683],再到 Wq/Wk/Wv 版 [0.3061, 0.8210]

04 给生成用的注意力:掩码、dropout、多头(原书 ch3 §3.5–3.6)

  • §3.1 进来时以为训练时可以看到全句 → 出去时知道预测「下一个词」必须遮住未来,以及 -inf 掩码为什么不泄漏
  • §3.2 进来时以为丢弃神经元是损坏模型 → 出去时知道 dropout 是故意制造扰动防背题,而且只在训练时开
  • §3.3 进来时以为一份注意力就够 → 出去时知道多头是把一份拆成几份并行看,以及「拼起来」和「切开来」两种写法的效率差
  • 主走查:同一句 6 词,注意力矩阵上三角被 -inf 抹掉、逐行重新归一(真实数值),再叠 50% dropout,最后两头拼成 4 维

05 拼出整台 GPT(原书 ch4)

  • §3.1 进来时以为 GPT 很庞大复杂 → 出去时拿到 GPT_CONFIG_124M 七个数,知道整机骨架只有五段
  • §3.2 进来时以为层叠多了自然更聪明 → 出去时知道梯度会消失,LayerNorm(均值 0 方差 1)和残差连接各自管什么
  • §3.3 进来时以为 ReLU 够用了 → 出去时知道 GELU 平滑留缝为什么更好,前馈层为什么要先扩 4 倍再缩回来
  • §3.4 进来时不知道 124M 怎么数 → 出去时会数参数(163M vs 124M 的 weight tying 账),会算显存(621.83 MB)
  • §3.5 进来时以为模型直接吐文字 → 出去时知道输出是 50,257 维 logits,生成是「取最后一个→argmax→接回输入」的循环,以及未训练的模型为什么说胡话
  • 主走查:「Every effort moves you」→ token IDs → [2,4,50257] logits;五层网梯度实验 0.0002 vs 0.22

06 预训练:把「差多远」变成一个数(原书 ch5 §5.1–5.2)

  • §3.1 进来时以为「好不好」只能凭感觉 → 出去时知道交叉熵是把目标词概率取对数、平均、取负,困惑度是它的指数
  • §3.2 进来时以为数据直接全用 → 出去时知道训练/验证切分是干什么的,损失曲线分叉就是过拟合
  • §3.3 进来时以为训练很神秘 → 出去时知道八步循环每一步做什么,AdamW 比 Adam 多了什么
  • §3.4 进来时以为损失降就是好 → 出去时看到真实记录:训练 0.39 / 验证 6.45,模型把小说背下来了
  • 主走查:两条三词输入的真实损失 10.7940 六步算一遍;10 轮训练日志逐步读

07 从模型到文本:解码与权重(原书 ch5 §5.3–5.5)

  • §3.1 进来时以为模型总挑最大概率 → 出去时知道那是贪心解码,按概率抽样(multinomial)才有变化
  • §3.2 进来时听过「温度」 → 出去时知道温度就是 logits 除以一个数,top-k 是把长尾填 -inf
  • §3.3 进来时以为训练完就完了 → 出去时知道权重存成 state_dict,以及 OpenAI 的 GPT-2 权重怎么搬进来(qkv_bias、weight tying)
  • 主走查:9 词小词表,1,000 次抽样分布(582/343/73/2),T=0.1/1/5 的分布变化,k=3 的掩码

08 分类微调:垃圾短信分类器(原书 ch6)

  • §3.1 进来时以为微调只有一种 → 出去时知道指令微调与分类微调的分工和成本差
  • §3.2 进来时以为数据越多越好 → 出去时知道类别不平衡要处理,下采样到 747/747 的取舍
  • §3.3 进来时以为模型要重造 → 出去时知道只换输出头(50,257→2)、冻结主干、只看最后一个 token(因果掩码的副产品)
  • §3.4 进来时以为微调很难 → 出去时看到 46%→97% 的完整记录与「验证集略高于测试集」的门道
  • 主走查:一条短信从下载到判定:padding 到 120、最后 token 的 2 维 logits、argmax;5 轮准确率日志

09 指令微调:教模型听人话(原书 ch7)

  • §3.1 进来时以为预训练模型能听指令 → 出去时看到它只会复读,知道 1,100 条指令-回答对长什么样、Alpaca 模板是什么
  • §3.2 进来时以为批处理就是补齐 → 出去时知道自配 collate 的五步,特别是 -100 这个「不计入损失」的暗号,以及留一个 50256 的用意
  • §3.3 进来时以为越大越慢越不值 → 出去时知道为什么这章换 355M(124M 容量不够),2 轮就够
  • §3.4 进来时以为评估跟分类一样数对错 → 出去时知道指令模型没有标准答案,要用 LLM 评 LLM,以及 50.32 vs 58.51/82.6 这三个数的含义
  • 主走查:「Ocassion」条目 → Alpaca 模板 → token IDs → 批内补齐 → 右移 → -100;评估三条真实打分(85/40/95)

10 地基与加料:PyTorch、训练三件套、LoRA(附录 A+D+E)

  • §3.1 进来时以为 PyTorch 是个黑箱 → 出去时知道它就三样:张量库、自动微分、网络积木;反向传播=链式法则在计算图上跑一遍
  • §3.2 进来时以为训练循环很复杂 → 出去时知道六步固定动作,zero_grad 忘了会怎样,DDP 怎么把数据切到多卡
  • §3.3 进来时以为学习率一成不变 → 出去时知道预热+余弦衰减+梯度裁剪三件套各自防什么
  • §3.4 进来时以为微调必须动全部参数 → 出去时知道 LoRA 用两个小矩阵冒充 ΔW,2.7M 参数达到 124M 全量微调的水平
  • 主走查:logistic 回归一行行算梯度(-0.0898);LoRA 冻结前后参数计数(124,441,346 → 0 → 2,666,528)

自查(任意两行「出去时知道」同义→合并)

  • 01§3.4 vs 06§3.1:前者讲「规模与涌现」的事实,后者讲「怎么度量好坏」——不同。
  • 03 与 04 都是注意力,但 03 停在「一份可训注意力怎么算」,04 解决「生成时不许看未来/并行多份」——机制不同,不并。
  • 06§3.3 训练循环 vs 10§3.2 训练循环:06 讲 LLM 语境下的循环与 AdamW;10 讲 PyTorch 通用六步+分布式。有重叠风险 → 10§3.2 只讲「附录 A 独有的」:autograd/计算图、zero_grad 的理由、DDP;通用六步在 06 讲透,10 一笔带过并指回 06。
  • 07§3.3 权重加载 vs 08§3.3 改输出头:前者是「搬权重进架构」,后者是「改架构做分类」——不同。
  • 02§3.5 位置向量 vs 05§3.2 残差:都是「加法进网络」但一个是输入侧补顺序,一个是层间保梯度——不同。

结论:10 章成立,无合并项。