《从零构建大模型》详细读书笔记

Author: [美]塞巴斯蒂安·拉施卡 (Sebastian Raschka) | 译者:覃立波、冯骁骋、刘乾 Published: 2025-04-01 | Category: 计算机-人工智能 Core Thesis: 通过亲手从零构建一个完整的类GPT大语言模型,真正理解LLM的工作原理——"亲手构建才是真理解"。 Reading Date: 2026-05-14 Tags: 大模型 LLM Transformer 深度学习 PyTorch 从零构建 微信读书评分: 9.15(275人评价)| 豆瓣评分: 9.5 ISBN: 9787115666000 | 出版社: 人民邮电出版社有限公司 GitHub: LLMs-from-scratch(44k+ stars)


一、全书概览

一句话总结

这本书带你用几百行PyTorch代码,从零搭建一个完整的类GPT-2大语言模型——从数据准备、模型架构、预训练到指令微调,每一步都亲手实现、亲手跑通。

全书结构

| 部分 | 章节 | 主题 | 一句话概括 | |------|------|------|------------| | 基础 | 第1章 | 大语言模型全景 | LLM的发展历程、分类和本书学习路径 | | | 第2章 | 处理文本数据 | 分词、词嵌入、数据集构建的全流程 | | 核心 | 第3章 | 编写注意力机制 | 从简单注意力到多头自注意力的完整实现 | | | 第4章 | 从零实现GPT模型 | 将注意力机制组装成完整的GPT架构 | | 训练 | 第5章 | 在无标签数据上预训练 | 预训练流程、损失函数、训练循环 | | | 第6章 | 微调以进行文本分类 | 分类任务的微调实践 | | | 第7章 | 使用人类反馈进行微调(RLHF) | 指令遵循、奖励模型、PPO | | 进阶 | 附录A-D | PyTorch基础、训练技巧 | 补充知识和工程实践 | | | 附录E | 加载预训练权重 | 从OpenAI GPT-2加载权重 | | | 附录F | 推理模型(DeepSeek R1) | 推理模型的构建方法与行业展望 |


二、逐章要点

第1章:理解大语言模型

核心观点

大语言模型的"大"不仅指参数量大,更指训练数据量大、计算资源需求大。LLM的核心能力是通过海量文本学习语言的统计规律,从而具备生成、理解、推理能力。

关键概念

  • LLM定义:基于Transformer架构的大规模语言模型,通过自回归方式生成文本
  • 三类LLM: | 类型 | 说明 | 代表 | |------|------|------| | 编码器(Encoder-only) | 理解文本,输出向量表示 | BERT | | 解码器(Decoder-only) | 生成文本,自回归预测下一个token | GPT系列 | | 编码器-解码器 | 先编码后解码 | T5, BART |
  • 本书目标:从零实现一个类GPT-2的Decoder-only模型

学习路径

数据处理 → 注意力机制 → GPT架构 → 预训练 → 微调 → 指令微调
  (Ch2)     (Ch3)       (Ch4)     (Ch5)   (Ch6)    (Ch7)

第2章:处理文本数据

核心观点

LLM的第一步是将原始文本转化为模型可处理的数值表示——分词(Tokenization)和嵌入(Embedding)。

关键流程

| 步骤 | 说明 | 代码要点 | |------|------|----------| | 1. 分词 | 将文本切分为token | 使用BPE(Byte Pair Encoding)算法 | | 2. 词表映射 | token → 整数ID | 构建词汇表,建立映射关系 | | 3. 嵌入 | ID → 高维向量 | Embedding层,将离散ID映射为连续向量 | | 4. 位置编码 | 为token添加位置信息 | 因为Transformer本身没有位置感知 | | 5. 数据集构建 | 滑动窗口切分训练样本 | input-target对,target是input右移一位 |

关键细节

  • BPE算法:从字符级开始,反复合并最高频的token对,直到达到目标词表大小
  • 嵌入维度:GPT-2使用768维(小版本)到1600维(大版本)
  • 上下文长度:GPT-2为1024个token
  • 训练数据:本书先用2万字短篇小说做小数据集,再用1.24亿参数的GPT-2公开数据集

行动清单

  • [ ] 实现一个简单的BPE分词器
  • [ ] 理解input-target对的构建方式(target = input右移一位)

