对应 Maps to:Stanford CS525 Winter 2026 Training Data for AI,1/28 Data for LMs: pre-training(学生报告 + Ludwig)。三个学生报告:FineWeb 与 Nemotron-CC(Animesh Jha、Nick Jiang)、Scaling Data-Constrained Language Models(由论文第一作者 Niklas Muennighoff 本人报告)、Scaling Laws for Data Filtering(Rohan Sinha);之后 Schmidt 综述了开源模型技术报告里关于训练数据的信息(23 页 slides)。 依据说明:FineWeb / Nemotron-CC、数据受限扩展律两份报告的 slides 我读了全文;过滤扩展律的报告只读到前 4 页(其余页面在查看器里没有文字层),那一节依据 Goyal et al. 的论文摘要。论文的关键数字核对过各论文的摘要;FineWeb-Edu 的标注模型(Llama-3-70B-Instruct)、Nemotron-CC 的 4.4T + 1.9T 拆分是我根据论文正文补充的。第 7 节”统一的视角”和第 8 节”延伸与前沿”是我补充的。 配套代码 Code:
code/lecture07/(numpy;3 个脚本 + 1 个模块;每个约 15–30 秒;复用第 6 讲的合成网页世界) 预计阅读时间:3 小时(含运行代码)
0. 本讲导航 · How to read this lecture
0.1 学习目标 Learning goals
- 说明 FineWeb 的主要发现:为什么跨快照的全局去重反而更差;FineWeb-Edu 怎样用 LLM 标注质量、再蒸馏成小分类器。
- 说明 Nemotron-CC 怎样在”质量”和”数量”之间找平衡:分类器集成、按质量分桶、用 LLM 改写低质量数据;为什么它在长训练里胜出。
- 用 Muennighoff et al. 的数据受限扩展律回答”数据重复几遍还有用”,并理解”重复的代价”来自哪里。
- 用 Goyal et al. 的质量-数量取舍(QQT)解释”最优的过滤强度取决于算力”。
- 了解开源模型技术报告里关于训练数据能看到什么、看不到什么,以及 2023–2025 年数据处理方法的演变。
0.2 先修与本讲范围 Prerequisites & scope
| 默认你已经会 Assumed | 本讲不展开 Not covered |
|---|---|
| 第 6 讲:Chinchilla、DCLM 的方法论和管线、“高质量是操作性的” | 数据配比的优化(第 10 讲) |
| 第 4 讲:MinHash、Bloom filter | 合成数据的系统讨论(第 11 讲);无限算力下的预训练(第 12 讲) |
| 第 5 讲:DataComp 的过滤基线 | 后训练数据(第 8–9 讲) |
0.3 本讲地图 Map
§1 问题:DCLM 的结论在"长训练"里还成立吗?
§2 FineWeb:快照去重的反直觉发现;FineWeb-Edu ← 代码 01
§3 Nemotron-CC:分类器集成、分桶、改写,为长训练保住数量 ← 代码 02
§4 数据受限:重复几遍还有用? ← 代码 03 演示 1
§5 过滤的扩展律:数据整理不能不考虑算力 ← 代码 03 演示 2
§6 开源模型的训练数据:Schmidt 的综述
§7 一个统一的视角
§8 延伸与前沿
§9–13 小结、常见误区、练习、延伸阅读、下一讲预告
0.4 关于数字
代码复用第 6 讲的合成网页世界和”慢慢学”的三元模型(第 6 讲 §7 说明了它能演示什么、不能演示什么)。这一讲的预算一直推到 300 万个 token——远大于过滤后的数据——所以数据会被重复看很多遍。为了让”重复”的行为合理,第 7 讲给模型加了一个改动:平滑用的计数也乘以”看了几遍”,看得越多越相信(越接近死记硬背);这个改动不影响第 6 讲的任何结果(那里每篇文档最多看一遍)。代码固定了随机种子,重复运行输出逐字相同。
1. 问题:DCLM 的结论在”长训练”里还成立吗?
第 6 讲的 DCLM 在三个规模上都得出同样的结论:模型过滤是关键,过滤得越狠越好(保留 10% 好于 15%、20%)。但它的三个规模,训练 token 数都远小于过滤后的数据(几百亿 vs 几万亿):每篇文档最多看一遍。
今天的模型不是这样训练的。第 6 讲 §1.4:Llama 3 8B 训练了 15 万亿 token,Qwen 2.5 7B 18 万亿,Qwen 3 36 万亿。DCLM-Baseline 只有 3.8 万亿(事后发现其中独特的只有约 1 万亿),FineWeb-Edu 只有 1.3 万亿。激进过滤删掉了约 90% 的数据——在 15 万亿 token 的训练里,这些数据要被重复十几遍。
于是这一讲的四篇论文,围绕同一个张力:质量 vs 数量。
- FineWeb:怎样处理 Common Crawl 才能既好又多?(去重怎么做;FineWeb-Edu 怎样用 LLM 定义质量)
- Nemotron-CC:怎样为”长训练”保住数量,又不牺牲质量?
- 数据受限的扩展律:数据不够时,重复几遍还有用?
- 过滤的扩展律:最优的过滤强度怎样随算力变化?
2. FineWeb
2.1 处理 Common Crawl 的几个”杠杆”
学生报告把处理 Common Crawl 的选择归纳为六个杠杆:HTML 的处理(抽取器)、语言识别、去掉被标记的来源(URL 黑名单)、去掉”低质量”文档的过滤器、去重、其他过滤器。目标有两个:足够多的 token(让大模型也能 Chinchilla 最优)和评测上的表现(例如 10 亿参数模型在 MMLU + HellaSwag 上的平均分)。
几个代表性的数据集,按时间顺序:
| 数据集 | 抽取 | 过滤 | 去重 |
|---|---|---|---|
| MassiveText(Gopher) | — | 启发式规则、Google SafeSearch | 文档级 MinHash |
| C4 | — | langdetect、启发式规则 | 3 行窗口的去重 |
| OSCAR | — | fastText 语言识别 | 行级哈希 |
| RefinedWeb | trafilatura | MassiveText 的启发式 | MinHash(模糊)+ 子串(精确) |
| FineWeb | trafilatura(WARC) | C4 + RefinedWeb 的规则 + 新规则;FineWeb-Edu:教育价值分类器 | 每个快照各自 MinHash |
| DCLM | resiliparse | fastText(选像 OpenHermes 的文档) | Bloom filter |
| Nemotron-CC | Justext | 三个分类器的集成;合成改写 | 全局模糊去重 |
2.2 FineWeb 的管线
FineWeb(Penedo et al. 2024)从 96 个 Common Crawl 快照里做出了 15 万亿 token 的英文数据集,并公开了每一步的消融实验——这是它最大的贡献之一。
-
抽取:从 WARC(原始 HTML)用 trafilatura 抽取,比直接用 WET 文件好(DCLM 也证实了这一点)。
-
基本过滤:URL 黑名单(来自 RefinedWeb);fastText 语言识别,英语概率低于 0.65 的删掉;MassiveText 的质量和重复规则。到这一步还有约 36 万亿 token(GPT-2 分词)。
-
去重:文档级 MinHash(§2.3)。
-
更多过滤器:在 HellaSwag 上发现,C4(更小)比当时的 FineWeb 还好。把 C4 的规则一条条加进来:全部加上能追平 C4,但删掉了超过 30% 的 token——罪魁是”每一行都要以标点结尾”这一条。去掉这一条、保留其余的,只删掉约 7%,效果有提升。然后他们设计了三条新规则来近似”行尾标点”规则的效果、但删得更少(合起来删约 22%):
- 以标点结尾的行的比例 ≤ 0.12 的文档删掉;
- 重复行里的字符占比 ≥ 0.1 的删掉;
- 短于 30 个字符的行占比 ≥ 0.67 的删掉。
结果比 C4 好。最后为公开发布去掉了邮件地址、IP 地址等个人信息。
2.3 反直觉的发现:全局去重更差
Common Crawl 是一系列快照的并集:每次抓取一部分网页,同一个网页会在很多快照里反复出现。直觉上,应该把所有快照放在一起做全局去重。FineWeb 试了两种做法:
- 全局 MinHash:所有快照放在一起,按从新到旧的顺序去重——老快照里约 90% 的数据被删掉,最后只剩 4 万亿 token;
- 每个快照各自 MinHash:剩 20 万亿 token,而且效果更好。
为什么?FineWeb 的分析发现:全局去重在老快照里”保留”下来的数据,质量比被删掉的数据还低。
代码 01 演示 1 模拟了 8 个快照:一直维持 1.2 万个活着的网页,每过一个快照,百科页以 0.9、论坛页以 0.85 的概率活下来,垃圾页、乱码页只有 0.3(其余被新网页替换)。
| 去重方式 | 文档数 | token 数 | 主要类型 | 3 万 | 10 万 | 30 万 |
|---|---|---|---|---|---|---|
| 每个快照各自去重 | 31,031 | 1,795,984 | 百科 0.38、论坛 0.28 | 0.364 | 0.679 | 0.906 |
| 全局去重(新 → 旧) | 13,114 | 819,791 | 垃圾 0.31、乱码 0.27 | 0.331 | 0.601 | 0.890 |
(后三列:训练预算 3 万 / 10 万 / 30 万个 token 时的知识题准确率。)
全局去重之后,最新的快照(第 8 个)一篇没删,主要是百科和论坛;最旧的快照(第 1 个)删掉了 53%,留下的 90% 是垃圾页和乱码页。机制很清楚:好网页活得久,在新快照里已经出现过,于是在老快照里被当成重复删掉;老快照里留下来的,几乎都是只出现过一次、早已消失的垃圾页。
换个角度看:每个快照各自去重时,一个活了 8 个快照的好网页留下了好几份——这相当于按”活得久”给好网页加了权(练习 3:活下来的概率 0.9 的网页,8 个快照里平均出现 5.7 次,0.3 的只有 1.4 次)。“重复”并不总是坏事——这和第 6 讲 DCLM 的事后分析(重复多的文档往往质量更高)是同一回事。
2.4 FineWeb-Edu:问 LLM 一个具体的问题
FineWeb-Edu 是 FineWeb 的一个 1.3 万亿 token 的子集:
- 让 Llama-3-70B-Instruct 给约 45 万个网页的教育价值打 0–5 分(学生报告写”约 50 万”);
- 用这些分数训练一个小分类器(在一个文本嵌入模型上加一个回归头);
- 用小分类器给 FineWeb 的全部文档打分,保留 3 分及以上的。
效果:在 MMLU、ARC 这类知识和推理任务上大幅领先 FineWeb。话题分布也变了:教育 / 教学、历史 / 文化变多,商业、娱乐、旅游变少;在学术文本(WikiText、arXiv)和代码上的困惑度更低。
这和第 6 讲的结论有什么关系?DCLM 里”LLM 当评委”(问 Mistral-7B “这篇文档有没有用”)输给了 fastText。FineWeb-Edu 的区别在于两点:问了一个更具体的问题(教育价值),以及把 LLM 的判断蒸馏成了一个小模型——贵的 LLM 只标几十万篇,便宜的分类器扫几十亿篇。
代码 01 演示 2:模拟的 LLM 标注员看内容(它能读懂被乱码打断的事实,知道前 100 个热门国家的事实、能发现关于它们的错误,乱糟糟的文字扣分),不看措辞。它给百科页平均 3.58 分(84% ≥ 3 分),论坛 2.59 分(51%),垃圾页 0.36,乱码页 0.02——和第 6 讲那个”只看像不像样”的人类标注员完全不同。蒸馏出的小分类器和 LLM 的”≥ 3 分”判断一致 78.4%。
| 数据 | token 数 | 主要类型 | 3 万 | 10 万 |
|---|---|---|---|---|
| 不用质量分类器 | 1,146,889 | 垃圾、乱码 | 0.321 | 0.601 |
| DCLM 式(指令问答做正例)前 10% | 70,197 | 论坛 | 0.491 | 0.759 |
| FineWeb-Edu 式前 10% | 85,896 | 论坛 0.55、百科 0.45 | 0.478 | 0.781 |
| FineWeb-Edu 式前 20% | 181,649 | 论坛 0.53、百科 0.47 | 0.471 | 0.832 |
两种分类器都远好于不用;3 万预算时两者相近,10 万预算时 FineWeb-Edu 式更好——但 10 万已经超过了两个”前 10%“数据集的大小,数据被重复看了,而同样的预算下保留 20% 更好。“预算大于数据时该放宽过滤”是 §5 的主题。
3. Nemotron-CC
3.1 动机
Nemotron-CC(Su et al. 2024,NVIDIA)的出发点是一句话:FineWeb-Edu 和 DCLM 靠**激进的模型过滤(删掉约 90% 的数据)**换来了基准分数,这限制了它们在长训练里的用处。目标:在质量和数量之间找到更好的平衡。
3.2 管线
-
抽取:Justext——比 trafilatura 多留下 57% 的 token(学生报告的比较表)。
-
去重:全局模糊去重加精确子串匹配(注意:它用的是全局去重,和 FineWeb 的选择不同)。
-
不用启发式过滤(例如困惑度过滤)——它们删掉的数据太多。
-
三个质量分类器的集成:
- 用 Mistral 8x22B 标注 → 在 Snowflake 文本嵌入上训练线性分类器;
- 用 Nemotron-340B 标注 → 同上;
- DCLM 的 fastText 分类器。
每个分类器给所有文档打分,按分数排序、均匀地分成 20 个桶;集成时取各分类器的最大值;最后按实际的下游效果把 20 个桶重新合并成 5 个质量等级。
为什么要集成?学生报告展示了 Nemotron-CC 的一个分析:在一个随机的 Common Crawl 子集上,FineWeb-Edu 分类器和 DCLM 分类器的高分文档,两者都认可的只有 10.1%(115 万篇),只有 FineWeb-Edu 认可的 35.4%,只有 DCLM 认可的 54.4%。不同的分类器认可的是不同的好文档;集成能大大提高高质量文档的召回。
代码 02 演示 1:两个分类器各自的前 20% 里,两者都认可的 2062 篇全是论坛问答;只有 FineWeb-Edu 式认可的 1868 篇几乎全是百科页;只有 DCLM 式认可的 1868 篇里 75% 是论坛、24% 是乱码。“真正有用”(按世界的真相,有用程度排前 20%)的文档被留下了多少:
| 分类器 | 保留 20% | 保留 30% | 保留 40% |
|---|---|---|---|
| FineWeb-Edu 式 | 0.544 | 0.792 | 0.968 |
| DCLM 式 | 0.274 | 0.284 | 0.296 |
| 集成(取最大值) | 0.442 | 0.650 | 0.777 |
集成远好于 DCLM 式;但在这个世界里,它不如 FineWeb-Edu 式单独用——取最大值意味着”任何一个分类器喜欢就留下”,DCLM 式在 30%–40% 时开始喜欢乱码页。集成的价值取决于各个分类器”错得是否不同”;在 Nemotron-CC 的真实数据上,它是值得的。
代码 02 演示 2:按集成分数分成 20 个桶,只用一个桶的文档训练,看效果——分数越高的桶大体越好,但并不单调(排在最前面的两个桶几乎全是论坛页,效果反而不如第 3–5 个百科页更多的桶;最后几个桶是纯垃圾页)。分类器分数只是质量的一个嘈杂代理,所以 Nemotron-CC 按实际效果合并成 5 个等级,而不是直接按分数切。
3.3 合成改写
Nemotron-CC 对不同质量的数据用不同的改写:
- 低质量文档:让 LLM 改写成”像维基百科那样”的高质量英语。提示词(学生报告引用)大意是:为下面这段话写一个多样的、像维基百科那样的高质量英语改写,另起一行以”这是改写后的版本:“开头。
- 高质量文档:改写成多种形式——多样的问答对、摘要(distill)、抽取核心知识、把知识写成列表。
低质量文档的信息还在,只是形式太乱,模型学不到;改写把它们”救”回来。高质量文档的多种改写相当于”有变化的重复”。
代码 02 演示 3(集成分数排后一半的文档,主要是垃圾页 68%、乱码页 21%):
| 文档数 | token 数 | 连续的正确事实 | 连续的错误事实 | |
|---|---|---|---|---|
| 改写前 | 9,827 | 635,384 | 13,423 | 12,260 |
| 改写后 | 9,216 | 196,782 | 18,889 | 13,908 |
改写后 token 只剩 31%,模型能直接学到的正确事实却从 13,423 条增加到 18,889 条(被乱码打断的事实被”修好”了)。代价也看得见:垃圾页里的错误被原样照抄(改写器不知道冷门事实的对错),再加上 3% 的”幻觉”。
| 训练数据 | token 数 | 10 万 | 30 万 | 100 万 |
|---|---|---|---|---|
| 集成前 30% | 267,843 | 0.824 | 0.983 | 0.983 |
| + 后一半(原样) | 903,227 | 0.586 | 0.872 | 0.994 |
| + 后一半(改写) | 464,625 | 0.793 | 0.983 | 0.996 |
原样加进来,短训练里明显吃亏;改写后再加,短训练几乎不吃亏,长训练里突破了”只用前 30%“的天花板。
3.4 结果
最终的 Nemotron-CC 有 6.3 万亿 token:约 4.4 万亿是全局去重之后的真实 token,约 1.9 万亿是合成的。和 DCLM 比:
- MMLU 和 DCLM 相当,独特的真实 token 是 DCLM 的 4 倍;
- 短训练(8B 模型、1 万亿 token):它的高质量子集比 DCLM 高 5.6 个 MMLU 分;
- 长训练(8B 模型、15 万亿 token,其中 7.2 万亿来自 Nemotron-CC):比 Llama 3.1 8B 的 MMLU 高 5 分、ARC-Challenge 高 3.1 分、10 个任务平均高 0.5 分。
学生报告的总结表:
| FineWeb(-Edu) | DCLM | Nemotron-CC | |
|---|---|---|---|
| 文本抽取 | trafilatura(WARC) | resiliparse(快 8 倍) | Justext(多 57% token) |
| 去重 | 每个快照各自 MinHash | Bloom filter | 全局模糊去重 |
| 质量过滤 | LLM 标注 → 分类器 | fastText(OpenHermes 做正例) | 三个分类器的集成 |
| 合成数据 | 没有 | 没有 | 有 |
| 最终 token 数 | 1.3T(Edu) | 3.8T | 6.3T |
代码 02 演示 4:
| 数据集 | 真实 token | 3 万 | 10 万 | 30 万 | 100 万 | 300 万 |
|---|---|---|---|---|---|---|
| DCLM 式:保留 10% | 70,197 | 0.491 | 0.759 | 0.759 | 0.759 | 0.759 |
| FineWeb-Edu 式:保留 10% | 85,896 | 0.478 | 0.781 | 0.781 | 0.781 | 0.781 |
| Nemotron-CC 式:保留 30% + 改写 | 267,843 | 0.443 | 0.798 | 0.971 | 0.997 | 0.997 |
(Nemotron-CC 式另有 328,303 个改写出的合成 token。)短训练时激进过滤更好;长训练时,激进过滤的数据被反复重复、很快到顶,保留更多加上改写的数据继续进步。在我们的世界里,短训练时 Nemotron-CC 式吃了亏——真实的改写(问答、摘要等多种形式)在短训练里也有用,而我们的改写只是换个格式,模型学到的东西一样。
4. 数据受限:重复几遍还有用?
4.1 好数据是有限的
Muennighoff 的报告从一组估计开始:高质量的语言数据,论文约 1 万亿 token,书约 1.6 万亿,加上维基百科等;代码(GitHub)约 14 万亿(“有没有用还不清楚”);低资源语言更少——芬兰语(600 万人使用)所有公开和非公开来源加起来约 380 亿 token。按 Chinchilla 的分配,最大的模型很快就会”数据受限”。
4.2 传统的做法:不重复
GPT-3:“训练时数据是无放回抽样的”。PaLM:“三个模型都在数据上恰好训练一个 epoch……选择混合比例以避免任何子集被重复”。重复数据真的那么糟吗?
4.3 发现
Muennighoff et al.(2023)做了 400 次训练,最多 90 亿参数、9000 亿 token:
- 回报:算力固定时,重复 4 遍以内,损失和用全新的数据几乎一样;重复得更多,增加算力的价值逐渐降到 0。
- 扩展律:他们把”重复的价值递减”写进了 Chinchilla 式的扩展律。直觉是放射性衰变:每重复一遍,数据剩下一个固定比例的价值。有效数据量
其中 是独特数据量, 是重复的次数(第一遍之外又看了几遍), 是拟合出来的”再重复就急剧贬值”的次数。用约 200 次训练拟合:(每重复一遍价值约降 6%)。参数也有同样的递减:。(练习 1:重复 4 遍相当于 3.73 遍新数据,16 遍相当于 10.6 遍,无论重复多少遍最多相当于 16.4 遍。)
- 分配:数据要重复时,数据(epoch 数)应该比参数增长得更快。在规模上检验:Chinchilla 式的分配(87 亿参数、7 个 epoch)vs 他们的拟合给出的分配(63 亿参数、10 个 epoch)——19 个任务的平均从 23.5 升到 25.9。
- 其他办法:用代码填充——最多一半是代码,自然语言任务上的表现和全用自然语言一样好(报告的图里约 60%);对已经很干净的数据集(C4)再做模糊去重可能没有帮助;质量过滤 + 重复可以是一个好策略。
三个要点(报告的总结页):重复约 4 遍没问题;一半是代码没问题;质量过滤加重复可以是好策略。
影响:FinGPT(芬兰语大模型)只有 380 亿独特 token,就训练了 8 个 epoch;Llama 3 等也引用了这个结论。
4.4 在我们的世界里:重复到底帮了什么
代码 03 演示 1:独特数据 U 是 1500 篇论坛问答(52,704 个 token),3000 道题里 61% 的事实在 U 里出现过。U 重复 k 遍,对比同样预算下 k 倍的新数据(答案损失,越小越好):
| k 遍 | 重复·U 里的 | 新数据·U 里的 | 重复·U 外的 | 新数据·U 外的 | 重复·全部 | 新数据·全部 |
|---|---|---|---|---|---|---|
| 1 | 0.776 | 0.776 | 2.527 | 2.527 | 1.454 | 1.454 |
| 2 | 0.460 | 0.550 | 2.527 | 1.499 | 1.261 | 0.918 |
| 4 | 0.303 | 0.345 | 2.527 | 0.667 | 1.165 | 0.470 |
| 8 | 0.243 | 0.219 | 2.527 | 0.283 | 1.128 | 0.244 |
| 16 | 0.223 | 0.152 | 2.527 | 0.163 | 1.116 | 0.156 |
| 32 | 0.222 | — | 2.527 | — | 1.115 | — |
把评测题分成两部分看,“重复”的故事就清楚了:
- U 里出现过的事实:重复 4 遍和 4 倍的新数据差不多,甚至更好(预算全部花在这些事实上,记得越来越牢);再往后就到顶了,而新数据还在进步。这正是 Muennighoff 的图景。
- U 里没出现过的事实:重复一点用都没有——重复不会带来数据里没有的东西。
所以”重复几遍还有用”取决于你要学的东西有多少已经在独特数据里了。真实的语言模型损失里,大部分是所有文档共享的模式(语法、常见搭配、常识)——像”U 里的事实”,重复几遍就能学好;长尾的知识像”U 外的事实”,只能靠新数据。我们的世界只考知识,所以总的结果里重复的代价被放大了(“全部”一列:重复 4 遍 1.165,新数据 0.470)。
5. 过滤的扩展律:数据整理不能不考虑算力
5.1 动机
报告的开场:当前的共识是”整理高质量数据集对性能至关重要”——过滤掉低质量数据常常带来很大的提升,例如 LAION 用 CLIP 相似度阈值只保留约 10% 的样本时效果最好。那么,在高质量数据上训练本身就更好,还是说下游的考量——比如算力——也要考虑进来? 观察:算力大的时候,低质量数据反而赢了。
5.2 质量-数量取舍(QQT)
Goyal et al.(2024,在 DataComp 上做的实验)把这个现象叫作质量-数量取舍(quality-quantity trade-off,QQT):
- 高质量数据数量少,低质量数据数量多;
- 高质量数据”重复几遍之后价值就迅速下降”,训练到后来必须用没见过的、质量更低的数据;
- 他们提出的扩展律描述一个数据点在第 次重复时的效用如何衰减,以及几个数据池混在一起时的相互作用——可以不用真的训练就估计一个混合的表现;
- 用它为 DataComp 的不同算力预算选出最好的数据池,画出数据整理的帕累托前沿。
结论就是论文的标题:数据整理不能不考虑算力(Data Curation cannot be Compute Agnostic)。
5.3 在我们的世界里扫一遍
代码 03 演示 2:用 DCLM 式分类器排序,保留前 5% 到 100%,训练预算从 1 万到 300 万个 token:
| 预算 | 前 5% | 前 10% | 前 20% | 前 40% | 前 70% | 前 100% | 最好的 |
|---|---|---|---|---|---|---|---|
| (token 数) | 34k | 72k | 165k | 412k | 784k | 1167k | |
| 10,000 | 0.246 | 0.257 | 0.239 | 0.207 | 0.215 | 0.172 | 前 10% |
| 30,000 | 0.472 | 0.491 | 0.469 | 0.390 | 0.389 | 0.305 | 前 10% |
| 100,000 | 0.498 | 0.759 | 0.830 | 0.728 | 0.709 | 0.593 | 前 20% |
| 300,000 | 0.498 | 0.759 | 0.932 | 0.956 | 0.947 | 0.896 | 前 40% |
| 1,000,000 | 0.498 | 0.759 | 0.932 | 0.984 | 0.998 | 0.996 | 前 70% |
| 3,000,000 | 0.498 | 0.759 | 0.932 | 0.984 | 0.998 | 0.999 | 前 100% |
最优的过滤强度随预算单调地放宽:10% → 20% → 40% → 70% → 100%。每一行最好的那个,数据都被看了不到 3 遍;被看 4 遍以上的格子没有一个是最好的。过滤得太狠,数据被重复太多遍;过滤得太松,每一遍都在看很多没用的东西。最优点在两者之间,位置由”预算 ÷ 高质量数据的量”决定。
把 DCLM 放到这张表上:它的三个规模都在左上角(预算比数据少),所以得出”保留 10% 最好”。今天的长训练在右下角:所以 Nemotron-CC、Llama 3 都不能只用最好的 10%。(第 5 讲的练习 3 在迷你 DataComp 里也看到了这个趋势的一半:算力增大时,宽松一端的损失迅速缩小。)
6. 开源模型的训练数据:Schmidt 的综述
学生报告之后,Schmidt 综述了 2023–2025 年开源权重模型的技术报告里关于训练数据的信息。
6.1 透明度的光谱
| 透明度 | 模型 | 公开了什么 |
|---|---|---|
| 完全开放 | OLMo、Marin | 数据集可下载,代码开源,完全可复现 |
| 详细 | Llama | 列出了来源、比例,详细描述了管线 |
| 中等 | Qwen、DeepSeek、Kimi | 描述了来源类别和处理方法 |
| 有限 | Gemma、GLM、MiniMax、MiMo | 只有 token 数,来源和方法几乎没说 |
6.2 规模的增长
两年里从约 1 万亿涨到 36 万亿 token。从第一版到最新版的倍数:GLM 25×(0.4T → 10T)、Qwen 12×(3T → 7T → 18T → 36T)、Llama 11×(1–1.4T → 2T → 15.6T)、DeepSeek 7.4×(2T → 8.1T → 14.8T)、Gemma 2.3×、Kimi 约 2×(15.5T → 约 30T)。
6.3 各家的要点
- OLMo(Allen AI),最透明。OLMo 1 的 Dolma:Common Crawl 2.18 万亿(81.7%)、GitHub 3420 亿(12.8%)、Reddit 800 亿(3.0%)、Semantic Scholar 570 亿(2.1%)、古登堡计划 52 亿、维基百科 37 亿;处理包括语言过滤、质量分类器、精确 + 模糊去重、个人信息遮蔽、评测去污染。OLMo 2 分两阶段:预训练约 3.9 万亿(其中 3.71 万亿就是 DCLM-Baseline,加上 StarCoder 830 亿、peS2o + arXiv 790 亿),中期训练(mid-training)500 亿–3000 亿(DCLM 的高质量子集、合成数学、FLAN 指令数据);关键的改进包括”n-gram 重复过滤”(有 32 个以上重复 n-gram 的文档删掉)和”模型汤”(不同数据顺序退火出的 3–4 个模型取平均)。OLMo 3:用 olmOCR 处理了 2.38 亿个 PDF(过滤后 1.08 亿,占训练混合的 13.6%);中期训练里约 7% 是推理轨迹(来自 QwQ、Gemini、Llama);CraneMath(合成的数学改写)让 MATH +18.5、GSM8K +27.4;用 100 亿 token 的”微退火”实验在正式训练前快速评估数据。
- Marin,完整记录了 12.75 万亿 token、5 个阶段:先用 DCLM(92.6%)+ StarCoder(6.1%);中途加入 30% 的高质量数据(Dolmino、FineMath);后来换成 Nemotron-CC + StarCoder;最后阶段 70% Nemotron-CC、数学数据上采样 5–10 倍。还贡献了 LLM 标注的科学问答(126 亿 token)和把 arXiv / StackExchange / 维基百科的 HTML 转成 Markdown 的语料。
- Llama(Meta)。Llama 1 按来源分:Common Crawl 67%、C4 15%、GitHub / 维基 / 书各 4.5%、arXiv 2.5%、StackExchange 2%。Llama 3(15.6 万亿)按能力分:通用 50%、数学 25%、代码 17%、多语言 8%。管线 7 步:安全过滤(域名黑名单)→ 保留数学和代码的 HTML 解析 → URL 去重(保留最新的)→ 文档级 MinHash → 行级去重(出现超过 6 次的行)→ 启发式(n-gram、脏词)→ 质量分类器(fastText + DistilRoBERTa)。一个重要的实验:退火——训练最后用少量高质量数据上采样,8B 模型的 GSM8K +24%、MATH +6.4%。
- Qwen(阿里)。Qwen 2 用 Qwen 模型自己当质量过滤器;试了 12 万亿 token,并不比 7 万亿好——“存在质量的天花板”。Qwen 2.5 用 Qwen2-Instruct 当评委、重新平衡领域(少电商和社交、多科技和科学)。Qwen 3:119 种语言、实例级的混合、用 Qwen2.5-VL 处理 PDF。
- DeepSeek。V1 做了跨快照去重:只在一个快照里去重删掉 22.2%,跨 91 个快照删掉 89.8%。V3(14.8 万亿)“没有刻意使用合成数据”。R1 的数据:强化学习的提示约 14.6 万个(数学 2.6 万、代码 2.5 万、STEM 2.2 万、逻辑 1.5 万、通用 7.8 万),监督微调约 80 万条(约 60 万推理 + 20 万非推理)——第 9 讲会讲。
- Gemma(Google):只说了”网页、数学、代码”。Gemma 2 的 2B、9B 和 Gemma 3 全部用知识蒸馏训练(从更大的教师模型学);Gemma 2 2B 用 5000 亿 token 蒸馏,比从头训练高 7.4 分。
- Kimi(月之暗面):K2 是 1 万亿参数的混合专家模型,15.5 万亿 token;质量过滤包括规则、fastText、嵌入相似度、LLM 评估,K2 还用了合成改写。
- GLM(清华 / 智谱):多任务指令预训练——5% 的 token 是 74 个提示化的数据集,最早把指令数据放进预训练的工作之一。
- MiniMax-01:一个关于数据质量和 epoch 的研究——低质量数据重复 2 遍之后就开始变差,高质量数据重复到 4 遍都没问题(和 §4、§5 一致)。
- MiMo-V2-Flash(小米):27 万亿 token 分三个阶段,最后 1 万亿 token 用 256K 上下文。
6.4 共同的模式
数据来源:网页 60–85%(Common Crawl、DCLM、Nemotron-CC、C4);代码 5–20%(GitHub、StarCoder、The Stack);书和论文 2–10%;合成数据 0–10%(数学改写、推理轨迹、问答对)。
处理方法的三个时代:
- 2023,规则的时代:启发式过滤器、快照内去重、简单的质量分数、关键词黑名单;
- 2024,分类器的时代:fastText / DistilRoBERTa、跨快照去重、MinHash + LSH、质量分类器;
- 2025,LLM 当评委的时代:LLM 当质量过滤器、多层次的去重、奖励模型打分、实例级的混合。
趋势:模型越来越多地用自己(或者自己的前一代)来过滤训练数据。
合成数据的兴起:数学改写(OLMo 的 CraneMath,MATH +18.5)、推理轨迹、问答生成(Marin 的 Datashop)、代码解答(Qwen)。但要小心:DeepSeek V3 没有刻意用合成数据,照样很强——合成数据很强大,但不总是必要的。
Schmidt 的五个要点:
- 规模重要,但质量更重要(Qwen 12T ≈ 7T);
- 去重至关重要(跨快照去重能去掉多达 90% 的冗余);
- 退火和蒸馏有效(GSM8K +24%、+7.4 分);
- 合成数据很强大,但是可选的;
- 透明度让科学成为可能(OLMo、Marin 让人能复现、能学习)。
一个值得注意的对照:DeepSeek 的跨快照去重删掉了 89.8%,和 FineWeb 的”全局去重删掉老快照的 90%、效果更差”是同一个现象的两面——删掉的是不是好东西,取决于你接下来用什么过滤器、训练多久。
7. 一个统一的视角(补充)
把这一讲(和第 6 讲)放在一起,预训练数据的几乎所有选择都落在一个三角里:质量、数量、算力(训练多久)。
| 选择 | 短训练(预算 < 高质量数据) | 长训练(预算 ≫ 高质量数据) |
|---|---|---|
| 过滤强度 | 越狠越好(DCLM:前 10%) | 要放宽(QQT;Nemotron-CC 保留更多) |
| 重复 | 用不着 | 高质量数据重复几遍可以,再多就要换新数据 |
| 去重 | 去得越干净越好 | “重复的往往是好东西”——按快照去重相当于给好网页加权 |
| 低质量数据 | 删掉 | 改写之后再用(Nemotron-CC) |
| 精选来源(维基、书) | 过滤好时反而稀释预算 | 新的独特数据,有价值 |
几乎每一个”最佳实践”,都要加一句”在什么预算下”。这也是第 6 讲”小规模实验能预测大规模”的一个限定:排名能推广,最优的阈值不一定能。
8. 延伸与前沿 · Beyond the original lecture
本节是我补充的。
- 中期训练(mid-training)和退火。OLMo 2/3、Llama 3、Marin 都在预训练的最后阶段换成更高质量、更有针对性的数据(数学、代码、推理轨迹、指令数据)。这模糊了”预训练”和”后训练”的界限(第 8–9 讲)。
- 无限算力、有限数据。如果算力几乎无限而数据不能再增加,最好的做法是什么?更多的重复、更强的正则化、集成、合成数据……第 12 讲会讨论 Pre-training under infinite compute 等工作。
- 重复与质量的关系。Datasets, Documents, and Repetitions(2025)发现重复多的文档往往质量更高;按快照去重的成功、MiniMax 的”高质量数据可以多重复几遍”都指向同一个方向:重复不是一个需要无条件消除的缺陷,而是一个可以利用的质量信号。
- 多语言。FineWeb 之后,Hugging Face 把同样的流程扩展到了上千种语言(FineWeb 2);Qwen 3 覆盖 119 种语言。低资源语言是”数据受限”最严重的地方(§4.1 的芬兰语例子)。
9. 小结 · Summary
- 核心张力:激进过滤(删掉约 90%)在短训练里最好,但今天的长训练(十几万亿 token)需要数量。
- FineWeb:96 个快照、15 万亿 token;每个快照各自去重(20T)好于全局去重(4T)——全局去重在老快照里留下的是低质量数据;FineWeb-Edu 用 LLM 给教育价值打分、蒸馏成小分类器,1.3 万亿 token,MMLU / ARC 大幅提升。
- Nemotron-CC:三个分类器的集成(不同的分类器认可不同的好文档)、20 个桶合并成 5 个等级、低质量改写成维基式、高质量改写成多种形式;6.3 万亿 token、独特真实 token 是 DCLM 的 4 倍;短训练和 DCLM 相当,长训练胜过 Llama 3.1 8B。
- 数据受限的扩展律:重复 4 遍以内几乎和新数据一样好,之后迅速贬值();数据要重复时,epoch 应比参数增长得快;代码填充一半没问题。
- 过滤的扩展律:高质量数据重复后迅速贬值,最优的过滤强度随算力放宽——数据整理不能不考虑算力。
- 开源模型:透明度从完全开放(OLMo、Marin)到几乎不公开;方法从规则 → 分类器 → LLM 当评委;退火、蒸馏、合成数据都在被广泛使用。
10. 常见误区 · Common pitfalls
- “过滤得越狠越好。” 只在预算比高质量数据少时成立(代码 03 演示 2)。
- “去重得越彻底越好。” FineWeb:全局去重更差;重复的往往是好东西。
- “重复数据有害,绝对不能重复。” 重复 4 遍以内几乎和新数据一样好;问题在于重复带不来新信息(代码 03 演示 1)。
- “低质量数据就该删掉。” Nemotron-CC:改写之后它们是有用的数据。
- “LLM 当评委不如 fastText。” 第 6 讲的结论依赖于问了什么问题;FineWeb-Edu 换了问题、做了蒸馏,效果很好。
- “多个分类器集成一定更好。” 取决于它们是否”错得不同”(代码 02 演示 1:集成不如 FineWeb-Edu 式单独用)。
- “数据量越多越好。” Qwen 2:12 万亿不比 7 万亿好——没有更好的数据,更多的数据不一定有用。
- “开源权重 = 开放数据。” 大多数开源权重模型几乎不公开训练数据;只有 OLMo、Marin 这样的完全开放模型能被复现。
11. 练习 · Exercises
练习 1(有效数据量) 用 Muennighoff et al. 的公式():(a) 独特数据重复 4 遍、16 遍、64 遍,分别相当于多少遍新数据?占新数据的百分之几?(b) 重复多少遍,无论如何也超不过多少遍新数据?(c) 一个只有 380 亿独特 token 的芬兰语模型训练了 8 个 epoch,相当于多少独特 token?
参考答案
epoch 数 ,:
(a) 4 遍:,相当于新数据的 93%;16 遍:约 10.6(66%);64 遍:约 16.1(25%)。
(b) 时 :再怎么重复也超不过约 16 遍新数据。
(c) 8 遍:,约 2500 亿”有效”token(83%)。
练习 2(读 QQT 的表) 用代码 03 演示 2 的表:(a) 预算 30 万时,“前 10%“的数据被看了几遍?为什么它停在 0.759?(b) 你有 7.2 万 token 的”前 10%“和 41 万 token 的”前 40%“,预算 100 万:混合两者(例如前 10% 看 3 遍 + 前 40% 剩下的部分)会比只用前 70% 好吗?用这张表能回答吗?
参考答案
(a) 遍。它已经学会了自己覆盖的全部事实(第 1 遍之后准确率就不再变了,只是更有把握),重复带不来数据里没有的事实——就是代码 03 演示 1 里”U 外的事实”。
(b) 这张表只比较了”从排序的最前面截一刀”的数据池,不能直接回答混合的问题。Goyal et al. 的扩展律正是为此设计的:它描述每个池子的效用如何随重复衰减、多个池子混合时如何相互作用,可以不训练就估计一个混合的表现。直觉上,“高质量的多看几遍 + 中等质量的看一遍”可能比”所有数据各看一遍”更好——这就是 Nemotron-CC 按质量等级区别对待、Marin 把数学数据上采样 5–10 倍的思路。要验证,就在代码副本里构造这个混合、训练、比较。
练习 3(为什么按快照去重相当于加权) 一个网页在 8 个快照里每次以概率 活下来(从第 1 个快照开始存在)。(a) 它平均出现在几个快照里?(b) (百科)和 (垃圾页)各是多少?(c) 每个快照各自去重之后,好网页相对垃圾页被”上采样”了多少倍?
参考答案
(a) 在第 个快照里还活着的概率是 ,期望出现次数 。
(b) :约 5.7 次;:约 1.43 次( 的论坛约 4.85 次)。
(c) 约 4 倍。每个快照各自去重保留了这些重复,于是好网页在训练数据里的比重被放大了约 4 倍;全局去重把它们压回 1 份,同时老快照里只出现过一次的垃圾页一个都没删。代码 01 演示 1 的两种去重的类型构成(百科 + 论坛 0.66 vs 0.41)正是这个效应。
练习 4(改写的风险) 代码 02 演示 3 里,改写后”连续的错误事实”从 12,260 增加到 13,908。(a) 这些新增的错误从哪里来?(b) 在真实的 LLM 改写里,还有哪些风险是这个世界没有模拟的?(c) 你会怎样检验改写数据是否引入了系统性的偏差?
参考答案
(a) 两个来源:原文里被乱码打断的错误事实也被”修好”了(改写器不知道冷门事实的对错,照抄);以及 3% 的”幻觉”。
(b) 例如:LLM 的系统性偏差(总是把某类事实写成它”以为”的样子,而不是原文的样子);风格的同质化(所有改写都是同一种腔调,多样性下降);把原文没有的”常识”加进去;对少数语言、少数群体的内容改写质量更差;以及长期的”模型用自己的输出训练自己”带来的退化(第 11 讲)。
(c) 例如:在有标准答案的子集上比较改写前后事实的一致性;比较改写数据和原始数据训练出的模型在不同子群体 / 领域上的表现;控制改写数据的比例做消融(Nemotron-CC 的改写只占约 30%);检查改写数据的 n-gram 多样性。
练习 5(透明度) Schmidt 的综述里,Gemma 只公开了”网页、数学、代码”和 token 数,Llama 3 公开了比例和管线,OLMo 公开了全部数据。(a) 只知道 token 数和”用了质量分类器”,你能回答哪些问题、不能回答哪些问题?(b) 为什么 OLMo 2 能直接用 DCLM-Baseline 做预训练数据的主体,这对研究意味着什么?
参考答案(要点)
(a) 能回答”训练了多久、大致过度训练了多少”;不能回答:数据里有没有评测集(污染)、有没有受版权保护或含个人信息的内容、模型的某个能力 / 偏见来自哪类数据、换一种过滤会怎样——也就不能复现,不能做数据归因(第 13 讲),不能审计(第 18–19 讲)。
(b) 因为 DCLM-Baseline 是公开的、配方清楚的:OLMo 2 可以站在一个已知质量的数据集上,把精力放在中期训练、退火、模型汤这些新问题上;别人也可以完全复现它。这是第 3 讲”共同任务框架”和第 5 讲 DataComp 的思想在语言模型上的延续:公开的数据让进步可以累积。
12. 延伸阅读 · Further reading
原课阅读
- Penedo et al., The FineWeb Datasets: Decanting the Web for the Finest Text Data at Scale(2024):arXiv:2406.17557。
- Su et al., Nemotron-CC: Transforming Common Crawl into a Refined Long-Horizon Pretraining Dataset(2024):arXiv:2412.02595。
- Muennighoff et al., Scaling Data-Constrained Language Models(NeurIPS 2023):arXiv:2305.16264。
- Goyal et al., Scaling Laws for Data Filtering — Data Curation cannot be Compute Agnostic(CVPR 2024):arXiv:2404.07177。
- Schmidt 综述里的技术报告:OLMo / OLMo 2 / OLMo 3、Marin、Llama 3(2407.21783)、Qwen 2.5(2412.15115)、DeepSeek-V3(2412.19437)、Gemma 3(2503.19786)、MiniMax-01(2501.08313)等。
本讲补充
- Hernandez et al., Scaling Laws and Interpretability of Learning from Repeated Data(2022)——重复数据的另一面:少量数据被重复很多次会严重伤害模型。
- Lee et al., Deduplicating Training Data Makes Language Models Better(2022)。
和本目录其他课程的联系
- CS336 第 14 讲(数据处理):过滤、去重的实现。
- CS324 第 2 讲(数据):重复数据的伤害(Hernandez et al.)。
13. 下一讲预告 · Next lecture
预训练让模型学会了”续写”——它知道很多,但不会听指令。从预训练模型到 ChatGPT 这样的助手,靠的是后训练,而后训练的数据和预训练完全不同:量小得多(几万到几百万条),每一条都精心构造。
第 8 讲:后训练数据 I——指令、偏好与 AI 反馈。 客座讲者 Etash Guha(OpenThoughts 的作者之一):FLAN 把几十个 NLP 数据集改写成指令;InstructGPT 的三阶段数据(示范、比较、强化学习);Self-Instruct 和 Alpaca 让模型自己生成指令数据;UltraFeedback 和 Constitutional AI 用 AI 代替人给反馈;以及 Tulu 3 这样完全开放的后训练配方。代码会模拟一个”教师 / 学生”的 Self-Instruct 循环,以及偏好数据的噪声怎样影响奖励模型。