Lecture 6 · 预训练数据 I:从 Common Crawl 到 DCLM · Pre-training Data I: From Common Crawl to DCLM

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

课程源码 ZIP ↓

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

本篇目录

对应 Maps to:Stanford CS525 Winter 2026 Training Data for AI,1/26 客座讲座 Data for LMs: pre-training(Vaishaal Shankar,slides 有 HTML 版,标题 Dataset Design for Large Language Models)。阅读:Li et al. DataComp-LM: In search of the next generation of training sets for language models(DCLM,2024)、Penedo et al. The RefinedWeb Dataset for Falcon LLM(2023)、Hoffmann et al. Training Compute-Optimal Large Language Models(Chinchilla,2022)。 依据说明:Shankar 是 DataComp 和 DCLM 的作者之一。他的 slides(正文 97 页 + 附录)是本讲的骨架:扩展律与”数据饥渴”、DCLM 的评测方法、DCLM-Baseline 管线的每一步、“什么是高质量”的人类标注实验、局限与事后反思。slides 里的数字核对过 DCLM、RefinedWeb、Chinchilla 的论文摘要。第 1.3 节关于 Chinchilla 拟合的争议依据 Besiroglu et al.(2024)的复现论文摘要;第 8 节”延伸与前沿”是我补充的。 配套代码 Code:code/lecture06/(numpy;3 个脚本 + 2 个模块;最慢的两个脚本各约 30 秒) 预计阅读时间:3 小时(含运行代码)


0. 本讲导航 · How to read this lecture

0.1 学习目标 Learning goals

  1. 用 Chinchilla 扩展律解释”语言模型为什么需要这么多数据”,会算计算最优的分配,理解今天的模型为什么”过度训练”。
  2. 说明 DCLM 怎样评测一个数据集:固定模型、训练配方和 token 数,只换数据,在多个规模上看 53 个下游任务。
  3. 讲清楚 DCLM-Baseline 管线的每一步——文本抽取、启发式过滤、去重、基于模型的质量过滤、去污染——各自做什么、为什么、贡献多大。
  4. 理解质量分类器的”正例”为什么那么重要,以及”我们其实不知道为什么指令数据做正例效果最好”。
  5. 理解”高质量”为什么只能操作性地定义:人的判断和”对训练有用”几乎不相关。
  6. 从 DCLM 的事后反思里学到:工程约束会塑造结果;要测量最终数据的性质(例如全局重复率)。

0.2 先修与本讲范围 Prerequisites & scope

默认你已经会 Assumed本讲不展开 Not covered
第 3 讲:Common Crawl、alt-text、CLIP 分数过滤FineWeb、Nemotron-CC、数据受限与过滤的扩展律(第 7 讲)
第 4 讲:Parquet、map-reduce、Bloom filter、MinHash + LSH代码、数学数据的专门处理
第 5 讲:DataComp 的”固定训练、只比数据”后训练数据(第 8–9 讲)、数据配比(第 10 讲)
语言模型是”预测下一个 token”Transformer 的结构、分词器的细节

0.3 本讲地图 Map

§1  为什么语言模型这么"饿":扩展律、Chinchilla、过度训练              ← 代码 01
§2  方法论:怎样衡量一个数据集
§3  DCLM-Baseline 管线:抽取 → 启发式 → 去重 → 模型过滤 → 去污染        ← 代码 02
§4  结果
§5  什么是"高质量"?人能分辨吗?                                      ← 代码 03
§6  局限、事后反思与开放问题
§7  我们的合成世界:它是什么、它不是什么
§8  延伸与前沿
§9–13  小结、常见误区、练习、延伸阅读、下一讲预告

0.4 记号 Notation

记号含义
NN模型参数个数
DD训练时看的 token 数
C≈6NDC \approx 6ND训练的计算量(浮点运算次数,FLOPs)
L(N,D)L(N, D)训练后的损失(每个 token 的交叉熵)
TT代码里的训练预算(看多少个 token)
η\eta代码里迷你语言模型的”学习率”:每看一次往观测挪多少

0.5 关于数字

讲义里 DCLM、Chinchilla 等的数字来自 Shankar 的 slides 和论文。代码的数字来自一个合成网页世界(§7 详细说明):600 个虚构国家、每个 5 个属性,共 3000 条”事实”;6 种网页(百科、论坛问答、垃圾广告、导航页、乱码、外语);一个”慢慢学”的三元语言模型;“下游任务”是 3000 道知识题。代码固定了随机种子,同一台机器上重复运行输出逐字相同。换一个训练时抽文档的随机种子,准确率的标准差约 0.005–0.009——比这小的差别不要当真。


1. 为什么语言模型这么”饿”

1.1 从图像到文本

前五讲的主角是图像和图文对。从这一讲开始换成文本和语言模型。语言模型的训练目标很简单:给定前面的 token,预测下一个 token,最小化交叉熵。token 是模型读的最小单位——常见的词是一个 token,少见的词被切成几段;词表通常有 3.2 万到 10 万个 token。英语里一个 token 平均约 0.75 个词,所以”训练 2 万亿个 token”大约是 1.5 万亿个词、三百万本书。

1.2 扩展律

Kaplan et al.(2020)发现,语言模型的损失随模型大小、数据量、算力呈幂律下降。Chinchilla 论文把损失写成模型大小 NN 和训练 token 数 DD 的函数:

L(N,D)=E+ANα+BDβ.L(N, D) = E + \frac{A}{N^{\alpha}} + \frac{B}{D^{\beta}} .

三项各有含义:EE 是文本本身的不确定性(再大的模型也降不下去);A/NαA/N^{\alpha} 是”模型太小”的代价;B/DβB/D^{\beta} 是”数据太少”的代价。训练的计算量约为 C≈6NDC \approx 6ND(每个 token、每个参数,前向 2 次、反向 4 次浮点运算)。

核心问题:给定算力 CC,NN 和 DD 怎么分?把 D=C/(6N)D = C/(6N) 代入,对 NN 求导令其为零,得到

Nopt∝Ca,Dopt∝Cb,a=βα+β, b=αα+β.N_{\text{opt}} \propto C^{a},\quad D_{\text{opt}} \propto C^{b},\qquad a = \frac{\beta}{\alpha+\beta},\ b = \frac{\alpha}{\alpha+\beta} .

