Chapter 02

预训练:从压缩里长出能力

上一章把流水线拆成三段,并立起"能力 vs 对齐"的分界(§1.3)。这一章放大第一段——预训练——看"能力"具体怎么从一堆文本里长出来,以及工程上要付出什么代价。

本章你将建立的 schema

  • 预测下一个 token 的 loss 下探一层:交叉熵在让模型分布逼近真实文本分布,梯度把正确 token 的 logit 抬高、其余压低
  • 数据为何"质量压过数量":FineWeb-Edu 1.3T 胜过完整 15T,以及一条网页到 token 的四步管线
  • 该训多大、喂多少:scaling law 从 Chinchilla 的 20:1 到为推理刻意"过度训练",以及分布式训练这台机器为什么必须拆开

2.1自监督:免费而稠密的信号

每个 token 自带标签,不需人工标注——这是预训练能吃下万亿数据的根本原因。

交叉熵下探一层

§1.2 的交叉熵给出了直觉版本:−log P(正确 token)。放大看,整段文本上的训练目标是:

训练目标(伪代码) Math
# 对长度为 T 的序列,交叉熵 loss 是所有位置的均值
loss = -(1/T) * sum( log P(x_t | x_1, x_2, ..., x_{t-1})
                     for t in range(1, T+1) )

# 等价于:最小化 KL(数据分布 || 模型分布)
# 即让模型输出的 token 分布 <= 无限逼近真实文本分布

梯度的作用方向是确定的:对某一位置的预测,正确 token 的 logit 被抬高,其余所有 token 的 logit 被压低,幅度正比于分错了多少概率质量。模型分错得越离谱(正确 token 概率接近 0),梯度信号越强。

这个目标有一个重要的等价性:最小化交叉熵等价于最小化模型分布与真实文本分布之间的 KL 散度。换言之,模型被迫让自己的输出分布尽量逼近人类写出来的文本分布,而不是某个特定的"正确答案"分布。

为什么"自监督"是关键优势

训练文本里每一个 token 都天然充当下一位置的标签:给定"法国的首都是","巴黎"就是标签;给定"def add(a, b):","return"几乎必定是标签。无需人工逐条标注,每个 token 就是一次训练信号。这解释了为什么唯独预训练能吃下万亿量级数据——后训练用人工标注或偏好比较,成本决定了数据量只能在百万量级止步。

涌现:压缩 = 副产品长出能力

要把真实文本预测准,模型被迫同时学会事实("法国首都是巴黎")、语法(词序合法)、算术("3+4=7"之后接"7")、意图建模(对话里对方下一句会说什么)。压缩世界,是拿到这一切能力的副产品。这与第一章的分界一致:能力来自预训练,不是来自后训练。

想一想

"预测下一个词"这个目标看起来只是语言接龙,为什么训出来的模型能做数学推理?

展开答案(先停 10 秒再点)

数学题和推理步骤大量出现在训练文本里(教材、论坛、代码注释)。要预测准"x = 4"接在"x + 3 = 7,所以"之后,模型必须在参数里编码"加减法规则"。压缩这些文本 = 把推理规则蒸进参数。这不是模型"真正会推理"的证明,但解释了推理能力从何而来。

2.2数据:为什么质量压过数量

FineWeb-Edu 用 1.3T token 打败了完整的 15T FineWeb——约 11× 小却更强。

从网页到 token:四步管线

预训练数据的主力来源是 Common Crawl——互联网每月的大规模爬取快照,原始体量在 PB 量级。直接喂给模型效果极差:大量内容是垃圾广告、重复页面、乱码。一条标准管线把它清洗成可用数据:

Common Crawl 原始网页 −50% 近重复 MinHash 去重 删近重复文档 规则+ML 过滤低质 质量过滤 启发式+分类器 BPE 切子词 Tokenize 词表 5万–15万 漏斗:每一步都在丢数据——剩下的才是真正有价值的训练信号
图 2.1从 Common Crawl 到可训练 token 的四步管线,每个箭头标注丢弃了什么。注意:MinHash 近重复去重单步就去掉约 50% 文档,说明互联网内容高度冗余——这些冗余不去掉会让模型反复见同一段文本,浪费计算且损害泛化。

步骤一:MinHash 近重复去重。用局部敏感哈希找出相似度高的文档对,保留一份去除其余。原始 Common Crawl 约有 50% 的内容是近重复文档——新闻转载、页面模板、重复评论。

