Lecture 20 · 构建你自己的训练集:方法论、实验设计与课程项目 · Building Your Own Training Set

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

课程源码 ZIP ↓

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

本篇目录

对应 Maps to:Stanford CS525 Winter 2026 Training Data for AI 的课程项目(占成绩 90%)和 3/11 的项目展示。 依据说明:课程网站上的项目说明(目标、四个交付物的要求和截止时间、评分标准)是本讲的骨架;方法论部分把这门课前 19 讲的实验方法整理成一个可以照着做的流程,是我补充的。项目展示那次课没有公开的 slides。代码是一个端到端的模板,复用第 6 讲的合成网页世界。 配套代码 Code:code/lecture20/(numpy;1 个脚本;约 5 秒) 预计阅读时间:1.5 小时(含运行代码)


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

0.1 学习目标 Learning goals

  1. 了解 CS525 课程项目的要求:目标、交付物、评分标准。
  2. 会选一个”数据是瓶颈、结果可以测量”的研究问题。
  3. 会按”先定评测 → 收集并记录来源 → 搭建可开关的管线 → 固定训练只换数据的消融 → 规模检查 → 测试集只看一次 → 数据卡”的流程设计和执行一个数据项目。
  4. 会估算项目需要的算力,并据此决定实验的规模和数量。
  5. 能把这门课的每一讲当作工具箱,知道什么时候用哪一个。

0.2 本讲地图 Map

§1  课程项目是什么
§2  选题:什么样的问题适合做数据项目
§3  第一步永远是评测
§4  数据来源:收集、记录、合法
§5  管线:每一步都可以开关、都留下日志
§6  实验设计:固定训练、只换数据                     ← 代码第 4、5 步
§7  分析:看数据、按切片看结果、追溯原因
§8  写作:数据卡、报告、展示                         ← 代码第 6、7 步
§9  整门课的回顾:工具箱
§10–13  小结、常见误区、练习、延伸阅读;结语

1. 课程项目是什么 · The course project

课程网站对项目的描述只有一句:为一个你自己选的学习问题构建一个训练集(build a training set for a learning problem of your choice)。好的项目应该是研究水平的,有可能发展成会议论文。鼓励最多三人一组。

交付物篇幅截止(Winter 2026)占比
项目提案1–2 页1 月 21 日10%
中期报告3 页2 月 11 日10%
最终报告5 页3 月 9 日50%
展示10 分钟3 月 11 日20%

另外 10% 是课堂上的论文报告。三个迟交日不能用于最终报告。

提案要回答的五个问题:动机(问题是什么、数据集支持什么学习任务);数据来源(网页抓取、已有数据集、合成数据……);方法(怎样整理、过滤、处理);评测(怎样衡量数据集的质量);算力需求。

评分标准:技术质量(方法可靠、数据集构建得好)、原创性(新的领域,或者填补一个重要的空白)、表达(报告和展示是否清楚)。

注意评测是提案的必答题:“数据集好不好”必须能被测量。这是整门课的方法论核心——DataComp 和 DCLM 把基准”翻过来”,固定模型、只比数据(第 5、6 讲)。


2. 选题 · Choosing a problem

2.1 好的数据项目的三个条件

  1. 数据是瓶颈:同样的模型和算力下,换数据会带来明显的差别。如果一个现成的公开数据集已经足够好,项目的空间就很小。
  2. 结果可以测量:有一个可信的评测(或者你能构建一个),而且它在你负担得起的规模上就有信号(第 14 讲)。
  3. 算力负担得起:能在课程的时间里,用多个种子、至少两个规模,把关键的消融做完。

2.2 四类项目

类型例子主要用到的讲次
为一个缺少数据的任务 / 领域 / 语言建数据集某个低资源语言的指令数据;某个科学领域的图文对;家庭场景的机器人示范3、5、8、15–17、19
改进一个已有的数据集更好的过滤器、去重、混合比例、合成增强4–7、10、11
为一个领域建”比数据”的基准固定一个小模型和训练代码,比较不同的数据整理方法(DataComp 式)5、6、14
研究一个数据现象污染对某类评测的影响;某种数据的扩展律;用归因找有害数据7、12–14、18

2.3 按讲次找灵感