直觉:α\alpha 大说明”加参数”降损失快,β\beta 大说明”加数据”降损失快;最优的分配让两种投资的边际收益相等。

1.3 Chinchilla:数据要跟上

Hoffmann et al.(2022)训练了 400 多个模型(7000 万到 160 亿参数,50 亿到 5000 亿个 token),用三种方法估计最优分配,结论是:模型大小和训练 token 数应该等比例增长——模型大一倍,数据也要多一倍,大约每个参数 20 个 token。按这个标准,当时的大模型都”严重训练不足”:

模型参数token 数每参数 token
GPT-3175B300B1.7
Gopher280B300B1.1
MT-NLG530B270B0.5
Chinchilla70B1.4T20

Chinchilla 和 Gopher 的算力相同,但参数少 4 倍、数据多 4 倍多,结果在几乎所有下游任务上都胜过 Gopher(以及 GPT-3、Jurassic-1、MT-NLG),MMLU 67.5%,比 Gopher 高 7 个百分点以上。而且它更小,推理和微调都更便宜。

代码 01 用论文”方法 3”的参数化拟合(E=1.69, A=406.4, B=410.7, α=0.34, β=0.28E = 1.69,\ A = 406.4,\ B = 410.7,\ \alpha = 0.34,\ \beta = 0.28)重现了这个对比:

模型预测的损失同算力下的最优损失
GPT-32.00231.9541
Gopher1.99331.9357
MT-NLG1.99061.9164
Chinchilla1.93661.9300

MT-NLG 用了最多的算力,损失却和 Gopher 差不多——参数再多,数据跟不上也没用。

一个值得知道的插曲。代码 01 演示 1 用同一个拟合算最优分配,得到的每参数 token 数不是 20,而是随算力从 32(101910^{19} FLOPs)涨到 122(102510^{25} FLOPs)。三种方法本应一致;Besiroglu et al.(2024)尝试复现方法 3,认为原文的拟合和数据对不上、置信区间窄得不合理,重新拟合后与方法 1、2 一致。教训:扩展律非常有用,但它是对一组实验的拟合,不是物理定律;细节对拟合方式很敏感。

1.4 今天的模型为什么”过度训练”

Shankar 的 slides 列出了几个开源模型(“Chinchilla 最优”按每参数 20 个 token 算):

模型参数Chinchilla 最优实际 token 数过度训练倍数
Llama 2 7B7B约 140B2T14×
Mistral 7B7B约 140B约 8T(估计)约 57×
Llama 3 8B8B约 160B15T94×
Qwen 2.5 7B7.6B约 150B18T120×

为什么要远远超过”最优”?因为”最优”只算了训练成本。一个要服务上亿次请求的模型,推理成本远比训练成本重要;而推理成本大约正比于参数个数。小模型多训练,是用训练算力换推理算力。代价是:你在损失曲线的平坦段上,每多一个 token 收益很小;而且需要海量的高质量数据。

代码 01 演示 3 用拟合算了一笔账:

模型token 数每参数计算最优地达到同样损失需要的模型需要的训练算力推理便宜几倍
Llama 2 7B2T28612.7B0.87 倍1.8
Llama 3 8B15T187526.1B0.50 倍3.3
Qwen2.5 7B18T236826.4B0.45 倍3.5

Llama 3 8B 多花了约一倍的训练算力,换来一个推理时便宜 3 倍多的模型。(绝对数字依赖于那个有争议的拟合,量级是可信的。)

反过来,GPT-3 时代的”训练不足”有什么问题?数据少、好整理,但模型太大、推理很贵,而且停在了损失曲线还很陡的地方——“把性能留在了桌上”。

1.5 隐含的假设

Shankar 强调了扩展律一个隐含的假设:有无限多的、高质量的、独立同分布的数据。现实是规模越大,保持质量越难:

  • 10 亿 → 1000 亿 token(GPT-1 到 GPT-3 时代):相对容易整理;
  • 1000 亿 → 1 万亿:认真过滤可以做到;
  • 1 万亿 → 10 万亿(GPT-4 时代):很难,需要激进的过滤;
  • 10 万亿以上:非常难,“刮锅底”。

从 GPT-1(2018)到 GPT-4(2023),训练集大约增长了 3000 倍,而关于数据里有什么的透明度却越来越低。规模越大,数据质量而不是算力,成了瓶颈。

代码 01 演示 4:按那条拟合,102310^{23} FLOPs 的最优 token 数约 1.1 万亿,102510^{25} 约 14.3 万亿,102610^{26} 约 50 万亿。而 Common Crawl 虽然每月有约 100 TB 压缩文本,经过语言过滤、去重、质量过滤,留下的只是一小部分。

所以我们需要的是:一个可扩展的、自动化的配方,在万亿 token 的规模上产出高质量的训练数据。手工整理 10 亿个 token 不能扩展到万亿。


2. 方法论:怎样衡量一个数据集

2.1 固定一切,只换数据

和第 5 讲的 DataComp 一样,DCLM(DataComp for Language Models)把”比数据”变成一个受控实验:

  1. 固定模型:每个规模用同样的架构(仅解码器的 Transformer);
  2. 固定训练:同样的超参数、同样的训练 token 数;
  3. 只换数据:用不同方法过滤出的数据集训练;
  4. 评测:53 个下游任务;
  5. 比较:分数高的数据集更好。

Shankar 说:“现在也许有了更好的数据集,但评测数据集的这套方法依然是对的。”

2.2 评测什么

53 个任务分成两组:

  • CORE(22 个):在小规模(10 亿参数)上就能给出稳定信号的任务——HellaSwag、ARC-Easy / Challenge、PIQA、WinoGrande、BoolQ、COPA、LAMBADA、OpenBookQA 和一些 BigBench 任务;
  • EXTENDED(53 个):CORE 加上 MMLU(0-shot 和 5-shot)、GSM8K、TriviaQA、SQuAD、CoQA、LogiQA、GPQA 等。

slides 举了三个例子:MMLU(57 个学科、15,908 道选择题,考知识)、HellaSwag(7 万道题,日常情境的常识推理,人类约 95%)、WinoGrande(4.4 万道题,代词指代,需要常识:“奖杯放不进棕色的箱子,因为它太大 / 太小”)。