步骤二:质量过滤。启发式规则(如:过滤掉标点比例异常、非目标语言、停用词比例极低的页面)与 ML 分类器(通常用一个轻量模型,以高质量参考文本为正例训练)联合筛选。

步骤三:数据混合。代码、多语言、数学类内容被系统性上采样,因为这些领域在真实互联网里数量少但训练价值高。

步骤四:Tokenize。用 BPE(Byte-Pair Encoding)或 byte-level BPE 把文本切成子词 token,构建词表(通常 5 万–15 万词条)。同一段文字在不同模型的词表下 token 数量会有差异。

质量 vs 数量:被量化的反直觉

HuggingFace 于 2024 年发布的 FineWeb(15T token)是当时最大的开放预训练数据集之一。随后他们进一步用"教育价值"分类器过滤,得到 FineWeb-Edu(1.3T token,约为全量的 1/11)。在 MMLU 和 ARC 等基准上,FineWeb-Edu 训出的模型胜过在完整 15T 上训练的版本。

洞察 · 为什么更小反而更强

计算量固定时,每个 token 都要占用有限的参数更新机会。高质量文本每次出现都在强化有价值的模式,低质量文本每次出现都在干扰参数更新的方向。当噪声比例过高,梯度更新的方向被平均掉——模型见到的总 token 数增加了,但真正有效的学习信号没有增加。

合成数据(截至 2026-06)

纯合成数据(由另一个模型生成)训练效果不如真实网页数据。但把合成数据以适当比例混入真实数据,在数学、代码等垂直领域能带来明显提升。蒸馏数据(用强模型的输出作为训练目标)在 SFT 阶段更为重要,详见第 3 章。

2.3架构选型:哪些选择影响训练

decoder-only 赢得预训练主导地位是工程上的胜利,不是能力上的碾压。

decoder-only 为什么成为主流

encoder-decoder 架构(如 T5、BART)在机器翻译等任务上很自然,但在预训练阶段有一个实际缺陷:训练需要成对的输入-输出数据,或者专门设计的自监督目标(如 span corruption)。decoder-only 架构直接把文档拼接起来,每一位置预测下一个 token,整段文本都是训练信号,不需要人为构造输入-输出对。

此外,decoder-only 的自回归结构天然支持 KV-cache 推理加速,纯语言模型预训练后就能展现 zero-shot 能力。这是工程上的优势,不意味着 decoder-only 在所有任务上的能力都优于 encoder-decoder。

四个训练相关的架构细节

RoPE(旋转位置编码)。用旋转矩阵把相对位置信息编入 attention 的 Q/K 向量,而非在输入端加绝对位置 embedding。好处是对训练时没见过的位置长度有更好的外推稳定性——这直接影响了预训练时能覆盖的上下文长度。

RMSNorm。只对均方根归一化,去掉了 LayerNorm 中的均值中心化步骤。计算更快,在训练早期(参数尚未稳定)梯度更稳定,不容易出现 loss 尖峰。

GQA(分组查询注意力)。多个 query 头共享同一组 key/value 头。标准 Multi-Head Attention 的 KV-cache 随上下文长度线性增长,在长序列推理时占据大量显存。GQA 把 KV 头数量从 H 减到 G(G < H),显存开销降低约 H/G 倍,推理时序列越长收益越大。

MoE(混合专家)。每个 token 经过路由器只激活少数几个专家网络(典型如 top-2/8),其余专家不参与该 token 的前向传播。模型的总参数量/容量随专家数增加,但每个 token 的实际计算量不变。这使得 MoE 模型能在相同计算预算下覆盖更多的"知识槽位",代价是路由负载均衡需要额外处理,以及专家参数散布在不同设备上带来的通信开销。

2.4该训多大、喂多少:scaling law

Chinchilla 定义了"计算最优";过度训练定义了"推理最优"——两者不是同一个目标。

两个里程碑

Kaplan 2020(OpenAI)。发现 loss 与模型参数量 N、数据量 D、计算量 C 之间存在幂律关系。在固定计算预算下,结论偏向"做更大的模型"——数据量不够时,更大的模型仍然比更小的模型 loss 更低。

Chinchilla 2022(DeepMind)。重新做了实验,结论是:固定计算预算下,模型参数量 N 和数据量 D 应等比例放大,计算最优点约在 20 token/参数。换言之,Kaplan 结论里的"更大模型"实际上数据喂得太少了。

提示 · 两者差异的来源

Kaplan 和 Chinchilla 的结论差距部分源于测量口径不同:是否把 embedding 层的参数计入 N。在相同的口径下,两者的差距缩小。但 Chinchilla 引入的"等比例放大"原则影响了此后数年的训练策略。

