chapter 07 / llm-pretraining · 预计学习时间 150-180 分钟

大语言模型 I
预训练:压缩整个互联网

AUDIO // 本章语音导读
本章目录
  1. 预训练目标:下一词预测的深意
  2. Tokenization:BPE 与它背的锅
  3. Scaling Laws:从 Kaplan 到 Chinchilla 到「过训练」
  4. 交互实验室:Scaling 计算器
  5. 数据工程:万亿 token 从哪来
  6. 分布式训练:把一个模型切到一万张卡上
  7. Dense vs MoE:两种放大方式的权衡
  8. 线性/混合注意力:对 O(n²) 的反叛
  9. 训练实务:超参、loss 曲线与玄学
  10. 章节测验

预训练目标:下一词预测的深意

形式上,预训练简单到令人失望——第 2 章的 softmax 交叉熵,类别是约 10 万个 token,对语料里每个位置最大化下一个 token 的对数概率:

$$L = -\frac{1}{T}\sum_{t=1}^{T} \log P_\theta\big(x_t \mid x_{<t}\big)$$

深意在「什么样的文本会出现在语料里」。预测「巴黎是法国的____」需要事实;预测「因此 x = ____」需要做完前面的代数;预测侦探小说最后一页「凶手是____」需要消化全书线索。下一词预测是一个任务的超集:损失压得足够低,语法、事实、推理被一并逼出来——不是模型「想」学它们,而是不学就压不下去。

信息论视角(Karpathy「训练即压缩」的严格版):$L$ 以 nat 计,换算成 bits/token 后正是用该模型做算术编码压缩语料的码长。「更低的 loss = 更好的压缩 = 对世界更好的预测模型」。GPT-3 约 0.7 bits/字符,远低于 gzip 的 ~2.5——它对文本的「理解」可以用压缩率严格度量。这也解释了为什么 loss 上 0.01 的差距在能力上是肉眼可见的:指数空间里的 0.01。

Tokenization:BPE 与它背的锅

模型不读字符,读 token。BPE(字节对编码)的算法朴素得像作业题:从 256 个字节开始,反复找语料中最高频的相邻 pair 合并成新 token,直到词表达到目标大小(GPT-4 约 10 万):

语料: "low lower lowest"  词表从字节开始
第1轮: 最高频 pair = (l,o) → 合并 "lo"     词表 +1
第2轮: 最高频 pair = (lo,w) → 合并 "low"   词表 +1
第3轮: (low,e) → "lowe" …… 直到 |V| = 目标

词表大小是三方权衡:大词表 → 序列短(省 $O(n^2)$ 注意力)但嵌入矩阵大、稀有 token 训练不足;小词表反之。LLM 的很多「智障时刻」其实是 tokenizer 背锅:数不对 "strawberry" 里有几个 r(它看到的是 [st][raw][berry] 三个原子,不是 10 个字母)、算术不稳定("1234" 可能切成 [12][34],对位加法无从谈起)、中文每字 1-2 token 而英文每词 ~1.3 token(同样上下文窗口装的中文信息更少、API 计费更贵)。Karpathy 的暴论值得记住:「LLM 的每一个怪癖,追根溯源一半在 tokenizer。」

VIDEO 01
Let's build the GPT Tokenizer(从零写 GPT 的分词器)
Andrej Karpathy · Zero to Hero 第8集 2:13:35
观看指南 · 选跟写(前 1 小时性价比最高)
  • 00:00 tokenizer 引发的全部怪相清单——先看病例再学解剖。
  • 14:00 BPE 合并算法逐行实现——与本章伪代码对应。
  • 57:00 GPT-2 → GPT-4 词表的 regex 切分规则演进——工业细节。

Scaling Laws:从 Kaplan 到 Chinchilla 到「过训练」

2020 年 Kaplan 等人发现:损失对参数量 $N$、数据量 $D$、算力 $C$ 都呈幂律,跨七个数量级成立:

$$L(N) \propto N^{-0.076}, \qquad L(D) \propto D^{-0.095}, \qquad C \approx 6ND$$