第3章:编写注意力机制(全书精华)

核心观点

注意力机制是Transformer的核心——它让模型能够"关注"输入序列中最重要的部分,捕获长距离依赖关系。RNN做不到这一点。

注意力机制演进路径

简单注意力 → 自注意力 → 因果自注意力 → 多头自注意力
   (3.2)       (3.3)       (3.4)          (3.5)

逐层拆解

1. 简单注意力(3.2)

  • 核心思想:给定一个查询(Query),从一组键值对中检索相关信息
  • 计算:注意力权重 = softmax(Query · Key^T)
  • 输出:加权求和 Value

2. 自注意力(3.3)

  • Query、Key、Value 都来自同一个输入序列
  • 每个token同时充当Q、K、V三种角色
  • 让序列中的每个位置都能"看到"其他所有位置

3. 因果自注意力(3.4)

  • 问题:在生成任务中,未来token不应该被看到
  • 解决:用因果掩码(Causal Mask)将未来位置的注意力权重设为负无穷
  • 掩码是一个上三角矩阵,softmax后未来位置权重为0

4. 多头自注意力(3.5)

  • 为什么需要多头:单头注意力只能捕获一种关系模式
  • 多头并行:将嵌入维度分成多个头,每个头独立计算注意力
  • GPT-2使用12个头(小版本)
  • 最终将所有头的输出拼接并线性变换

QKV核心公式

Attention(Q, K, V) = softmax(QK^T / √d_k) · V

其中:
- Q = X · W_Q  (查询矩阵)
- K = X · W_K  (键矩阵)  
- V = X · W_V  (值矩阵)
- d_k = 嵌入维度 / 头数 (缩放因子,防止点积过大)

读者争议

  • 有读者指出QKV概念引入太晚(3.4.1结尾),建议在3.1-3.2就提及
  • 但也有读者认为循序渐进的讲解方式更容易理解

行动清单

  • [ ] 手动实现一个简单的注意力计算(不使用PyTorch的nn.MultiheadAttention)
  • [ ] 可视化注意力权重,观察模型"关注"了哪些位置
  • [ ] 实验不同头数对模型效果的影响

第4章:从零实现GPT模型

核心观点

GPT模型 = Token嵌入 + 位置嵌入 + N个Transformer块 + 层归一化 + 线性输出层。整个架构清晰、模块化。

GPT架构逐层拆解

输入文本 → Token嵌入 → + 位置嵌入
                    ↓
            ┌───────────────┐
            │ Transformer块 │ × N
            │  ├ 多头自注意力│
            │  ├ 层归一化    │
            │  ├ 前馈网络    │
            │  └ 层归一化    │
            └───────────────┘
                    ↓
              层归一化
                    ↓
            线性输出层(映射到词表大小)
                    ↓
              softmax → 下一个token的概率分布

GPT-2各版本参数对比

| 版本 | 参数量 | 层数 | 头数 | 嵌入维度 | |------|--------|------|------|----------| | GPT-2 Small | 124M | 12 | 12 | 768 | | GPT-2 Medium | 355M | 24 | 16 | 1024 | | GPT-2 Large | 774M | 36 | 20 | 1280 | | GPT-2 XL | 1558M | 48 | 25 | 1600 |

前馈网络(FFN)

  • 两层全连接:Linear → GELU激活 → Linear
  • 维度变化:d_model → 4 × d_model → d_model
  • GELU激活函数比ReLU更平滑,在大模型中效果更好

层归一化(Layer Normalization)

  • 对每个样本的每个位置独立归一化
  • 稳定训练过程,加速收敛
  • GPT-2使用Pre-LN(归一化在注意力/FFN之前),比Post-LN更稳定

代码量

  • 整个GPT模型核心代码仅几百行PyTorch
  • 所有代码都能在普通笔记本上运行

第5章:在无标签数据上进行预训练

核心观点

预训练的目标很简单:给定前N个token,预测第N+1个token。通过海量文本反复训练这个简单任务,模型就学会了语言的统计规律。

预训练流程