2024–2026:转向过度训练

Chinchilla 定义的"最优"是:给定计算预算 C,训练后 loss 最低的模型。但这不是工业界唯一关心的目标。当一个模型要服务海量推理请求时,推理成本(每个 token 的算力消耗)与模型大小成正比。用更小的模型、喂远超 20:1 的数据,换来更低的单 token 推理成本,在部署现实中往往是更理性的选择。

Llama 系列的 token/参数比清楚地展示了这个转变:

0 500 1000 1500 2000 142 Llama 1 7B 参数 284 Llama 2 7B 参数 1875 Llama 3-8B 8B 参数 Chinchilla ≈20 token / 参数比
图 2.2Llama 系列三代模型的 token/参数比,红色虚线为 Chinchilla 计算最优基准(≈20)。注意:Chinchilla 基准线在这个纵轴尺度下几乎贴着横轴——Llama 3-8B 用了约 15T token,是 Chinchilla 最优的 90 倍以上,但目标不是"训练时 loss 最低",而是"推理时成本最低"。

scaling 目标的三种选择

表 2.1 · scaling 目标三选一
方案核心主张适用前提主要代价
Kaplan(2020) 固定预算下做更大模型 数据充足、推理成本不敏感 数据利用率低,单模型推理慢
Chinchilla(2022) N 与 D 等比例放大,约 20 token/参数为计算最优 只训一次、不大规模部署 部署成本高(模型偏大),推理延迟大
过度训练(2024+) 小模型喂远超 20:1 的数据,优化推理成本 海量推理请求、单 token 成本敏感 训练计算量超计算最优,训练成本更高
洞察 · o1/R1 进一步强化过度训练方向

test-time compute(推理时增加思考 token 数量)的崛起让"小而精"的基座模型更有价值:推理时可以用更多 token 弥补模型容量,但模型本身越小,单 token 推理成本越低。这个方向进一步推动了"训练时多喂数据、部署时用小模型"的策略。

2.5工程现实:把训练这台机器拆开

70B 模型仅权重就约 140GB,超过单张 H100 的 80GB 显存——分布式不是优化选项,是必选项。

为什么必须分布式

以 70B 参数模型为例,bf16 精度下仅权重约占 140GB(每参数 2 字节 × 70×10⁹)。训练时还需要存储梯度(同等大小)和优化器状态(AdamW 需要额外 2 份动量,共约 560GB 仅 fp32 优化器状态)。单张 H100 的 80GB HBM 装不下,必须把模型拆到多卡。

四种并行策略

DP · 数据并行 每卡:整模型副本 切:不同 batch 通信:反向后 all-reduce 梯度 适合:模型能放进单卡 通信量:O(参数数) TP · 张量并行 每卡:层内权重矩阵的一列 切:单层内矩阵 通信:每层前后向 all-reduce 适合:单机 NVLink(高带宽) 通信量:最高,频率最高 PP · 流水线并行 每卡:连续几层 切:层间,传激活 问题:bubble 空泡时间 适合:跨机通信带宽受限 通信量:仅激活,量小 ZeRO / FSDP 每卡:参数/梯度/优化器切片 切:优化器状态+梯度+参数 用时聚合,不用时分散 PyTorch FSDP 2024 标准 省显存最多,常与 DP 组合
图 2.3四种分布式并行策略,各自"切"的是不同维度。注意:TP 通信最频繁(每层都要 all-reduce),因此只在单机 NVLink 高带宽环境内使用;跨机则用 DP 或 PP 以适应较低的跨机带宽。
表 2.2 · 四种并行策略对比
策略切什么省什么主要代价
DP 数据并行 batch(每卡完整模型) 不省显存,提高吞吐 每卡须放下整模型;反向后 all-reduce 梯度
TP 张量并行 层内权重矩阵 单层参数显存 每层前后向各需 all-reduce;需 NVLink 高带宽
PP 流水线并行 层(连续几层一组) 总参数显存 bubble 空泡降低利用率;激活须跨卡传输
ZeRO-3 / FSDP 优化器状态+梯度+参数 显存降低 3×–8× 用时聚合参数带来额外通信;2024 年 PyTorch 标准

MFU:实际算力利用率

MFU(Model FLOPs Utilization)= 实际 FLOPs / 硬件理论峰值 FLOPs,衡量计算资源实际被用了多少。GPT-3 训练时 MFU 约 19.6%;PaLM 优化后达到约 46%;现代主流训练在 30–60% 之间。

