跳到主要内容

Build a Large Language Model (From Scratch) — 全书拆解

30 秒导读: 这是一本 370 页的动手教材(2024 年,Manning),回答一个问题: 一个大语言模型(LLM)——读过海量文字、学会了「猜下一个词」的机器——是怎么从零造出来的。 它不靠讲,靠写:每个零件都用 PyTorch 当场写出来跑给你看,每一步都印着真实的数字。 你从一堆随机数出发,到一台会说英语的机器收尾。

本组文档是我们重写的完整拆解,十章。读完不必看原书。

两个词先交代:这本书属于机器学习——让计算机从数据里学规律、而不是手写规则——这一行。

学出来的那个东西叫模型:一台从数据里学出来的计算装置,给它一段文字,它吐出下一个词。

这本书要造的那台机器有名字:GPT——OpenAI 那系列「会写文字的模型」;书里造的是它的第二代 GPT-2(2019 年)。

1. 先交代清楚:这是谁在什么时候写的

1.1 作者与出版

作者Sebastian Raschka——机器学习(让计算机从数据里学规律、而不是手写规则的学科)研究者,更是一个教育者:写过多本 Python 机器学习畅销书,曾是威斯康星大学麦迪逊分校统计系助理教授,写这本书时是 Lightning AI 的研究工程师,日常工作就是实现和训练(用数据把模型内部的数调对)LLM1
出版Manning,2024 年;代码全部开源(源代码公开、可自由取用)在 GitHub 的 rasbt/LLMs-from-scratch 仓库2
写作立场作者在前言里明说了教学法:「理解 LLM 最好的方式是亲手从零写一个」3

利益相关:基本干净。一处要留意——书末推荐微调(在训好的模型上再用小数据接着训)框架 Axolotl 和 LitGPT,而 LitGPT 是作者雇主 Lightning AI 的产品、作者本人参与开发4

1.2 它刻意停在 2019 年的配方

这本书造的是 GPT——OpenAI 那系列「会写文字的模型」——的第二代(GPT-2,2019 年)。

作者的理由:GPT-3 的架构与 GPT-2 相同、只是更大,而且 OpenAI 公开了 GPT-2 的权重—— 这台机器里训练好的全部数字,存成文件——可以搬进来直接用5

这里说的「模型」,就是一台从数据里学出来的计算装置;更大的模型要 GPU(显卡,擅长同时做大批数值计算)才玩得动。

而且不是一块——要一屋子 GPU 联起来一起算,这种一屋子叫集群

显卡、内存、机房、电——训练要花掉的这些家当,统称计算资源(能调动多少,决定了你训得起多大的模型)。

从 2026 年回看,这个选择反而成了优点:它教的是不过时的骨架与流程,零件换代的清单见第 4.2 节。

1.3 它是三本同族书里「最教材」的一本

我们书架上另有两本同题的书,已经拆过: 梁楠《从零构建大模型》(2025,中文)是广度优先的零件目录加工程实战; Grigorov《Building Large Language Models from Scratch》(2026)用 2025 年的新零件拼一台现代模型。

Raschka 这本的不可替代性在于:它是一台机器从零到听话的完整连续构建—— 每个环节(包括翻车)都印着真实的运行数字;教学坡道(先简化版、再加可学习的矩阵(排成矩形的一堆数,装的是学出来的旋钮)、再遮未来、再开多路) 是专门为「第一次读」的人设计的。

2. 全书一条主线(读完这一节,你就懂了这本书)

这本书不是知识点合集,是一台机器的施工记录:每一步都被上一步逼出来。 下面把整条链走一遍——只读这一节,你也能把这本书讲给别人听。

① 要造的东西:一台「猜下一个词」的机器

全部目标就这一个动作:读一段文字,给它认识的每个候选词打分,猜下一个该是什么。 那份「它认识的全部词」的名单叫词表

任务简单到令研究者惊讶——它居然能养出会翻译、会答题的模型。

「大」指两件事:读过的字有几千亿个;机器内部有几亿个可调的数。 这些数叫参数——训练时会微调的旋钮。这是第 01 章。

② 文字先进不去:先变成数

机器只认数。所以文字先切成小块:切出来的每块叫词元—— 可以是一个词、一个标点或一个词片段;英文里它叫 token(「词元」的英文名,同一个东西)。

