从0训练LLM · 现代大模型体系 阅读 + 实验 ≈ 25 分钟 页内实验 ×1
C7 数据:从哪来、怎么洗、怎么配 第 4 课

网页、代码、数学、书,按什么比例混?

数据配比
按体量混,维基百科在 The Pile 里只占 0.77%;所以人们有意上采样小而精的数据——GPT-3 给维基 3% 的权重、走 3.4 遍。手工权重离最优很远:DoReMi 用小代理模型搜出的权重,下游平均高 6.5 个点。但权重一变,有些域就要被重复很多遍。
❓

本课一问:洗干净的数据来自很多地方:网页、代码、论文、书、百科、数学题。训练时每一步从哪一类里取多少?

这一课先不碰:好数据不够、只能重复或合成时怎么办(第 5 课);不同阶段用不同配比(第 6 课)。

从已有出发

从已有出发 · 累计数据流 点已学环节看形状与参数
解码层

模型这条流水线上,本章始终停在最左边的「文字」一格;把这一格展开,就是下面这条数据管线:

从已有出发 · 数据管线 本课其他环节点环节看它做什么、真实数字

前三课是在每一类数据内部删东西。现在换一个问题:各类之间怎么分配训练的 token。

本课换例子,原因写在这里:贯穿任务里我们只有一种数据——文言小说,没有「配比」可调;配比问题只在多种来源之间才存在。所以本课的实验改用 The Pile 的 22 个真实来源,项目自己的配比决策(要不要加现代白话、英文,加多少)放在本课最后一节。

先自己设计:按体量自然混

最「公平」的做法:每类数据有多少就按多少的比例取,也就是把所有数据倒进一个池子里均匀打乱。

  1. ① 朴素方案
  2. ② 它在哪失败
  3. ③ 改进方案
朴素方案按体量混:每类数据按自己的大小占比

The Pile 由 22 个来源组成,原始体量合计 825.18 GiB。其中 Pile-CC(网页)227.12 GiB,英文维基百科只有 6.38 GiB。

按体量混:维基百科占 0.77%,网页占 27.5%。每个来源都恰好走一遍——不管它每个 token 值多少。

📐

表里「按体量应占」一列是用前一列的 token 数现算的:499B 里维基占 0.6%,实际给了 3%;WebText2 占 3.8%,实际给了 22%。

改进一:手工权重,和它的问题

The Pile 的做法和 GPT-3 一样,只是写成了「每个来源走几遍」:维基 3 遍,Gutenberg 书 2.5 遍,PubMed、arXiv、GitHub 讨论区等 2 遍,网页和 GitHub 代码 1 遍——22 个来源的 epoch 数是手工定的,合起来的有效体量是 1,254.20 GiB 。

问题是:手工权重离最优有多远?DoReMi(Xie 2023)给出了一个数字。它先用 280M 参数的小代理模型,用 Group DRO 的思路反复调整各域权重——哪个域上的 loss 比参考模型高得多,就给哪个域更多权重——再用搜出来的权重训 8B 模型。结果:下游 one-shot 平均高 6.5 个点,达到基线精度所需的步数少 2.6 倍(75k 步对 200k 步) 。

它搜出来的权重很反直觉:Pile-CC 从基线的 0.1121 升到 0.6057,arXiv 从 0.1052 降到 0.0036,PubMed Central 从 0.1071 降到 0.0046——而 YouTube 字幕从 0.0042 升到 0.0502,PhilPapers 从 0.0027 升到 0.0274。「人觉得质量高」和「对模型最有用」不是一回事。

改进二:温度采样——在体量与均匀之间调一个旋钮

多语言训练遇到的是同一个问题的另一面:英文数据多出其他语言几个数量级。mT5 与 XLM-R 用的是一个单参数的折中:

温度采样:按体量的 α 次方分配权重(mT5、XLM-R 取 α = 0.3)
∝
👆 公式里带下划线的每一项都可以点——点哪项,讲哪项。
∝ 表示「正比于」:算完 piα 之后要除以所有域的总和,让权重加起来等于 1。每个域走几遍 = 权重 × 总预算 ÷ 这个域的体量,计算器里实时算。
计算器 · 22 个来源、4 种配比,每个域走几遍(真实体量与权重)