| 步骤 | 说明 | 关键代码 | |------|------|----------| | 1. 数据准备 | 加载文本 → 分词 → 构建数据集 | Dataset + DataLoader | | 2. 前向传播 | 输入batch → 模型 → 输出logits | model(input_ids) | | 3. 计算损失 | 交叉熵损失(预测vs真实下一个token) | CrossEntropyLoss | | 4. 反向传播 | 计算梯度 | loss.backward() | | 5. 更新权重 | AdamW优化器 | optimizer.step() | | 6. 生成文本 | 从模型输出中采样下一个token | 贪心/温度采样/top-k |

交叉熵损失

  • 本质:衡量模型预测的概率分布与真实分布的差异
  • 模型输出:词表中每个token作为下一个token的概率
  • 目标:最小化这个差异,使模型预测越来越准

文本生成策略

| 策略 | 说明 | 特点 | |------|------|------| | 贪心解码 | 每步选概率最高的token | 确定性强,但输出可能重复 | | 温度采样 | 调整概率分布的"尖锐度" | 温度高→更多样,温度低→更确定 | | Top-k采样 | 只从概率最高的k个token中采样 | 平衡多样性和质量 | | Top-p(核采样) | 从累积概率超过p的最小token集合中采样 | 自适应的采样范围 |

小数据集 vs 大数据集对比

| | 小数据集(2万字小说) | 大数据集(GPT-2公开数据) | |---|---|---| | 计算资源需求 | 低(笔记本可跑) | 较高 | | 生成质量 | 不通顺,语法错误多 | 流畅自然 | | 训练时间 | 快 | 慢 | | 教学价值 | 理解流程 | 感受scaling效果 |

行动清单

  • [ ] 用小数据集跑完整个预训练流程
  • [ ] 尝试不同的文本生成策略,观察输出差异
  • [ ] 监控训练过程中的loss曲线

第6章:微调以进行文本分类

核心观点

预训练模型学到了通用的语言表示,微调则是让模型适应特定任务——分类微调是最基础的微调形式。

微调方式

| 方式 | 说明 | 参数量 | 适用场景 | |------|------|--------|----------| | 全量微调 | 更新所有参数 | 大 | 数据充足、算力够 | | 特征提取 | 冻结模型,只训练分类头 | 小 | 数据少、算力有限 | | 参数高效微调(PEFT) | 只更新少量参数 | 极小 | 数据少但想保留微调优势 | | LoRA | 在权重矩阵上加低秩矩阵 | 极小 | 当前主流方案 |

分类微调步骤

  1. 修改模型:在GPT输出层后添加分类头
  2. 准备数据:标注好的文本-标签对
  3. 训练:用分类损失(而非语言建模损失)训练
  4. 评估:准确率、F1等指标

第7章:使用人类反馈进行微调

核心观点

RLHF(基于人类反馈的强化学习)让模型学会遵循指令、避免有害输出——这是从"语言模型"到"助手"的关键一步。

RLHF三步流程

Step 1: 指令微调(SFT)
  预训练模型 + 指令数据 → 监督微调 → SFT模型

Step 2: 训练奖励模型(RM)  
  人类标注偏好 → 训练打分模型 → 奖励模型

Step 3: 强化学习优化(PPO)
  SFT模型 + 奖励模型 + PPO算法 → 最终模型

关键概念

  • 指令微调(SFT):用(指令, 期望输出)对进行监督学习
  • 奖励模型:学习人类偏好,给模型输出打分
  • PPO(近端策略优化):控制更新幅度,防止模型崩溃
  • KL散度惩罚:防止微调后的模型偏离预训练模型太远

指令微调的数据格式

{"instruction": "翻译以下句子", "input": "Hello world", "output": "你好世界"}
  • 数据集不需要特殊处理,只是dataset返回数据本身
  • input和target采用右移一位的方式
  • 神奇之处:这种简单的格式就能让模型学会"遵循指令"

附录E:加载预训练权重

核心观点

不需要从头训练——可以加载OpenAI发布的GPT-2预训练权重,在自己的模型上直接使用或继续微调。

关键步骤

  1. 下载OpenAI的GPT-2权重文件
  2. 将权重映射到自己实现的模型架构
  3. 验证加载后的模型输出是否一致

附录F:推理模型(DeepSeek R1)

核心观点

推理模型(Reasoning Model)通过强化学习训练模型"思考"——生成推理链(Chain of Thought),在给出答案前先进行多步推理。

