Lecture 7 · 预训练数据 II:FineWeb、Nemotron-CC、重复与过滤的扩展律 · Pre-training Data II

Training Data for AI · Lecture 07。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应 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

  1. 说明 FineWeb 的主要发现:为什么跨快照的全局去重反而更差;FineWeb-Edu 怎样用 LLM 标注质量、再蒸馏成小分类器。
  2. 说明 Nemotron-CC 怎样在”质量”和”数量”之间找平衡:分类器集成、按质量分桶、用 LLM 改写低质量数据;为什么它在长训练里胜出。
  3. 用 Muennighoff et al. 的数据受限扩展律回答”数据重复几遍还有用”,并理解”重复的代价”来自哪里。
  4. 用 Goyal et al. 的质量-数量取舍(QQT)解释”最优的过滤强度取决于算力”。
  5. 了解开源模型技术报告里关于训练数据能看到什么、看不到什么,以及 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 语言识别行级哈希
RefinedWebtrafilaturaMassiveText 的启发式MinHash(模糊)+ 子串(精确)
FineWebtrafilatura(WARC)C4 + RefinedWeb 的规则 + 新规则;FineWeb-Edu:教育价值分类器每个快照各自 MinHash
DCLMresiliparsefastText(选像 OpenHermes 的文档)Bloom filter
Nemotron-CCJustext三个分类器的集成;合成改写全局模糊去重

2.2 FineWeb 的管线

FineWeb(Penedo et al. 2024)从 96 个 Common Crawl 快照里做出了 15 万亿 token 的英文数据集,并公开了每一步的消融实验——这是它最大的贡献之一。

  1. 抽取:从 WARC(原始 HTML)用 trafilatura 抽取,比直接用 WET 文件好(DCLM 也证实了这一点)。

  2. 基本过滤:URL 黑名单(来自 RefinedWeb);fastText 语言识别,英语概率低于 0.65 的删掉;MassiveText 的质量和重复规则。到这一步还有约 36 万亿 token(GPT-2 分词)。

  3. 去重:文档级 MinHash(§2.3)。

  4. 更多过滤器:在 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,0311,795,984百科 0.38、论坛 0.280.3640.6790.906
全局去重(新 → 旧)13,114819,791垃圾 0.31、乱码 0.270.3310.6010.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 的子集:

  1. 让 Llama-3-70B-Instruct 给约 45 万个网页的教育价值打 0–5 分(学生报告写”约 50 万”);
  2. 用这些分数训练一个小分类器(在一个文本嵌入模型上加一个回归头);
  3. 用小分类器给 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.3210.601
DCLM 式(指令问答做正例)前 10%70,197论坛0.4910.759
FineWeb-Edu 式前 10%85,896论坛 0.55、百科 0.450.4780.781
FineWeb-Edu 式前 20%181,649论坛 0.53、百科 0.470.4710.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 管线

  1. 抽取:Justext——比 trafilatura 多留下 57% 的 token(学生报告的比较表)。

  2. 去重:全局模糊去重加精确子串匹配(注意:它用的是全局去重,和 FineWeb 的选择不同)。

  3. 不用启发式过滤(例如困惑度过滤)——它们删掉的数据太多。

  4. 三个质量分类器的集成:

    • 用 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.5440.7920.968
DCLM 式0.2740.2840.296
集成(取最大值)0.4420.6500.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,827635,38413,42312,260
改写后9,216196,78218,88913,908

改写后 token 只剩 31%,模型能直接学到的正确事实却从 13,423 条增加到 18,889 条(被乱码打断的事实被”修好”了)。代价也看得见:垃圾页里的错误被原样照抄(改写器不知道冷门事实的对错),再加上 3% 的”幻觉”。

训练数据token 数10 万30 万100 万
集成前 30%267,8430.8240.9830.983
+ 后一半(原样)903,2270.5860.8720.994
+ 后一半(改写)464,6250.7930.9830.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)DCLMNemotron-CC
文本抽取trafilatura(WARC)resiliparse(快 8 倍)Justext(多 57% token)
去重每个快照各自 MinHashBloom filter全局模糊去重
质量过滤LLM 标注 → 分类器fastText(OpenHermes 做正例)三个分类器的集成
合成数据没有没有有
最终 token 数1.3T(Edu)3.8T6.3T

代码 02 演示 4:

数据集真实 token3 万10 万30 万100 万300 万
DCLM 式:保留 10%70,1970.4910.7590.7590.7590.759
FineWeb-Edu 式:保留 10%85,8960.4780.7810.7810.7810.781
Nemotron-CC 式:保留 30% + 改写267,8430.4430.7980.9710.9970.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 式的扩展律。直觉是放射性衰变:每重复一遍,数据剩下一个固定比例的价值。有效数据量
D′=U+U⋅RD∗(1−e−RD/RD∗),D' = U + U \cdot R^{*}_{D}\left(1 - e^{-R_D / R^{*}_{D}}\right),

其中 UU 是独特数据量,RDR_D 是重复的次数(第一遍之外又看了几遍),RD∗R^{*}_{D} 是拟合出来的”再重复就急剧贬值”的次数。用约 200 次训练拟合:RD∗=15.4R^{*}_{D} = 15.4(每重复一遍价值约降 6%)。参数也有同样的递减:RN∗=5.3R^{*}_{N} = 5.3。(练习 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 外的重复·全部新数据·全部
10.7760.7762.5272.5271.4541.454
20.4600.5502.5271.4991.2610.918
40.3030.3452.5270.6671.1650.470
80.2430.2192.5270.2831.1280.244
160.2230.1522.5270.1631.1160.156
320.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):

  • 高质量数据数量少,低质量数据数量多;
  • 高质量数据”重复几遍之后价值就迅速下降”,训练到后来必须用没见过的、质量更低的数据;
  • 他们提出的扩展律描述一个数据点在第 nn 次重复时的效用如何衰减,以及几个数据池混在一起时的相互作用——可以不用真的训练就估计一个混合的表现;
  • 用它为 DataComp 的不同算力预算选出最好的数据池,画出数据整理的帕累托前沿。

结论就是论文的标题:数据整理不能不考虑算力(Data Curation cannot be Compute Agnostic)。

5.3 在我们的世界里扫一遍

代码 03 演示 2:用 DCLM 式分类器排序,保留前 5% 到 100%,训练预算从 1 万到 300 万个 token:

预算前 5%前 10%前 20%前 40%前 70%前 100%最好的
(token 数)34k72k165k412k784k1167k
10,0000.2460.2570.2390.2070.2150.172前 10%
30,0000.4720.4910.4690.3900.3890.305前 10%
100,0000.4980.7590.8300.7280.7090.593前 20%
300,0000.4980.7590.9320.9560.9470.896前 40%
1,000,0000.4980.7590.9320.9840.9980.996前 70%
3,000,0000.4980.7590.9320.9840.9980.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 的五个要点:

  1. 规模重要,但质量更重要(Qwen 12T ≈ 7T);
  2. 去重至关重要(跨快照去重能去掉多达 90% 的冗余);
  3. 退火和蒸馏有效(GSM8K +24%、+7.4 分);
  4. 合成数据很强大,但是可选的;
  5. 透明度让科学成为可能(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

  1. 核心张力:激进过滤(删掉约 90%)在短训练里最好,但今天的长训练(十几万亿 token)需要数量。
  2. FineWeb:96 个快照、15 万亿 token;每个快照各自去重(20T)好于全局去重(4T)——全局去重在老快照里留下的是低质量数据;FineWeb-Edu 用 LLM 给教育价值打分、蒸馏成小分类器,1.3 万亿 token,MMLU / ARC 大幅提升。
  3. Nemotron-CC:三个分类器的集成(不同的分类器认可不同的好文档)、20 个桶合并成 5 个等级、低质量改写成维基式、高质量改写成多种形式;6.3 万亿 token、独特真实 token 是 DCLM 的 4 倍;短训练和 DCLM 相当,长训练胜过 Llama 3.1 8B。
  4. 数据受限的扩展律:重复 4 遍以内几乎和新数据一样好,之后迅速贬值(RD∗≈15.4R^{*}_{D} \approx 15.4);数据要重复时,epoch 应比参数增长得快;代码填充一半没问题。
  5. 过滤的扩展律:高质量数据重复后迅速贬值,最优的过滤强度随算力放宽——数据整理不能不考虑算力。
  6. 开源模型:透明度从完全开放(OLMo、Marin)到几乎不公开;方法从规则 → 分类器 → LLM 当评委;退火、蒸馏、合成数据都在被广泛使用。

10. 常见误区 · Common pitfalls

  1. “过滤得越狠越好。” 只在预算比高质量数据少时成立(代码 03 演示 2)。
  2. “去重得越彻底越好。” FineWeb:全局去重更差;重复的往往是好东西。
  3. “重复数据有害,绝对不能重复。” 重复 4 遍以内几乎和新数据一样好;问题在于重复带不来新信息(代码 03 演示 1)。
  4. “低质量数据就该删掉。” Nemotron-CC:改写之后它们是有用的数据。
  5. “LLM 当评委不如 fastText。” 第 6 讲的结论依赖于问了什么问题;FineWeb-Edu 换了问题、做了蒸馏,效果很好。
  6. “多个分类器集成一定更好。” 取决于它们是否”错得不同”(代码 02 演示 1:集成不如 FineWeb-Edu 式单独用)。
  7. “数据量越多越好。” Qwen 2:12 万亿不比 7 万亿好——没有更好的数据,更多的数据不一定有用。
  8. “开源权重 = 开放数据。” 大多数开源权重模型几乎不公开训练数据;只有 OLMo、Marin 这样的完全开放模型能被复现。

11. 练习 · Exercises

练习 1(有效数据量) 用 Muennighoff et al. 的公式(RD∗=15.4R^{*}_{D} = 15.4):(a) 独特数据重复 4 遍、16 遍、64 遍,分别相当于多少遍新数据?占新数据的百分之几?(b) 重复多少遍,无论如何也超不过多少遍新数据?(c) 一个只有 380 亿独特 token 的芬兰语模型训练了 8 个 epoch,相当于多少独特 token?

参考答案

RD=R_D = epoch 数 −1- 1,D′/U=1+15.4 (1−e−RD/15.4)D'/U = 1 + 15.4\,(1 - e^{-R_D/15.4}):

(a) 4 遍:1+15.4 (1−e−3/15.4)≈3.731 + 15.4\,(1 - e^{-3/15.4}) \approx 3.73,相当于新数据的 93%;16 遍:约 10.6(66%);64 遍:约 16.1(25%)。

(b) RD→∞R_D \to \infty 时 D′/U→1+15.4=16.4D'/U \to 1 + 15.4 = 16.4:再怎么重复也超不过约 16 遍新数据。

(c) 8 遍:1+15.4 (1−e−7/15.4)≈6.631 + 15.4\,(1 - e^{-7/15.4}) \approx 6.63,约 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) 300,000/72,000≈4.2300{,}000 / 72{,}000 \approx 4.2 遍。它已经学会了自己覆盖的全部事实(第 1 遍之后准确率就不再变了,只是更有把握),重复带不来数据里没有的事实——就是代码 03 演示 1 里”U 外的事实”。