数据:The Pile 表 1(原始体量单位 GiB,合计 825.18 GiB;有效体量 1,254.20 GiB)与 DoReMi 表 1(one-shot 下游平均 +6.5 个点,达到基线精度的步数少 2.6 倍,280M 代理模型求权重、8B 主模型)。DoReMi 权重是 token 占比、这里近似按字节折算,它那一栏的 epoch 只看量级。

🎯

试三件事:① 在「Pile 手工」下读「走几遍」一列——预算默认是 Pile 的有效体量 1,254 GiB,这一列应该和原表逐项相同(维基 3.0、Gutenberg 2.5……),这是计算器的自检;② 切到「DoReMi」,数一数有几个域超过 4 遍,重复最多的是谁;③ 切到「温度采样 α」,从 1 拖到 0,看灰竖线(按体量的份额)和蓝条怎么分开。

DoReMi 的权重有一个代价在计算器里一眼可见:同样 1,254 GiB 的预算下,YouTube 字幕要走十几遍,PhilPapers、维基也一样(这一栏把 token 占比近似当字节占比,只看量级)。重复太多遍就不值了——第 5 课专门算这笔账。

2026 年的做法

放回演进图里

前三代都在决定「一条数据要不要」;从这一代开始,决定的是「每类数据要多少」。

预训练数据的演进:每一代都被上一代的某个真数字逼出来
  1. 起点 有多少用多少:原始网页直接进训练 Common Crawl 原始快照
    解决了量几乎无限:Common Crawl 定期抓取全网,FineWeb 用了 96 个快照。
    卡在WET 纯文本里样板和菜单太多(FineWeb §3.2);我们的原始文件不还原硬换行就跑 C4 句末规则,整本书只剩 17.02% 的字。
  2. 第一代 让人当过滤器:只取被点过赞的链接 GPT-2 WebText,2019
    解决了Reddit 上至少 3 karma 的外链,4,500 万个链接,清洗后约 800 万文档、40 GB。
    卡在量太小:C6 算出的需求是十几 T token;而且只覆盖被分享过的那一小部分网页。
  3. 第二代 只看长相的规则过滤 C4 2019 · Gopher 2021
    解决了句末标点、词数、平均词长、停用词、重复行……便宜,能在全网快照上跑。
    卡在绑语言、绑求值单位:英文原版在整本《三國志演義》3,697 段上通过 0 段;C4 句末标点规则删掉约 30% 的 token,FineWeb 最后没用它。
  4. 第二代 近重复去重:MinHash + 分桶 Broder 1997 → Lee 2021 → FineWeb 2024
    解决了C4 里一句话重复 61,036 次;去重后模型复述训练文本的频率降到 1/10。MinHash 把两两比较变成查桶。
    卡在去得越狠未必越好:跨 96 个快照全局去重只剩 4T,训不出更好的模型;每快照独立去重留 20T,才追平 RefinedWeb。
  5. 第三代 让模型给数据打分 CCNet 2019 · GPT-3 2020 → FineWeb-Edu、DCLM 2024
    解决了判断「有没有营养」:FineWeb-Edu 让 Llama-3-70B 标 46 万页、蒸馏成分类器,MMLU 33% → 37%。
    卡在参考语料的困惑度偏向「像参考」:我们模型写的胡话困惑度 93.417,低于真原文 273.209;阈值 3 删掉 92%,长程训练不够用。
  6. 第四代 配比:从手工权重到代理模型搜索 The Pile 2020 → DoReMi 2023 你在这里
    解决了DoReMi 用 280M 代理模型搜域权重,8B 模型下游平均 +6.5 个点,达到基线快 2.6 倍。
    卡在权重一变就要重复:按 DoReMi 的权重花完 The Pile 的有效体量,YouTube 字幕要走约 16.9 遍(按字节近似 token,只看量级)。
  7. 第五代 数据墙:重复与合成 Muennighoff 2023 · WRAP 2024 · Phi-4 2024
    解决了重复 4 遍以内几乎等于新数据;改写真实网页(WRAP)预训练约快 3 倍;Phi-4 约 10T token 里合成占 40%。
    卡在让模型只吃自己生成的数据,分布的尾巴一代代消失:在三国演义真实字频上重采样,只出现 1 次的字每一代有约 36.8% 的概率丢掉,丢了就回不来。
  8. 第六代 按时机投放:退火 → mid-training MiniCPM、Llama 3 2024 → OLMo 2、Qwen3、GLM-5
    解决了最好的数据放到学习率衰减段(C5 的 WSD)加量;再发展成独立阶段,顺便拉长上下文。
    卡在同名不同方:Qwen3 的高质量阶段占 13.9%,Llama 3 的退火只占 2.6e-6;收益与学习率调度缠在一起,很难单独归因。