每一讲的”延伸与前沿”和”关于实验结果”里都有开放的问题。几个例子:

  • 第 9 讲:为一个新的工具或环境自动合成可验证的任务(SWE-smith 式),研究”任务难度在能力边界上”的过滤。
  • 第 10 讲:数据领域在开发中不断变化时,怎样以最少的代理实验更新混合比例。
  • 第 11 讲:在一个小的专业语料上,比较改写、EntiGraph 式的合成和检索。
  • 第 14 讲:为你的领域构建一个在小模型上就有信号的评测(信噪比高、连续指标)。
  • 第 15 讲:在仿真里研究”场景多样性 vs 示范数量”对泛化的影响,或者人类视频的迁移。
  • 第 17 讲:按序列相似度划分时,某个生物预测任务的真实泛化能力有多少。
  • 第 19 讲:只用开放许可的数据,在某个任务上能做到多好;或者按群体审计一个常用数据集。

3. 第一步永远是评测 · Evaluation first

3.1 先定评测,再看数据

在看任何训练数据之前,写下:模型应该会做什么、怎样测、什么样的提高算有意义。否则很容易不自觉地按”在评测上好看”去调整数据——这是第 1 讲和第 14 讲讲过的适应性过拟合。

模板的第 1 步(01_project_template.py):问题是”让一个小语言模型记住虚构世界里 600 个国家的 3000 条事实”;主要指标是知识题准确率(每个国家同等重要),次要指标是长尾国家的准确率和正确答案的对数损失。3000 道题随机分成开发集(1500 道,做所有的选择)和测试集(1500 道,最后只看一次)。

3.2 评测的清单(第 14 讲)

  • 有效性:它测的是你关心的能力吗?
  • 在你的规模上有信号吗:小模型在上面是不是都在瞎猜?考虑连续的指标(正确答案的概率、对数损失)。
  • 误差棒:题数够吗?比较方案时用配对比较、报告置信区间。
  • 污染:训练数据和评测集有没有重叠?做 n-gram 去污染(第 6、14 讲);生物数据要按序列相似度划分(第 17 讲)。
  • 按切片看:按任务、领域、群体分别报告(第 14、19 讲)。
  • 留出测试集:开发集用来选,测试集只用一次。

4. 数据来源 · Sources

4.1 收集

数据来源大致有:已有的数据集;网页抓取(Common Crawl 或自己爬);自己收集或标注(遥操作、众包、专家);合成(用模型生成或改写)。每一种都有它的成本和风险:已有数据集的许可证可能是错的(第 19 讲);网页抓取要处理抽取、过滤、去重(第 4、6 讲);人工收集贵、质量参差(第 3、15 讲);合成数据要有真实数据锚定(第 11 讲)。

在过滤之前先”看”数据:随机读几十到几百个样本。很多问题(编码错误、模板页、重复、语言混杂、个人信息)一眼就能发现,比任何统计量都快。

4.2 记录

从第一天开始记录每个来源的:名字和获取方式、时间、规模、许可证、robots.txt / 服务条款的状态、已知的问题。这既是第 19 讲的合规要求,也是可复现性的前提——最后的数据卡(§8)就是这些记录的整理。

模板的第 2 步记录了候选池的规模(32,882 个网页,其中 12,882 个是复制品,约 222 万个 token)。在模拟里我们还知道真实的组成(外语 0.32、导航 0.23、垃圾 0.21、乱码 0.11、论坛 0.07、百科 0.06)——真实项目没有这个标签,只能靠抽样阅读和分类器估计。

4.3 合法与伦理

  • 许可证和服务条款是否允许你的用途?聚合的数据集要追溯上游(第 19 讲)。
  • 数据里有没有个人信息?是否需要去除、是否需要伦理审查(第 18、19 讲)?
  • 你的数据集如果发布,以什么许可证、什么形式发布?

5. 管线 · The pipeline

5.1 典型的管线

收集 → 抽取 → 启发式过滤 → 去重 → 基于模型的过滤 / 打分 → 混合 → (合成增强) → 训练集

两个原则:

  1. 每一步都能单独开关:这样才能做消融,知道每一步贡献了多少(第 6 讲 DCLM 的每一步都有消融)。
  2. 每一步都留下日志:多少进来、多少出去、因为哪条规则被拦下。没有日志,最后写不出数据卡,也解释不了结果。

