跳到主要内容

备料与训练 — 从一本短篇到 checkpoint

这一章讲两件事: 真开训之前,数据要过哪五道工序(以及为什么大模型公司在这上面花的心思不比模型少); 训练循环的每件套怎么拼——最后用本书真实的训练记录收尾:20 遍,损失从 24.2 掉到 0.12。 原书把这一章起名叫「The BIG Moment」,这是全书最有实感的一章。

1. 先看现象:数据决定模型的上限

模型架构相同时,「它学过什么」完全由语料决定。原书数据工程一节的第一句话就把立场亮明: 数据准备不是「收一堆文本」,而是一整套精选、清洗、过滤、去重、配比的工艺1—— 脏数据训出的模型会忠实放大脏:事实错误、毒性、偏见都从语料里来。

五道工序,每道一小段2:

**一、来源配比。**网页给广度、书给长文推理、代码给逻辑、对话给交互风格; 按目标定比例,稀缺但值钱的刻意多给。

二、清洗过滤。去广告、乱码、低质与敏感内容,统一编码。最基础的一层是现成的判断规则,行话叫启发式(凭经验定死、不用学的条目)。

**三、清洗过滤(续)。**再往上是拿小模型帮忙:分类器(专门判「是/不是」的小模型)给文本打质量分,或者按「读起来有多意外」筛掉不像话的。

**四、去重。**网上的内容大量互相抄袭,不去重、模型就会背。三层手段:精确指纹(哈希:把内容压成一小串指纹来比对,整篇相同的当场现形)、近似比对(MinHash/LSH,专抓「改了几处的相同」)、以及段落级的重复段删除。

**五、切分打包。**定长窗口、文档边界、打包成批;切法与打包直接拖累数学/代码能力3

六、评测集防线。考题绝不能漏进训练材料;跨集去重、按时间切分、记录数据出处。 这一道最容易被忽略、后果也最重:考题(基准)混进训练集,模型考满分也不代表会做事。 原书在评测一章给这个病起了名——它管这叫数据污染,第 12 章还会回来4

2. 本书真的吃了什么:一篇 4,200 词的短篇

说完工艺,原书交出了本书的实际语料,坦率得少见:一篇 20 世纪初的美国短篇小说开头, 约 4,200 词(伊迪丝·华顿的作品,以 "I HAD always thought Jack Gisburn rather a cheap genius…" 开场)5

原书拿这篇东西把五道工序真走了一遍6:文本干净(公版、UTF-8、无乱码)、 质量评估高(叙事完整、句法多样)、安全过滤直接通过、全文哈希查重、 切词考虑了斜体外来语和破折号。并且诚实标注了它的局限: 文学小说在真实训练语料里通常只占 1-5%,拿它单训的模型只会这一种腔调—— 这个局限第 11 章会当着所有人的面爆发出来。

为什么明知偏科还要用它?原书给了三个理由7: 整个文本装得进内存、训练几分钟就跑完、错误一眼看得出来——教学语料的第一美德是「错得起、看得见」

3. 主走查:语料怎么变成训练样本

这一章的主走查是「一长串 token → 一批样本对」。设定(照录本书代码):块长 BLOCK_SIZE=648:

整本小说 → 切词器(第 03 章)→ 一条长长的编号序列
… 41 6 46 5 24 6 44 23 …(示意)

滑窗切样本:窗口长 65 = 64+1,每次右移一格
样本 1:[t0 … t63 | t64]
样本 2:[t1 … t64 | t65]
……

每个窗口砍成两半:
x = 窗口前 64 个 token(输入)
y = 窗口后 64 个 token(答案)= x 整体左移一位

图说:同一条串,错一位就是答案——第 02 章「语料自己出题」的代码形态。
一个 64 的窗口里藏着 64 道「猜下一词」题:位置 0 猜位置 1,位置 1 猜位置 2……[^9]

为什么要 64+1 那个多出来的位置:答案是输入整体右移一位,没有「+1」就凑不出最后一个位置的标准答案。 这就是自监督在代码里的全部魔法——没有任何人工标注,只有错位。