关键洞察

  • DeepSeek R1 证明:单纯的强化学习就能引发大模型自我推理能力的涌现
  • 蒸馏技术证明:小模型在特定场景可以和大模型一样有效
  • 三种主流推理机制各有优劣
  • 这篇附录是作者的博客文章,紧跟最新技术趋势

三、关键概念速查

| 概念 | 定义 | 一句话理解 | |------|------|------------| | Token | 文本的最小处理单元 | 一个token约等于0.75个英文单词 | | Embedding | 将离散token映射为连续向量 | 让文字变成数学对象 | | Attention | 让模型关注输入中最重要的部分 | "看哪里"的机制 | | QKV | 查询、键、值——注意力的三个核心矩阵 | Q是问题,K是索引,V是内容 | | Causal Mask | 防止模型看到未来token的掩码 | 生成时不能偷看答案 | | Transformer Block | 自注意力 + FFN + LayerNorm的组合 | GPT的基本重复单元 | | Pre-training | 在海量无标注数据上训练语言模型 | 学会语言的统计规律 | | Fine-tuning | 在特定任务数据上继续训练 | 让通用模型变专家 | | RLHF | 用人类偏好反馈进行强化学习训练 | 让模型学会"听话" | | LoRA | 在权重矩阵上添加低秩适配矩阵 | 只改一点点参数就能微调 | | BPE | 字节对编码分词算法 | 从字符开始逐步合并高频对 | | GELU | 高斯误差线性单元 | 比ReLU更平滑的激活函数 | | Cross-Entropy | 衡量预测分布与真实分布的差异 | 模型"错得有多离谱" |


四、核心框架/模型

1. 完整的LLM构建流程

┌─────────────────────────────────────────────────────────┐
│                    数据处理阶段                           │
│  原始文本 → BPE分词 → Token ID → Embedding + 位置编码     │
└─────────────────────┬───────────────────────────────────┘
                      ↓
┌─────────────────────────────────────────────────────────┐
│                    模型架构阶段                           │
│  N × [多头自注意力 → LayerNorm → FFN → LayerNorm]         │
│  → LayerNorm → Linear(vocab_size) → softmax              │
└─────────────────────┬───────────────────────────────────┘
                      ↓
┌─────────────────────────────────────────────────────────┐
│                    预训练阶段                             │
│  输入batch → 前向传播 → 交叉熵损失 → 反向传播 → AdamW更新   │
└─────────────────────┬───────────────────────────────────┘
                      ↓
┌─────────────────────────────────────────────────────────┐
│                    微调阶段                               │
│  SFT(指令微调) → RM(奖励模型) → PPO(强化学习) → 最终模型    │
└─────────────────────────────────────────────────────────┘

2. Transformer Block 内部结构

输入 x
  │
  ├──→ LayerNorm → 多头自注意力 → +残差连接 ──→ 
  │                                           │
  ├──→ LayerNorm → FFN → +残差连接 ──→ 输出
  │
  FFN内部: Linear(d→4d) → GELU → Linear(4d→d)

3. 注意力计算流程

输入 X (batch × seq_len × d_model)
  │
  ├── W_Q → Q (batch × seq_len × d_k)
  ├── W_K → K (batch × seq_len × d_k)  
  └── W_V → V (batch × seq_len × d_v)
  
Scores = QK^T / √d_k           # (batch × seq_len × seq_len)
Scores = Scores + Causal Mask  # 上三角设为-∞
Weights = softmax(Scores)      # 每行归一化
Output = Weights · V           # (batch × seq_len × d_v)

五、金句摘录

"亲手构建才是真理解。" — 本书核心理念

"LLM的本质是通过词元的向量化,在高维空间去拟合——意图理解。维度代表了特征,而这些特征可以在大模型的训练过程中自我学习得到。" — 读者总结

"只有基于海量的数据训练,才能使模型拥有强大的学习和处理复杂语言的能力。" — 数据集对比结论

"每一行代码都能看懂,连在一起却不知道在干嘛。" — 读者对大模型学习的感悟

"大模型的'大'不仅仅是参数量大,更指训练数据量大、计算资源需求大。"

"很多东西不是简单就能说清楚的,也超出了本书的定位。现阶段先从大处着手,先上手再补充理论知识,不必过于拘泥细节。" — 作者的态度


六、行动清单