($C \approx 6ND$ 的由来:前向每参数每 token 约 2 FLOPs(一乘一加),反向约 2 倍前向,合计 6。)Kaplan 的结论「优先放大 N」导致了 GPT-3 时代的「大模型、少数据」(175B 只喂 300B token)。2022 年 Chinchilla 修正了实验方法(每个算力点重新调学习率调度),结论翻转:给定算力下,N 和 D 应同比放大,最优配比约 $D^* \approx 20N$。70B 参数 × 1.4T token 的 Chinchilla 全面击败 4 倍大的 Gopher——半个领域的训练计划当场作废。

2023 后的实践又演化了一步:故意「过训练」。Chinchilla 最优只管「训练算力买 loss」,没算推理成本——模型部署后每天要跑万亿 token,小模型每 token 便宜得多。所以 LLaMA-3 8B 喂了 15T token(D/N = 1875,是 Chinchilla 配比的 90 倍):训练时多烧钱,换一个能力远超其体型的小模型,部署省回来。「训练最优 → 推理最优」的转向,是理解 2024 后模型谱系(为什么小模型越来越强)的钥匙。去计算器里亲手对比 GPT-3 和 LLaMA-3 8B 的 D/N 比。

交互实验室:Scaling 计算器

必做实验:① 依次点五个预设,看 D/N 判定从「欠训练」(GPT-3,1.7:1)走到「推理最优」(LLaMA-3,1875:1)的历史轨迹;② 把 N 拉到 1T、D 设为 20N——看看 Chinchilla 最优地训一个万亿参数模型要多少张 H100 跑多少年,理解为什么万亿级模型几乎都是 MoE;③ 固定算力心算验证:N 翻倍、D 减半,C 不变——但 loss 不同,这正是 scaling law 要回答的问题。

scaling.calculator(C = 6ND)

滑块均为对数刻度 · MFU 按 40% 计(实际大集群 35-45%)· MoE 模型按激活参数算 C

数据工程:万亿 token 从哪来

以 FineWeb(Hugging Face 公开复现的预训练数据管线,附录信息源有报告链接)为模板,从 Common Crawl 的 ~百 PB 原始网页到 15T 干净 token,每一步都是数量级的删减:

  1. 文本抽取:HTML 剥壳(导航栏/广告/模板噪声),抽取质量直接决定下游一切。
  2. 语言识别 + 质量过滤:规则(标点比例、重复行)+ 模型打分(「这段文字像不像教科书」)。激进过滤反而伤多样性——质量阈值是精细的调参对象。
  3. 去重:MinHash 模糊去重。重复数据是大忌——既浪费算力又放大记忆(隐私/版权风险),还会让 loss 虚低。
  4. 评测集去污染:把 benchmark 题从训练集里抠掉(第 1 章纪律的万亿级版本),做不干净则分数全是假的。
  5. 配比(data mixing):网页/代码/书籍/论文/多语言按比例混合。代码比例是公认的推理能力杠杆——即使是非编程任务,代码训练也显著提升逻辑链质量。

关键纪律:基本只训 ~1 个 epoch(数据足够多时重复见同一数据收益骤减且加剧记忆)。对照第 1 章经典 ML 动辄几百 epoch——LLM 的过拟合主战场不在 epoch 数,在数据重复和污染。高质量数据耗尽(「data wall」)是 2025-2026 的真问题,应对路线:合成数据(强模型生成+过滤)、多模态数据、以及第 8 章的 RL(用算力换数据效率)。

分布式训练:把一个模型切到一万张卡上

70B 参数 × (权重 2 字节 + 梯度 2 + Adam 两个矩 8) ≈ 840GB——单卡 80GB 装不下零头。四把刀,按「切什么」区分:

策略切什么代价
数据并行 DP切 batch,每卡完整模型副本每步 all-reduce 梯度;显存不省
ZeRO / FSDP把优化器状态/梯度/权重分片到各卡,用时临时聚合通信换显存,DP 的显存解药
张量并行 TP切单个矩阵乘(按行/列),几卡合算一层每层两次 all-reduce,需 NVLink 级带宽,一般不出节点
流水线并行 PP按层切段,不同卡管不同层流水线「气泡」(首尾空转),用 micro-batch 填

万卡训练是 3D 并行:节点内 TP(吃 NVLink 带宽)× 节点间 PP × 整体 DP/ZeRO。再加两件标配:混合精度(bf16 算、fp32 累积——bf16 指数位与 fp32 相同,不易溢出,已基本淘汰 fp16+loss scaling)和梯度检查点(不存中间激活,反向时重算——拿 1/3 的额外计算换一半以上的激活显存,几乎所有大模型训练默认开)。