4. 训练循环:每件套各管一个失败模式

第 09 章的模型 + 这里的样本,中间隔着一张「防翻车清单」。本书训练循环的每件套 (全部照录代码与默认值9):

**优化器 AdamW。**学习率 3e-4、β=(0.9, 0.95)——第 02 章讲过:亿级参数各要不同的步幅。

学习率调度(按计划调学习率)。这是七件套里最值得展开的一件,拆成三小段说。

开局为什么不能全速?训练刚开始参数是随机的,第一批反馈里全是无意义的随机抖动,猛踩油门会直接发散。

所以前 6% 步把步幅从零线性抬到目标值——这一段叫预热(warmup)10

之后步幅沿余弦退火(cosine decay:沿一条平滑的余弦曲线——半段波浪——滑落到 0)收尾:越接近终点步子越小,稳稳落进谷底11

先解释一个词——精度就是每个数字记到小数点后几位;记得越细越准,也越费显存。

混合精度:GPU 在就开半精度(记得粗一点)算前向,显存减半、速度翻倍;配 GradScaler 防小数位不够用造成的数值下溢。

**梯度裁剪。**把每步修正量的总力度封顶在 1.0:个别批次的反馈偶尔爆炸,不封顶会一棒子把参数打飞。

**梯度清零。**每步开始先清掉上一步的反馈,免得两批互相掺和。

**权重绑定。**输出层与嵌入表共用同一份参数(第 09 章):省一份参数,还带来对称性。

**断点保存。**训完把 chkpt/(config.json + model.pt)存盘——几小时的成果不能跟着进程一起没。

5. 真实的训练日志:损失从 24.2 到 0.12

本书 2 层/128 维的小模型(比第 04 章配置再缩一档:2 层、2 专家各 1、 词表按切词器实际产出),20 遍,真实输出照录12:

Epoch 1 loss 24.2249 ppl 3.29e+10 ← 模型在瞎猜,损失数值起飞
Epoch 3 loss 2.6101 ppl 13.60
Epoch 5 loss 1.0923 ppl 2.98
Epoch 10 loss 0.2931 ppl 1.34
Epoch 20 loss 0.1183 ppl 1.13 ← 基本背下了这本 4200 词的小说

图说:ppl 是困惑度(perplexity):损失取指数,含义是
「模型眼里每个位置约有几个同样可信的候选」。3.29e10 = 百亿选一都没头绪;
1.13 = 平均 1.13 选 1,接近逐字复述[^14]。前 5 遍掉得快(学常见搭配),
后面越来越慢(剩下的都是细节)——这条「先陡后缓」的曲线形状,
与第 12 章 trillion 级训练的曲线形状是同一条,只是横轴差九个数量级。

原书把训练动力学分了三段,与日志对得上13:前 5 遍学基本统计(哪些词常见、谁跟谁), 6-15 遍学短语与结构,16-20 遍只剩细节打磨——并且提醒:再训下去就是过拟合 (背题)的领地,所以正经训练要配一个没参与训练的验证集盯着,本书的教学代码省了它14

6. 作者的判断与证据

说法书里的证据我们的标注
数据质量重于数量「质量重于数量」作为独立小节+去重/过滤的整套工艺15领域共识
教学语料偏科的代价明说文学小说占语料 1-5%、单训会偏科6有自知之明,第 11 章兑现
小模型与大模型的训练是同一套原理训完总结:「prepare data, initialize model, … update parameters」同构、差的只是规模16本书代码与生产代码逐件对得上
曲线先陡后缓真实记录 20 遍12实测输出

判断(我们的,不是书里的): 这份日志最有教学价值的数字是第一个——ppl 3.29e10。 它演示了「训练前」不是「笨」,而是「分布还没对齐」:词表 2000、每个位置 2000 选 1, 均匀瞎猜的困惑度就是 2000;比 2000 还差 7 个数量级,说明初始参数让 softmax 输出了极端错误的分布。 第 1 遍到第 3 遍之间那 9 个数量级的暴跌,才是「训练在干活」最直观的样子。 如果错,会错在: 如果初始损失高其实是数值 bug(比如 logit 未初始化好)而非「正常起点」, 这段解读就变成给 bug 涂色——原书把它当正常起点呈现,我们也照此理解,但这是一处可复核的判断。