然后查词表把词元换成编号,再查另一张对照表把编号换成一串数。 这张「词 → 一串数」的对照表叫嵌入(embedding);它也是参数,跟着模型一起学。

最后还要加一份位置向量(固定长度的一串数),否则机器分不清词序。

一篇 2 万字符的小说走完这四道工序,变成 5,145 个词元、每个词元 256 个数。这是第 02 章。

③ 机器的心脏:让每个词去给别的词打分

老一代模型(按顺序读字的循环神经网络——很多简单计算零件连成环、边读边更新内部状态的那种)要把整句话压进一个固定长度的便签,长句必丢信息。

药方的名字叫注意力:每个词去给所有词算一个「相关分」,再按分数把别的词的数掺进自己的数里。

打分用点积——两串数逐位相乘再求和,在这里当相似度用。

归一用 softmax(一种把一串分数压成「和为 1 的权重」的函数)。

学习靠三个矩阵(排成矩形的一堆数,这里装的是学出来的参数),分别管查询、键、值—— 「该看谁」是训出来的,不是人定的。这是第 03 章,全程用六个词的句子和真实数字走了一遍。

④ 拿去生成,要补三个改造

直接拿③去「猜下一个词」有三个漏洞:打分时看到了答案(未来);会把训练文本背下来; 一份注意力只看一个角度。

「背下来」这种毛病叫过拟合——在见过的题上满分,换个问法就露馅。

补丁一:把分数矩阵的上三角填成负无穷,未来就遮住了,一步且不漏。

补丁二:训练时随机清掉一部分权重——这个做法叫 dropout,专门防过拟合。

补丁三:把一份注意力拆成几份并行(同时各算各的)跑,这叫多头。这是第 04 章。

⑤ 总装:12 个相同的块,加两件保险

整台 GPT 只有五段:嵌入加位置 → dropout → 12 个相同的 transformer 块 → 最后一次归一 → 输出头。

层叠得深,训练信号会半路消失,所以每个块配两件保险。保险一先把每层的输出归一化—— 把一批数拉回到均值 0 上。

这个做法的全名叫层归一化:除了均值归 0,还要把散开的程度也归 1。

方差——这批数离均值的平均距离——归 1,就是不让它们散得太开、也不许挤成一团。

保险二给信号开一条短路:把层的输入直接加到输出上——这叫残差连接。

训练时用来给模型打分的那个数叫损失——答得离正确答案越远,损失越大;它怎么算,第 06 章讲。

数完参数还抓到一个口径差:号称 124M,全数是 163M,差的那张表被输出头和嵌入层共享了。 这是第 05 章——章末点火,机器开口说了句胡话,因为几亿个数还全是随机值。

⑥ 点火:把「差多远」变成一个数

训练的全部机制就一步:模型给「正确的下一个词」打了多高的分? 把那个分换成概率——0 到 1 之间、所有候选加起来等于 1 的数。

「正确的下一个词」从哪来?它就躺在原文里——这行管标准答案叫标注;这里不用人贴,是它便宜的原因。

再取对数(把小于 1 的概率变成好算的负数)、平均、取负,得到损失。

先交代一个字:——从物理借来的词,这里读作「不确定的程度」。

这个损失的名字叫交叉熵损失,越小越好;全书训练的靶子就是它。这是第 06 章上半。

⑦ 训练:1.24 亿个旋钮一起调

有了损失,用链式法则(复合函数求导:外壳的导数乘内核的导数)从损失倒推出每个参数该往哪挪。

这个倒推的过程叫反向传播——信号从损失那一头倒着传回每个参数;然后一万次一万次地挪。

「往哪挪、挪多少」这件事有个名字:优化——拿损失当靶子,一遍遍把参数往损失更小的方向调。

书里真点了一次火:训练集被完整过了 10 遍,每一遍叫作(英文 epoch:训练集被完整过一遍,就算一轮)。

10 轮下来训练损失 9.78 降到 0.39,验证损失却停在 6.45——它把训练用的小说背下来了。 学会与背题同时发生,这是全书最值钱的一段录像。这是第 06 章下半。

⑧ 挑词与搬权重:生成的最后一公里,与「别自己烧钱」

模型给的打分清单不变,「怎么挑」是独立的一层:总挑最高分(贪心)会复读,按概率抽签才有变化。

拿训好的模型干活、生成文字,这个阶段叫推理(inference,与「训练」相对:训练是调旋钮,推理是用旋钮);这一节管的就是推理时怎么挑词。

