对应 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
- 用 Chinchilla 扩展律解释”语言模型为什么需要这么多数据”,会算计算最优的分配,理解今天的模型为什么”过度训练”。
- 说明 DCLM 怎样评测一个数据集:固定模型、训练配方和 token 数,只换数据,在多个规模上看 53 个下游任务。
- 讲清楚 DCLM-Baseline 管线的每一步——文本抽取、启发式过滤、去重、基于模型的质量过滤、去污染——各自做什么、为什么、贡献多大。
- 理解质量分类器的”正例”为什么那么重要,以及”我们其实不知道为什么指令数据做正例效果最好”。
- 理解”高质量”为什么只能操作性地定义:人的判断和”对训练有用”几乎不相关。
- 从 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
| 记号 | 含义 |
|---|---|
| 模型参数个数 | |
| 训练时看的 token 数 | |
| 训练的计算量(浮点运算次数,FLOPs) | |
| 训练后的损失(每个 token 的交叉熵) | |
| 代码里的训练预算(看多少个 token) | |
| 代码里迷你语言模型的”学习率”:每看一次往观测挪多少 |
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 论文把损失写成模型大小 和训练 token 数 的函数:
三项各有含义: 是文本本身的不确定性(再大的模型也降不下去); 是”模型太小”的代价; 是”数据太少”的代价。训练的计算量约为 (每个 token、每个参数,前向 2 次、反向 4 次浮点运算)。
核心问题:给定算力 , 和 怎么分?把 代入,对 求导令其为零,得到
直觉: 大说明”加参数”降损失快, 大说明”加数据”降损失快;最优的分配让两种投资的边际收益相等。
1.3 Chinchilla:数据要跟上
Hoffmann et al.(2022)训练了 400 多个模型(7000 万到 160 亿参数,50 亿到 5000 亿个 token),用三种方法估计最优分配,结论是:模型大小和训练 token 数应该等比例增长——模型大一倍,数据也要多一倍,大约每个参数 20 个 token。按这个标准,当时的大模型都”严重训练不足”:
| 模型 | 参数 | token 数 | 每参数 token |
|---|---|---|---|
| GPT-3 | 175B | 300B | 1.7 |
| Gopher | 280B | 300B | 1.1 |
| MT-NLG | 530B | 270B | 0.5 |
| Chinchilla | 70B | 1.4T | 20 |
Chinchilla 和 Gopher 的算力相同,但参数少 4 倍、数据多 4 倍多,结果在几乎所有下游任务上都胜过 Gopher(以及 GPT-3、Jurassic-1、MT-NLG),MMLU 67.5%,比 Gopher 高 7 个百分点以上。而且它更小,推理和微调都更便宜。
代码 01 用论文”方法 3”的参数化拟合()重现了这个对比:
| 模型 | 预测的损失 | 同算力下的最优损失 |
|---|---|---|
| GPT-3 | 2.0023 | 1.9541 |
| Gopher | 1.9933 | 1.9357 |
| MT-NLG | 1.9906 | 1.9164 |
| Chinchilla | 1.9366 | 1.9300 |
MT-NLG 用了最多的算力,损失却和 Gopher 差不多——参数再多,数据跟不上也没用。
一个值得知道的插曲。代码 01 演示 1 用同一个拟合算最优分配,得到的每参数 token 数不是 20,而是随算力从 32( FLOPs)涨到 122( FLOPs)。三种方法本应一致;Besiroglu et al.(2024)尝试复现方法 3,认为原文的拟合和数据对不上、置信区间窄得不合理,重新拟合后与方法 1、2 一致。教训:扩展律非常有用,但它是对一组实验的拟合,不是物理定律;细节对拟合方式很敏感。
1.4 今天的模型为什么”过度训练”
Shankar 的 slides 列出了几个开源模型(“Chinchilla 最优”按每参数 20 个 token 算):
| 模型 | 参数 | Chinchilla 最优 | 实际 token 数 | 过度训练倍数 |
|---|---|---|---|---|
| Llama 2 7B | 7B | 约 140B | 2T | 14× |
| Mistral 7B | 7B | 约 140B | 约 8T(估计) | 约 57× |
| Llama 3 8B | 8B | 约 160B | 15T | 94× |
| Qwen 2.5 7B | 7.6B | 约 150B | 18T | 120× |
为什么要远远超过”最优”?因为”最优”只算了训练成本。一个要服务上亿次请求的模型,推理成本远比训练成本重要;而推理成本大约正比于参数个数。小模型多训练,是用训练算力换推理算力。代价是:你在损失曲线的平坦段上,每多一个 token 收益很小;而且需要海量的高质量数据。
代码 01 演示 3 用拟合算了一笔账:
| 模型 | token 数 | 每参数 | 计算最优地达到同样损失需要的模型 | 需要的训练算力 | 推理便宜几倍 |
|---|---|---|---|---|---|
| Llama 2 7B | 2T | 286 | 12.7B | 0.87 倍 | 1.8 |
| Llama 3 8B | 15T | 1875 | 26.1B | 0.50 倍 | 3.3 |
| Qwen2.5 7B | 18T | 2368 | 26.4B | 0.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:按那条拟合, FLOPs 的最优 token 数约 1.1 万亿, 约 14.3 万亿, 约 50 万亿。而 Common Crawl 虽然每月有约 100 TB 压缩文本,经过语言过滤、去重、质量过滤,留下的只是一小部分。
所以我们需要的是:一个可扩展的、自动化的配方,在万亿 token 的规模上产出高质量的训练数据。手工整理 10 亿个 token 不能扩展到万亿。
2. 方法论:怎样衡量一个数据集
2.1 固定一切,只换数据
和第 5 讲的 DataComp 一样,DCLM(DataComp for Language Models)把”比数据”变成一个受控实验:
- 固定模型:每个规模用同样的架构(仅解码器的 Transformer);
- 固定训练:同样的超参数、同样的训练 token 数;
- 只换数据:用不同方法过滤出的数据集训练;
- 评测:53 个下游任务;
- 比较:分数高的数据集更好。
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 小时 |
|---|---|---|---|
| XS | 412M | 8B | 约 50 |
| S | 1B | 29B | 约 500 |
| M | 3B | 56B | 约 2,500 |
| L | 7B | 138B | 约 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.000 | 6,677,013 | 外语、导航、垃圾、乱码 | 0.120 | 0.169 | 0.240 |
| 好的抽取器 | 0.772 | 4,914,194 | 外语、垃圾、乱码、论坛 | 0.130 | 0.197 | 0.277 |
| + 启发式过滤 | 0.314 | 2,051,608 | 垃圾、乱码、百科、论坛 | 0.159 | 0.255 | 0.383 |
| + 去重 | 0.199 | 1,146,889 | 垃圾、乱码、百科、论坛 | 0.175 | 0.321 | 0.456 |
| + 质量分类器(前 10%) | 0.020 | 70,183 | 论坛 | 0.243 | 0.473 | 0.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.5 | 1× |
| resiliparse | 快,质量好 | 24.1 | 8× |
DCLM 选了 resiliparse:质量和 trafilatura 差不多,快 8 倍。在 240 万亿 token 的规模上,8 倍的速度就是 8 倍的钱。(FineWeb 也发现 WARC 加好的抽取器优于 WET,第 7 讲。)
代码 02:同样的后续步骤,WET 式抽取的准确率是 0.282,好的抽取器 0.321(中等预算)。模板文字浪费了训练预算,还让重复行规则误判。
3.2 起点:RefinedWeb
DCLM 先比较了当时的开源数据集(同样的设置下的 CORE):
| 数据集 | 来源 | CORE |
|---|---|---|
| C4 | Common Crawl + 启发式 | 34.2 |
| Dolma-V1 | Common Crawl + 维基 + 书籍 + …… | 35.0 |
| RedPajama | Common Crawl + 维基 + 书籍 + …… | 35.3 |
| RefinedWeb | 只有 Common Crawl | 36.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 个哈希函数(哈希族 )。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 | 删掉 | 分数 | 提升 |
|---|---|---|---|---|
| 不去重 | 76B | 0% | 24.7 | — |
| 只做完全哈希 | 66B | 13% | 26.0 | +1.3 |
| 只做 MinHash | 62B | 18% | 25.6 | +0.9 |
| 只做后缀数组 | 51B | 33% | 26.6 | +1.9 |
| Bloom filter(BFF) | 56B | 26% | 26.8 | +2.1 |
| 三种合起来 | 45B | 41% | 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,918 | 0% | 12,169 | 0.255 | 0.383 |
| 完全去重 | 24,408 | 23% | 5,659 | 0.291 | 0.414 |
| 段落 + 文档级(1 片) | 19,654 | 44% | 905 | 0.321 | 0.456 |
| 段落 + 文档级(10 片) | 29,352 | 11% | 10,603 | 0.279 | 0.424 |
去重让同样预算下的模型学到更多;段落级比整篇去重删得更多(它能删掉”整体不同、但套了同一段广告”的页面);分 10 片之后,多余的副本从 905 个涨到 10,603 个,准确率也低了一些。(“多余的副本”是用世界的真相数出来的——真实数据没有这个标签,这正是 DCLM 事后才发现问题的原因。)
3.5 基于模型的质量过滤
启发式规则和去重之后,还能不能用机器学习做得更好?思路:训练一个二分类器,区分”高质量”文本和随机的网页文本,然后给每个文档打分,保留分数最高的 。
fastText(Facebook,2016)是一个又快又浅的文本分类器:把文档里的词和 n-gram 映射成向量、求平均、接一个线性层和 softmax。没有循环网络、没有注意力,一个 CPU 每秒能处理约 100 万个文档——这在几十亿个文档上很重要。DCLM 的设置:约 40 万个训练文档(20 万正例、20 万负例——负例是随机网页文本),特征是一元和二元组,嵌入 100 维,在 CPU 上训练几分钟;然后给语料里的每个文档打分,保留前 10%。
关键问题:正例用什么? 传统的选择是维基百科、书籍、精选的网页(OpenWebText)。DCLM 发现指令微调数据好得多:
| 正例(参照数据) | 保留 | CORE | MMLU |
|---|---|---|---|
| 维基百科 | 10% | 35.7 | 27.0 |
| OpenWebText2 | 10% | 34.7 | 25.0 |
| 维基 + 书籍 + OpenWebText | 10% | 37.5 | 24.4 |
| OpenHermes 2.5 + ELI5 | 10% | 41.0 | 29.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.321 | 0.456 | 0.756 | 0.392 |
| 百科(维基式) | 10% | 百科 | 0.453 | 0.645 | 0.968 | 0.560 |
| 指令问答(OpenHermes 式) | 10% | 论坛 | 0.473 | 0.693 | 0.904 | 0.649 |
| 指令问答 | 20% | 论坛、乱码 | 0.460 | 0.677 | 0.872 | 0.625 |
| 指令问答 | 40% | 乱码、论坛 | 0.392 | 0.560 | 0.788 | 0.506 |
| 百科 | 20% | 百科 | 0.474 | 0.673 | 0.944 | 0.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 | + 维基 / 书籍等 | 变化 |
|---|---|---|---|
| C4 | 23.7 | 25.9 | +2.2 |
| RefinedWeb | 25.1 | 26.5 | +1.4 |
| DCLM-Baseline | 31.1 | 29.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 的总结)
- 文本抽取很重要:resiliparse 远好于 WET 文件(+3.4 CORE);
- 去重有帮助:+2.1 CORE;
- 模型过滤是关键:用指令数据做正例的 fastText 最好;
- 混合可能有害:过滤做得好时,再加维基 / 书籍反而变差;
- 小规模能预测大规模: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.846 | 0.194 | 垃圾 0.84、百科 0.16 |
| LLM 评委 | 0.830 | 0.606 | 百科 0.85、垃圾 0.15 |
| 困惑度过滤(百科上训练) | 0.678 | 0.599 | 百科 |
| 百科式分类器 | 0.778 | 0.645 | 百科 |
| 指令问答式分类器 | 0.194 | 0.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 种类型,比例和行为都是设定的:百科(正式、正确、多半写热门国家)、论坛问答(口语、基本正确、什么国家都问)、垃圾广告(正式、多半错误、重复)、导航页、乱码(有信息,但事实常被乱码打断)、外语。网页外面包着导航栏和页脚;一部分网页被复制(模板页、垃圾页复制得最多)。
模型。一个”慢慢学”的三元语言模型:每看到一次”前两个词 → 下一个词”,就把预测往看到的词挪一步();看得越多越相信,没看过的回退到更短的上下文。训练预算比数据少时随机抽一部分文档、每篇看一遍;比数据多时整个数据集看好几遍(第 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
- 语言模型很”饿”:Chinchilla 说参数和数据要等比例增长(约每参数 20 个 token);今天的模型为了推理便宜而”过度训练”(每参数上千个 token),把对数据的需求推到了十几万亿 token。扩展律假设有无限的高质量数据——规模越大,数据质量越是瓶颈。
- DCLM 的方法论:固定模型、训练配方和 token 数,只换数据;53 个任务(CORE 22 个在小规模上就有信号);4 个规模;小规模的排名能预测大规模(r 0.84–0.98)。
- 管线:resiliparse 抽取 → RefinedWeb 启发式(删掉约 80%)→ BFF 段落 + 文档级去重 → fastText 质量分类器(OpenHermes 2.5 + ELI5 做正例,保留前 10%)→ 3.8T token,约 1.4% 的文档。
- 模型过滤是关键,正例的选择影响巨大,而且”我们不知道为什么”;过滤做得好时,混入维基 / 书籍反而有害。
- 结果:7B、2.6T token、MMLU 64%,训练算力比 Llama 3 8B 少 6.6 倍,数据公开。
- “高质量”是操作性的:人与人的一致率只有 71%,和人更一致的过滤方法并不更好。
- 事后反思:分片的 Bloom filter 去重留下了大量近似重复(约 80%);工程约束塑造结果,要测量最终数据的性质。
10. 常见误区 · Common pitfalls
- “Chinchilla 最优就是最好的训练方式。” 它只最小化训练算力;考虑推理成本,过度训练小模型往往更划算。
- “扩展律是定律。” 它是对一组实验的拟合;Chinchilla 自己的三种方法就给出过不一致的分配。
- “过滤数据就是删掉低质量的。” 过滤同时决定了模型擅长什么(代码 02 演示 3:热门 vs 长尾)。
- “人觉得好的数据就是好数据。” DCLM 和代码 03:和人一致率更高的方法,训练出的模型并不更好,甚至更差。
- “加入维基百科、书籍总是有帮助。” 过滤做得好时反而有害。
- “在小样本上能研究去重的效果。” 子样本里的重复比全集少得多。
- “分片去重和全局去重差不多。” 跨片的重复会留下来;DCLM-Baseline 事后被发现约 80% 是近似重复。
- “质量分类器越大越好、LLM 当评委最好。” DCLM 里一个 fastText 线性分类器打败了 Mistral-7B 当评委;关键是正例和问题,而不是分类器的大小。
11. 练习 · Exercises
练习 1(Chinchilla 算一算) DCLM 的 7B 模型训练了 2.6 万亿 token。(a) 它用了多少训练算力?(b) 按代码 01 的拟合,这个算力下计算最优的模型多大、看多少 token?(c) 为什么 DCLM 仍然选择 7B?
参考答案
(a) 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) 如果要求误报率 ,1 万亿个 n-gram 的 Bloom filter 要多大?
参考答案
(a) 剩下 40 个没见过的 n-gram,每个以 0.01 的概率误报:期望 个”见过”,比例 0.604 < 0.8,保留。
(b) 要被误删,40 个里至少要有 20 个同时误报:。slides 用 Hoeffding 不等式给出了一个更松的上界 。阈值让单个 n-gram 的误报几乎不可能影响结果——这就是为什么可以用很小的 Bloom filter。
(c) 最优 ,每个元素约 位; 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(分片会留下多少重复) 一个文档在语料里有 个副本,语料被随机分成 片、每片独立做完全去重。(a) 去重后期望留下几个副本?(b) 时, 分别留下多少?(c) 这和 DCLM-Baseline 事后被发现”约 80% 是近似重复”有什么关系?
参考答案
(a) 每一片里只要有至少一个副本,就留下一个;一片里一个副本都没有的概率是 。期望留下 个。
(b) : 留下约 1.99 个(几乎没去掉), 约 9.56 个, 约 63.4 个。只有当副本数远多于片数时,分片去重才删得掉大部分。
(c) 网页上的重复大多是”每篇有几个到几十个副本”,远少于 100 片——分片几乎删不掉它们。这正是 DCLM 的 100 片 BFF 留下大量重复的原因。(另外,BFF 的段落级阈值、近似重复的定义也和 MinHash 不同。)
练习 5(讨论) 你的同事说:“我们新的过滤器选出的文档,标注员评分比旧过滤器低,所以新过滤器更差,不要用。“你怎么回应?你会做什么实验来决定用哪个?
参考答案(要点)
- 标注员的评分和”对训练有用”可能几乎不相关(DCLM:71% 一致率;和人更一致的方法反而更差;代码 03 的相关系数 −0.51)。
- 决定的唯一可靠办法是 DCLM 式的受控实验:同样的模型、同样的训练 token 数,分别用两个过滤器的数据训练,在你关心的评测上比较;先在小规模上做,确认排名在两个以上的规模上一致。
- 但也要问:标注员在看什么?如果他们发现的是安全或隐私问题(例如新过滤器留下了更多个人信息、有害内容),那是另一个维度,不能只看下游分数。
- 还要检查评测本身:新过滤器是不是只在某一类任务上好(例如知识题),而在你关心的其他能力上差?
12. 延伸阅读 · Further reading
原课材料
- Shankar 的 slides(HTML 版):dclmlecture.netlify.app。
- Li et al., DataComp-LM: In search of the next generation of training sets for language models(2024):arXiv:2406.11794;代码 github.com/mlfoundations/dclm。
- Penedo et al., The RefinedWeb Dataset for Falcon LLM(2023):arXiv:2306.01116。
- Hoffmann et al., Training Compute-Optimal Large Language Models(2022):arXiv:2203.15556。
本讲补充
- 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)。
和本目录其他课程的联系
- CS336 第 13 讲(数据来源)、第 14 讲(数据处理):Common Crawl、过滤、去重的实现细节。
- CS336 第 9 讲(扩展律):扩展律的推导和拟合。
- CS324 第 2 讲(数据):C4、GPT-3 的数据配比与质量分类器。
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 对开源模型技术报告里数据部分的综述。代码会在本讲的世界里扫描”过滤强度 × 重复次数 × 预算”,看看最优的过滤怎样随预算变化。