5.2 模板的第 3 步

方案文档数token 数真实组成(只用于解释)
A 抽取 + 启发式10,440695,728垃圾 0.49、乱码 0.20、百科 0.19、论坛 0.13
B A + 去重6,635387,759垃圾 0.35、乱码 0.25、百科 0.23、论坛 0.18
C B + 分类器前 20%1,32754,332论坛 0.88、乱码 0.12
D B + 分类器前 10%66323,868论坛 1.00

管线日志:候选池 32,882 → 抽取后非空 25,367 → 启发式过滤后 10,440(31.7%)→ 去重后 6,635(20.2%)。启发式规则里拦下最多的是语言规则(17,975 个,候选池里约三分之一是外语网页)。

注意 C、D 的组成:质量分类器的正例是问答文本,它几乎把百科式的文档全部过滤掉了。这是一个设计决策的后果,要在报告和数据卡里说明(第 6 讲:质量是”操作性”的,取决于你用什么定义它)。


6. 实验设计 · Experimental design

6.1 固定训练、只换数据

这门课最重要的方法论:模型、训练代码、训练预算都固定,只换数据。任何差别都只能归因于数据(DataComp、DCLM,第 5、6 讲)。在此基础上:

  • 一次只改一件事:每个方案和基线只差一个处理步骤,才能把效果归因给它。
  • 多个种子:至少 3 个。报告均值和标准误。
  • 配对比较:同一个种子下,方案减基线,报告差值的均值和标准误(第 14 讲)。
  • 多个指标:总体、长尾 / 切片、连续指标(对数损失)。事先说明以哪个为主。

模板的第 4 步(预算 3 万 token,开发集):

方案准确率(均值 ± 标准误)长尾准确率答案损失和 A 的配对差
A 抽取 + 启发式0.278 ± 0.00040.2392.196—
B A + 去重0.327 ± 0.00320.2812.115+0.049 ± 0.0036
C B + 分类器前 20%0.468 ± 0.00230.4071.778+0.190 ± 0.0027
D B + 分类器前 10%0.432 ± 0.00000.3851.826+0.155 ± 0.0004

去重和质量分类器都有明显的、远大于标准误的提升。D 的标准误是 0:它只有 23,868 个 token,比预算还少,整个数据集都被用上,种子不起作用——这个玩具模型的随机性只来自”抽哪些文档”;真实的训练还有初始化和数据顺序的随机性,标准误会大得多,种子也就更重要。

6.2 规模检查

小规模的结论要在更大的规模上验证。模板的第 5 步:

方案预算 1 万预算 3 万预算 6 万
A0.1680.2780.397
B0.1810.3270.480
C0.2420.4680.653
D0.2580.4320.432

排序的 Spearman 相关:预算 1 万 vs 6 万只有 0.40,3 万 vs 6 万是 0.80。最激进的过滤(D)在小预算时最好,但它只有 2.4 万个 token,预算加大后不再提高,被保留了更多数据的 C 超过。这就是第 7 讲的过滤扩展律:最优的过滤强度随算力变化。如果只在 1 万的预算上做实验,就会选错。

6.3 算力预算

一个实验计划的总成本 ≈ 方案数 × 种子数 × 规模数 × 每次训练的成本。每次训练的算力约为 6ND6ND(NN 是参数量,DD 是训练 token 数,第 6 讲)。一个算例:1.5 亿参数的模型、30 亿 token:6×1.5×108×3×109=2.7×10186 \times 1.5 \times 10^8 \times 3 \times 10^9 = 2.7 \times 10^{18} 次浮点运算;如果一张 GPU 的有效算力是每秒 1.5×10141.5 \times 10^{14} 次,大约 5 小时。4 个方案 × 3 个种子 × 3 个规模 = 36 次训练,大约 180 GPU 小时——还没有算调试和失败的运行。

所以在提案阶段就要做这个账,并据此决定:用多小的代理模型(第 10 讲:代理和目标的排序要先验证一致)、哪些消融是必须的、哪些可以只跑一个种子做探索。

6.4 留出测试集