每天

  • [ ] 跟着书中的代码实现一个模块(注意力/FFN/Transformer Block)
  • [ ] 在PyTorch中运行并观察每一步的tensor形状变化

每周

  • [ ] 完成一个章节的代码实操,确保能跑通
  • [ ] 阅读对应的GitHub仓库代码,对比自己的实现

每月

  • [ ] 完成整个模型的构建和预训练
  • [ ] 尝试在自己的数据集上做分类微调
  • [ ] 阅读1-2篇相关论文(Attention Is All You Need 等)

学习资源

  • [ ] GitHub仓库:LLMs-from-scratch(扩展代码比书中更多)
  • [ ] 作者录制的视频讲解(出版社同步到国内平台)
  • [ ] 附录F:推理模型博客文章(DeepSeek R1分析)

七、社区评价

高分书评(认同度 Top)

《实操性最强的LLM入门书》 — 迷途小書僮(👍300 人认同)

这是一本实操性很强的书,涵盖了构建大模型的整个流程。作者把模型核心组件拆分成多个知识点,引导读者按章节渐进实践。只有几百行代码,在笔记本上就能搭建运行。

《五星好评,Transformer讲解最清楚》 — 那木拉(👍58 人认同)

整本书结构严谨,解释清晰,操作性强。最精彩部分是Transformer模块的注意力机制的讲解和分步实现。是近几年除了《Python深度学习》以外最好的AI技术书。

《碎片化知识的系统梳理》 — 古户艾莉卡(👍46 人认同)

最大的收获是把碎片化的知识组织起来了。书里写得最好的部分是Attention机制(第三章3.3-3.6)。缺点是QKV概念引入太晚,部分图画得不好。

《系统学习LLM的最佳拍档》 — 九月菊(👍34 人认同)

结合《图解大模型》双剑合璧效果最佳。两本书都摒弃了晦涩的数学公式,以代码驱动学习,非常符合程序员的审美习惯。

《第一次真正理解了大语言模型》 — 多位读者

"看完此书才发现,模型内部真就是预测了词汇表里几万个词作为下一个词的概率。" — 细逐空香瑶月麓 "对于训练架构的讲解,几页内容就比我之前读过的那些深奥论文讲得更清楚。" — tanelP

不同声音

《语言逻辑性较差》 — Li FJ(👍2 人认同,3星中评)

语言逻辑性较差,对各个模块的运行逻辑缺乏整体论述,而是专注于讲如何写代码。对Transformer如何工作几乎毫无介绍,直接上代码。


八、争议与批评

| 批评点 | 来源 | 核心论据 | 是否成立 | |--------|------|----------|----------| | 过度依赖PyTorch,数学细节不够 | 微信读书书评 | 没有详细讲解链式求导、交叉熵计算原理等 | 部分成立 — 但这符合本书"实践优先"的定位 | | QKV概念引入太晚 | 微信读书书评 | 在3.4.1结尾才提及,前面内容让部分读者困惑 | 成立 — 确实可以更早引入 | | 部分配图质量不高 | 微信读书书评 | 有些图有误导作用(如附录F的DeepSeek流程图) | 部分成立 — 中文版印刷质量有提升 | | 代码细节没有完全展开 | 微信读书书评 | 大量代码细节没有解释 | 部分成立 — 但详细展开会大幅增加篇幅 | | 缺少强化学习专题 | 微信读书书评 | RL只在附录F中简要提及 | 成立 — 但RL本身足以单独成书 |

我的判断

  • 最成立的批评:对数学原理和"为什么这样做有效"的解释不够深入。比如为什么点积能表示相似度,为什么交叉熵损失有效。
  • 不太成立的批评:批评"直接上代码不讲原理"——这恰恰是本书的优势,让读者在实践中理解原理。
  • 本书真正的价值:填补了"论文太碎片化、理论书太抽象"之间的空白。它不追求面面俱到,而是通过"做一遍"建立直觉。
  • 最佳阅读策略:先跟着代码做一遍建立直觉,再回头看数学推导补充理解。配合《深度学习入门》(鱼书)补充基础。

九、一句话总结

从零构建大模型的秘诀不是什么高深的数学,而是"拆解-实现-运行"的实践循环——几百行PyTorch代码就能让你真正理解GPT的每一个组件。


笔记生成:2026-05-14 by 喵喵 🐈