还有一个旋钮叫温度——一个除数,管差距的锐度:大于 1 更敢挑冷门,小于 1 更保守; top-k 则把长尾直接砍掉。

然后是最实战的一步:预训练(第一段训练:在海量无标注文字上学语言)动辄几十万美元, 所以把 OpenAI 公开的 GPT-2 权重逐层搬进自己写的模型——搬对了没有别的检验, 就看它开口说不说人话。这是第 07 章。

⑨ 微调一:换个小出口,变成分类器

把输出头从「768 维→5 万词表」换成「768 维→2 个类」,模型就变成一台分类器—— 只回答「是哪一类」的机器。

其余 99% 的参数冻结(设成不再更新),只用垃圾短信数据训 5 轮: 准确率从接近瞎猜的 46% 跳到测试集 95.67%。

只看最后一个词元的输出——遮未来的那个规矩顺手送了份礼:只有它看全了整条短信。 这是第 08 章。

⑩ 微调二:教它听人话,再请另一个模型当裁判

这一步的正式名字叫指令微调——用「指令+标准回答」对接着训。 数据 1,100 条,套固定模板;目标里的补位词元用 -100 从损失里摘出去,留一个结束符教模型收工。

124M 容量不够,换 355M;训 2 轮,模型学会了「主动句改被动句」。

没法用准确率评估开放回答,就让本地一个 8B 的 Llama 3 当裁判打分:平均 50.32 分—— 输给 8B 基座的 58.51,这是小模型明码标价的天花板。这是第 09 章。

⑪ 地基与加料

三个附录各补一块。第一块:PyTorch 替你算了全部微积分(附录 A)。

第二块:真实训练比教学版多三件稳定器——学习率(每步挪多大的步长)先爬坡。

爬到峰值后沿余弦(一条先缓后急再缓的弯曲轨道)降下来。

第三件:梯度(每个参数「该往哪挪多少」的信号)太长就按比例截短(附录 D)。

第三块:微调还能更省——LoRA——一种只学两个小矩阵来冒充整张权重更新的微调法, 只动 2% 的参数就追平全量微调(附录 E)。合在第 10 章。

一句话收尾

这本书证明一件事:一台会听人话的语言模型,分解开来每一步都朴素—— 查表、点积、归一、加权混合、取对数、挪旋钮;「智能」是这些朴素步骤在海量数据上重复几万亿次之后的产物。

3. 十章地图

这张表不用记任何术语——每章名字后面写的是「读完你能回答什么问题」。

读完你就能回答
01 这本书要造什么大语言模型到底是什么?「预训练+微调」两段各干什么?全书分几步走?
02 文字变成数字一段文字怎么变成模型能吃的数?为什么没有「不认识的词」?训练样本长什么样?
03 注意力的核心注意力三步到底在算什么?Q/K/V 三个矩阵是干什么的?为什么要除以根号 d?全书的心脏,别跳
04 给生成用的注意力训练时怎么防止它偷看答案?dropout 为什么能防背题?多头省在哪?
05 拼出整台 GPT一台 GPT 有哪五段?深网络为什么需要两件保险?「124M」这个数字怎么数?
06 预训练「写得好不好」怎么变成一个数?1.24 亿个旋钮怎么一次算清该往哪挪?过拟合长什么样?
07 从模型到文本同一句话问两遍为什么答案不同?别人的权重怎么搬进自己的代码?
08 分类微调只会续写的机器怎么变成只会判断的机器?为什么只动 1% 的参数就够?
09 指令微调「听指令」是怎么教出来的?-100 是什么暗号?没有标准答案怎么打分?
10 地基与加料PyTorch 替你做了什么?真实训练比教学版多哪三样?LoRA 凭什么只动 2%?

推荐顺序: 01 → 02 → … → 10,这也是原书的施工顺序。 只想拿结论:读本页第 2 节;只想理解注意力:02 → 03 → 04;只想学微调:07 → 08 → 09。

4. 这本书覆盖什么、不覆盖什么

4.1 覆盖(而且每一步都带真实数字)

  • 从一段文字到一台会说话的小 GPT 的全部环节:分词(把文字切成词元的那道工序)、嵌入、注意力、整机、训练、解码、微调;
  • 每个零件「解决什么问题→怎么做→为什么有效→边界在哪」,全部可在一台笔记本上复现;
  • 训练与评估的完整实录:损失曲线、过拟合现场、准确率、LLM 当裁判的打分;
  • 权重的工程面:存取、继续训练、把 OpenAI 的 GPT-2 逐层搬进自己的实现;
  • 附录三件套:PyTorch 底座、训练稳定器、LoRA。