7. 边界与局限

  • 没有验证集:教学代码只看训练损失,「什么时候该停」全靠遍数写死——原书自己点破了这一点14;
  • 原书引用的「前沿训练 1 万-10 万 petaflop-天、数百万美元」17是公开估计口径,未附一手来源;
  • 本书一轮 epoch 把 4,200 词过 20 遍,是故意多轮;生产预训练对万亿 token 只过 1-2 遍—— 多轮与小数据是教学特权,照搬到大语料上就是过拟合车间18;
  • 数据工程的「人工审核边角案例」部分,原书给了原则没给流程,照着做不出可复现的流水线。

8. 可带走的

  1. 数据五道工序:配比、清洗、去重、打包、防污染;考题混进语料是静默的作弊;
  2. 语料决定模型的上限;教学语料的第一美德是「错得起、看得见」;
  3. 滑窗错位切样本:x 是输入、y 是 x 左移一位——自监督的全部魔法就是错位;
  4. 训练循环每件套各防一种翻车:预热防开局发散、余弦退火防收尾震荡、裁剪防梯度爆炸、混合精度省钱;
  5. 困惑度 = 「平均几个候选里挑一个」,它比损失好懂,适合向人汇报进度;
  6. 曲线先陡后缓:先学搭配、再学结构、最后磨细节;三段式动力学跨十个数量级成立;
  7. 教学代码省了验证集——真实训练里「什么时候停」永远由验证损失说了算;
  8. 小数据多遍与大数据少遍是同一枚硬币的两面;边界在「模型开始背题」的地方。

9. 原文地图

主题原书章原文位置
数据工程的立场Dataset Preparation for LLM Trainingtext/69-fm-dataset-preparation-for-llm-training.txt:3(搜「multifaceted process」)
五道工序Dataset Preparation for LLM Trainingtext/69-fm-dataset-preparation-for-llm-training.txt:15(搜「Data Collection and Sourcing」) · text/69-fm-dataset-preparation-for-llm-training.txt:31(搜「Cleaning and Filtering」) · text/69-fm-dataset-preparation-for-llm-training.txt:49(搜「Deduplication」) · text/69-fm-dataset-preparation-for-llm-training.txt:59(搜「Formatting and Tokenization」) · text/69-fm-dataset-preparation-for-llm-training.txt:91(搜「Evaluation Set Creation」)
去重的三层手段Dataset Preparation for LLM Trainingtext/69-fm-dataset-preparation-for-llm-training.txt:53(搜「MinHash」)
切词影响领域能力Dataset Preparation for LLM Trainingtext/69-fm-dataset-preparation-for-llm-training.txt:73(搜「Poor tokenization」)
质量重于数量Dataset Preparation for LLM Trainingtext/69-fm-dataset-preparation-for-llm-training.txt:109(搜「quality over quantity」)
本书语料与七阶段Preparing Our Dataset · Data Preparation Pipelinetext/71-fm-data-preparation-pipeline-for-this-text.txt:9(搜「4,200」) · text/70-fm-preparing-our-dataset.txt:7(搜「Jack Gisburn」)
文学占比 1-5%Data Preparation Pipeline for This Texttext/71-fm-data-preparation-pipeline-for-this-text.txt:19(搜「1-5%」)
教学语料的理由TinyStories, Shakespeare, The Wizard of Oz, and OpenWebTexttext/17-fm-tinystories-shakespeare-the-wizard-of-oz-and-ope.txt:17(搜「fits easily into memory」)
规模参照表Training Large Language Modelstext/72-fm-training-large-language-models.txt:7(搜「20–100+ layers」)
AdamW 与调度Training Large Language Modelstext/72-fm-training-large-language-models.txt:15(搜「warmup」)
训练超参默认值Source Code for Training Our LLMtext/73-fm-source-code-for-training-our-llm.txt:35(搜「VOCAB_SIZE」) · text/73-fm-source-code-for-training-our-llm.txt:39(搜「BLOCK_SIZE」)
滑窗样本对Source Code for Training Our LLMtext/73-fm-source-code-for-training-our-llm.txt:59(搜「block_size + 1」) · text/73-fm-source-code-for-training-our-llm.txt:79(搜「chunk[1:]」)
微型模型配置Source Code for Training Our LLMtext/73-fm-source-code-for-training-our-llm.txt:163(搜「num_hidden_layers=2」)
权重绑定一行Source Code for Training Our LLMtext/73-fm-source-code-for-training-our-llm.txt:209(搜「output_proj.weight」)
预热 6% 与余弦Source Code for Training Our LLMtext/73-fm-source-code-for-training-our-llm.txt:229(搜「warmup」) · text/73-fm-source-code-for-training-our-llm.txt:229(搜「cos」)
AMP 与裁剪Source Code for Training Our LLMtext/73-fm-source-code-for-training-our-llm.txt:19(搜「GradScaler」) · text/73-fm-source-code-for-training-our-llm.txt:295(搜「clip_grad_norm_」)
真实日志Source Code for Training Our LLMtext/73-fm-source-code-for-training-our-llm.txt:335(搜「24.2249」) · text/73-fm-source-code-for-training-our-llm.txt:373(搜「0.1183」)
perplexity=exp(loss)Source Code for Training Our LLMtext/73-fm-source-code-for-training-our-llm.txt:305(搜「perplexity = math.exp」)
三段动力学Source Code for Training Our LLMtext/73-fm-source-code-for-training-our-llm.txt:793(搜「Early Training」)
教学代码无验证集Source Code for Training Our LLMtext/73-fm-source-code-for-training-our-llm.txt:797(搜「validation loss」)
前沿训练规模Training Large Language Modelstext/72-fm-training-large-language-models.txt:51(搜「petaflop」)
大语料 1-2 遍What This Demonstrates About Language Model Designtext/78-fm-what-this-demonstrates-about-language-model-desi.txt:55(搜「1-2 epochs」)