DCLM 报告居中准确率(centered accuracy):把随机猜的准确率映射到 0、全对映射到 1。四选一的题随机猜就有 25%,居中之后不同任务才能平均。

为什么要 CORE?小模型在很多难任务上接近随机,分数里全是噪声;只用”在小规模上就有信号”的任务做决策,才能在小规模上做实验。

2.3 多个规模

规模参数训练 token 数约 GPU 小时
XS412M8B约 50
S1B29B约 500
M3B56B约 2,500
L7B138B约 10,000

一次 XS 训练几个小时,一次 L 要在集群上跑好几天。关键问题:小规模上的排名能信吗? DCLM 的答案是相当能:XS → L 的相关 0.84,S → L 0.96,M → L 0.98(DataComp 的图像实验里,各规模之间的秩相关在 0.71–0.90)。所以可以在小规模上便宜地迭代。

注意这些规模的训练 token 数(80 亿到 1380 亿)都远小于过滤后的数据(几万亿)——每个文档最多看一遍。数据要被重复时会发生什么,是第 7 讲的问题。

代码 03 演示 4 在合成世界里做了同样的检查:9 个数据集在三个预算(1 万、3 万、6 万个 token)下的准确率,排名的 Spearman 相关是小 → 大 0.72、中 → 大 0.95——规模越接近越相关;差距很小的数据集会交换名次(百科式分类器前 20% 在小、中预算上排第 1,大预算上排第 3)。


3. DCLM-Baseline 管线

DCLM-Pool(Common Crawl,240 万亿 token)
  → 文本抽取(resiliparse)
  → 启发式过滤(RefinedWeb 的规则)
  → 去重(Bloom filter,段落 + 文档级)
  → 模型过滤(fastText,正例:OpenHermes 2.5 + ELI5,保留前 10%)
  → DCLM-Baseline(3.8 万亿 token,约占原始文档的 1.4%)

(slides 的流程图写的是这四步;去污染作为单独的一步在后面检查。)

代码 02 演示 1 在合成世界里走了一遍同样的管线(“小 / 中 / 大”是 1 万 / 3 万 / 6 万个 token 的训练预算下 3000 道知识题的准确率):

步骤文档占比token 数主要类型小中大
候选池(WET 式抽取)1.0006,677,013外语、导航、垃圾、乱码0.1200.1690.240
好的抽取器0.7724,914,194外语、垃圾、乱码、论坛0.1300.1970.277
+ 启发式过滤0.3142,051,608垃圾、乱码、百科、论坛0.1590.2550.383
+ 去重0.1991,146,889垃圾、乱码、百科、论坛0.1750.3210.456
+ 质量分类器(前 10%)0.02070,183论坛0.2430.4730.693

每一步都让同样预算下的模型学到更多;最后留下的文档只占候选池的 2.0%(DCLM:约 1.4%)。下面逐步来看。

3.1 文本抽取

Common Crawl 提供原始的 HTML(WARC 文件),也提供它自己抽好的纯文本(WET 文件)。WET 文件把网页上的所有文字都留下了:导航栏、“跳到正文”、“订阅”、“登录”、版权声明……slides 里的例子是一篇《纽约时报》存档文章:WET 版本开头是十几行站点导航,正文淹没在其中;resiliparse 抽出来的只有正文。

方法说明CORE速度
WET 文件Common Crawl 预先抽好的20.7—
trafilatura严格抽取,去掉模板24.51×
resiliparse快,质量好24.18×

DCLM 选了 resiliparse:质量和 trafilatura 差不多,快 8 倍。在 240 万亿 token 的规模上,8 倍的速度就是 8 倍的钱。(FineWeb 也发现 WARC 加好的抽取器优于 WET,第 7 讲。)

代码 02:同样的后续步骤,WET 式抽取的准确率是 0.282,好的抽取器 0.321(中等预算)。模板文字浪费了训练预算,还让重复行规则误判。

3.2 起点:RefinedWeb

DCLM 先比较了当时的开源数据集(同样的设置下的 CORE):

数据集来源CORE
C4Common Crawl + 启发式34.2
Dolma-V1Common Crawl + 维基 + 书籍 + ……35.0
RedPajamaCommon Crawl + 维基 + 书籍 + ……35.3
RefinedWeb只有 Common Crawl36.9

最好的是 RefinedWeb(Penedo et al. 2023,为 Falcon 模型构建)。它的核心主张是:只要过滤和去重做得好,只用网页数据就能训练出强大的模型,不需要专门收集书籍、论文、社交媒体等”精选”语料——它的模型显著好于在 The Pile(精选语料的混合)上训练的模型。RefinedWeb 从 Common Crawl 抽出约 5 万亿 token,公开了其中 6000 亿。DCLM 以它的配方为起点往上改进。

3.3 启发式过滤

DCLM 复现了 RefinedWeb 的规则(它们又继承自 Gopher 的 MassiveText 和 C4):

  • 文档级:语言(用 fastText 语言识别器,只留英语);URL 黑名单(成人、恶意网站);长度上下限;词数合理;
  • 内容质量:重复(重复的 n-gram、行、段落);停用词比例(正常的英语句子里有大量 the、of、and);省略号个数;被删掉的模板文字比例。

slides 给出了各条规则删掉的比例:非英语约 55%,太短 / 太长约 10%,重复约 8%,停用词太少约 5%;合起来,启发式规则删掉了约 80% 的文档。

代码 02 演示 1 里,6 条规则一共拦下了候选池的 68.6%,语言规则一条就占了 54.6%。导航页、外语页被清得干干净净;但垃圾广告页和乱码页大量混了过去——过滤后,垃圾页反而成了最大的一类(47%)。它们的措辞、标点、长度都很正常,事实却多半是错的。这是启发式规则的天花板:规则只能看表面统计量。

3.4 去重

为什么去重? 减少记忆(模型会逐字背下反复出现的内容,第 18 讲);增加多样性(每个训练 token 带来更多新东西);去掉模板(页眉页脚、导航在大量网页上重复)。难点是:“重复”怎么定义?完全一样?近似一样?共享某些段落?