数字口径:我们语料上的数字由 gen_c07_corpus.py 在《三國志演義》上实算(c07-*.json);FineWeb、GPT-2 数字出自本地 PDF;DoReMi、Muennighoff、WRAP、Phi-4、Qwen3、Llama 3 出自原文(核实记录见设计卡);「约 16.9 遍」「36.8%」「13.9%」在构建时现算。

我们的项目:古今、中英比例怎么定

旧版课程的项目第一步就是「选语料,定中英比例(建议中文为主、少量英文和代码)」,理由是:分词器只认得它见过、统计过的东西,语料配比直接决定压缩率。第 2 课的实验把这句话变成了数字:训练分词器的语料里混进 107 份英文声明后,1,791 次合并里有 1,034 次变成了英文 token,中文验证集的 token 数从 58,386 涨到 71,330。

所以项目里的配比决策有两层:

  1. 分词器的训练语料按什么比例混——它决定每种语言、每种文体的压缩率,一旦定下就和模型终身绑定(C1);
  2. 模型的训练数据按什么比例混——它决定模型在各类任务上的能力。

我们的语料目前是 100% 文言小说。如果加入现代白话或英文,比较时要用 val_bpb(每字节比特数)而不是 val loss——换了分词器,每个 token 的含义就变了(MILESTONES 的全局约定第 2 条)。这组实验还没有跑,列在章首页的项目推进里。

⚠

常见误解一:「按体量混最公平、最自然。」按体量混意味着每个 token 同等重要。可维基的一个 token 和推广页的一个 token 对模型的价值不同;从 GPT-3 起,所有公开的配方都在有意上采样小而精的数据。

常见误解二:「配比靠拍脑袋。」The Pile 时代确实是手工定的;现在用小代理模型搜(DoReMi、RegMix、Qwen3 的消融)。但「代理模型上的最优能迁移到大模型」本身是一个经验假设,只在论文验证过的那几组规模上成立。

常见误解三:「配比一次定终身。」SmolLM3、Qwen3、Llama 3 都在训练后期改配比,第 6 课讲为什么。

证据三问

问本课的回答
① 它解决什么问题?决定训练的每个 token 来自哪一类数据,让价值高的数据多出现、价值低的少出现
② 数学上为什么可能有效?DoReMi 的出发点是 Group DRO:优化「最差的那个域」的超额 loss,让模型不偏废任何一类
③ 实验上为什么选了它?DoReMi 在 280M → 8B 上 +6.5 个点、快 2.6 倍;Llama 3、Qwen3 都用小模型实验定配比

一句话

📌

配比不是按体量摊,而是按「每个 token 值多少」分:小而精的数据被有意多喂几遍,权重可以用小代理模型搜出来——但上采样得越多,就重复得越多。

🚦

先停在这里:记住「按体量混没人用」「手工权重离最优很远」「权重决定了每个域要重复几遍」。
再深一层:读 DoReMi 表 1,想一想为什么 Pile-CC 的权重会从 11% 升到 61%——提示:Group DRO 看的是「超额 loss」,不是「质量」。

下一个缺口

高质量数据被上采样到第几遍就不值了?用完了怎么办? → 第 5 课:高质量数据用完了怎么办?

你可能会问