所有的选择都在开发集上做;测试集只在最后报告一次。模板的第 6 步:开发集上最好的方案 C 在测试集上是 0.460(开发集 0.468),基线 A 是 0.273(开发集 0.278)——两者接近,说明测试集没有被”用掉”。如果在测试集上反复挑方案,最后报告的数字就会偏乐观(第 1、14 讲)。


7. 分析 · Analysis

一个好的数据项目不只报告”哪个方案分数最高”,还要解释为什么。可用的工具:

  • 看数据:每个方案里随机抽样阅读;看被过滤掉的样本(过滤器有没有误删?)。
  • 看组成:每个方案按来源、领域、语言、长度的组成(第 10 讲)。模板里,质量分类器把百科几乎全部去掉了——这能解释它在哪些问题上可能失败。
  • 按切片看结果:按任务、领域、群体、长尾 vs 头部(第 14、19 讲)。模板里,长尾准确率和总体准确率的排序一致;但在别的项目里它们可能相反。
  • 追溯原因:用数据归因找出对某个失败负责的训练样本(第 13 讲);检查评测集和训练数据的重叠(第 14 讲);检查模型是否逐字记住了某些数据(第 18 讲)。
  • 和简单的基线比:随机子集、只用最大的来源、温度采样的混合(第 10 讲)。一个复杂的方法如果打不过简单的基线,要诚实地报告(第 17 讲的”过拟合奥运会”)。

8. 写作 · Writing

8.1 数据卡

每个项目都应该附一份数据卡(第 19 讲的数据表)。模板的第 7 步自动生成了一份,它的七个部分是:

1. 动机       为什么建这个数据集、支持什么学习任务
2. 组成       规模、来源的比例、每个实例是什么
3. 收集       来源、时间、方式、许可证、robots.txt 状态
4. 预处理     管线的每一步和它的阈值,每一步留下多少
5. 评测       评测集、开发 / 测试划分、训练设置、结果和误差棒
6. 已知的局限 它不适合用来做什么;过滤器的偏好;只验证过哪些规模和能力
7. 维护与许可 谁维护、怎样报告问题和请求移除、以什么许可证发布

其中最重要的是已知的局限:模板里写的是”质量分类器偏好问答式文本,可能系统性地排除百科式的长文;只测了’记住事实’这一种能力;结论只在 1 万–6 万 token 的预算里检查过”。

8.2 最终报告(5 页)的结构

  1. 问题与动机:学习任务是什么,为什么数据是瓶颈。
  2. 相关工作:已有的数据集和方法。
  3. 数据:来源、收集方式、许可证和伦理考虑。
  4. 方法:管线,每一步的设计理由。
  5. 实验设置:固定的模型和训练代码、预算、规模、种子、评测。
  6. 结果:主要的消融表(均值、误差棒、配对差),规模检查,切片分析。
  7. 分析:为什么有效 / 无效;数据组成;失败的例子。
  8. 局限与伦理:数据卡里的局限;可能的误用。

8.3 展示(10 分钟)

一个可用的结构:问题(1 分钟)→ 为什么数据是瓶颈(1 分钟)→ 数据和管线(2–3 分钟,配一张流程图和每一步留下多少)→ 主要结果(3 分钟,一张消融表、一张规模图)→ 一个具体的例子(1 分钟:被过滤掉的 / 被保留的样本)→ 局限和下一步(1 分钟)。


9. 整门课的回顾:工具箱 · The toolbox

第 1 讲提出了七个想法。现在可以把它们和每一讲的工具对应起来:

想法讲次你在项目里会用到的工具
机器学习 = 从数据里学出程序,数据就是规格说明1、8、9、15想清楚”示范了什么就学会什么”;后训练数据的质量;机器人示范的一致性
扩大数据是可靠的进步来源3、6、7、12、16扩展律、数据受限时的重复、数据会用完吗
质量需要被定义和测量5、6、7、10、11、14固定训练只换数据;启发式和模型过滤;去重;混合;合成;评测的信噪比
数据决定泛化是否可靠2、15、16、17分布偏移;场景和类别的多样性;按簇划分
理解哪条数据造成了哪种行为13、14、18影响函数、TRAK、datamodels、元梯度;污染检测;记忆审计
数据不是无限的7、11、12重复的价值、合成数据、token 级过滤、无限算力下的正则化与集成
数据来自人3、18、19许可证与同意、隐私与投毒的防御、数据卡、按群体审计