一个方法论上的陷阱(slides 第 32 页):去重的效果不能在小样本上研究。完整数据集(比如 1 万亿 token)里有大量重复;随机抽 10 亿 token 的子样本,重复会少得多——两个副本同时被抽中的概率很小。所以”在小规模上做实验”这个 DCLM 的基本策略,对去重不完全适用。

几种方法(第 4 讲讲过原理):

方法粒度类型思路
完全哈希文档精确对整个文档算哈希
MinHash + LSH文档模糊近似 Jaccard 相似度
后缀数组子串精确找出重复出现的长子串
Bloom filter(BFF)段落 + 文档精确 / 模糊n-gram 是否见过

GPT-3、RefinedWeb 用的是 MinHash + 后缀数组。DCLM 的 MinHash 设置:5-gram,目标 Jaccard 阈值 0.8,93 段 × 每段 15 个,共 1,395 个哈希函数(哈希族 h(x)=(ax+b) mod ph(x) = (ax + b) \bmod p)。MinHash 的缺点:在几十亿个文档上很贵;只能整篇去重,删不掉”独特文档里的重复段落”;分片后跨片的重复检测不到。后缀数组要把整个语料载入内存,很难跨机器并行。

DCLM 的做法:BFF(段落 + 文档级 Bloom filter)。对每个文档:按换行切成段落;对每个至少有 min_ngram 个 token 的段落,抽出所有 13-gram,查 Bloom filter——如果超过 80% 已经见过,删掉这个段落,否则把它的 n-gram 加进去;如果整个文档超过 80% 的 n-gram 都见过,删掉整篇。超参数:min_ngram = max_ngram = 13,阈值 0.8,误报率 0.01。为什么是 13 而不是 5?设成 5 时总分略高,但 MMLU 明显下降——它删掉了太多短的、有效的段落(菜谱的配料、选择题的选项这类短列表项)。误报率 0.01 为什么够用?因为要被误删,一个段落需要大量 n-gram 同时误报(练习 2)。

在 1B 规模上的比较:

方法剩余 token删掉分数提升
不去重76B0%24.7—
只做完全哈希66B13%26.0+1.3
只做 MinHash62B18%25.6+0.9
只做后缀数组51B33%26.6+1.9
Bloom filter(BFF)56B26%26.8+2.1
三种合起来45B41%26.8+2.1

BFF 一个就达到了三种方法合起来的效果,而且更容易扩展、留下的 token 更多。在 7B 规模上,min_ngram = 13 的 BFF(MMLU 44.3,留下 3.8T)和 MinHash + 后缀数组(44.4,3.2T)相当;min_ngram = 5 的 MMLU 只有 32.5。

分片。DCLM-Baseline 分成 100 片(每片约 700 GB)独立去重:可以 100 台机器并行,每片的 Bloom filter 放得进内存,几天而不是几周跑完。代价是:同一个文档如果在第 1 片和第 50 片各有一份,两份都会留下。“我们本来希望跨片的重复很少……事实并非如此。”(§6.2)

代码 02 演示 2:

方法文档数删掉的 token同一原文多余的副本中大
不去重30,9180%12,1690.2550.383
完全去重24,40823%5,6590.2910.414
段落 + 文档级(1 片)19,65444%9050.3210.456
段落 + 文档级(10 片)29,35211%10,6030.2790.424

去重让同样预算下的模型学到更多;段落级比整篇去重删得更多(它能删掉”整体不同、但套了同一段广告”的页面);分 10 片之后,多余的副本从 905 个涨到 10,603 个,准确率也低了一些。(“多余的副本”是用世界的真相数出来的——真实数据没有这个标签,这正是 DCLM 事后才发现问题的原因。)

3.5 基于模型的质量过滤

启发式规则和去重之后,还能不能用机器学习做得更好?思路:训练一个二分类器,区分”高质量”文本和随机的网页文本,然后给每个文档打分,保留分数最高的 k%k\%。

fastText(Facebook,2016)是一个又快又浅的文本分类器:把文档里的词和 n-gram 映射成向量、求平均、接一个线性层和 softmax。没有循环网络、没有注意力,一个 CPU 每秒能处理约 100 万个文档——这在几十亿个文档上很重要。DCLM 的设置:约 40 万个训练文档(20 万正例、20 万负例——负例是随机网页文本),特征是一元和二元组,嵌入 100 维,在 CPU 上训练几分钟;然后给语料里的每个文档打分,保留前 10%。

关键问题:正例用什么? 传统的选择是维基百科、书籍、精选的网页(OpenWebText)。DCLM 发现指令微调数据好得多:

正例(参照数据)保留COREMMLU
维基百科10%35.727.0
OpenWebText210%34.725.0
维基 + 书籍 + OpenWebText10%37.524.4
OpenHermes 2.5 + ELI510%41.029.2

OpenHermes 2.5 是约 100 万条指令-回答对(用 GPT-4 等模型生成,覆盖代码、数学、写作、推理、角色扮演……),本来是做指令微调用的;ELI5(“像对五岁孩子那样解释”)是 Reddit 上被高赞的问答。用它们做正例,比维基百科高 5 个 CORE 分。

为什么? Shankar 的回答很诚实:“我们其实不知道!“几个假设:清晰的、解释性的写作风格;问答结构和评测格式相似;信息密度高、没有模板文字;话题多样。“但这些只是猜测。分类器是个黑盒——我们只知道它在经验上有效。”

阈值:保留得越少越好(在 DCLM 的规模上)——前 10% CORE 41.0、15% 39.8、20% 38.7。

和其他质量过滤方法比:

方法说明CORE
只用启发式RefinedWeb 的规则27.5
PageRank 前 20%保留被链接多的网页26.1
困惑度过滤保留困惑度低的文本29.0
LLM 当评委问 Mistral-7B 这个文档有没有用28.6
fastText 分类器用指令数据做正例30.2

便宜的线性分类器打败了用大模型当评委。会不会”用掉”指令微调的收益? 一个担心是:既然预训练数据已经被选得像指令数据,后面的指令微调还有用吗?答案是不会——在 DCLM-Baseline 上预训练的模型,指令微调的效果和平常一样。过滤选的是”像指令数据的网页”,指令数据本身并没有进入预训练。