4.2 不覆盖·2024 年后的新零件

这本书教的是 2019 年 GPT-2 的配方;主流模型后来换了几样零件,书里都没有。

第一样是 RoPE(旋转位置编码:把词序信息编进打分的一种现代做法,替掉本书的位置表)。

第二样是 GQA(分组查询:让几个注意力头共享一份键值的省法)。

第三样是 MoE(专家混合:一个模型里养多个「专家」网络、每次只叫醒几个);另有 RMSNorm、SwiGLU 两处的换代。

要这些新零件,读同族的 Grigorov 那本(我们拆过)。

4.3 不覆盖·偏好微调与对齐

RLHF(用人的偏好当奖励来继续训练)这一族,书里只在结尾一段指向了补充仓库。

DPO(同一目的、但免去了单独训练一个打分模型的做法)同样在书外。

今天助手的「听话感」很大程度来自这道没讲的工序;它的总目标——对齐,即让模型的回答符合人的意图——本书只走到指令微调。

4.4 不覆盖·推理与部署工程

推理的工程优化(让生成更快、更省内存的那类改造),书里一个字没讲。

比如缓存——把算过的中间结果存起来、下次直接复用,让生成变快。

注意力里用它,就叫键值缓存(存的是每个词元算好的键与值)。

比如量化(把参数从 32 位浮点压成更小的数位,省内存)。

大规模训练侧也只讲了一种多卡做法;精度(每个数用多少位来存)的讲究没有展开。

混合精度(训练时混用 16 位与 32 位浮点,省一半内存)这类手段也不在。

4.5 不覆盖·「读」那一半

BERT——取了「读」那一半的模型家族——只在第 1 章对照出现。

它出自 Transformer——2017 年那篇论文定下的架构,本书的整机就是其中「写」的那一半。

Transformer 里负责「读」的那一半叫编码器;它这一侧的模型怎么造,不在本书。

5. 今天读,要修正的两处

这本书 2024 年出版,配方刻意停在 2019 年。 两处不是写错,是时代差(名词见 4.2、4.3):

  • 书里的做法:绝对位置嵌入(给每个位置加一份学出来的向量)、LayerNorm、GELU、完整多头。

  • QKV 还带偏置——每层输出前额外加的那个常数项。

  • 偏置长在线性(只做「输入乘矩阵、再加一个常数」两步的)层里:本书的注意力投影与输出头都是它。

  • 今天的现实:主流模型换成 RoPE、RMSNorm、SwiGLU、GQA,偏置多数取消(书里自己也点了偏置这条6)。

  • 书里以指令微调收尾;今天的助手还要过偏好微调(DPO 等)与红队评估——书末指出了 DPO 补充材料的方向,但没写进正文。

骨架与训练流程不变;零件对照表在 Grigorov 那本的拆解里。

6. 我们的判断

判断(我们的,不是书里的): 这本书今天的正确读法是「骨架教材 + 数字实证」: 架构会换代,但「损失怎么算、过拟合长什么样、权重怎么搬、-100 是什么」这些环节五年没变。 引用它时引机制与实录,别把 GPT-2 的具体超参(12 头、768 维、1024 词元的窗口)当现代默认值。 如果错,会错在: 如果未来架构换代到连「transformer 块堆叠 + 下一词预测」都不再成立 (比如状态空间(state space,让信息沿一条状态逐步递推)那一派全面取代),这本书就只剩历史价值——但 2026 年的今天,主流模型仍是这套骨架。

判断(我们的,不是书里的): 三族书怎么选——想「第一次从头走一遍、每步都看得懂」,读这本; 想「2025 年的零件长什么样」,读 Grigorov 那本;想「中文、广度、工程面(算力——能调动多少计算资源——、压缩、实战)」, 读梁楠那本。三本不互相替代。

如果错,会错在: 如果读者已有深度学习(用很多层简单计算单元——一个数进、一个数出的最小计算零件——叠起来、从数据里学的那一派方法)经验, 这本书的教学坡道会显得慢——这类读者可以直接读 03、04、06、09 四章。

