数据:从哪来、怎么洗、怎么配
主线定位
点任一已学环节,看这一步的输入 → 输出形状、参数量,以及它解决了什么问题(数字取自 Qwen/Qwen3.8-27B 真实 config)。
- 上游 · C6 规模:训多大、喂多少:按 Chinchilla,算力最优约 20 token/参数;生产模型远不止——Llama 3 8B 训了 15T token,Qwen3 训了 36T。C6 回答了「喂多少」,没回答「从哪来」。
- 本章:流水线最左边那一格「文字」从哪来。它本身也是一条流水线:爬取 → 抽取 → 规则 → 去重 → 质量分类 → 配比 → 重复与合成 → 按时机投放。
- 下游 · C8 稳定性:放大后为什么会炸:数据和配方都齐了,模型一放大,loss 开始出现尖峰。
百分比 = 相对「基础过滤后 36T」现算;原始 WARC 的总 token 数论文没给,所以漏斗从 36T 开始。鼠标停在每一行上看原文出处。全局去重那一行不是漏斗的一级,而是被放弃的另一条路(L2 讲为什么)。
贯穿任务
把一部《三國志演義》的原始 Gutenberg 文件,当成一次「网页快照」,一步步洗成训练数据。这就是我们项目的语料原样:1,863,656 字节,带 19,333 字节英文声明、21,682 个 Windows 换行、每 38 个字一个硬换行——和网页一样脏。洗完以后,用项目分词器切出 560,001 个 token;Llama 3 8B 的 15T 相当于把它重复 2.68 × 10⁷ 遍。每一课在这份语料上多做一步;某一课的主题在一部书上体现不出来(配比、质量筛选)时,课里会写明为什么换例子。
本章问题链
每一课只回答一个问题;上一课的失败,逼出下一课的问题。
| 课 | 这一课的问题 | 朴素方案在哪个真数字上失败 | 一句话 |
|---|---|---|---|
| 第 1 课 | 直接把网页爬下来就能训练吗? | 不还原硬换行就跑 C4 句末规则,整本书只剩 17.02% 的字;英文规则在 3,697 段上 0 段通过 | 先还原正文、再在自己的数据上逐条跑规则 |
| 第 2 课 | 同一段话在语料里出现几万次,会怎样? | 每回带一份声明,分词器 1,791 次合并里 1,034 次被英文占掉;全局去重留下的 10% 比删掉的 90% 更差 | 去重删大簇,不是删所有相似;删多狠由模型说了算 |
| 岔路 | 一个最小哈希值,凭什么能估出两篇文档有多像? | — | 随机排序后第一名相同的概率 = Jaccard |
| 第 3 课 | 规则都过了、也不重复,没营养的文本怎么筛? | 我们模型写的胡话困惑度 93.417,低于真原文 273.209;FineWeb-Edu 阈值 3 删掉 92% | 规则管长相,分类器管营养;筛得越狠剩得越少 |
| 第 4 课 | 网页、代码、数学、书,按什么比例混? | 按体量混,维基在 The Pile 里只占 0.77%;手工权重比 DoReMi 低 6.5 个点 | 按每个 token 的价值分配,代理模型能搜权重 |
| 第 5 课 | 高质量数据用完了怎么办? | 训 16 遍只相当于 10.6 份新数据;只出现 1 次的字每代丢约 37% | 真数据约 4 遍内几乎不亏;改写真数据,别让模型吃自己 |
| 第 6 课 | 最好的数据什么时候喂?(回扣 C5) | 均匀打乱时,90% 的好数据在学习率衰减段之前就用掉了 | 好数据留给衰减段;同叫退火,量级差 5 个数量级 |
| 实验课 | 把《三國志演義》当成一次网页快照,完整跑一遍 | — | 每一级都在自己的数据上算删除率、看删掉的样本 |
演进地图
- 解决了量几乎无限:Common Crawl 定期抓取全网,FineWeb 用了 96 个快照。卡在WET 纯文本里样板和菜单太多(FineWeb §3.2);我们的原始文件不还原硬换行就跑 C4 句末规则,整本书只剩 17.02% 的字。
- 解决了Reddit 上至少 3 karma 的外链,4,500 万个链接,清洗后约 800 万文档、40 GB。卡在量太小:C6 算出的需求是十几 T token;而且只覆盖被分享过的那一小部分网页。
- 解决了句末标点、词数、平均词长、停用词、重复行……便宜,能在全网快照上跑。卡在绑语言、绑求值单位:英文原版在整本《三國志演義》3,697 段上通过 0 段;C4 句末标点规则删掉约 30% 的 token,FineWeb 最后没用它。
- 解决了C4 里一句话重复 61,036 次;去重后模型复述训练文本的频率降到 1/10。MinHash 把两两比较变成查桶。卡在去得越狠未必越好:跨 96 个快照全局去重只剩 4T,训不出更好的模型;每快照独立去重留 20T,才追平 RefinedWeb。
- 解决了判断「有没有营养」:FineWeb-Edu 让 Llama-3-70B 标 46 万页、蒸馏成分类器,MMLU 33% → 37%。卡在参考语料的困惑度偏向「像参考」:我们模型写的胡话困惑度 93.417,低于真原文 273.209;阈值 3 删掉 92%,长程训练不够用。
- 解决了DoReMi 用 280M 代理模型搜域权重,8B 模型下游平均 +6.5 个点,达到基线快 2.6 倍。卡在权重一变就要重复:按 DoReMi 的权重花完 The Pile 的有效体量,YouTube 字幕要走约 16.9 遍(按字节近似 token,只看量级)。
- 解决了重复 4 遍以内几乎等于新数据;改写真实网页(WRAP)预训练约快 3 倍;Phi-4 约 10T token 里合成占 40%。卡在让模型只吃自己生成的数据,分布的尾巴一代代消失:在三国演义真实字频上重采样,只出现 1 次的字每一代有约 36.8% 的概率丢掉,丢了就回不来。
- 解决了最好的数据放到学习率衰减段(C5 的 WSD)加量;再发展成独立阶段,顺便拉长上下文。卡在同名不同方:Qwen3 的高质量阶段占 13.9%,Llama 3 的退火只占 2.6e-6;收益与学习率调度缠在一起,很难单独归因。
三层交互
| 层 | 本章里的组件 | 在哪一课 |
|---|---|---|
| 概念动画 | 数据管线累计视图与 FineWeb 真实 token 漏斗;网页 → 正文的两种抽取(浏览器 DOMParser 真解析);演进地图 | 各课开头、第 1 课 |
| 算法模拟器(真算法、小数据) | 规则逐条求值(文档 × 规则,整本书删除率实时重算);MinHash 签名与分桶、S 曲线;1,000 次随机置换证明;字级 bigram 困惑度过滤器(逐字着色);配比与 epoch 计算器;Muennighoff 有效数据;模型崩溃逐代重采样 | 第 1–5 课、岔路 |
| 真模型 / 真数据 | 项目分词器的真实词表与三种条件下真训练的 BPE;整本书上的精确 Jaccard 枚举与 MinHash-LSH 真跑;项目基线模型的真实生成样本;项目真实训练日志(0.5M token 重复 24.5 遍);整本书逐级漏斗 | 第 2、3、5 课与实验课 |
项目推进:给我们的模型建一条可复现的数据管线
对应 04-实践项目/MILESTONES.md 的「预训练目标与数据」一节(minillm/data.py 的清洗与切分;项目文件里的章号是项目自己的编号)。分工照旧:代码 AI 来写,决策你来做。清洗、分词、训练的代码已经写好;本章的规则、去重与困惑度统计由 知识平台/src/data/precomputed/gen_c07_corpus.py 在整本书上算出。
你要拍板的六件事
- 清洗的顺序:抽取还原(去声明、拼回硬换行)放在任何逐行规则之前吗?(第 1 课)
- 规则集:哪些规则适用于文言小说?虚词表用哪一套?长度门槛按段还是按回?(第 1 课)
- 去重的单位与参数:段落还是回?shingle 取几个字?分桶取多少?(第 2 课)
- 配比(旧版项目的「定中英比例」):要不要加入现代白话或英文?各占多少?分词器和模型的训练语料是否用同一个配比?(第 4 课)
- 同一份语料训几遍:依据哪条曲线的哪个拐点?怎么排除学习率调度的影响?(第 5、6 课)
- 要不要退火:WSD 衰减段上采样哪一个子集?(第 6 课)
验收标准(全部可测,已实测的写出了数字):
- 在清洗结果上跑句末标点规则,段落保留率 ≥ 90%(实测 91.24%);同一规则在原始硬换行行上的保留率写进报告作对照(实测 24.45%)。
- 每条规则在整本书上的删除率都算出来;删除率超过 10% 的规则写明理由(实测:最少 50 字删 8.8%,文言虚词表删 15.5%,现代虚词表删 46.1%)。
- 去重:报告 Jaccard ≥ 0.75 的段落对数(实测 0)与最像的一对(J = 0.5833);MinHash-LSH 的候选与精确枚举对照(实测 0 对,一致)。
- 分词器只在去掉声明的训练集上训练:1,791 次合并里英文 token 为 0,合并表与
tokenizer.json逐条一致(gen_c07_bpe_template.py实测)。 - 训练步数:指出 val loss 最低点所在的 epoch(实测 1,500 步 run 在第 300 步,约 4.9 个 epoch),并说明它与学习率调度的关系。
- 配比与退火:用
val_bpb比较(换分词器时不能比 val loss),差值小于噪声底线不下结论(以 C14 为准:同配置 5 次重跑的 val loss 极差 0.016、3σ ≈ 0.020;MILESTONES 原写的 0.01 比实测的重跑波动还小;用 val_bpb 比时,底线也要用同样的重跑换算成 bpb)。这两组实验尚未跑,需要实验 agent 增补,见实验课末尾的清单。
坑与带走
| 坑 | 症状 | 后果 | 怎么办 |
|---|---|---|---|
| 不还原正文就跑逐行规则 | 我们的原始文件只剩 17.02% 的字 | 句子被切碎,数据量骤减 | 先抽取、还原,再跑规则(第 1 课) |
| 英文规则原样套中文 | 整本书 0 段通过 | 好文本被删光 | 按语言改写,在自己的数据上逐条求值(第 1 课) |
| 在带样板的语料上训分词器 | 最长 token 是套话;每回一份声明时,1,034 / 1,791 次合并是英文 | 压缩率变差,词表和模型终身绑定 | 先去重、去样板,再训分词器(第 2 课) |
| 只做精确哈希去重 | 转载改一个字就漏网 | 近重复残留、模型背书、验证集污染 | shingle + MinHash + 分桶(第 2 课) |
| 跨所有快照全局去重 | 老快照留下的反而是广告和关键词堆砌 | 训练数据变差 | 每个快照独立去重(第 2 课) |
| 把参考语料的困惑度当质量 | 模型胡话困惑度最低,诗先被删 | 偏向参考文体 | 写明打分细则,训分类器,抽查被删样本(第 3 课) |
| 质量阈值拉太高 | 只剩百分之几的 token | 长程训练被迫大量重复 | 质量和数量一起算(第 3 课) |
| 按体量混 | 维基只占 0.77% | 高价值数据被淹没 | 上采样,用代理模型搜权重(第 4 课) |
| 小数据集上采样过度 | 某些域一次训练走十几遍 | 收益递减,甚至过拟合 | 用 D′ 公式算重复的价值(第 4、5 课) |
| 用生成数据替代真实数据递归训练 | 低频字、低频词一代代消失 | 模型崩溃 | 改写真实文本,始终混入真实数据(第 5 课) |
| 好数据均匀打乱 | 90% 的好数据在衰减段之前就用掉 | 浪费最好的数据 | 退火、mid-training(第 6 课) |
| 看到「退火」就以为是同一配方 | 13.9% 对 2.6 × 10⁻⁶ | 复现失败 | 看 token 数、学习率和数据,不看名字(第 6 课) |
这一章你应该带走的(各课「一句话」):
- 规则只看文本的长相:先把网页还原成正文,再在你自己的数据上逐条求值——英文规则原样套在中文上,会把最好的文本删光。
- 去重要删的是被复制成千上万份的大簇,不是所有「相似」;MinHash 把两两比较变成查桶,但删到多狠,要让训练出来的模型说了算。
- 随机排一次序,两篇文档各自的第一名相同的概率就是它们的 Jaccard。
- 规则管长相,分类器管营养:先把「好」写成打分细则,让强模型标一小批,再蒸馏成便宜的分类器去筛全网——但筛得越狠,剩下的 token 越少。
- 配比不是按体量摊,而是按「每个 token 值多少」分:小而精的数据被有意多喂几遍,权重可以用小代理模型搜出来——但上采样得越多,就重复得越多。
- 数据墙前面有两条路:把真数据多喂几遍(约 4 遍以内几乎不亏),或让模型改写真数据来扩充;纯靠模型生成再喂自己,分布的尾巴会一代代消失。
- 最好的数据留到学习率往下走的那一段再加量;同叫「退火」,Qwen3 的高质量阶段占 13.9%,Llama 3 只有最后 40M token。
深入这一章
每条都实际打开核对过(2026-09-26):写清它讲清了什么、对应哪一课、为什么推荐。标「需联网」的是站外资料;本地 PDF(/papers/)与本章全部交互组件断网可用。arXiv 链接的论文会在 P6 统一下载到本地后改链。
🎮 想更直观 10–30 分钟
🔬 想吃透原理 1–3 小时
📄 想读原文 按需
排除了什么(也是筛选标准):① B 站「古希腊掌管代码的神」等 2–4 分钟的速通视频(只给结论,没有推导);② PKU-DCAI《大白话 13》(主要是自家工具的使用教程);③「小工蚁创始人」的 4 分钟数据集罗列;④ CS336 的 AI 配音搬运版(改给带字幕的搬运版或原片);⑤ Karpathy 视频的 B 站搬运(直接链原片);⑥ 腾讯云开发者社区《大规模预训练数据管理与质量控制机制》(疑似生成的填充文章,伪代码调用了未定义的函数);⑦ CSDN《MinHash-LSH 哈希模糊去重:医学大模型……》(大段罗列医学数据集,只适用一个领域);⑧ 智源社区与 CSDN 上对 BigCode 博客、MiniCPM 博客的转载(直接链原文);⑨ 仓库 text-dedup(只有代码,没有讲解;需要动手时再看);⑩ Lilian Weng《Thinking about High-Quality Human Data》(讲的是人工标注,不是预训练数据)。另:B 站「呱呱炼丹炉」的 MinHash / LSH 两集可能是中文里少有的原理讲解,但播放量很低、内容未能核实,暂不列入;知乎几篇数据清洗长文对自动访问返回 403,未能核实。