代码 02 演示 3(中 / 大预算;“热门”是前 50 个国家的题,“长尾”是排名 200 以后的):

正例保留主要类型中大大·热门大·长尾
不用分类器100%垃圾、乱码、百科0.3210.4560.7560.392
百科(维基式)10%百科0.4530.6450.9680.560
指令问答(OpenHermes 式)10%论坛0.4730.6930.9040.649
指令问答20%论坛、乱码0.4600.6770.8720.625
指令问答40%乱码、论坛0.3920.5600.7880.506
百科20%百科0.4740.6730.9440.600
  • 任何一种质量分类器都远好于不用;
  • 同样保留 10%,指令问答做正例好于百科(方向和 DCLM 一致,幅度小一些);
  • 在这个世界里,原因看得见:百科式分类器挑出”最像百科”的网页——措辞最正式、主题多半是热门国家,热门题 0.968,长尾题 0.560;问答式分类器挑出论坛问答——人们什么国家都会问,长尾 0.649。我们的评测按国家均匀出题,长尾占了大头。这对应上面”话题多样”那条假设;我们的世界只实现了这一条。
  • 最佳阈值取决于分类器:问答式 10% 略好于 20%、明显好于 40%;百科式却是 20% 好于 10%——它的前 10% 是”最百科”而不是”最有用”的网页。

正例是什么,决定了模型擅长什么——如果评测改成按热度加权(热门国家的题多考),排名会反过来(练习 3)。这和第 5 讲”按图片过滤编码了’我们关心什么‘“是同一个教训。

3.6 去污染

如果评测题出现在训练数据里,基准就失去了意义:模型可能背下了答案,而不是学会了推理。DCLM 检查训练文档和全部 53 个评测任务之间的 13-gram 重叠,删掉重叠的文档。结果:不到 0.01% 的文档因为污染被删掉——大多数基准的数据本来就不在 Common Crawl 里,或者在前面的步骤里已经被过滤掉了(slides 推测:基准题看起来并不像指令数据)。去污染前后,MMLU 51.8 → 52.7,HellaSwag 77.9 → 78.4——删掉重叠样本并没有降低分数。第 14 讲会更系统地讨论评测数据的污染。

3.7 混合”高质量来源”反而有害

一个反直觉的发现(slides 附录):

Common Crawl 子集原始 CORE+ 维基 / 书籍等变化
C423.725.9+2.2
RefinedWeb25.126.5+1.4
DCLM-Baseline31.129.9−1.2

过滤做得好的时候,再混入”高质量”的精选来源反而有害。

代码 02 演示 4:给问答式分类器前 10% 的数据混入约 9 万 token 的百科网页,中等预算的准确率从 0.473 掉到 0.244;只做了启发式过滤的数据,混入百科几乎没有影响(0.321 → 0.312)。机制是稀释:预算固定,混进来的百科占了一半以上的预算,而它们讲的多半是模型已经知道的热门国家。我们的世界没有复现”过滤得差时混入有帮助”的那一半——这里的百科多半讲热门国家,而真实的维基和书籍能补上 C4 缺的长尾知识和长文本。


4. 结果

4.1 最终的模型

最终的 7B 模型用 DCLM-Baseline(3.8T)加上 StarCoder(代码)和 ProofPile2(数学),训练约 2.5–2.6 万亿 token(slides 写 2.5T,论文摘要写 2.6T),学习率衰减分两个阶段(第二阶段用过滤得更严的数据),上下文长度从 2K 扩展到 8K。

4.2 数字

  • MMLU(5-shot)64%,7B 参数、2.6T token;
  • 对比 Llama 3 8B:MMLU 相近(64% vs 66%),53 个任务的平均相近,训练算力少 6.6 倍;
  • 对比 Mistral-7B:MMLU 相近(64% vs 63%),而 DCLM 的数据是公开的;
  • 对比之前最好的开放数据模型 MAP-Neo:MMLU 高 6.6 个百分点,算力少 40%;
  • 截至 2024 年 6 月,用 DCLM-Baseline 训练的模型在”算力-准确率”平面上帕累托支配了所有 7B 级的模型;
  • 指令微调之后,DCLM-7B-Instruct 的 IFEval 59.3、GSM8K 51.2、MMLU 63.2、BBH 45.1,都高于 Mistral-7B-Instruct(57.2、40.0、53.9、42.2);
  • 小模型同样受益:1.4B 参数、4.3T token,CORE 45.2、MMLU 47.5,高于 Gemma-2B(43.3、40.8)和 OLMo-1B(29.7、26.0)。

4.3 关键发现(slides 的总结)

  1. 文本抽取很重要:resiliparse 远好于 WET 文件(+3.4 CORE);
  2. 去重有帮助:+2.1 CORE;
  3. 模型过滤是关键:用指令数据做正例的 fastText 最好;
  4. 混合可能有害:过滤做得好时,再加维基 / 书籍反而变差;
  5. 小规模能预测大规模:1B 和 7B 之间的相关 r > 0.95。

5. 什么是”高质量”?人能分辨吗?

5.1 一个游戏

Shankar 在课上给学生看几段文档,让大家猜它来自哪个阶段:候选池(几乎全是垃圾)、RefinedWeb(只做了启发式过滤)、还是 DCLM-Baseline(又过了质量分类器)。

  • 一个博客侧边栏(日历、TrackBack 链接、评论预览)——候选池;启发式规则会删掉它。
  • 一个相册导航页(“photo No. 1, photo No. 2 ……”)——候选池;重复规则会删掉它。
  • 一个卖古董鱼饵的页面,描述得很详细——RefinedWeb;质量分类器拒绝了它,“我们不知道为什么”。
  • 一个 Apple StackExchange 上的问答(Time Machine 让硬盘变成只读)——DCLM-Baseline。
  • 一个电台节目的介绍,有真实的内容——RefinedWeb;分类器拒绝了。
  • 一篇”该不该买旅行指南书”的利弊列表——DCLM-Baseline。

很难猜。代码 03 演示 1 在合成世界里出了同样的题:一篇措辞正式的垃圾页通过了全部启发式规则;一篇看起来比论坛问答”好”得多的百科页,没被问答式分类器选中。

5.2 人类标注实验