Footnotes

  1. 出处:「Dataset Preparation for LLM Training」第 3 段(text/69-fm-dataset-preparation-for-llm-training.txt:3,搜「multifaceted process」)。原文:数据准备远超「从网上收大量文本」——精选、清洗、过滤、去重、配源,需要计算技术与人的判断。

  2. 出处:同章「Data Collection and Sourcing」(text/69-fm-dataset-preparation-for-llm-training.txt:15,搜「Data Collection and Sourcing」)、「Data Cleaning and Filtering」(:31,搜「Cleaning and Filtering」)、「Deduplication」(:49,搜「Deduplication」)、「Data Formatting and Tokenization」(:59,搜「Formatting and Tokenization」)、「Dataset Composition and Mixing」(:79,搜「Composition and Mixing」)、「Evaluation Set Creation」(:91,搜「Evaluation Set Creation」)。

  3. 出处:「Tokenization Strategy」(text/69-fm-dataset-preparation-for-llm-training.txt:73,搜「Poor tokenization」)。原文:差的数字切法直接伤害数学推理,差的代码切法伤害编程能力。

  4. 出处:「Deduplication Across Splits」(text/69-fm-dataset-preparation-for-llm-training.txt:57,搜「contamination」)与「The Limitations of Benchmarks」(text/92-fm-evaluation-and-benchmarking.txt:63,搜「contamination」)。原文:训练/评测集之间防污染;基准数据被爬进训练语料是评测失真的主要途径。

  5. 出处:「Preparing Our Dataset」(text/70-fm-preparing-our-dataset.txt:7,搜「Jack Gisburn」)与「Data Preparation Pipeline for This Text」(text/71-fm-data-preparation-pipeline-for-this-text.txt:9,搜「4,200」)。原文:该文本是一篇 20 世纪初文学短篇,约 4,200 词,以 "I HAD always thought Jack Gisburn rather a cheap genius" 开场(伊迪丝·华顿作品)。

  6. 出处:「Data Preparation Pipeline for This Text」(text/71-fm-data-preparation-pipeline-for-this-text.txt:3,搜「Stage 1」;:19,搜「1-5%」)。原文:七阶段走查(提取、清洗、质量评估、分类、安全、去重、切词);文学小说通常占训练语料 1-5%。 2

  7. 出处:「TinyStories, Shakespeare, The Wizard of Oz, and OpenWebText」(text/17-fm-tinystories-shakespeare-the-wizard-of-oz-and-ope.txt:17,搜「fits easily into memory」)与「Why This Implementation Wasn't Included in the Book」(text/82-fm-why-this-implementation-wasn-t-included-in-the-b.txt:17,搜「Iteration and debugging」)。原文:整个文本装得进内存、训练快、错误好查——「每次训练只要几分钟,迭代与调试才现实」。

  8. 出处:「Source Code for Training Our LLM」(text/73-fm-source-code-for-training-our-llm.txt:39,搜「BLOCK_SIZE」)。原文:BLOCK_SIZE=64、BATCH_SIZE=4、EPOCHS=20、LR=3e-4。

  9. 出处:text/73-fm-source-code-for-training-our-llm.txt:211(搜「AdamW」)、:169(搜「warmup」)、:35(搜「GradScaler」)、:255(搜「clip_grad_norm_」)、:157(搜「output_proj.weight」)、:291(搜「save_checkpoint」)。各项默认值与代码照录。

  10. 出处:text/73-fm-source-code-for-training-our-llm.txt:235(搜「0.06」)。原文:warmup_steps = int(0.06·total_steps),前 6% 步线性升温;调度公式见 :175(搜「cos」)。生产口径见 text/72-fm-training-large-language-models.txt:15(搜「warmup」):先热身后衰减是常规。

  11. 出处:text/73-fm-source-code-for-training-our-llm.txt:229(搜「cos」)。原文:余弦调度 0.5·(1+cos(π·progress)),学习率沿余弦曲线降到底。

  12. 出处:「Output」(text/73-fm-source-code-for-training-our-llm.txt:335,搜「24.2249」;:311,搜「1.0923」;:349,搜「0.1183」)。原文日志:Epoch 1 loss 24.2249 / ppl 3.29e+10;Epoch 5 loss 1.0923 / ppl 2.98;Epoch 20 loss 0.1183 / ppl 1.13。微型配置见 :127(搜「num_hidden_layers=2」):2 层、hidden 128、2 专家各 1。 2

  13. 出处:「Understanding Training Dynamics」(text/73-fm-source-code-for-training-our-llm.txt:793,搜「Early Training」;:831,搜「Middle Training」;:833,搜「Late Training」)。原文:早期学基本统计与句法、中期学短语与结构、晚期打磨细节并可能开始过拟合。

  14. 出处:text/73-fm-source-code-for-training-our-llm.txt:797(搜「validation loss」)。原文:「Depending on dataset size, the model might start overfitting…This is why we'd typically monitor validation loss (which we don't implement in this simple example)」。 2

  15. 出处:「Best Practices and Recommendations」(text/69-fm-dataset-preparation-for-llm-training.txt:109,搜「quality over quantity」)。原文:「Prioritize quality over quantity. While scale matters, quality often matters more.」另见第 12 章同名铁律(text/93-fm-practical-considerations-and-best-practices.txt:3,搜「Data Is King」)。

  16. 出处:「Source Code for Training Our LLM」末段(text/73-fm-source-code-for-training-our-llm.txt:813,搜「prepare data, initialize model」)。原文:训练 GPT-4 或 Claude 遵循同一模式——备数据、初始化模型、反复算预测与梯度、更新参数;差别只在规模与基建。

  17. 出处:「Training Large Language Models」(text/72-fm-training-large-language-models.txt:51,搜「petaflop」)。原文:前沿模型消耗 10,000-100,000+ petaflop-天、成本数百万到数千万美元。

  18. 出处:「What This Demonstrates About Language Model Design」(text/78-fm-what-this-demonstrates-about-language-model-desi.txt:55,搜「1-2 epochs」)。原文:生产训练即使万亿 token 也通常只过 1-2 遍,而本书 20 遍——多轮是小数据教学的特权。