判断(我们的,不是书里的): 全书最有价值的单页不是任何一张架构图, 而是第 06 章那段训练日志:训练损失 0.39、验证损失 6.45、生成文本在原文里逐字搜得到。 「过拟合」三个字,这本书是拿一段录像教的,不是拿定义教的。 如果错,会错在: 如果读者把这段教学演示当成「LLM 训练都会过拟合」的证据——不对, 书里明说真实预训练是海量数据只过一轮,背题是这个小实验的刻意安排。

7. 许诺兑现表

这份拆解里每一处「第 N 章讲」,都在这里记一行、逐行核过。

许诺在哪许诺了什么应兑现在哪核过了吗
本页 §2 ②一篇小说怎么变成 5,145 个词元、每个 256 个数02 §3.4、§3.5 的主走查
本页 §2 ③注意力三步与三个矩阵,用真实数字走一遍03 §3.2、§3.4
本页 §2 ④遮未来为什么不漏、dropout 补偿、多头两种写法04 §3.1、§3.2、§3.3
本页 §2 ⑤124M 与 163M 的口径差;两件保险各自管什么05 §3.5 第一笔账、§3.2、§3.3
本页 §2 ⑤损失怎么算(「第 06 章讲」)06 §3.1 六步走查
本页 §2 ⑥概率、对数、交叉熵的完整六步06 §3.1
本页 §2 ⑦反向传播凭什么一次算清全部参数06 §3.3
本页 §2 ⑦10 轮实录:学会与背题同时发生06 §3.4
本页 §2 ⑧温度/top-k 的机制;搬权重的三个障碍与冒烟测试07 §3.2、§3.3、§3.5
本页 §2 ⑨「只看最后一个词元」的理由;46%→97%08 §3.3、§3.4
本页 §2 ⑩-100 掩码机关;50.32/58.51/82.6 三个数09 §3.1、§3.4
本页 §2 ⑪LoRA 凭什么 2% 追平10 §3.4
本页 §4.2新零件清单在哪读05 §5 与 04 §5 的指向(Grigorov 那本)
01 §3.5九道工序分别落在哪章全篇(02~09 章标题与之一一对应)
02 §3.3BPE 完整实现去哪读(minbpe 书架锚)同节补充块✓(就在许诺当场)
03 §5注意力效率(FlashAttention)03 §5 补充块当场给出书架锚✓(同上)
05 §3.6nanoGPT 对照读物05 §3.6 末补充块✓(同上)
06 §5训练三件套与 autograd 细节「第 10 章讲」10 §3.1–3.3
08 §4「容量不够要换更大」的预演09 §3.3(124M→355M)
10 §3.4LoRA 的工业界标准实现10 §3.4 末补充块(PEFT 书架锚)✓(同上)

拆解写于 2026-08-29,依据 2024 年 Manning 英文版。原始书籍文件不入库, 本组文档是我们自己的重写;每条引用都可用 node scripts/book-verify.mjs build-large-language-model 回核。

Footnotes

  1. 出处:「about the author」第 7 段(text/07-fm-about-the-author.txt:7,搜「staff research engineer」)。 原文:Raschka 是 Lightning AI 的 staff research engineer,专注实现与训练 LLM;此前是威斯康星大学麦迪逊分校统计系助理教授。

  2. 出处:「about this book」第 82 段(text/06-fm-about-this-book.txt:82,搜「rasbt/LLMs-from-scratch」)。

  3. 出处:「preface」第 28 段(text/04-fm-preface.txt:28,搜「the best way to understand LLMs」)。 原文:「I strongly believe that the best way to understand LLMs is to code one from scratch—and you'll see that this can be fun too!」

  4. 出处:「7 Fine-tuning to follow instructions」第 2074 段(text/15-ch07-7-fine-tuning-to-follow-instructions.txt:2074,搜「actively involved in developing」)。 原文:「I recommend exploring popular tools such as Axolotl or LitGPT…which I am actively involved in developing」。

  5. 出处:「4 Implementing a GPT model from scratch to generate text」第 110 段(text/12-ch04-4-implementing-a-gpt-model-from-scratch-to-gener.txt:110,搜「GPT-2 vs. GPT-3」)。

  6. 出处:「5 Pretraining on unlabeled data」第 1700 段(text/13-ch05-5-pretraining-on-unlabeled-data.txt:1700,搜「bias vectors」)。 原文:「Bias vectors are not commonly used in LLMs anymore as they don't improve the modeling performance」。