DCLM 的作者们请 16 位合著者给约 500 个文档打质量标签,每个文档 3 人,多数投票。平均一致率只有 71%——人和人之间对”质量”都没有共识。更关键的问题:人的判断能预测一个文档对训练有没有用吗?

没有相关性。 和人的判断更一致的分类器,并不能产出更好的训练数据:

方法和人的一致率下游分数
AskLLM(问 Mistral-7B)82%28.6
fastText(指令数据做正例)73%30.2

和人更不一致的方法反而更好。Shankar 的假设:人可能高估了”光鲜”的内容,低估了多样性。

代码 03 演示 2–3 把这个假设变成了一个可以检验的机制。模拟的标注员看”像不像样”(正式的措辞、规范的标点、长度),各自带噪声;3 个人两两之间的一致率 0.724。他们喜欢百科页(89% 被评为好)和垃圾页(62%),不喜欢论坛问答(0%)和乱码页(3%)——而按世界的真相,每 100 个词里的正确事实:百科 9.75、论坛 7.71、乱码 3.42、垃圾 1.08。“被评为好”和”真的有用”的相关系数只有 0.06。

过滤方法(各保留前 10%)和人的一致率下游准确率留下的主要类型
不过滤(启发式 + 去重)—0.456垃圾、乱码
人类标签训练的分类器0.8460.194垃圾 0.84、百科 0.16
LLM 评委0.8300.606百科 0.85、垃圾 0.15
困惑度过滤(百科上训练)0.6780.599百科
百科式分类器0.7780.645百科
指令问答式分类器0.1940.693论坛

和人最一致的方法(人类标签训练的分类器)训练出的模型最差,比不过滤还差——它学会了人的偏好,把措辞正式的垃圾页大量留了下来。和人最不一致的方法(一致率 0.194,低于 0.5,说明判断方向和人相反)最好。五种方法的”一致率”和”下游准确率”的相关系数是 −0.51。

5.3 操作性的定义

DCLM 的结论:“高质量”没法事先定义。 它是操作性的,不是哲学性的:

高质量的数据 = 能让我们在乎的评测变好的数据。

它取决于你的下游任务;人的直觉不是可靠的向导;唯一的办法是训练、评测。这和第 1 讲”基准在测什么”、第 5 讲”过滤编码了我们关心什么”是一脉相承的。

两点补充。第一,“在乎的评测”本身是一个选择:DCLM 的 53 个任务偏向英语的知识和常识推理;换一组评测,“高质量”的含义就会变。第二,人的判断不是没用——在安全、毒性、隐私这些维度上,人的标准恰恰是我们要的(第 18–19 讲)。DCLM 的结论针对的是”对下游能力有用”这一个维度。


6. 局限、事后反思与开放问题

6.1 局限(slides)

  • 规模:只测到 7B 参数;
  • 算力:没法测试所有组合;
  • 分词器:只用了 GPT-NeoX 的分词器(可能影响多语言和数学);
  • 只有英语:多语言分析很有限;
  • 代码和数学:StarCoder、ProofPile 是事后加进去的;
  • 偏向评测:针对 MMLU、HellaSwag 等优化,不一定推广到所有用途。

6.2 事后反思:重复的问题

为什么选 Bloom filter 去重?因为当时它是能跑得最快的:MinHash 在几十亿个文档上要几千个排列,后缀数组要把整个语料载入内存。“但这个选择带来了我们当时没有充分意识到的后果。”

发表之后,两篇论文分析了 DCLM:

  • Nemotron-CC(2024 年 12 月,第 7 讲):DCLM 里约 80% 是近似重复,3.8 万亿 token 里只有约 1.0 万亿是独特的;
  • Datasets, Documents, and Repetitions(2025 年 3 月):取决于候选池,模糊重复占 33%–83%;而且重复多的文档往往质量更高。

slides 附录的表格(用全局 MinHash 检查处理过的数据集,剩余的重复比例):DCLM-Baseline(BFF,100 片)85%;RefinedWeb 官方版(MinHash + 后缀数组,1 片)0%;DCLM 复现的 RefinedWeb(16 片)45%;Dolma V1(精确 Bloom)36%。BFF 和 MinHash 对”重复”的定义不同——而且”剩下的重复似乎没有造成伤害!”

教训(slides):

  • 工程约束塑造结果:选 Bloom filter + 分片是为了效率,不是因为最优;
  • 测量重要的东西:他们没有在最终数据上测全局重复率;
  • 科学是迭代的:后来的论文发现了他们漏掉的问题。
  • “如果重来一次:在全局去重的基础设施上多投入,至少测一下最终数据集的重复率。”

(代码 02 里,分片留下的重复让准确率低了一些;DCLM 的经验是”似乎没有伤害”。两者不矛盾:如果重复的主要是高质量文档,它们相当于被”上采样”了——第 7 讲 FineWeb 的发现会回到这一点。)

6.3 开放问题(slides)

  • 为什么指令格式的参照数据效果这么好?
  • 在更大的规模上,最优的阈值是多少?
  • 好的过滤能不能和聪明的混合结合起来?(第 10 讲)
  • 怎样扩展到真正的多语言?
  • 能不能在不损害质量的前提下过滤安全 / 毒性内容?

7. 我们的合成世界:它是什么、它不是什么

代码 02、03 的所有结论都来自一个刻意简化的世界(webtext_world.py、textlab.py)。读代码之前,先弄清楚它的假设:

世界。600 个虚构国家,每个国家有首都、出口品、语言、气候、动物 5 个属性,共 3000 条事实。国家有热度(Zipf 分布)。一条事实在文本里总是三个连续的词:zoka capital belmiro。

网页。6 种类型,比例和行为都是设定的:百科(正式、正确、多半写热门国家)、论坛问答(口语、基本正确、什么国家都问)、垃圾广告(正式、多半错误、重复)、导航页、乱码(有信息,但事实常被乱码打断)、外语。网页外面包着导航栏和页脚;一部分网页被复制(模板页、垃圾页复制得最多)。

模型。一个”慢慢学”的三元语言模型:每看到一次”前两个词 → 下一个词”,就把预测往看到的词挪一步(η=0.5\eta = 0.5);看得越多越相信,没看过的回退到更短的上下文。训练预算比数据少时随机抽一部分文档、每篇看一遍;比数据多时整个数据集看好几遍(第 7 讲)。它的好处是”训练”只需要数数,几秒钟就能比较几十个数据集。