洞察 · MFU 低于 50% 的真正原因

直觉上以为是"算力不够",实际上主要瓶颈是通信。GPU 等待梯度 all-reduce、等待 TP 的层间 all-reduce、等待 PP 的激活传输——这些等待时间加起来,轻松把 MFU 砍到 50% 以下。从 GPT-3 的 19.6% 到 PaLM 的 46%,进步来自更优的并行策略和通信重叠(计算和通信在时间上交叠),而非硬件本身的提升。

优化器配置

AdamW。对 Adam 的权重衰减做了解耦——直接在参数更新时减去 weight decay × 参数值,而非把权重衰减加进梯度(后者与 Adam 的自适应学习率相互干扰)。预训练标准选择。

超参数基准。betas 通常设为 (0.9, 0.95);学习率从 0 线性 warmup 约 1–2k 步,然后 cosine 衰减到峰值的约 10%;batch size 通常在 100 万–400 万 token;梯度全局范数裁剪为 1.0(防止 loss 尖峰时的梯度爆炸)。

常见失败模式 · loss 尖峰

预训练长程中时常出现 loss 突然尖峰(spike)——模型在某个 batch 遇到异常数据或梯度爆炸。梯度裁剪是第一道防线。若尖峰在裁剪后仍持续,通常回退到尖峰前的 checkpoint 并跳过或重采样该 batch。这是大规模训练中不可避免的工程问题,不是模型设计缺陷。

§本章 self-check

先不看答案,写下自己的理解,再展开对照。

  1. "自监督"具体指什么?为什么唯独预训练能吃下万亿 token,而后训练不能?
  2. FineWeb-Edu 1.3T 在 MMLU/ARC 上打败完整 15T FineWeb——这对"数据越多越好"的直觉做了什么修正?背后的机制是什么?
  3. Chinchilla 说约 20 token/参数最优,为什么 Llama 3-8B 却用了约 1875?Chinchilla 的"最优"和 Llama 3 的"最优"优化的目标不同在哪?
  4. (设计题)某团队预算紧张,要预训一个 7B 模型。把预算花在"多爬 10× 数据"还是"清洗现有数据 + 混入合成数据"上更划算?依据是什么?
答案(先做完再展开)
  1. "自监督"指训练标签来自数据本身,不需人工标注——每个 token 都是下一位置的标签。后训练依赖人工标注(SFT)或人类偏好比较(RLHF/DPO),单条数据成本远高于网页抓取,决定了数量上限在百万量级。预训练抓取网页几乎零标注成本,才能规模化到万亿 token。
  2. 修正:数据量不是越多越好,质量决定单位 token 的学习信号强度。低质量文本的梯度更新方向噪声大,稀释了有价值的信号。固定计算量下,11× 少但高质量的数据,每次参数更新都在强化有用的模式,效果胜过高噪声的大数据集。
  3. Chinchilla 优化的是"固定计算预算下训练结束时 loss 最低"——这是训练效率最优。Llama 3-8B 优化的是"部署时单 token 推理成本最低"——模型越小越快,因此宁愿多花训练算力喂更多数据,换一个更小但更强的模型。两个"最优"的目标函数不同,不矛盾。
  4. 更划算的是"清洗 + 混入合成数据"。FineWeb-Edu 的实验证明,质量过滤后 1/11 的数据量就能超越全量。10× 原始数据中的低质量内容会稀释梯度信号,清洗后相同计算量能获得更强的学习信号。合成数据混入网页有增益(截至 2026-06 的证据),尤其在数学和代码领域。
进阶挑战 · 刚好够不着

MFU 低于 50%:通信 vs 计算的取舍

MFU 常年低于 50%,意味着一半以上算力被通信吃掉。DP 的通信发生在反向后(all-reduce 梯度),TP 的通信发生在每一层前后向。为什么"模型越大越倾向多用 TP,但 TP 又最吃带宽"?给定 TP 通常只在单机 8 卡 NVLink 内使用、跨机用 DP/PP,如何理解这背后的显存 vs 通信带宽取舍?

提示(卡住再展开)

显存瓶颈迫使大模型必须把单层权重切开放到多卡(TP),而 TP 每层都要 all-reduce——通信频率极高,只有 NVLink 的带宽(约 600 GB/s)才跑得起来,以太网(约 12.5 GB/s)会让 GPU 大部分时间等通信。DP 的通信只发生一次(反向后),跨机可以接受。所以大模型的实际配置通常是:单机内 TP,跨机 DP(梯度 all-reduce)或 PP(只传激活,通信量小)。