如果只记一条:固定训练、只换数据、多种子、留出测试集、记录一切。 这五件事做到了,你的数据项目就站在了这门课的方法论上。


10. 小结 · Summary

  1. CS525 的项目:为一个自己选的学习问题构建一个训练集;提案、中期报告、最终报告、展示;评测是提案的必答题。
  2. 好的数据项目:数据是瓶颈、结果可测量、算力负担得起。
  3. 流程:先定评测(开发 / 测试划分)→ 收集并记录来源 → 可开关、有日志的管线 → 固定训练只换数据的消融(多种子、配对比较、多指标)→ 规模检查 → 测试集只看一次 → 数据卡。
  4. 模板里的例子:去重 +0.049、质量分类器 +0.190(配对差,远大于标准误);但最激进的过滤只在小预算时最好——规模检查改变了结论。
  5. 提案阶段就要算算力的账,据此决定代理模型的大小和实验的数量。
  6. 报告的核心不是”哪个分数最高”,而是”为什么”,以及”它不适合做什么”。

11. 常见误区 · Common pitfalls

  1. “先把数据做出来,最后再想怎么评测。” 没有事先定下的评测,所有的选择都可能在不自觉地拟合评测。
  2. “一个种子就够了。” 种子之间的波动可能比方案之间的差别还大(第 14 讲)。
  3. “小规模上最好的方案,大规模上也最好。” 最优的过滤强度随规模变化(模板第 5 步、第 7 讲)。
  4. “在测试集上挑一下最好的方案。” 那样测试集就变成了开发集(第 1、14 讲)。
  5. “一次改好几个地方,看总的效果。” 这样无法知道哪一步有用。
  6. “复杂的方法一定比简单的基线好。” 一定要和随机子集、简单的启发式比。
  7. “数据卡是最后补的文档。” 它是从第一天开始的记录的整理;最后补的数据卡往往缺了最重要的信息。
  8. “许可证的事以后再说。” 来源一旦混进去就很难追溯(第 19 讲)。

12. 练习 · Exercises

练习 1(写提案) 为你自己的项目写一份一页的提案草稿,回答网站要求的五个问题(动机、数据来源、方法、评测、算力)。对每个问题,写出你还不知道的部分,以及打算怎样在中期报告之前弄清楚。

参考答案

(开放题)一个检查清单:动机里有没有说清楚”为什么数据是瓶颈”(例如现有数据集太小、领域不对、质量差)?数据来源有没有写许可证和获取方式?方法里每一步能不能单独开关?评测是否在你的规模上有信号(有没有先用一个小模型试过)?算力有没有按”方案 × 种子 × 规模 × 6ND”算过账?“还不知道的部分”通常是:评测在小规模上是否有信号、某个来源的许可证、过滤器的阈值——它们都应该成为中期报告之前的第一批实验。

练习 2(算力的账) 你打算比较 5 个数据方案,每个 3 个种子、2 个规模(6000 万参数 × 12 亿 token,3 亿参数 × 60 亿 token)。(a) 总共需要多少次浮点运算?(b) 如果你只有 200 GPU 小时(每张 GPU 每秒 101410^{14} 次有效浮点运算),怎样调整计划?

参考答案

(a) 小规模每次:6×6×107×1.2×109=4.32×10176 \times 6 \times 10^7 \times 1.2 \times 10^9 = 4.32 \times 10^{17};大规模每次:6×3×108×6×109=1.08×10196 \times 3 \times 10^8 \times 6 \times 10^9 = 1.08 \times 10^{19}。总共 5×3×(4.32×1017+1.08×1019)≈1.68×10205 \times 3 \times (4.32 \times 10^{17} + 1.08 \times 10^{19}) \approx 1.68 \times 10^{20} 次。

(b) 200 GPU 小时 = 200×3600×1014=7.2×1019200 \times 3600 \times 10^{14} = 7.2 \times 10^{19} 次,不够。可以:大规模只跑小规模上最好的 2 个方案加基线、每个 2 个种子(3×2×1.08×1019≈6.5×10193 \times 2 \times 1.08 \times 10^{19} \approx 6.5 \times 10^{19}),小规模保留全部 5 × 3(6.5×10186.5 \times 10^{18}),合计约 7.1×10197.1 \times 10^{19},刚好在预算内。代价是大规模的统计功效变低——在报告里说明。