评测。3000 道知识题:“zoka capital ?”,在候选值里选概率最高的。按国家均匀出题,长尾国家占多数。

它不是什么。这个模型没有泛化能力(没见过的事实只能瞎猜),没有容量限制,也没有”推理”;评测只考”记住了多少事实”。所以:

  • 它能演示”数据里有什么 → 模型学到什么”的机制:覆盖、噪声、重复、稀释;
  • 它不能演示格式、写作风格、推理能力这些——DCLM 关于”为什么指令数据好”的其他几个假设(问答结构、解释性写作),这个世界里根本不存在;
  • 绝对数字没有意义,只看相对的比较和趋势。

8. 延伸与前沿 · Beyond the original lecture

本节是我补充的。

  • 模型过滤成了标配。DCLM 之后,开源模型的技术报告里几乎都有基于模型的质量过滤:Llama 3 用 fastText 加 DistilRoBERTa 分类器;Qwen 2 用 Qwen 模型自己当质量过滤器;OLMo 2 第一阶段的预训练数据里 3.71 万亿 token 直接来自 DCLM-Baseline(第 7 讲 Schmidt 的综述)。
  • “LLM 当标注员,小模型当过滤器”。DCLM 里”LLM 当评委”输给了 fastText;但 FineWeb-Edu 换了一个问题——让 Llama-3-70B 给”教育价值”打分,再蒸馏成一个小分类器——效果很好(第 7 讲)。问 LLM 什么问题、怎样把它的判断蒸馏成可扩展的过滤器,是一个活跃的方向。
  • 过滤太狠的代价。DCLM、FineWeb-Edu 的激进过滤删掉了约 90% 的数据,在长训练(十几万亿 token)中数据不够用。Nemotron-CC 用分类器集成和合成改写在”质量”和”数量”之间找平衡(第 7 讲)。
  • 这份 slides 本身。Shankar 的 HTML 版 slides 最后几页介绍了它的制作过程:在一次会话里用 Claude Code 生成,给它看了 DCLM、Chinchilla、DataComp 论文的 LaTeX 源码和从 Common Crawl 实时下载的样例。哪些需要人来把关?教学结构、学术诚实(“我们不知道指令数据为什么有效”,“去掉花哨的词”)、视觉品味、领域知识(重复问题的事后反思、过度训练的权衡)。

9. 小结 · Summary

  1. 语言模型很”饿”:Chinchilla 说参数和数据要等比例增长(约每参数 20 个 token);今天的模型为了推理便宜而”过度训练”(每参数上千个 token),把对数据的需求推到了十几万亿 token。扩展律假设有无限的高质量数据——规模越大,数据质量越是瓶颈。
  2. DCLM 的方法论:固定模型、训练配方和 token 数,只换数据;53 个任务(CORE 22 个在小规模上就有信号);4 个规模;小规模的排名能预测大规模(r 0.84–0.98)。
  3. 管线:resiliparse 抽取 → RefinedWeb 启发式(删掉约 80%)→ BFF 段落 + 文档级去重 → fastText 质量分类器(OpenHermes 2.5 + ELI5 做正例,保留前 10%)→ 3.8T token,约 1.4% 的文档。
  4. 模型过滤是关键,正例的选择影响巨大,而且”我们不知道为什么”;过滤做得好时,混入维基 / 书籍反而有害。
  5. 结果:7B、2.6T token、MMLU 64%,训练算力比 Llama 3 8B 少 6.6 倍,数据公开。
  6. “高质量”是操作性的:人与人的一致率只有 71%,和人更一致的过滤方法并不更好。
  7. 事后反思:分片的 Bloom filter 去重留下了大量近似重复(约 80%);工程约束塑造结果,要测量最终数据的性质。

10. 常见误区 · Common pitfalls

  1. “Chinchilla 最优就是最好的训练方式。” 它只最小化训练算力;考虑推理成本,过度训练小模型往往更划算。
  2. “扩展律是定律。” 它是对一组实验的拟合;Chinchilla 自己的三种方法就给出过不一致的分配。
  3. “过滤数据就是删掉低质量的。” 过滤同时决定了模型擅长什么(代码 02 演示 3:热门 vs 长尾)。
  4. “人觉得好的数据就是好数据。” DCLM 和代码 03:和人一致率更高的方法,训练出的模型并不更好,甚至更差。
  5. “加入维基百科、书籍总是有帮助。” 过滤做得好时反而有害。
  6. “在小样本上能研究去重的效果。” 子样本里的重复比全集少得多。
  7. “分片去重和全局去重差不多。” 跨片的重复会留下来;DCLM-Baseline 事后被发现约 80% 是近似重复。
  8. “质量分类器越大越好、LLM 当评委最好。” DCLM 里一个 fastText 线性分类器打败了 Mistral-7B 当评委;关键是正例和问题,而不是分类器的大小。

11. 练习 · Exercises

练习 1(Chinchilla 算一算) DCLM 的 7B 模型训练了 2.6 万亿 token。(a) 它用了多少训练算力?(b) 按代码 01 的拟合,这个算力下计算最优的模型多大、看多少 token?(c) 为什么 DCLM 仍然选择 7B?

参考答案

(a) C=6ND=6×7×109×2.6×1012≈1.09×1023C = 6ND = 6 \times 7\times10^{9} \times 2.6\times10^{12} \approx 1.09\times10^{23} FLOPs。

(b) 用 optimal(1.09e23):约 152 亿参数、1.2 万亿 token(每参数约 79 个;按方法 1、2 的约 20 个/参数,会是更大的模型、更少的 token)。预测损失:7B 是 2.0098,最优是 2.0008——差得很少。

(c) 7B 是一个”比较的规模”:DCLM 要和 Llama 2/3、Mistral 这些 7–8B 的模型直接比较;而且 7B 推理便宜、是社区最常用的尺寸。另外,DCLM 关心的是”同样的训练配方下哪个数据集更好”,模型大小本来就是固定的。