(b) 这张表只比较了”从排序的最前面截一刀”的数据池,不能直接回答混合的问题。Goyal et al. 的扩展律正是为此设计的:它描述每个池子的效用如何随重复衰减、多个池子混合时如何相互作用,可以不训练就估计一个混合的表现。直觉上,“高质量的多看几遍 + 中等质量的看一遍”可能比”所有数据各看一遍”更好——这就是 Nemotron-CC 按质量等级区别对待、Marin 把数学数据上采样 5–10 倍的思路。要验证,就在代码副本里构造这个混合、训练、比较。

练习 3(为什么按快照去重相当于加权) 一个网页在 8 个快照里每次以概率 pp 活下来(从第 1 个快照开始存在)。(a) 它平均出现在几个快照里?(b) p=0.9p = 0.9(百科)和 p=0.3p = 0.3(垃圾页)各是多少?(c) 每个快照各自去重之后,好网页相对垃圾页被”上采样”了多少倍?

参考答案

(a) 在第 ss 个快照里还活着的概率是 ps−1p^{s-1},期望出现次数 ∑s=18ps−1=(1−p8)/(1−p)\sum_{s=1}^{8} p^{s-1} = (1 - p^8)/(1 - p)。

(b) p=0.9p = 0.9:约 5.7 次;p=0.3p = 0.3:约 1.43 次(p=0.85p = 0.85 的论坛约 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)。

和本目录其他课程的联系


13. 下一讲预告 · Next lecture

预训练让模型学会了”续写”——它知道很多,但不会听指令。从预训练模型到 ChatGPT 这样的助手,靠的是后训练,而后训练的数据和预训练完全不同:量小得多(几万到几百万条),每一条都精心构造。

第 8 讲:后训练数据 I——指令、偏好与 AI 反馈。 客座讲者 Etash Guha(OpenThoughts 的作者之一):FLAN 把几十个 NLP 数据集改写成指令;InstructGPT 的三阶段数据(示范、比较、强化学习);Self-Instruct 和 Alpaca 让模型自己生成指令数据;UltraFeedback 和 Constitutional AI 用 AI 代替人给反馈;以及 Tulu 3 这样完全开放的后训练配方。代码会模拟一个”教师 / 学生”的 Self-Instruct 循环,以及偏好数据的噪声怎样影响奖励模型。

← 返回课程目录