练习 3(解读模板的规模检查) 模板第 5 步里,D 在预算 1 万时最好,在 6 万时比 C 差很多。(a) 如果你只能在一个预算上做实验,你会选哪个?为什么?(b) 怎样在报告里呈现这个结果?

参考答案

(a) 选最接近最终使用规模的那个预算——如果最终要用大预算,就在你负担得起的最大预算上做(3 万比 1 万更接近 6 万的排序:Spearman 0.80 vs 0.40)。如果完全没法在接近最终规模上做实验,至少要检查每个方案的 token 数是否足够支撑最终的预算:D 只有 2.4 万个 token,预算一旦超过它,必然要重复,这是一个可以事先算出来的风险。

(b) 一张”方案 × 预算”的表(或折线图),明确指出排序在哪个预算发生了变化,并解释原因(数据量和预算的关系,第 7 讲的过滤扩展律)。结论写成”在预算 ≤ X 时 D 最好,在预算 ≥ Y 时 C 最好”,而不是一个无条件的”C 最好”。

练习 4(写数据卡的”已知的局限”) 为模板选出的方案 C 补充三条”已知的局限”(除了脚本里已经写的那几条)。提示:看第 3 步的组成、第 4 步的指标、第 1 步的评测设计。

参考答案

(示例)(1) 方案 C 的 88% 是论坛问答式的文本、12% 是乱码文本——乱码文本里的事实三元组常被打断,可能教给模型一些错误的共现;对需要正式书面语的任务,这个数据集不合适。(2) 评测只有一种题型(给出国家和关系,选值),不能说明模型是否能在别的提问方式下用这些知识。(3) 开发 / 测试集来自同一个题库的随机划分,对”新的国家”或”新的关系”没有任何泛化的证据。(4) 质量分类器是在一组问答文本上训练的,如果这些参照文本本身有偏差(话题、风格),过滤后的数据会继承它。

练习 5(整门课的回顾) 从这门课里选三讲,各写一句”如果我的项目里出现了 X,我会用第 N 讲的 Y 来处理”。

参考答案

(示例)(1) 如果我的数据来自几个规模差很多的来源,我会用第 10 讲的方法:先验证代理模型的排序和目标一致,再用带重复约束的回归找混合比例。(2) 如果我的评测分数在小模型上都在瞎猜,我会用第 14 讲的办法:换成连续的指标、平均检查点,或者找在小规模上有信号的任务。(3) 如果我的数据里可能有个人信息或受版权保护的内容,我会按第 18、19 讲:去重、PII 过滤、记录许可证和 robots.txt 状态,在数据卡里写明局限,并在训练后做记忆审计。


13. 延伸阅读 · Further reading

方法论的范例

  • Gadre et al., DataComp: In search of the next generation of multimodal datasets(2023):第 5 讲。
  • Li et al., DataComp-LM: In search of the next generation of training sets for language models(2024):arXiv:2406.11794;第 6 讲。
  • Magnusson et al., DataDecide: How to Predict Best Pretraining Data with Small Experiments(2025):arXiv:2504.11393;第 14 讲。
  • Gebru et al., Datasheets for Datasets(2018 / 2021):第 19 讲。

本课各讲


结语 · Closing

第 1 讲从一个问题开始:什么是机器学习?答案是”从数据里学出程序”,所以数据就是规格说明。二十讲之后,这句话有了具体的含义:ImageNet 的标注流程决定了”什么算对”;CLIP 的鲁棒性来自它的数据分布;DCLM 的分类器定义了什么是”高质量”;混合比例决定了模型在哪些任务上强;合成数据的质量取决于它的锚点;机器人学会的是示范者的习惯;3D 模型想象的是它见过的东西;蛋白质模型学到的是进化的规律,还是数据库的偏差;模型记住了什么、泄露了什么、可以用什么——都取决于数据。

这门课的另一半是方法:固定训练、只换数据,让”数据好不好”变成一个可以测量的问题。它是这个领域从”手艺”走向”科学”的关键一步。祝你的项目顺利。

← 返回课程目录