练习 2(Bloom filter 的误报为什么不要紧) DCLM 的 BFF 用 1% 的误报率、0.8 的阈值。一个段落有 100 个 13-gram,其中 60 个真的出现过。(a) 它”看起来见过”的比例的期望是多少?会被删掉吗?(b) 它被误删(看起来见过的比例超过 0.8)的概率大约是多少?(c) 如果要求误报率 10−1210^{-12},1 万亿个 n-gram 的 Bloom filter 要多大?

参考答案

(a) 剩下 40 个没见过的 n-gram,每个以 0.01 的概率误报:期望 60+0.4=60.460 + 0.4 = 60.4 个”见过”,比例 0.604 < 0.8,保留。

(b) 要被误删,40 个里至少要有 20 个同时误报:P(Binomial(40,0.01)≥20)≈1.1×10−29P(\text{Binomial}(40, 0.01) \ge 20) \approx 1.1\times10^{-29}。slides 用 Hoeffding 不等式给出了一个更松的上界 <10−8< 10^{-8}。阈值让单个 n-gram 的误报几乎不可能影响结果——这就是为什么可以用很小的 Bloom filter。

(c) 最优 k=−ln⁡ε/ln⁡2≈40k = -\ln\varepsilon / \ln 2 \approx 40,每个元素约 −ln⁡ε/(ln⁡2)2≈57.5-\ln\varepsilon / (\ln 2)^2 \approx 57.5 位;1012×57.5/8≈7.210^{12} \times 57.5 / 8 \approx 7.2 TB。slides 写约 6.5 TB——同一个量级。用 1% 的误报率,每个元素只要约 9.6 位,约 1.2 TB(第 4 讲练习 1 的算法)。

练习 3(换一个评测,“最好的数据”会变) 代码 02 演示 3 里,问答式分类器前 10% 好于百科式分类器(大预算 0.693 vs 0.645)。如果把评测改成”按国家热度加权”——热门国家的题被问得多——结论会变吗?先预测,再看在代码副本里算出的结果。

参考答案(实际运行结果)

按 pop_head 加权(大预算):问答式前 10% 0.895,百科式前 10% 0.911,百科式前 20% 0.915——排名反过来了。均匀出题时长尾占大头,问答式分类器覆盖长尾;按热度出题时,百科页对热门国家的覆盖更有价值。

这个练习的教训是 DCLM”操作性定义”的另一面:“高质量”是相对于评测的。DCLM 的 53 个任务偏向某一类能力;换一个评测,最好的过滤方法可能就不一样了。真实世界的评测通常不是均匀覆盖所有知识的——这也是为什么数据研究要在多个评测上报告结果。

练习 4(分片会留下多少重复) 一个文档在语料里有 cc 个副本,语料被随机分成 kk 片、每片独立做完全去重。(a) 去重后期望留下几个副本?(b) k=100k = 100 时,c=2,10,100c = 2, 10, 100 分别留下多少?(c) 这和 DCLM-Baseline 事后被发现”约 80% 是近似重复”有什么关系?

参考答案

(a) 每一片里只要有至少一个副本,就留下一个;一片里一个副本都没有的概率是 (1−1/k)c(1 - 1/k)^c。期望留下 k (1−(1−1/k)c)k\,(1 - (1 - 1/k)^c) 个。

(b) k=100k = 100:c=2c = 2 留下约 1.99 个(几乎没去掉),c=10c = 10 约 9.56 个,c=100c = 100 约 63.4 个。只有当副本数远多于片数时,分片去重才删得掉大部分。

(c) 网页上的重复大多是”每篇有几个到几十个副本”,远少于 100 片——分片几乎删不掉它们。这正是 DCLM 的 100 片 BFF 留下大量重复的原因。(另外,BFF 的段落级阈值、近似重复的定义也和 MinHash 不同。)

练习 5(讨论) 你的同事说:“我们新的过滤器选出的文档,标注员评分比旧过滤器低,所以新过滤器更差,不要用。“你怎么回应?你会做什么实验来决定用哪个?

参考答案(要点)
  • 标注员的评分和”对训练有用”可能几乎不相关(DCLM:71% 一致率;和人更一致的方法反而更差;代码 03 的相关系数 −0.51)。
  • 决定的唯一可靠办法是 DCLM 式的受控实验:同样的模型、同样的训练 token 数,分别用两个过滤器的数据训练,在你关心的评测上比较;先在小规模上做,确认排名在两个以上的规模上一致。
  • 但也要问:标注员在看什么?如果他们发现的是安全或隐私问题(例如新过滤器留下了更多个人信息、有害内容),那是另一个维度,不能只看下游分数。
  • 还要检查评测本身:新过滤器是不是只在某一类任务上好(例如知识题),而在你关心的其他能力上差?

12. 延伸阅读 · Further reading

原课材料

本讲补充

  • Kaplan et al., Scaling Laws for Neural Language Models(2020)。
  • Besiroglu et al., Chinchilla Scaling: A replication attempt(2024):arXiv:2404.10102。
  • Joulin et al., Bag of Tricks for Efficient Text Classification(fastText,2016)。
  • Wenzek et al., CCNet: Extracting High Quality Monolingual Datasets from Web Crawl Data(2020)——困惑度过滤。
  • Rae et al., Scaling Language Models: Methods, Analysis & Insights from Training Gopher(2021)——MassiveText 的启发式规则。
  • Raffel et al., Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer(T5 / C4,2020)。

和本目录其他课程的联系


13. 下一讲预告 · Next lecture

DCLM 的三个规模都在”数据比预算多”的区域里:每篇文档最多看一遍,过滤得越狠越好。但过度训练把预算推到了十几万亿 token——激进过滤之后的数据根本不够用。

第 7 讲:预训练数据 II。 FineWeb(96 个快照、15 万亿 token;为什么”全局去重”反而更差;FineWeb-Edu 用 LLM 标注教育价值);Nemotron-CC(分类器集成、按质量分桶、用 LLM 改写低质量数据,6.3 万亿 token、“长训练”上胜过 Llama 3.1);数据受限的扩展律(重复 4 遍以内几乎和新数据一样好);过滤的扩展律(“数据整理不能不考虑算力”);以及 Schmidt 对开源模型技术报告里数据部分的综述。代码会在本讲的世界里扫描”过滤强度 × 重复次数 × 预算”,看看最优的过滤怎样随预算变化。

← 返回课程目录