Dense vs MoE:两种放大方式的权衡

MoE(混合专家)把每层 FFN 复制成 $E$ 份「专家」,由路由器为每个 token 挑 top-$k$(如 8 选 1-2)个激活。效果:参数量 ×E,每 token 计算量几乎不变。DeepSeek-V3:总参数 671B,每 token 只激活 37B——用 37B 的算力买 671B 的知识容量。但天下没有免费午餐,权衡要细算:

DenseMoE
推理计算全参数参与只激活 top-k 专家,FLOPs 低
显存= 参数量全部专家都要载入显存(路由是逐 token 的,没法预测下个 token 用谁)——计算省了,内存没省
训练工程成熟、简单难度高一档:负载均衡辅助 loss(防专家垮塌——少数专家垄断流量)、专家并行的 all-to-all 通信、容量因子调优
微调开箱即用路由在小数据下易失衡,框架支持参差
实践推论:资源受限的垂直场景(本地部署、单机微调)优先选 dense——MoE 的「计算便宜」要在显存管够、且框架对其训练支持成熟的前提下才兑现;在统一内存的 Mac/单卡环境里,把 671B 专家全部塞进内存的代价远超 37B dense 的全部成本。训练侧更是如此(负载均衡与通信的复杂度)。第 13 章实战章会用真实数字展开这笔账。

线性/混合注意力:对 O(n²) 的反叛

第 6 章埋的雷:注意力对序列长度是 $O(n^2)$——128K 上下文时,注意力矩阵本身就是天文数字。一条活跃的研究线试图把它压到 $O(n)$:线性注意力 / 状态空间模型(Mamba、RWKV、DeltaNet 系),思想可粗暴概括为「把 KV 历史压缩进一个固定大小的循环状态」——某种意义上是带着 Transformer 的训练并行性回到 RNN(第 5 章的幽灵)。纯线性模型的检索能力(「大海捞针」)仍逊于全注意力,所以 2025-2026 的主流妥协是混合架构:大部分层用线性注意力,每隔几层插一层全注意力兜底(Qwen3.5、MiniMax 等均属此类)。

纸面 FLOPs ≠ 实际吞吐,新架构的隐形成本是框架成熟度。一个真实对照实验(2026 年,Apple Silicon + mlx-lm 训练场景):同机、同数据、同 LoRA 规模下,经典 dense Transformer 比 delta-net 系混合架构快 15 倍吞吐、省 3/4 内存——差距 100% 来自训练框架对新算子的实现成熟度(融合 kernel、内存布局优化都没跟上),而非架构本身的理论属性。工程启示:选架构时要审计「目标框架对它的支持成熟度」,理论复杂度只是故事的一半。新架构从论文到生态打磨好 kernel,通常滞后 1-2 年。

训练实务:超参、loss 曲线与玄学

一份典型 LLM 预训练配置,每一项你都在前面章节推导过:

optimizer:  AdamW(β₁=0.9, β₂=0.95, weight_decay=0.1)   # 第3章;β₂ 调低应对梯度噪声
lr:         warmup 2000 步 → 余弦衰减到峰值的 10%        # 第1章 SGD 噪声地板的解药
grad_clip:  1.0                                          # 第5章梯度裁剪
precision:  bf16(fp32 master weights)                  # 本章 §6
batch:      ~4M token/步(数百万级)                      # 第1章 mini-batch 的极端形态

收尾视频:Karpathy 的 3.5 小时通览把本章(预训练)和下一章(后训练)串成完整图景,看完它你对「ChatGPT 是怎么炼成的」将有工程级的理解:

VIDEO 02 · 通览大餐
Deep Dive into LLMs like ChatGPT(深入理解 ChatGPT 类大模型)
Andrej Karpathy 3:31:24
观看指南 · 本章看前半(预训练),第 8 章回来看后半
  • 00:00 FineWeb 数据管线实地讲解——§5 的可视化版本。
  • 14:30 tokenization 再回顾——巩固 §2。
  • 31:00 训练过程、loss、以及「base model 是互联网文档模拟器」——预训练完成时你得到的是什么(以及它还不是什么)。
  • 1:20:00 之后进入 SFT/RLHF——第 8 章的预告片。

章节测验