对应 Maps to:Stanford CS324 Winter 2023 Advances in Foundation Models,Syllabus 主题 “How does data impact FMs and what are the downstream effects?” 的全部阅读:CS324 Winter 2022 课程笔记 Data、Harms I、Harms II;Hazy Research 博客 Foundation Models are Entering their Data-Centric Era(2022.10);Gao et al. The Pile(2020);Lee et al. Deduplicating Training Data Makes Language Models Better(2021);Hernandez et al. Scaling Laws and Interpretability of Learning from Repeated Data(2022);Bender et al. On the Dangers of Stochastic Parrots(FAccT 2021)。以及 2/1 的客座报告:Ludwig Schmidt,A data-centric view on reliable generalization。 依据说明:课程网站没有提供 slides 或录像。§2–§3、§7 主要沿着 Winter 2022 的 Data 笔记展开,细节来自原始论文:C4 的过滤规则和”重复多少遍”的实验来自 T5 论文(Raffel et al., 2020)§2.2 与表 8、表 9;GPT-3 的数据配比、质量分类器、污染分析来自 GPT-3 论文 §2.2、附录 A、§4 与附录 C;C4 的文档化与黑名单分析来自 Dodge et al. (2021)。§5 依据 Lee et al. (2021),§6 依据 Hernandez et al. (2022)。Schmidt 的报告没有公开的 slides,§9 依据他和合作者公开发表的论文重建:Taori et al. (2020) 的”有效鲁棒性”、Miller et al. (2021) 的 “accuracy on the line”、Fang et al. (2022) 的 Data Determines Distributional Robustness in CLIP、LAION-5B (2022),以及报告之后发表的 DataComp (2023);哪些是推断会在正文里说明。§10 依据 Harms I/II 笔记和 Bender et al.;§11”2023 年之后”是我补充的。 配套代码 Code:
code/lecture02/(numpy + PyTorch;5 个脚本 + 2 个模块;03_repeated_data.py第一次运行不到 2 分钟、04_contamination.py第一次约 1 分钟,之后读缓存;其余几秒) 预计阅读时间:3 小时(含运行代码)
0. 本讲导航 · How to read this lecture
0.1 学习目标 Learning goals
学完这一讲,你应该能够:
- 说出主流预训练语料从哪里来:Common Crawl、WebText、C4、GPT-3 的数据配方、The Pile 的 22 个组成部分;理解为什么”整个互联网”不等于”所有人”。
- 解释数据文档化(datasheets、data statements)要回答什么问题,以及 Dodge et al. 给 C4 写文档时发现了什么。
- 区分两类质量过滤——启发式规则和基于参考语料的分类器——并能用具体的例子说明:每一种过滤器都会误伤某一类内容或某一群人(体裁、话题、写法)。
- 讲清楚去重的三种做法:精确哈希、MinHash + LSH 近似去重、后缀数组找重复子串;会推导 MinHash 为什么估计 Jaccard、LSH 的 S 形曲线从哪里来。
- 说明重复数据什么时候几乎无害、什么时候有害(“看几遍”与”能不能背下来”),以及 Hernandez et al. 的”双下降”发现了什么。
- 解释测试集污染(input vs input-and-output contamination)、GPT-3 的 13-gram 检测和”干净子集”分析,知道它们的盲区。
- 理解数据配比是一个设计选择:为什么小而精的数据要上采样。
- 讲清楚 Ludwig Schmidt 报告的核心论点:分布鲁棒性由训练数据决定——有效鲁棒性、“准确率在一条直线上”、CLIP 的鲁棒性从哪里来,以及 LAION-5B 和 DataComp 为什么重要。
- 把数据和危害联系起来:代表性、偏见、有害内容、“过滤 vs 代表性”的两难(第 18 讲展开)。
0.2 先修与本讲范围 Prerequisites & scope
| 默认你已经会 Assumed | 本讲只给直觉,后面几讲再展开 Previewed only |
|---|---|
第 1 讲:语言模型、bit/字符、预训练与适配、迷你互联网 fm_world.py | 分词(tokenization)对数据统计的影响(第 3 讲) |
| 概率:期望、二项分布的方差 | 数据量与模型大小的权衡、数据受限时的 scaling law(第 4 讲) |
| 逻辑回归是什么(不熟悉也没关系,代码里有解释) | 指令数据、偏好数据(第 7 讲);领域数据(第 15 讲) |
| Python 基础:字典、集合、排序 | 记忆与隐私(第 16 讲);数据投毒(第 17 讲);偏见与有害内容(第 18 讲);版权(第 19 讲) |
本讲讨论的是预训练数据:从原始网页到训练语料的整条流水线,以及数据的选择怎样决定模型会什么、不会什么、在哪里可靠。
0.3 本讲地图 Map
§1 为什么从数据讲起:同一个配方,不同的数据;以数据为中心的视角;流水线全景
§2 预训练数据从哪里来:Common Crawl、WebText、C4、GPT-3、The Pile;一份迷你爬取 ← 代码 01
§3 给数据写文档:datasheets、data statements、Dodge et al. 对 C4 的审计 ← 代码 01
§4 质量过滤,以及它把谁过滤掉了:启发式规则、黑名单、质量分类器 ← 代码 01
§5 去重:精确哈希、Jaccard、MinHash、LSH、后缀数组 ← 代码 02
§6 重复数据为什么伤害模型(以及什么时候不伤害) ← 代码 03
§7 测试集污染:泄漏、n-gram 检测、干净子集 ← 代码 04
§8 数据配比 ← 代码 05
§9 数据决定分布鲁棒性(Ludwig Schmidt 的客座报告) ← 代码 05
§10 数据带来的危害
§11 2023 年之后
§12–16 小结、常见误区、练习、延伸阅读、下一讲预告
0.4 记号 Notation(只列新出现的;其余见第 1 讲 §0.4)
| 符号 | 含义 | 例子 |
|---|---|---|
| 两个集合的 Jaccard 相似度 | 两个页面的 shingle 集合 | |
| shingle | 文本里相邻 个词(或字符)组成的片段 | “the soup was” |
| ;, | MinHash 的哈希个数;LSH 的段数(bands)和每段行数(rows), | 代码 02:, |
| 同一份数据被看了几遍(epoch 数 / 重复次数) | 代码 03: | |
| 数据配比里第 个来源的权重(采样比例) | GPT-3:Common Crawl 60% | |
| ID / OOD | 训练分布内(in-distribution)/ 分布外(out-of-distribution) | ImageNet / ImageNet-Sketch |
| 准确率画图时的坐标变换 | ||
| 有效鲁棒性(effective robustness) | §9 |
0.5 关于数字 · About the numbers
本讲的实验数字都来自配套代码的实际输出(固定随机种子,同一台机器上重复运行逐字相同)。代码用两个”知道真相”的玩具世界:
crawl_world.py:用第 1 讲的世界造一份原始网页爬取——2175 个页面,有正常内容、另一种英语写法、健康论坛、各种垃圾、页眉页脚、镜像和转载。因为每个页面都带着”真相”(是不是垃圾、是哪个页面的副本),我们能精确地算出过滤器删掉了谁、去重找到了多少副本。- 第 1 讲的迷你互联网 + tiny GPT(约 11 万参数):在不同的数据上重新训练,观察重复数据和泄漏的考题怎样改变模型。
小模型演示的是机制,不是量级。真实的预训练语料有几万亿个 token,去重、过滤的每一个决定都要在几十亿个文档上执行;每当讲义从玩具推到真实模型时,会给出论文里的数字作为对照。有几处结果和我写代码前的预想不一样(例如重复数据的”额外伤害”在我们的规模上没有出现),讲义按实际结果来写,这些情况列在代码 README 的”关于实验结果”里。
1. 为什么从数据讲起 · Why data first
1.1 同一个配方,不同的数据
第 1 讲反复出现一句话:“能力从数据里来,缺陷也从数据里来。“迷你实验里,模型会给评论打分,是因为语料里有带评分的评论;它对职业有代词偏斜,是因为语料里有偏斜;它的验证集数字偏乐观,是因为验证集和训练集有重复(第 1 讲 §4.4)。
真实模型也一样。T5 论文(Raffel et al., 2020)做过一个干净的对照实验:同一个模型、同样的训练步数,只换预训练数据,在下游任务上微调后比较(表 8,数字是验证集分数):
| 预训练数据 | 大小 | GLUE | SuperGLUE |
|---|---|---|---|
| C4(过滤后的 Common Crawl) | 745GB | 83.28 | 71.36 |
| C4,不过滤 | 6.1TB | 81.46 | 68.04 |
| WebText-like(只保留被 Reddit 推荐过的网页) | 17GB | 84.03 | 71.40 |
| Wikipedia + 多伦多图书语料 | 20GB | 83.65 | 73.24 |
两个结论。第一,过滤有用:去掉 C4 的启发式过滤,各项指标一致变差。第二,更小、更”对口”的数据可以更好:维基百科加小说只有 20GB,SuperGLUE 却最高。作者发现这几乎全部来自其中一个阅读理解数据集 MultiRC(exact match 从 25.78 升到 50.93)——MultiRC 的文本主要来自小说,正是图书语料覆盖的领域;同样,只含新闻的 RealNews-like 数据让新闻阅读理解 ReCoRD 变好。数据不是越多越好,“什么数据”和”多少数据”同样重要。
1.2 以数据为中心的视角
Christopher Ré 和 Simran Arora 在 Hazy Research 博客 Foundation Models are Entering their Data-Centric Era(2022.10,本主题的阅读之一)里提出了一个判断:随着 GPT-3、CLIP、Stable Diffusion 这样的模型变得人人可用,模型架构和训练工程正在”商品化”,价值越来越多地落在对世界和问题的描述上——也就是数据。
这个判断有一段历史。监督学习时代,深度学习把”特征工程”商品化之后,从业者之间的差别变成了”怎样把问题通过训练数据传达给模型”;这催生了他们组的 Snorkel 项目和弱监督(weak supervision):把有噪声的数据来源当作知识,用统计方法把它们组合起来。基础模型把这个钟摆又推了一步:
- 基础模型在广泛的数据上训练,开箱即用,靠提示(prompt)引导——用户先试、先迭代,而不是先整理一个任务专用的数据集;
- 正因为它们在”广泛的数据”上训练,整理这份数据成了让它们普遍有用的核心问题;
- 博客还提出了几个开放问题:怎样高效地整理数据;数据的 scaling law 是否应该用”信息量”而不是 token 数来衡量;把事实存进参数是不是一个好的抽象(还是应该用检索)。
这一讲就是从这个视角出发:把”数据”当作基础模型的一个设计变量,逐一看它的每个环节怎样影响结果。
1.3 从网页到训练语料:流水线全景
几乎所有基于网页的预训练语料都经过类似的流水线(不同的工作顺序和细节不同):
原始爬取(Common Crawl 的 WARC / WET 文件)
→ 正文提取(去掉导航栏、页眉页脚;jusText、trafilatura……) §2、代码 01、02
→ 语言识别(只保留某种语言,例如英语) §4
→ 质量过滤(启发式规则;黑名单;"像不像参考语料"的分类器) §4、代码 01
→ 去重(精确 / 近似 / 子串) §5、代码 02
→ 去污染(删掉和评测基准重叠的内容) §7、代码 04
→ 配比(不同来源按权重采样,好的来源多看几遍) §8、代码 05
→ 分词、训练
每一步都在回答”留下什么”,每一步也都在决定”模型会什么”。第 1 讲 §1.4 的生态图里,“数据的整理者”这个环节,指的就是这条流水线。
2. 预训练数据从哪里来 · Where pretraining data comes from
2.1 Common Crawl
Common Crawl 是一个非营利组织,定期抓取网页并免费发布快照。它是 T5、GPT-3、Gopher 等模型训练数据的标准来源。规模感(数字引自 CS324 课程笔记 Data):2021 年 4 月的一个快照是 320 TB;Google 的搜索索引至少有 100 PB——Common Crawl 比它小几个数量级,而企业内部的私有数据还要更大。
“整个互联网”听起来像是”所有人的语言”,其实不是。Bender et al. (2021) 在 Stochastic Parrots 里专门用一节 “Size Doesn’t Guarantee Diversity” 讨论这一点(课程笔记引用了其中的数字):
- 互联网的使用者偏向发达国家的年轻人;
- GPT-2 的数据来自 Reddit 推荐的链接,而 2016 年 Pew 的调查显示,美国 Reddit 用户 67% 是男性、64% 在 18–29 岁之间;
- 维基百科的编辑者中只有 8.8%–15% 是女性;
- 网络骚扰会把一些群体赶出某些平台;而按”坏词”过滤又会进一步边缘化某些群体(§4)。
2.2 WebText 与 OpenWebText
GPT-2 的 WebText 想要”多样但高质量”的数据。做法是用人的投票当质量信号:抓取 Reddit 上至少获得 3 个 karma 的帖子里的外链,去掉维基百科(为了能在基于维基百科的基准上评测),得到约 40GB 文本。WebText 没有公开,EleutherAI 等社区按同样的思路复制了 OpenWebText(约 38GB,用 fastText 过滤非英语,并做了近似去重)。
“用 Reddit 投票当质量”本身就是一个选择:它把”高质量”定义成”某个用户群体愿意点赞的东西”。RealToxicityPrompts(Gehman et al., 2020)的分析发现,OpenWebText 里 2.1%、WebText 里 4.3% 的文档毒性分数至少 50%(课程笔记 Data)。
2.3 C4
C4(Colossal Clean Crawled Corpus)是 Google 为训练 T5 做的。它从 2019 年 4 月的 Common Crawl 快照出发,用一组启发式规则过滤(T5 论文 §2.2):
- 只保留以终止标点(句号、感叹号、问号、结束引号)结尾的行;
- 丢弃少于 3 个句子的页面,只保留至少 5 个词的行;
- 删除含有 “List of Dirty, Naughty, Obscene or Otherwise Bad Words” 里任何一个词的页面;
- 删除含 “Javascript” 的行;删除含 “lorem ipsum” 的页面;删除含花括号 ”{” 的页面(为了去掉代码);
- 删除引用标记(“[1]”、“[citation needed]“)和 “terms of use”、“privacy policy” 这样的政策声明行;
- 重复出现的三句话片段只保留一个;
- 用 langdetect 只保留”是英语的概率 ≥ 0.99”的页面。
结果大约 750GB、约 1560 亿个 token。这些规则看起来都很合理——直到你问”它们会删掉什么”。§4.2 会在迷你爬取上逐条检验。
2.4 GPT-3 的数据
GPT-3 论文 §2.2 描述了三步:
- 按”像不像高质量参考语料”过滤 Common Crawl:训练一个逻辑回归分类器区分”参考语料”(WebText、维基百科、一个网络书籍语料)和原始 Common Crawl,再按分数随机保留(附录 A:当
np.random.pareto(9) > 1 − score时保留——分数越高越可能留下,低分文档也有很小的机会留下); - 文档级的模糊去重(Spark 的 MinHashLSH,10 个哈希;平均删掉约 10% 的数据);
- 加入已知的高质量语料:扩展版 WebText、两个图书语料、英文维基百科。
Common Crawl 部分从 45TB(压缩后的纯文本)过滤到 570GB,约 4000 亿个 BPE token。最终的训练配比(GPT-3 论文表 2.2,训练 3000 亿个 token):
| 数据集 | token 数 | 训练中的权重 | 训练 3000 亿 token 时看了几遍 |
|---|---|---|---|
| Common Crawl(过滤后) | 4100 亿 | 60% | 0.44 |
| WebText2 | 190 亿 | 22% | 2.9 |
| Books1 | 120 亿 | 8% | 1.9 |
| Books2 | 550 亿 | 8% | 0.43 |
| Wikipedia | 30 亿 | 3% | 3.4 |
注意最后一列:Common Crawl 占了全部 token 的 82%,在训练中只占 60%,连一遍都没看完;维基百科只有 30 亿 token,却被看了 3.4 遍。配比本身就是一个质量判断:认为更好的数据,就让模型多看几遍(§6、§8)。
2.5 The Pile
EleutherAI 的 The Pile(Gao et al., 2020)代表另一种思路:网页爬取之外,专门收集学术和专业领域的高质量来源。它有 825 GiB、22 个组成部分(论文表 1,节选):
| 组成部分 | 原始大小 | 权重 | 看几遍 |
|---|---|---|---|
| Pile-CC(Common Crawl,用 jusText 从 WARC 提取正文) | 227.12 GiB | 18.11% | 1.0 |
| PubMed Central(生物医学论文) | 90.27 GiB | 14.40% | 2.0 |
| Books3 | 100.96 GiB | 12.07% | 1.5 |
| OpenWebText2 | 62.77 GiB | 10.01% | 2.0 |
| ArXiv | 56.21 GiB | 8.96% | 2.0 |
| GitHub | 95.16 GiB | 7.59% | 1.0 |
| FreeLaw(法律文书) | 51.15 GiB | 6.12% | 1.5 |
| Stack Exchange | 32.20 GiB | 5.13% | 2.0 |
| ……(另外 13 个:专利、数学、字幕、邮件……) | |||
| Wikipedia (en) | 6.38 GiB | 1.53% | 3.0 |
The Pile 的论文用 GPT-2、GPT-3 在各个组成部分上的 bits per byte 做了对比,发现 GPT-3 在学术写作(PubMed、ArXiv)、领域数据(FreeLaw、HackerNews、USPTO 专利)和”不像自然语言”的文本(GitHub 代码、DM Mathematics)上表现相对较差——GPT-3 的训练数据很少覆盖这些内容。模型在哪里差,往往就是数据在哪里缺。The Pile 还附了 datasheet 和 data statement(§3)。
课程笔记 Data 对这一节的总结是:可用的数据非常多,但”什么都训练”不是对算力的高效利用;过滤是必要的,但会引入偏差;精心挑选的非网页来源很有前景;数据集应该被仔细地文档化和检查。
2.6 一份迷你爬取
代码 01 演示 1 先做了”给数据写文档”的第一步:数一数爬取里都有什么。迷你爬取有 2175 个页面、453,612 个字符,按站点统计(节选):
| 站点 | 页面数 | 字符占比 | 主要内容 |
|---|---|---|---|
| foodblog.example | 239 | 14.6% | A 写法的评论 |
| goodeats.example | 260 | 14.2% | 评论、只有导航栏的页面 |
| dailyviews.example | 261 | 13.0% | 变体 B 写的评论、人物、故事 |
| tales.example | 290 | 11.3% | 故事 |
| autotrans.example | 250 | 9.9% | 机器翻译出错的乱码 |
| wiki.example | 132 | 6.9% | 人物介绍 |
| …… |
第五大的站点是一个机器翻译出错的站点,比维基站点还大。这是故意模仿 Dodge et al. (2021) 对 C4 的发现:C4 里文本最多的单个网站是 patents.google.com,其中不少专利是从其他语言机器翻译或 OCR 出来的,带着系统性的错误。统计还显示:22.0% 的字符是垃圾,12.2% 的页面是别的页面的副本,变体 B 写的页面占 13.5% 的字符。
“变体 B”是什么?迷你爬取里有一部分页面用另一种同样合法的英语写成:stays in(= lives in)、shifted to … long back(= moved to … years ago)、is working as(= works as)、took rest(= sat down)。这些说法借自真实存在的英语变体(例如印度英语),内容和第 1 讲的写法(“A 写法”)完全一样真——它们只是另一群人的说话方式。§4 会看到,过滤器怎样对待它们。
3. 给数据写文档 · Documenting data
3.1 为什么需要文档
机器学习的数据集长期以来是”拿来就用”的:一个文件夹、一段下载脚本,最多一句”我们用了 Common Crawl”。Bender et al. (2021) 把这叫做文档债(documentation debt):数据集大到事后再也无法记录清楚,等发现问题时,已经没人说得清里面有什么。他们的建议是:从项目一开始就为数据的整理和文档化留出预算,只收集”能被充分记录”那么多的数据。
其他领域早有成熟的做法:电子元件有 datasheet,食品有营养标签。课程笔记 Data 介绍了两套给数据集用的规范。
3.2 Datasheets for Datasets
Gebru et al. 提出的 datasheets for datasets 按数据集的生命周期列出一组问题。它同时服务两类人:数据的创建者(借此反思自己的决定和可能的危害)和数据的使用者(借此知道这份数据能用来做什么、不能用来做什么)。
| 阶段 | 要回答的问题(节选) |
|---|---|
| 动机 Motivation | 为什么创建这个数据集?谁创建的?谁出的钱? |
| 组成 Composition | 每个实例代表什么?有没有缺失的信息?有没有保密数据? |
| 收集 Collection | 数据是怎样获得的?谁收集的,报酬如何?有没有经过伦理审查? |
| 预处理 Preprocessing | 做了哪些清洗、标注?处理代码能不能拿到? |
| 用途 Uses | 已经用在哪里?哪些任务不应该用它? |
| 分发 Distribution | 怎样分享?有没有知识产权限制? |
| 维护 Maintenance | 谁托管、谁维护?会不会更新? |
3.3 Data statements
Bender & Friedman (2018) 的 data statements 专门针对自然语言数据,额外要求写明:整理的理由(curation rationale)、语言变体(用 BCP 47 这样的标准标注是哪种语言、哪个地区的变体)、说话人和标注者的人口学信息。对语言模型而言,“语言变体”这一项尤其重要:它直接回答”这份语料代表了谁的语言”。
3.4 一次真实的审计:Dodge et al. 给 C4 写文档
C4 发布时只附了一段生成它的脚本,重跑一遍要花几千美元。Dodge et al. (2021) 做了一次事后审计,把文档分成三个层次:元数据(文本来自哪些网站、什么时候写的)、被包含的数据(里面有什么:机器生成的文本、社会偏见、和评测基准的重叠)、被排除的数据(过滤器删掉了什么)。主要发现:
- 来源:文本最多的单个网站是 patents.google.com(含机器翻译和 OCR 文本);抽样的网址里 51.3% 托管在美国;被 Internet Archive 收录的那部分网页里,约 92% 写于 2011–2019 年。
- 被包含的偏见:在 C4 里,“Jewish” 附近带情感的词 73.2% 是正面的,“Arab” 附近只有 65.7%。
- 和评测基准的重叠:XSum 测试集的 15.49%、TIFU-short 的 24.88% 在 C4 里能找到(§7)。
- 被排除的数据:黑名单过滤删掉的文档里有大量医学、健康主题;提到性取向身份词的文档被删除的可能性最高;用非裔美国人英语写的文本被删掉 42%(§4.3)。
他们的建议包括:报告文本来自哪些网站;检查评测污染;测量社会偏见;提供报告问题的渠道;以及不要再用黑名单过滤网页数据。
代码 01 演示 1 打印的那句”数据说明书”(垃圾占比、副本占比、变体 B 占比)就是最小的一份 datasheet。它能写出来,只是因为玩具世界知道每个页面的真相——真实的爬取里,这一列真相要靠审计去发现。
4. 质量过滤,以及它把谁过滤掉了 · Quality filtering and who gets filtered out
4.1 两类过滤器
| 启发式规则 heuristics | 基于参考语料的分类器 model-based | |
|---|---|---|
| 代表 | C4、Gopher、RefinedWeb 的规则 | GPT-3、PaLM 的质量分类器;后来的 FineWeb-Edu、DCLM |
| 怎么判断”好” | 长度、标点、符号比例、黑名单、重复度…… | “像不像我们挑的高质量文本” |
| 优点 | 透明、便宜、容易解释 | 能抓住规则描述不了的”像文章”的特征 |
| 风险 | 规则只看形式,会按体裁、按词误伤 | “高质量”由参考语料定义,会偏向参考语料代表的那群人 |
代码 01 把三种过滤器(C4 式规则、黑名单、GPT-3 式分类器)用在同一份迷你爬取上,看它们各删掉了谁。
4.2 启发式规则:误伤是按体裁发生的
代码 01 演示 2 按 §2.3 的规则(加上一个玩具语言识别)过滤爬取。关键的测量是正文保留了多少——只看页眉页脚之外的正文,因为样板常常能活下来,让页面”看起来没被删”:
| 页面类型 | 整页删除 | 正文保留(每行 ≥ 5 个词) | 正文保留(每行 ≥ 3 个词) | 主要原因 |
|---|---|---|---|---|
| A·人物 | 3% | 80% | 100% | 行太短 |
| A·评论、A·故事、A·问答 | 0% | 100% | 100% | |
| A·加法 | 100% | 0% | 0% | 页面凑不够 3 句(每行只有 1 个”词”) |
| B·人物 | 0% | 85% | 100% | 行太短 |
| 健康论坛 | 95% | 5% | 5% | 黑名单 |
| 垃圾·广告 | 100% | 0% | 0% | 黑名单 |
| 垃圾·导航 | 14% | 36% | 36% | 样板声明、行尾无标点 |
| 垃圾·乱码 | 50% | 48% | 57% | 语言识别 |
| 垃圾·代码、占位符 | 100% | 0% | 0% | 花括号 / lorem ipsum |
合计:垃圾正文留下 27%,合法正文留下 77%。几点值得细看:
- 规则抓”结构上不像文章”的垃圾很有效(广告、代码、占位符),但机器翻译的乱码有一半活了下来:它们的句子结构、标点、长度和正常页面一样。这正是 C4 里专利翻译文本的处境。(我第一版的乱码每个字母 20% 出错,玩具语言识别能全部拦下;真实的机器翻译大部分词是对的,改成 3% 之后才有一半过关——见代码 README。)
- 误伤按体裁发生。“每行至少 5 个词”让加法练习一行不剩(“96+76=172.” 按空格切只有 1 个”词”),人物介绍里最短的句子(“zesul lives in brena.”)也被删掉。真实的 C4 里,同样的规则会删掉表格、列表、诗歌和数学;花括号规则让 C4 几乎不含代码——后来的模型要专门加入代码数据(第 15 讲)。
- 样板活了下来。代码 01 打印的那个人物页面,过滤后页眉页脚一行不少:它们恰好是足够长、以句号结尾的完整句子。规则衡量的是”像不像写完整的文章”,不是”内容好不好”。
- 这些规则对 A 写法和变体 B 一视同仁(人物正文保留 80% vs 85%):长度、标点、个别词,看不出写法的差别。误伤 B 的是另一类过滤器(§4.4)。
4.3 黑名单:一个词本身不带好坏
代码 01 演示 3 只用一个玩具黑名单(xxx、casino、pills、breast、naked——从垃圾广告里整理出来的词)过滤。结果:广告页 100% 被删,健康论坛 95% 被删,其他内容不受影响。触发健康论坛的是 “breast”(乳腺检查、乳腺癌筛查)和 “pills”(按时吃药)。作为垃圾检测器,它的精确率只有 63%(被删的 239 页里有 89 页是健康论坛),召回率只有 26%(导航、乱码、代码、占位符里没有黑名单词,一个也拦不住)。
这是 Dodge et al. (2021) 在 C4 里发现的现象的缩影:
- 被黑名单删掉的文档里约 31% 与性有关,其余的聚类里有科学、医学、健康主题;
- 提到性取向身份词(例如 lesbian、gay)的文档被删除的可能性最高;人工检查 50 篇被删的文档,“lesbian” 的 22%、“gay” 的 36% 既不冒犯、也与性无关;
- 按方言估计,非裔美国人英语(AAE)的文档被删掉 42%,西班牙裔相关英语 32%,白人相关英语只有 6.2%。
被删掉的不是随机的一部分文本,而是特定人群谈论自己的方式。后果是双重的:模型对这些人群、这些话题见得少,处理它们时更差(性能差异,§10);而且被删掉的恰恰是他们正面地谈论自己的文本,留下来的可能是别人怎样谈论他们。课程笔记 Harms II 还指出:基于词表的过滤会删掉医疗、性教育、小说里的正常用法,以及被群体”收回”使用的词。
4.4 质量分类器:“高质量” = “像参考语料”
代码 01 演示 4 复刻了 GPT-3 的做法:正例是 400 个参考页面(只有 A 写法的人物、问答、评论、故事——相当于 GPT-3 的 WebText + 维基百科 + 书),负例是爬取页面;特征是词和二元词组,模型是逻辑回归。结果(“保留”按分数 > 0.5 计):
| 页面类型 | 平均质量分 | 保留(分数 > 0.5) | 保留(GPT-3 的 Pareto 规则) |
|---|---|---|---|
| A·人物 | 0.602 | 88% | 5% |
| A·问答 | 0.865 | 100% | 33% |
| A·评论 | 0.393 | 26% | 3% |
| A·故事 | 0.577 | 73% | 6% |
| A·加法 | 0.128 | 0% | 0% |
| B·人物 | 0.192 | 0% | 0% |
| B·评论 | 0.373 | 23% | 4% |
| B·故事 | 0.301 | 8% | 0% |
| 健康论坛 | 0.060 | 0% | 0% |
| 垃圾·乱码 | 0.339 | 13% | 2% |
| 其他垃圾 | 0.050–0.107 | 0% | 0–2% |
“质量”其实是一个比值。 为什么问答分数最高、评论只是中等?设参考语料的分布是 、爬取的分布是 ,正例占比为 。一个训练充分的分类器给出的概率是
它只随比值 单调变化。所以分类器学到的不是”好不好”,而是”在参考语料里比在爬取里常见多少”:问答在参考语料里占四分之一、在爬取里很少,分数最高;评论在两边都很多,分数中等;加法、健康论坛在参考语料里一页也没有,分数接近 0。
同样的内容、不同的写法。 A 写法的人物、故事保留 88%、73%,变体 B 只有 0%、8%;合计 A 写法保留 54%,B 写法 13%。分类器权重最负的特征里能直接看到 B 的标志:stays、stays in、went back、back home。B·评论是一个现成的对照组:评论模板里恰好没有任何 B 的说法,它的分数(0.373)和 A 评论(0.393)几乎一样——被扣分的是那几个说法本身,不是站点,也不是内容。
这在真实世界里被测量过。Gururangan et al. (2022) 用美国高中生写的校报文章检验了 GPT-3 式的质量过滤器:它更偏爱来自更大、更富裕、教育程度更高、更城市化的学区的文章;而它的”质量”和事实准确性、文学奖项这些标准并不一致。他们的结论是:把任何语料定为”高质量”,本身就是一种语言观(language ideology),需要透明和论证。
两个实现上的坑(都在代码 README 里有记录)。第一,不要在训练集上打分:第一版用全部爬取页面当负例、再给同一批页面打分,分类器记住了每个训练负例,所有页面的分数都接近 0;改成交叉拟合(一半训练、给另一半打分)才正常——GPT-3 的分类器在一个样本上训练、给几十 TB 打分,没有这个问题。第二,先提取正文:给含页眉页脚的整页打分时,分类器学到的主要是”有没有样板”,没有样板的广告页反而得分更高。
GPT-3 的 Pareto 规则:保留条件是 ,其中 是分数、 服从形状参数 的 Lomax(Pareto II)分布,,所以保留概率是 。分数 0.99 时约 0.91,0.9 时约 0.42,0.5 时只有约 0.03(练习 3)。它比”分数 > 0.5”严格得多(上表最后一列),但也会以很小的概率留下低分页面(导航页 2%)——GPT-3 用这一点”保留一些分布之外的文档”。
4.5 过滤是一种价值判断
把三种过滤器放在一起:
| 过滤器 | 主要误伤 | 误伤的维度 |
|---|---|---|
| C4 式启发式规则 | 加法练习(以及表格、代码、数学) | 体裁 |
| 黑名单 | 健康论坛(以及身份词、方言) | 话题 / 群体 |
| 质量分类器 | 变体 B、加法、健康论坛 | 写法 / 不在参考语料里的一切 |
过滤显然是必要的——T5 的表 8 显示,不过滤的 C4 让所有下游指标变差。但”必要”不等于”中立”。每一个过滤器都编码了一个关于”什么是好文本”的判断,而这个判断决定了模型以后会说谁的语言、了解谁的生活。课程笔记的态度是:过滤要做,但要测量它删掉了谁,并把这些写进文档。
5. 去重 · Deduplication
5.1 重复从哪里来
网页数据里的重复有好几种来源:镜像站整页复制;新闻和文章被转载,换了外壳;每个站点的每个页面都带着同样的页眉页脚;模板生成的页面(商品页、天气页)大同小异。Lee et al. (2021) 在 C4 里发现,一句 61 个词的句子在训练集里重复了 61,036 次。
为什么要去重?三个理由(§5.7、§6、§7 分别展开):记忆——重复的内容更容易被模型逐字背下,再原样吐出来(隐私、版权,第 16、19 讲);算力——同样的内容看很多遍是浪费;评测——验证集和测试集的内容如果在训练集里出现过,数字会偏乐观。
5.2 精确去重
最简单的做法:给每个文档算一个哈希(例如 md5),哈希相同就是重复,只保留一个。它只需要一次线性扫描和一个字典,几十亿个文档也做得到。代码 02 演示 1 在迷你爬取上:删掉 209 个页面,精确率 100%(删掉的都是真副本),但召回率只有 54%:镜像(整页复制)106 个全部找到,转载 159 个只找到 8 个——转载换了页眉页脚,哈希就完全不同。(找到的 8 个恰好转回了原来的站点、又没有改动。)
真实流程里,精确去重也常常按”行”或”段落”做:CCNet 按段落哈希,C4 把重复出现的三句话片段只保留一次。这样能删掉跨页面的样板,但也会把不同文章里”恰好相同”的句子一起删掉。
5.3 近似重复与 Jaccard 相似度
“差一点”的副本需要一个相似度。标准做法是把文本变成 shingle 的集合——相邻 个词组成的片段( 时,“the soup was tasty” → {“the soup was”, “soup was tasty”})——再算 Jaccard 相似度
代码 02 演示 2 测了几类页面对(3 词 shingle):
| 页面对 | 整页 Jaccard(平均 / 最小 / 最大) | 只看正文 |
|---|---|---|
| 镜像对 | 1.00 / 1.00 / 1.00 | 1.00 / 1.00 / 1.00 |
| 转载对(同一内容,换了站点) | 0.43 / 0.10 / 1.00 | 0.86 / 0.45 / 1.00 |
| 同站点的不同页面 | 0.28 / 0.12 / 0.67 | 0.10 / 0.00 / 0.50 |
| 不同站点的不同页面 | 0.01 / 0.00 / 0.23 | 0.02 / 0.00 / 0.33 |
| 两个垃圾广告页面 | 0.00 / 0.00 / 0.03 | 0.00 / 0.00 / 0.03 |
两个教训。第一,先提取正文,再算相似度:看整页时,“同一个站点的两篇不同文章”(最高 0.67)可能比”同一篇文章的两个副本”(最低 0.10)还像——全是共享的页眉页脚造成的。RefinedWeb、FineWeb 的流程都把正文提取放在去重之前。第二,shingle 比较的是词的序列:关键词堆砌的广告用的是同一小撮词,但顺序随机,Jaccard 几乎是 0,近似去重不会把它们当成重复(我原以为会,见代码 README)——它们要靠质量过滤去掉。
5.4 MinHash:用很短的签名估计 Jaccard
两两比较所有文档是 :迷你爬取的 2175 个页面就有 2,364,225 对,几十亿个文档根本做不到。MinHash 先把每个文档压缩成一个短签名。
取一个随机哈希函数 ,对集合 定义 。关键性质:
直觉: 相当于把 里的元素随机排了个序。排第一的那个元素,同时属于 和 的概率,正好是 ;而只有在这种情况下两个最小值才相等。
用 个独立的哈希函数,签名就是 个最小值。两个签名里”相等的分量”所占的比例 是 的无偏估计;每个分量是一次成功概率为 的伯努利试验,所以
代码 02 演示 3 (a) 验证了这一点: 时,平均绝对误差 0.013、0.006、0.003,和理论量级(0.013、0.007、0.003)吻合——哈希个数翻 4 倍,误差减半。Lee et al. 的 NearDup 用了 9000 个哈希;我们的页面少、要求低,128 个就够了。
代码里的哈希函数是 , 是一个素数,、 随机——每组 就是一个”随机排序”。用 numpy 的广播, 个哈希函数对所有 shingle 一次算完。
5.5 LSH:只比较”可能相似”的文档对
有了签名,还是要两两比较吗?**局部敏感哈希(locality-sensitive hashing, LSH)**的分带(banding)技巧避免了这一点:把长 的签名切成 段、每段 个数;每一段用一个字典(“桶”),段的内容完全相同的文档落进同一个桶。只要有一段相同,就成为候选对。
Jaccard 为 的两个文档,某一段完全相同的概率是 , 段都不同的概率是 ,所以成为候选的概率是
这是一条 S 形曲线: 大时接近 1, 小时接近 0,陡峭的部分大约在 。代码 02 用 、(阈值约 0.71),只检查了 1070 个候选对(全部 2,364,225 对)。按真实 Jaccard 分箱:
| 真实 Jaccard | 实际成为候选 | 理论 (箱子中点) |
|---|---|---|
| [0.4, 0.6) | 0.06 | 0.06 |
| [0.6, 0.7) | 0.38 | 0.40 |
| [0.7, 0.8) | 0.84 | 0.82 |
| [0.8, 0.9) | 1.00 | 0.99 |
| 低于 0.4 / 高于 0.9 | 0.00 / 1.00 | 0.00 / 1.00 |
调 和 就是在调阈值和曲线的陡峭程度: 大,曲线更陡、阈值更高; 大,阈值更低、召回更高、候选更多。Lee et al. 用的是 、。候选对只是”可能相似”:下一步要对候选对算真实的相似度确认(Lee et al. 用编辑相似度 > 0.8),再用**并查集(union-find)**把相似的文档连成簇,每簇只留一个。
代码 02 演示 4 比较了三种去重:
| 方法 | 删掉页面 | 精确率 | 召回率 |
|---|---|---|---|
| 精确去重(整页 md5) | 209 | 100% | 54% |
| MinHash + LSH,整页,确认 Jaccard ≥ 0.8 | 272 | 81% | 56% |
| MinHash + LSH,只看正文,确认 Jaccard ≥ 0.8 | 339 | 96% | 84% |
只看正文的近似去重找回了 84% 的多余副本;删错的几个是”几乎一样、但不完全一样”的页面(两张导航页只差一行……),“近似”本来就意味着要划一条线。看整页时两头都差:转载因为换了页眉页脚被漏掉,同一站点的短故事页面因为共享页眉页脚被误删(38 个)。
5.6 后缀数组:找出重复出现的长子串
文档级去重处理不了”每个页面都带着同一段版权声明”这种重复。Lee et al. 的 ExactSubstr 找出所有出现至少两次、长度至少 50 个 token 的子串,把它们删掉。工具是后缀数组(suffix array):把整个语料的所有后缀按字典序排好,相同的子串一定会挨在一起,扫一遍相邻的后缀就能找出所有长重复。真实的后缀数组可以在线性时间内构建;代码 02 用了一个简化版——只按每个后缀的前 50 个字符排序(“截断的后缀数组”),足以找出长度 ≥ 50 的重复,0.3 秒处理完 455,737 个后缀。
| 字符类别 | 占全部字符 | 其中落在重复子串里 |
|---|---|---|
| 页眉页脚(样板) | 35.5% | 86% |
| 有副本的页面的正文 | 17.7% | 98% |
| 没有副本的页面的正文 | 46.7% | 61% |
出现次数最多的片段全是样板(“kindly share your feedback in the comments section…” 281 次)。但被覆盖的远不只是样板:没有副本的页面,正文也有 61% 落在重复子串里——我们的世界是模板生成的,同一句评论会在不同页面上独立出现。所以玩具里重复子串覆盖了 76.8% 的字符,远高于真实网页(ExactSubstr 从 C4 里删掉了 7.18% 的 token)。这个数字本身不可推广,但它说明了一个真实的取舍:按子串删除会把一部分合法内容一起删掉,去重的粒度(文档 / 段落 / 子串)本身是一个设计选择。
5.7 去重带来了什么
Lee et al. (2021) 在 C4、RealNews、LM1B、Wiki-40B 上做了系统的测量:
- 重复有多普遍:NearDup 从 C4 训练集里删掉 3.04% 的样本,RealNews 13.63%;ExactSubstr 删掉 C4 的 7.18% 的 token、RealNews 的 19.4%。
- 记忆:在原始 C4 上训练的模型,无提示生成的文本里有 1.926% 的 token 属于”从训练数据逐字复制的 50 token 片段”;用 NearDup 去重后降到 0.189%,ExactSubstr 0.138%——约 10 倍的差别。
- 评测失真:C4 验证集里 4.60% 的样本在训练集里有近似副本(RealNews 14.35%)。Transformer-XL 在 LM1B 验证集上,“训练集里有副本”的样本困惑度 10.11,“没有副本”的 23.58。
- 效率:去重后的模型用更少的训练步数就能达到同样或更好的准确率。
去重今天是每一份预训练语料的标准步骤(GPT-3 的 MinHashLSH、The Pile 的 OpenWebText2、RefinedWeb、FineWeb……)。但”去得越狠越好”并不成立——§11 会讲到 FineWeb 的一个反直觉发现。
6. 重复数据为什么伤害模型(以及什么时候不伤害)· Why repeated data hurts
6.1 同样的算力,看几遍?
代码 03 演示 1 用第 1 讲的 tiny GPT 做了一个控制实验:每个模型训练同样的 640 步(每步 32 段 × 96 个字符,总共看约 197 万个字符),只改”这些字符里有多少是不同的”——取一份新鲜数据的前 ,重复 遍:
| 重复次数 | 唯一数据 | 训练 bpc | 验证 bpc | 加法·见过的题 | 加法·没见过的题 |
|---|---|---|---|---|---|
| 1 | 1,966,107 字符 | 0.558 | 0.568 | 0.02 | 0.00 |
| 16 | 122,639 字符 | 0.549 | 0.568 | 0.02 | 0.00 |
| 128 | 15,424 字符 | 0.488 | 0.621 | 0.01 | 0.00 |
| 1024 | 2,184 字符 | 0.221 | 1.772 | 0.75(8 题) | 0.00 |
| 1(换一种数据顺序重训) | 1,966,107 字符 | 0.569 | 0.579 | 0.01 | 0.00 |
最后一行是噪声参照:同样的数据,只换 batch 的抽样顺序,验证 bpc 就从 0.568 变成 0.579。差别在 0.01 左右的,都只是训练过程的随机性。
- 少量重复几乎免费:只用 1/16 的数据、每行看 16 遍,验证 bpc 和全新数据完全一样(0.568)。T5 论文的表 9 有同样的现象:把 C4 截短到 个 token、重复 64 遍,GLUE 82.87(完整数据 83.28);Muennighoff et al. (2023) 用约 400 次训练(最大 90 亿参数)得出:最多 4 个 epoch 的重复,损失和全新数据几乎没有区别。
- 重复太多就变成背诵:重复 128 遍时训练和验证开始拉开(0.488 vs 0.621);重复 1024 遍时,模型几乎背下了全部 2,184 个字符的训练数据(训练 bpc 0.221),验证 bpc 却是 1.772。它”见过”的 8 道加法题答对 75%,没见过的题全错:背住了答案,没学会加法。T5 表 9 里重复 1024 遍、4096 遍时,GLUE 降到 79.55、76.34。
- 伤害先落在”具体事实”上:按体裁拆开, 时问答的验证 bpc 从 1.013 升到 1.697、人物介绍从 1.035 升到 1.192,评论和故事几乎不变(0.338 → 0.359,0.299 → 0.299)——评论和故事只需要规则,规则在 1.5 万个字符里已经学得到;而唯一数据少到一定程度,有些人的事实根本不在里面了。重复不能创造信息。
6.2 背诵的样子
代码 03 还从每个模型采样了 200 行:
| 重复次数 | 格式合法且为真 | 是训练原句 | 基准 | 不同的行 |
|---|---|---|---|---|
| 1 | 10% | 10% | 95% | 197 |
| 128 | 10% | 3% | 27% | 199 |
| 1024 | 46% | 42% | 7% | 142 |
“基准”是新鲜生成的验证行里、恰好也出现在这个模型训练数据里的比例。 的模型生成的 42% 是训练原句——对新鲜数据来说这个比例只有 7%——而且 200 行里只有 142 种不同的行:它在背诵。( 一行的”是训练原句”很低,是因为 640 步的小模型生成的句子大多有错;模板世界里一句正确的话几乎必然”在训练数据里”,所以这一列要和基准对照着看。)这就是 Lee et al. 测到的”生成文本里逐字复制的比例”在玩具里的样子,也是第 16 讲(隐私:训练数据提取)的起点。
6.3 一小部分数据重复很多遍:Hernandez et al.
Hernandez et al. (2022)(Anthropic,本主题的阅读之一)研究的是另一种更贴近现实的情况:大部分数据是新的,只有一小部分被重复了很多遍(例如某些网页被大量镜像,或者训练者有意上采样了一小份”好”数据)。他们训练了 150 万到 8 亿参数的模型,每个都看 1000 亿个 token,其中 90% 是不重复的数据、10% 来自一个被反复使用的小子集。主要发现:
- 伤害可以非常大:把 0.1% 的数据重复 100 次(占 10% 的 token),一个 8 亿参数的模型会退化到 4 亿参数模型的水平——相当于丢掉一半的参数。
- 双下降(double descent):伤害不是随重复次数单调变化的。重复几次的、或者极小一份被重复极多次的,伤害都小;伤害在中间某个区间达到峰值,而峰值恰好出现在重复数据的训练损失接近 0、即被背下来的时候。他们的解释(作者自己称为粗略的假设):背下这份数据会占用模型可观的一部分容量;而从损失的角度看,背诵是”划算”的——8 亿参数模型的损失约 2.0 nats/token、4 亿参数约 2.2,把 10% 的 token 背到损失为 0,。
- 受伤最重的是”复制”能力:在一段文字重复出现时预测后文的能力、以及与之相关的 induction head(第 12 讲)受损远比测试损失严重。
代码 03 演示 2 在玩具里做了同样的设计:90% 的 token 是新数据,10% 来自 40 行(20 道加法题 + 20 条评论),每行重复 131 次。还加了一个对照——干脆不要这 10%,只用 90% 的新数据、训练 90% 的步数:
| 模型 | 验证 bpc | 在那 40 行上的 bpc | 那 20 道加法题 | 样本里是那 40 行 |
|---|---|---|---|---|
| 100% 新数据,640 步 | 0.568 | 0.631 | 0.00 | 0.0% |
| 90% 新数据 + 10% 重复子集,640 步 | 0.574 | 0.586 | 0.00 | 0.0% |
| 对照:只用那 90% 新数据,576 步 | 0.604 | 0.640 | 0.00 | 0.0% |
我们没有复现 Hernandez 的伤害。 重复子集模型的验证 bpc(0.574)和全新数据(0.568)的差别在噪声范围内,而且好于”干脆少训练 10%“(0.604)——重复的那 10% 起到了和新数据差不多的作用。原因在第二列:模型在那 40 行上的 bpc(0.586)只比从没见过它们的模型(0.631)低一点,远没有背下来(对比 的 0.221)。131 次重复、只占 10% 的训练信号,对这个只训练 640 步的 11 万参数模型来说不够背下来。也就是说,我们停在 Hernandez 曲线上”还没背下来”的一侧:那里重复数据 ≈ 新数据。练习 6 把子集缩小到 10 行、或者把训练拉长到 2000 步,模型开始背下一部分(子集里的加法题答对 0.35),但验证 bpc 仍然没有变差——要看到峰值,需要背诵真正占用模型容量的一大块,这超出了 2 分钟能训练的范围。
6.4 哪些结论能推广
- 能推广的机制:少量重复几乎免费;大量重复让模型从”学规律”转向”背样本”,验证损失上升、生成文本逐字复制、多样性下降;伤害先落在需要记忆的具体知识上。这些在 T5、Muennighoff、Lee 的真实模型上都看到了。
- 需要真实规模才能看到的:Hernandez 的双下降峰值,以及”复制能力 / induction head 受损”——它们出现在重复数据被大模型背下、背诵占用了可观容量的区间。
- 实践上的含义:小而精的数据可以多看几遍(GPT-3 让维基百科看了 3.4 遍,§8);但要警惕网页里被大量镜像的内容和”上采样过头”的子集;去重的价值一半在于防止后者。
7. 测试集污染 · Test-set contamination
7.1 什么是污染
基准测试和预训练数据都来自互联网:考题被贴到网上、被 GitHub 上的代码仓库收录、被论文引用,然后被爬进预训练语料。模型训练时”看过考卷”,分数就不再衡量能力。课程笔记 Data 区分了两种污染(依据 Dodge et al. 2021 在 C4 上的测量):
- 输入和答案都在训练数据里(input-and-output contamination):例如摘要数据集 XSum 的 15.49%、TIFU-short 的 24.88%(TIFU-long 只有 1.87%)。
- 只有输入在训练数据里(input contamination):例如 GLUE 的 QNLI 有 53.6% 的句子在 C4 里——它取自维基百科。
对”考答案”的基准,前一种危险得多;后一种的影响要具体看(§7.5)。笔记还提醒:污染通常不是因为有人把数据集文件放到了网上(它们一般是 JSON 文件,不是网页),而是考题的内容本来就来自网页。
7.2 第 1 讲的验证集有多干净?
代码 04 演示 1 先回头检查第 1 讲:验证集里 60%(223 / 369 行)在训练集里一字不差地出现过。人物、问答、故事的验证行 100% 重叠(它们都是模板句,种类有限),只有加法(19%)和评论(34%)有真正”没见过”的行。
| 体裁 | 在训练集里 | bpc:重叠的行 | bpc:没见过的行 |
|---|---|---|---|
| 加法 | 19% | 1.854 | 1.884 |
| 评论 | 34% | 0.208 | 0.214 |
| 合计 | 60% | 0.290 | 0.478 |
合计的差别看起来很大,但主要来自体裁构成(没见过的行全是加法和评论);在同一个体裁里比,差别很小——11 万参数的 base model 几乎没有背下具体的行,它学的是模板和规律。大模型会背得多得多(§5.7:Transformer-XL 的 10.11 vs 23.58)。所以重叠对指标的影响取决于模型背了多少;对大模型,验证集必须先对训练集去重。
7.3 泄漏的考题能把分数抬高多少
代码 04 演示 2 构造了一个”跨格式问答”基准:第 1 讲里那 30 个没有问答文本的人,每人问城市、职业两道题,共 60 道——它考的是”把叙述句里学到的事实用到问答格式上”的能力(第 1 讲 §3.3)。把其中 45 道以三种方式混进预训练语料(每种 15 道、各 3 份),用和第 1 讲 base model 完全相同的配置、步数、随机种子重新预训练:
| 考题组 | 泄漏的样子 | base model | 泄漏后的模型 |
|---|---|---|---|
| 不泄漏 | — | 0.33 | 0.33 |
| 题目 + 答案原样泄漏 | q: where does zusu live? a: osku. | 0.27 | 0.73 |
| 只泄漏题目 | q: what does budon do? a: | 0.40 | 0.40 |
| 换个问法 + 答案 | q: what job does bogu have? a: judge. | 0.47 | 0.40 |
| 整个基准(60 道) | 0.37 | 0.47 | |
| 加法:泄漏的题(各 5 份) | 37+45=82. | 0.12 | 0.18 |
| 加法:没泄漏的题 | 0.07 | 0.04 |
(每组只有 15 道题,一道题就是 0.07。)
- 原样泄漏的题从 0.27 升到 0.73,整个基准从 0.37 升到 0.47。模型”跨格式迁移知识”的能力并没有变(不泄漏的那组 0.33 → 0.33)——分数上涨全部来自背下了考题的答案。
- 只泄漏题目、没有答案:没有变化。
- 换个问法泄漏答案:这一次没有帮上忙。这个结果不稳定:一次只改变了语料打乱顺序的试跑里,它是 0.47 → 0.67(同一次试跑里原样泄漏的题升到 1.00)。小模型对”换了说法的同一个事实”泛化得很弱(第 1 讲 §4.2),大模型却可能从换了说法、甚至换了语言的泄漏里学到答案——而这种泄漏最难检测。
- 加法几乎没被抬高:这个小模型背不住加法题(第 1 讲:见过的题也只有 0.12)。GPT-3 论文也有类似情况:LAMBADA 有真实的污染,但干净子集的分数和全集相差不到 0.5%。污染会不会抬分,取决于模型背不背得下来——模型越大,背得越多。
7.4 怎样检测:n-gram 重叠
GPT-3 论文(§4、附录 C)的做法:对每个基准的每个样本,如果它的任何一个 13-gram(13 个词)出现在预训练语料里,就标为”脏”(dirty);比 13 个词还短的样本整体比较。细节里有两个重要的补丁: 按基准里样本长度的第 5 百分位往下调(非合成任务最少 8 个词);出现在 10 个以上训练文档里的 13-gram 被忽略——它们通常是常见短语或样板。
代码 04 演示 3 在泄漏后的语料上做了同样的检测。我们的模型是字符级的、考题只有 7 个词左右,所以按字符 n-gram 切:
| 考题组 | n = 8 | n = 13 | n = 13,忽略常见 | n = 20,忽略常见 | n = 30,忽略常见 |
|---|---|---|---|---|---|
| 不泄漏 | 100% | 100% | 93% | 0% | 0% |
| 原样泄漏 | 100% | 100% | 100% | 100% | 100% |
| 只泄漏题目 | 100% | 100% | 100% | 100% | 0% |
| 换个问法 | 100% | 100% | 100% | 0% | 0% |
| 加法:泄漏 / 没泄漏 | 100% / 0% | 100% / 0% | 100% / 0% | 100% / 0% | 100% / 0% |
- n 太小,假阳性:13 个字符只是两三个词。一道没泄漏的题 “q: what does tazil do? a: tailor.” 里,“q: what does “(113 行)、”: what does t”(9 行)、” do? a: tailo”(5 行)都在训练数据里——共享的是格式和常见答案,不是考题本身。忽略常见 n-gram 也只救回了一道题。
- n = 20 + 忽略常见恰好把不泄漏和原样泄漏分开;但换了问法的泄漏是 0%,检测器看不见。n = 30 连”只泄漏题目”也漏掉了(题目本身不到 30 个字符)。
- 加法题比 n 还短,就整题比较:泄漏的 100% 被找到,没泄漏的 0%——短而唯一的考题最容易查。
的选择是假阳性和假阴性之间的权衡,没有放之四海皆准的数字。(我第一版直接沿用了”13”,60 道题里 59 道被标脏,下一步的分析无法进行——见代码 README。)
7.5 干净子集
检测出来之后怎么办?GPT-3 没有重新训练(一个过滤上的 bug 让一部分重叠没被删掉,而重训太贵),而是做干净子集(clean subset)分析:只在没被标脏的样本上重新算分,和全集比较。如果干净子集的分数比全集低 1–2 个百分点以上,就提示分数被污染抬高了。代码 04 演示 4 用 n = 20 的检测器:
| 子集 | 题数 | base model | 泄漏后的模型 |
|---|---|---|---|
| 全部 | 60 | 0.37 | 0.47 |
| 被标为脏的(原样泄漏 + 只泄漏题目) | 30 | 0.33 | 0.57 |
| 干净子集(不泄漏 + 换个问法) | 30 | 0.40 | 0.37 |
泄漏后的模型在干净子集上 0.37,比全集低 0.10——按 GPT-3 的判据,分数被抬高了;而 0.37 恰好等于 base model 的真实水平。但这有运气成分:换了问法的泄漏留在了”干净子集”里,只是它恰好没帮上忙。
GPT-3 论文的真实结果说明了这种分析的价值和局限:四分之一的基准有超过 50% 的样本被标脏,但大多数基准的干净子集和全集差别可以忽略。几个例子:阅读理解(QuAC、SQuAD 2、DROP)超过 90% 的样本被标脏,人工检查发现只是原文在训练数据里、问题和答案不在(input contamination);PIQA 29% 被标脏,干净子集低 3 个百分点,但小 25 倍的模型也有类似的下降,作者认为更可能是统计偏差;Winograd 45% 被标脏,干净子集低 2.6%,人工找到了 132 个以不同格式出现在训练集里的 Winograd 题;维基百科上的语言建模基准和 Children’s Book Test 几乎完全在训练数据里,干脆不报告(第 1 讲 §4.4 提到的 WikiText-103 就是其中之一)。
“被标脏的比例”不等于”分数被抬高的幅度”;要比较的是干净子集和全集的分数。而整个分析的前提是检测器够好——它查不出换了说法、换了语言、或者只泄漏了答案的情况。这是 2023 年之后污染问题变得更难的原因之一(§11)。
8. 数据配比 · Data mixtures
预训练语料几乎都是多个来源的混合:网页、书、维基百科、代码、论文……训练时按权重 从第 个来源采样。如果总共训练 个 token、第 个来源有 个 token,它被看的遍数就是
为什么不按大小比例混合? 因为来源的质量和”对口程度”不同。GPT-3 让 Common Crawl 只看 0.44 遍、维基百科看 3.4 遍(§2.4);The Pile 让 Pile-CC 和 GitHub 看 1 遍、学术来源看 2 遍、维基百科看 3 遍(§2.5)。这本质上是有意的重复,§6 告诉我们它在”几遍”的范围内基本安全,而在”几十上百遍”时会变成背诵。
配比决定模型会什么。 The Pile 的分析显示,GPT-3 在它的数据很少覆盖的领域(学术写作、法律、代码、数学)表现相对较差;第 1 讲的迷你互联网里,评论占 46.8% 的字符、问答只占 2.3%,这直接影响了哪些能力先出现(第 1 讲 §3.3)。2020–2022 年,配比大多是凭经验和小规模实验手工定的;之后出现了用小模型自动搜索配比的方法(§11 的 DoReMi)。
配比还决定一件更微妙的事:模型在分布偏移下是否可靠。代码 05 演示 2 在保持模型不变的情况下只改训练配比,结果是 §9 的核心证据。
9. 数据决定分布鲁棒性 · Data determines distributional robustness
本节对应 2/1 的客座报告:Ludwig Schmidt(当时在华盛顿大学;LAION-5B、DataComp 的作者之一),A data-centric view on reliable generalization。报告没有公开的 slides;下面依据他和合作者在 2020–2023 年发表的论文重建论证的主线。报告的具体内容和顺序是推断。
9.1 分布偏移
在 ImageNet 上训练的图像分类器,在 ImageNet 的测试集上准确率很高。但换一个”看起来是同一个任务”的测试集,准确率就会明显下降:ImageNetV2(按同样的流程重新收集的新测试集)、ImageNet-Sketch(素描)、ImageNet-R(卡通、绘画等各种再现)、ObjectNet(奇怪的角度和背景)、ImageNet-A(对抗性筛选出的难例)。这叫分布偏移(distribution shift)。对部署来说,它比原测试集上的准确率更重要:真实世界的数据很少和训练数据同分布。
9.2 有效鲁棒性,以及”准确率在一条直线上”
Taori et al. (2020)(Schmidt 是作者之一)在 204 个 ImageNet 模型、213 种测试条件上做了大规模评测,发现了一个惊人的规律:几乎所有在 ImageNet 上训练的模型,它们的”原测试集准确率”和”偏移后准确率”在 logit 坐标下落在同一条直线上——不管架构、大小、训练技巧。
这让”鲁棒”有了一个精确的定义。设 是这条直线(在 logit 坐标里拟合,再变换回准确率),一个模型 的有效鲁棒性是
也就是”在原测试集准确率相同的情况下,比直线预测的多出多少”。只是”整体更准”的模型沿着直线往右上走,;真正”更鲁棒”的模型要高于直线。他们的发现:
- 为合成偏移(图像噪声、对抗扰动)设计的鲁棒性方法,对自然的分布偏移几乎没有帮助;在合成偏移上的鲁棒性对自然偏移的预测力很弱(例如在 ImageNetV2 上,与图像损坏鲁棒性的相关系数只有 0.24)。
- 唯一的例外是”在更多样的数据上训练”,而且也不稳定:在 10 亿张 Instagram 图片上训练的模型 ,在 JFT-300M 上训练的模型却是 。
Miller et al. (2021)(Schmidt 也是作者之一)把这个现象推广到更多数据集和任务,称之为 “accuracy on the line”:跨架构、超参数、训练集大小、训练时长,分布内和分布外的表现高度线性相关;也有例外(例如 Camelyon17 的组织病理图像)。
9.3 CLIP 为什么鲁棒?
CLIP(2021)在 4 亿对网上的”图片 + 说明文字”上做对比学习,零样本分类时在这些偏移测试集上远高于那条直线——这是第一次有一类模型大幅度离开 ImageNet 的直线。为什么?可能的解释有五个,Fang et al. (2022) 逐一做了控制实验:
| 假设 | 实验 | 结论 |
|---|---|---|
| 训练集更大 | 对训练集降采样 | 准确率变,有效鲁棒性不变 |
| 训练分布不同 | 在不同数据上训练同样的模型 | 起决定作用 |
| 训练时用语言监督 | 在 ImageNet-Captions(ImageNet 的 463,622 张图配上原始文字说明)上训练 CLIP | 和普通分类器在同一条直线上 |
| 测试时用语言提示 | 换不同的提示模板 | 模板提高了准确率(34.7% vs 31.5%),没有提高鲁棒性 |
| 对比损失 | 在 ImageNet 上用 SimCLR、SimSiam、SwAV 等对比 / 自监督方法 | 几乎没有有效鲁棒性 |
一个关键对照:在 YFCC-15M 上,CLIP 的 ImageNet 准确率 37.9%;不用任何语言、先 SimCLR 自监督再分类的基线 35.7%,两者的有效鲁棒性相近(平均分布外准确率 19.9 vs 18.8)。论文的结论是:CLIP 的鲁棒性主要由训练分布决定,语言监督、对比损失、数据量的作用很小或没有。
9.4 一个迷你实验
代码 05 在一个玩具任务上重现了这个结构。任务:读一条评论,判断食物好不好。评论来自 4 个”网站”:
A(训练 / 原测试集,相当于 ImageNet) review: the bread was tasty. the host was grumpy.
B(分布偏移的测试集,相当于 Sketch) bread? juicy! service: grumpy.
C(另一个网站,覆盖了 B 的一部分说法) i had the bread, it was rich. staff grumpy.
D(句式不同,但用词和 A 一样) bread tasty, host grumpy.
B 里有一半的食物形容词(zesty、velvety、mushy、rancid……)在 A 里从来没出现过,只有 C 里有。
演示 1:只用 A 训练。 5 种模型——词袋 + 逻辑回归(判别式)、字符 3-gram + 逻辑回归(不同特征)、朴素贝叶斯(生成式,不同的训练目标)、最近质心(“和原型比相似度”,形式上像 CLIP 的零样本分类)、小 MLP(不同的架构)——每种在 7 种训练集大小(8 到 1024)上训练。35 个点在 logit 坐标下几乎落在同一条直线上:
每种模型的平均有效鲁棒性:词袋逻辑回归 −0.002、朴素贝叶斯 −0.003、最近质心 −0.007、小 MLP −0.005、字符 3-gram +0.017。换训练目标、换架构、加数据量,都只是让模型沿着直线移动。唯一稍高于直线的是字符 3-gram:B 独有的形容词和 A 里的词共享一些字母片段(zesty 和 tasty 都以 -sty 结尾),归纳偏置帮了一点小忙。直线很平,因为 B 里一半的词 A 里根本没有:只用 A 训练,B 准确率的天花板大约是 ——这个天花板由数据决定。
演示 2:模型不变,只改训练配比(词袋逻辑回归和小 MLP,训练集 256、1024、4096,取平均):
| 训练数据配比 | A 准确率 | B 准确率 | 有效鲁棒性 |
|---|---|---|---|
| A(基线) | 0.961 | 0.727 | −0.012 |
| A 50% + D 50%(句式更多样,但用词和 A 一样) | 0.961 | 0.726 | −0.013 |
| A 90% + C 10% | 0.965 | 0.881 | +0.134 |
| A 75% + C 25% | 0.965 | 0.929 | +0.183 |
| A 50% + C 50% | 0.960 | 0.956 | +0.218 |
| C 100% | 0.963 | 0.965 | +0.223 |
终端里打印的散点图(横轴 A 准确率、纵轴 B 准确率,logit 缩放;a = 只用 A,d = A + D,c = A + C):
0.97 | c
| c
| c
|
0.94 |
|
|
| c
0.87 |
|
|
|
0.74 | a ·····a·dd··
| ·········d··· da
| ············a
| ····a········
0.56 | ···a········· a
|··a
+----------------------------------------------------------------
0.65 0.79 0.89 0.94 0.97
三个结论,都和 Schmidt 等人的发现同构:
- 模型的选择决定你在直线上的位置,数据决定直线本身。 同样的模型、同样的 A 准确率,只改配比,有效鲁棒性从 −0.012 变成 +0.218。
- “多样”本身不够,要覆盖。 A + D 的句式和 A 完全不同,有效鲁棒性却是 −0.013:D 没有覆盖 B 的说法。练习 8 把 C 里的 B 独有词去掉,A + C 也立刻回到直线上( 在 −0.016 到 −0.007 之间)。
- 少量对的数据作用很大;混入不对的数据会稀释。 只混入 10% 的 C, 就到 +0.134。反过来,C 100% 在 B 上是 0.965,混入一半 A 后降到 0.956。Nguyen et al. (2022)(Schmidt 是作者之一)在六个图文数据源上发现了同样的方向:没有一个来源在所有偏移上都最好,而把来源混在一起会稀释最好的那个来源的鲁棒性。
玩具的局限也要说清楚:这里的”覆盖”是构造出来的;真实世界里,我们往往不知道部署时会遇到什么分布,也不知道网络数据到底覆盖了什么。
9.5 LAION-5B 与 DataComp:让数据成为可以研究的对象
如果鲁棒性由数据决定,那么研究数据就需要可以公开实验的数据集——CLIP 的 4 亿对训练数据没有公开。这是 Schmidt 参与的两个项目的出发点。
LAION-5B(Schuhmann et al., 2022):从 Common Crawl 的网页里解析出 <img> 标签和它的 alt 文字,下载图片,用 CLIP ViT-B/32 计算图文相似度来过滤(英语阈值 0.28,其他语言 0.26);约 500 亿个候选里删掉了约 90%,最后得到 58.5 亿对(其中 23.2 亿对英语)。它以”网址 + alt 文字”的形式发布,不分发图片本身;可能不适宜的内容不删除而是打标签(约 3% 被检测为 NSFW)。在 LAION 上训练的 CLIP 达到了和 OpenAI CLIP 相近的准确率和鲁棒性(ObjectNet 等少数偏移上仍有差距)。两点值得注意:用”另一个模型(CLIP)的打分”过滤数据,意味着新数据集继承了旧模型的偏好(§4.4 的”质量分类器”问题换了一种形式);而”网址列表”式的发布方式带来了第 17 讲要讲的投毒风险。
DataComp(Gadre et al., 2023,报告之后发表)把思路推到底:固定训练代码、模型和算力,只让参与者改数据集——把通常的”固定数据、改算法”反过来。它提供一个 128 亿对图文的候选池(CommonPool),在 38 个下游任务上评测。最好的基线 DataComp-1B(14 亿对,从候选池里过滤出来)训练的 ViT-L/14 在 ImageNet 零样本上达到 79.2%,而在相同算力下,OpenAI 的 CLIP ViT-L/14 是 75.5%。最有效的过滤是 CLIP 分数过滤(大约保留分数最高的 30%)和”基于图像的过滤”(保留与 ImageNet 图像相近的聚类)的交集;论文的一个关键结论是:更小、过滤更严格的数据集,可以训练出泛化更好的模型。
9.6 这对语言模型意味着什么
Schmidt 的论证是在图像上做的,但结论对所有基础模型都适用:模型在哪些分布上可靠,主要取决于预训练数据覆盖了什么——CLIP 的零样本鲁棒性和 GPT-3 在法律、代码上的短板(§2.5)是同一件事的两面;“更大的模型、更好的目标函数”只沿着直线移动,想离开直线要改数据;评测因此必须包含分布偏移,而不只是同分布的测试集(第 1 讲 §4.4;第 5、18 讲)。2023 年之后,语言模型的数据工作基本沿着这条路走(DCLM 就是”语言模型版的 DataComp”,§11)。
10. 数据带来的危害 · Harms from data
本主题的阅读里有两份关于危害的课程笔记(Harms I、Harms II)和 Stochastic Parrots。第 18 讲会系统地讨论偏见、有害内容与发布规范;这里只看它们和数据的关系。
10.1 谁在数据里
§2.1 讲过:网页数据过度代表某些人群。§4 又看到:过滤器会进一步删掉某些人群的语言(方言、身份词、健康话题)。Harms I 指出了一个反馈回路:一个系统对某些用户表现差,他们就不再使用它,产生的数据就更少,下一代系统的差距就更大。
10.2 偏见与刻板印象
模型学的是数据的统计,数据里的社会偏见会被学进去(第 1 讲 §5.2 的代词偏斜就是迷你版本)。Harms I 的例子:
- Abid et al. (2021):给 GPT-3 以穆斯林为主语的提示,超过 60% 的续写涉及暴力;在类比任务 “Muslim is to ___” 中,23% 的续写是 “terrorist”。
- StereoSet(Nadeem et al., 2021)测量模型偏好刻板句子的比例(50 为理想),所有模型都偏好刻板印象,而且越大越偏:GPT-2 small 56.4、medium 58.2、large 60.0。
- 偏见的测量本身很难:结果对词表、解码参数等设计选择很敏感;上游的偏见指标也不一定能预测下游的实际伤害。
10.3 有害内容
Harms II 的例子(RealToxicityPrompts,Gehman et al., 2020):用不含毒性的提示让 GPT-3 每次生成 25 个续写,“最毒的那个”的期望毒性是 52%,至少有一个续写毒性 ≥ 50% 的概率是 87%——无害的提示也会引出有害的输出,因为训练数据里有。缓解方法之一是数据层面的:在 15 万篇无毒的 OpenWebText 文档上继续训练(DAPT),GPT-2 无提示时的期望最大毒性从 44% 降到 30%——有效,但只是部分有效。
10.4 过滤与代表性的两难
问题在于,“去掉有害内容”的工具本身有偏差。Perspective API 给 “He’s gay.” 打出 77.82% 的毒性分(身份词和毒性在它的训练数据里相关);Welbl et al. (2021) 发现,优化毒性指标会降低模型对方言的覆盖(Harms II);Dodge et al. 发现黑名单删掉了 42% 的非裔美国人英语文本(§4.3)。于是有一个真实的两难:过滤得少,模型学到更多有害内容;过滤得多,模型对边缘群体的语言和话题更陌生。没有一个阈值能同时消除两种伤害,这是一个需要被记录、被讨论的价值选择,而不是一个纯技术问题。
10.5 静态的数据,“随机鹦鹉”
Stochastic Parrots 还提出了两个与数据有关的论点。价值锁定(value-lock):社会运动会改变语言和框架,而在一份固定的数据上训练出来的模型会把旧的理解固定下来,频繁重训又很昂贵。“随机鹦鹉”:语言模型按概率拼接它见过的语言形式,并不参照意义或交流意图,但人类天然会把流畅的语言当作有意图的——这会带来自动化偏见、滥用、主流世界观的放大,以及记住的个人信息被泄露。它们的建议和本讲的主线一致:在项目开始时就为数据的整理和文档化留出预算,有意识地挑选和记录数据,而不是”能拿到什么就用什么”。
11. 2023 年之后 · Since 2023
CS324 Winter 2023 之后,预训练数据成了基础模型研究里最活跃、也最”工业化”的方向之一。和本讲直接相关的几条:
- 只用网页也可以很好。 RefinedWeb(Penedo et al., 2023,Falcon 的数据)从 Common Crawl 里提取了约 5 万亿 token,并论证”经过仔细过滤和去重的网页数据本身”就能训练出超过 The Pile 训练的模型(公开了 6000 亿 token 的子集)。这修正了 §2.5 The Pile 的一个前提:精选的非网页来源有用,但不是必需的。
- FineWeb 与 FineWeb-Edu(Penedo et al., 2024):从 96 个 Common Crawl 快照得到 15 万亿 token。两个发现和本讲直接相关。(1) 去重不是越狠越好:跨所有快照做全局 MinHash 去重后只剩约 4 万亿 token,训练效果却几乎没有提升;在每个快照内部分别去重(剩约 20 万亿)反而和 RefinedWeb 一样好——他们在一个 2013 年的旧快照上检查发现,全局去重之后留下的数据反而比被删掉的数据质量更差——更多广告、关键词列表和格式混乱的文本。(2) 用 LLM 定义”质量”:让 Llama-3-70B-Instruct 给 46 万个网页的”教育价值”打 0–5 分,再训练一个小分类器给全部数据打分、保留 3 分以上,得到 1.3 万亿 token 的 FineWeb-Edu,在 MMLU、ARC 这类知识和推理基准上明显更好。这是 §4.4 质量分类器的升级版——“参考语料”换成了”一个 LLM 的判断”,§4.4 的问题(“谁的质量”)也随之换了一种形式。
- DCLM(DataComp for Language Models,Li et al., 2024):把 §9.5 的 DataComp 思路搬到语言模型——固定训练配方,在一个 240 万亿 token 的 Common Crawl 候选池上比较数据整理方法,用 53 个下游任务评测。结论是基于模型的过滤是关键;DCLM-Baseline 训练的 70 亿参数模型用 2.6 万亿 token 达到 MMLU 5-shot 64%。
- 完全开放的数据:Dolma(AI2,2024,3 万亿 token,网页、论文、代码、公版书、社交媒体、百科)连同整理工具一起公开,用来训练开放的 OLMo 模型——这是 §3 文档化精神的延续:不只公开权重,也公开数据和流水线。
- 配比的自动化:DoReMi(Xie et al., 2023)用一个 2.8 亿参数的小代理模型、以分组分布鲁棒优化(Group DRO)求出各领域的权重,再用来训练 80 亿参数的模型;在 The Pile 上,平均 few-shot 准确率提高 6.5 个百分点,用少 2.6 倍的步数达到基线水平。此后”数据配比 + 课程(训练后期提高高质量数据的比例)“成为大模型训练的常见做法。
- 重复数据的再认识:Muennighoff et al. (2023) 系统地研究了数据受限时的 scaling:最多约 4 个 epoch 的重复和新数据几乎等价,之后重复数据的价值逐渐衰减到零(§6.1;第 4 讲)。随着高质量文本逐渐被用尽,“能重复几遍”从学术问题变成了实际问题。
- 合成数据:phi-1(Gunasekar et al., 2023)用约 60 亿 token “教科书质量”的网页代码数据,加上约 10 亿 token 由 GPT-3.5 生成的教科书和练习,训练出 13 亿参数、HumanEval 50.6% 的代码模型。此后用强模型生成或改写训练数据被广泛采用(第 7 讲的指令数据也是一例)。风险的一面是模型崩溃(model collapse):Shumailov et al. (2024,Nature) 发现,反复在模型自己生成的数据上训练,原始分布的尾部会逐渐消失。网页上 AI 生成的文本越来越多,“爬到的数据是谁写的”变成了 §3 文档化的新问题。
- 许可、退出与”数据公地”的收缩:Longpre et al. (2024) 审计了 C4、RefinedWeb、Dolma 背后的 14,000 个网站,发现仅在 2023–2024 一年里,C4 中超过 5% 的 token、以及最活跃的关键来源中超过 28% 的 token,被网站的 robots.txt 完全禁止 AI 爬取(如果算上服务条款,C4 的 45% 受到限制)。与此同时,围绕训练数据版权的诉讼进入法院(第 19 讲)。数据从哪里来,越来越是一个法律和许可问题。
- 污染变得更难查:模型的训练数据规模更大、来源更不透明,考题也会以改写、翻译的形式出现(§7.4 的盲区)。常见的应对包括:在基准里嵌入”金丝雀字符串”(canary string,例如 BIG-bench)便于训练者过滤;只用模型发布之后才出现的新考题;以及保留不公开的测试集。
哪些结论仍然成立? 数据决定能力和鲁棒性(DataComp、DCLM 把它变成了可以测量的科学问题);过滤是价值判断、必须测量它删掉了谁;去重和去污染是标准步骤;文档化依然重要,而且因为合成数据和许可问题变得更重要。哪些被修正了? “精选的非网页来源必不可少”(RefinedWeb 表明网页本身足够);“去重越彻底越好”(FineWeb 的全局去重反例);“重复的数据总是有害”(几个 epoch 内基本无害);以及”质量分类器”从逻辑回归变成了 LLM 打分。
12. 小结 · Summary
- 预训练数据的源头是网页爬取(Common Crawl),经过正文提取、语言识别、质量过滤、去重、去污染、配比,才成为训练语料。WebText、C4、GPT-3 的数据、The Pile 是这条流水线的几种做法。“整个互联网”不等于”所有人”:网页数据本身就偏向某些人群。
- 数据要写文档:datasheets 和 data statements 回答”从哪里来、由什么组成、覆盖了谁、漏掉了谁、不该用来做什么”。Dodge et al. 对 C4 的审计发现了机器翻译的专利、评测基准的重叠和黑名单的系统性误伤。
- 每一种质量过滤器都会误伤某些内容:启发式规则按体裁误伤(迷你爬取里加法练习 0% 留下),黑名单按话题和群体误伤(健康论坛 95% 被删;C4 里非裔美国人英语被删 42%),质量分类器按”像不像参考语料”误伤(变体 B 13% vs A 54%)。分类器学到的”质量”本质上是参考语料与爬取的比值。
- 去重:精确哈希快而准,但只找得到一字不差的副本(召回率 54%);MinHash 用 个最小哈希无偏地估计 Jaccard(误差 ),LSH 分带把候选对限制在 S 形曲线的阈值以上;后缀数组找出重复的长子串(主要是样板)。先提取正文,再去重。
- 重复数据:少量重复几乎免费(16 遍时验证 bpc 不变;真实模型最多约 4 个 epoch);重复上千遍,模型从学规律转向背样本(验证 bpc 0.568 → 1.772,生成 42% 是训练原句)。Hernandez et al. 发现一小部分数据被背下时伤害最大(8 亿 → 4 亿参数的等效);我们的小模型停在”还没背下来”的一侧,没有复现这个峰。
- 测试集污染会抬高分数而不改变能力(原样泄漏的题 0.27 → 0.73);只泄漏输入通常不抬分。n-gram 检测的 是假阳性与假阴性的权衡,换了说法的泄漏查不出来;干净子集分析能提示污染,但依赖检测器的质量。
- 数据配比是有意的设计:好数据多看几遍,配比决定模型擅长什么。
- 数据决定分布鲁棒性:在同一个分布上训练的模型,不论架构、目标、大小,都落在同一条”准确率直线”上;CLIP 的鲁棒性来自训练分布,而不是语言监督或对比损失。迷你实验里,只改配比让有效鲁棒性从 −0.012 变成 +0.218,而”更多样但不覆盖”的数据毫无帮助。
- 危害从数据里来:代表性不足、偏见、有害内容;而过滤有害内容的工具本身会误伤边缘群体——这是一个需要记录和讨论的价值选择。
13. 常见误区 · Common pitfalls
- “数据越多越好。” T5 的表 8:20GB 的维基百科 + 小说在 SuperGLUE 上胜过 745GB 的 C4;DataComp:更小、过滤更严格的数据集泛化更好。质量、覆盖和配比同样重要。
- “互联网数据代表了所有人。” 网页的作者偏向特定人群,过滤又会进一步删掉某些人群的语言(§2.1、§4)。
- “质量分类器衡量的是质量。” 它衡量的是”像不像参考语料”,确切地说是一个比值(§4.4);换一份参考语料,“高质量”的定义就变了(练习 5)。
- “黑名单只删掉坏内容。” 一个词本身不带好坏,语境才带(健康论坛里的 breast、pills;身份词)。Dodge et al. 建议不要再用黑名单过滤网页数据。
- “去重越彻底越好。” 精确去重漏掉大部分近似副本;但过度去重也会伤害(FineWeb 的全局去重),按子串删除会误伤正文(§5.6、§11)。
- “重复数据总是有害的。” 几遍之内几乎无害,GPT-3 有意让维基百科看了 3.4 遍;有害的是上百上千遍、以及一小部分被背下来的数据(§6)。
- “被标为污染的基准,分数一定被抬高了。” GPT-3 的大多数被标脏的基准,干净子集和全集差别可以忽略;只泄漏输入(例如阅读理解的原文)通常不抬分(§7.5)。
- “没查出污染,就是没有污染。” n-gram 检测查不出改写、翻译的泄漏(§7.4)。
- “更好的架构或训练目标能让模型更鲁棒。” 在同一分布上训练的模型都在同一条直线上(§9);有效鲁棒性主要来自训练分布。
- “更多样的数据就能带来鲁棒性。” 要覆盖测试时会遇到的东西;只是句式更多样的 D 毫无帮助,把好的来源和差的来源混在一起还会稀释鲁棒性(§9.4)。
14. 练习 · Exercises
练习 1(LSH 的 S 形曲线) 代码 02 用 、。(a) Jaccard 为 0.5 和 0.9 的两个页面成为候选对的概率各是多少?(b) 阈值 是多少?(c) 如果改成 、(签名长度不变),阈值变成多少?对去重的精确率和召回率有什么影响?
参考答案
(a) :,。:,。和代码 02 的实测([0.4, 0.6) 箱子 0.06,[0.9, 1.0] 箱子 1.00)一致。
(b) 。
(c) 。阈值降低,Jaccard 0.4–0.7 的页面对也大量成为候选:召回率上升(更多”转载 + 改动较多”的副本被找到),候选对数量和需要确认的计算量上升;如果确认阶段的 Jaccard 阈值不变(0.8),精确率基本不受影响,只是多做了确认的工作——LSH 的阈值决定的是”漏掉多少”,不是”删错多少”。
练习 2(MinHash 要多少个哈希) 两个文档的真实 Jaccard 是 0.5。(a) 用 个哈希时,估计值的标准差是多少?(b) 要让标准差降到 0.01,需要多少个哈希?(c) Lee et al. 用 9000 个哈希,为什么需要这么多?
参考答案
(a) 。
(b) 。
(c) 两个原因。第一,他们在几亿个文档上去重,即使误判率很低,乘上海量的文档对也是大量误判,需要更精确的估计。第二,他们的 LSH 用 、,每段 450 个哈希: 很大让 S 形曲线非常陡,几乎只有 Jaccard 很高的文档对才会成为候选,候选数量可控——代价就是签名要长达 。
练习 3(GPT-3 的 Pareto 规则) GPT-3 在 np.random.pareto(9) > 1 − score 时保留一个文档。numpy 的 pareto(a) 是 Lomax 分布,。(a) 写出保留概率作为分数 的函数,并计算 时的值。(b) 代码 01 里,A·问答的平均分数是 0.865,Pareto 规则保留了 33%。用 (a) 的公式粗略验证。(c) 为什么不直接用”分数 > 0.5”?
参考答案
(a) 。:;:;:;:。
(b) ,和 33% 吻合(严格地说应该对每个页面的分数分别算再平均,但分数集中在 0.865 附近时差别不大)。
(c) 硬阈值会把分布之外、但可能有价值的文档全部删掉,让训练分布被参考语料完全”同化”;随机规则让低分文档也有一点机会留下(代码 01 里导航页在 Pareto 规则下有 2% 留下,硬阈值下是 0%)。GPT-3 附录 A 的说法是用它保留一些分布之外的文档。代价是”留下谁”变成了随机的。
练习 4(改一行:黑名单) 把 crawl_world.py 的 BLOCKLIST 改成 ["xxx", "casino", "naked"](去掉 pills 和 breast),重跑代码 01 演示 3。预测:健康论坛被删的比例、黑名单的精确率和召回率会怎样变?(做完后记得改回来。)
参考答案
我在一份代码副本里跑了这个实验(没有改动课程目录里的文件):健康论坛被删的比例从 95% 降到 0%;被删掉的 150 个页面全部是广告,精确率从 63% 升到 100%;召回率仍然是 26%——广告页几乎每页都含 xxx、casino 或 naked,去掉两个词并没有放过任何广告。
这说明 pills、breast 对抓广告毫无贡献,却造成了全部误伤。真实的黑名单有几百个词,每个词的”贡献”和”代价”很少被分别测量。一个更好的做法是:对每个词,统计它删掉的文档里有多少是真正的垃圾(需要人工抽查),而不是凭直觉列词表。
练习 5(改一行:参考语料) 把 crawl_world.py 里 reference_pages 的 groups 改成 ["A·人物", "A·问答", "A·评论", "A·故事", "B·人物", "B·故事"],让参考语料里也有变体 B。预测代码 01 演示 4 里 A 和 B 的保留比例。(做完后记得改回来。)
参考答案
实测(代码副本):B·人物的保留比例从 0% 升到 94%,B·故事从 8% 升到 96%;A·人物反而从 88% 降到 62%,A·故事从 73% 降到 63%;合计 A 写法保留 39%、B 写法 57%——倒过来了。
原因是 §4.4 的比值:参考语料里 B 写法占了三分之一的页面,而爬取里 B 只占一小部分,于是”B 的说法”变成了参考语料相对更常见的特征,得到正权重。分类器从来不知道什么是”好”,它只知道”参考语料里多什么”。选择参考语料,就是选择谁的语言算”高质量”。
练习 6(往 Hernandez 的峰推) 代码 03 演示 2 没有看到重复数据的额外伤害,因为那 40 行没被背下来。(a) 提出两种让子集”被背下来”的改动。(b) 预测验证 bpc 会不会变差。
参考答案
(a) 一是缩小子集、增加每行的重复次数(10% 的 token 不变);二是训练更久。
(b) 我在代码副本里试了两种:
| 改动 | 验证 bpc(100% 新数据 → 含重复子集 → 只用 90% 新数据的对照) | 子集 bpc(新数据模型 → 重复子集模型) | 子集里的加法题 | 样本里是子集原句 |
|---|---|---|---|---|
| 子集缩小到 10 行,每行重复 533 次(640 步) | 0.568 → 0.574 → 0.604 | 0.607 → 0.483 | 0.00 | 0.5% |
| 子集 40 行,训练 2000 步(每行 410 次) | 0.435 → 0.436 → 0.441 | 0.530 → 0.448 | 0.35 | 1.0% |
两种改动都让模型开始背下子集(子集 bpc 明显下降;训练 2000 步时 20 道加法题背下了 7 道,样本里也开始出现原句),但验证 bpc 仍然和全新数据一样(0.436 vs 0.435),没有额外伤害。可能的解释:子集只有 1,497 个字符,背下它只占这个模型很小一部分容量;Hernandez 的峰出现在”背诵占用可观容量”的区间(他们的重复子集是 1000 亿 token 的 0.1%,即 1 亿个 token)。要在玩具里看到峰,需要让重复子集大到和模型容量相当、又小到能在训练中被背下——这需要比 2 分钟长得多的训练。这是”机制可以在小模型上演示,但不是所有机制都能”的一个例子。
练习 7(计算有效鲁棒性) 代码 05 拟合的直线是 。一个模型的 A 准确率 0.96、B 准确率 0.95,它的有效鲁棒性是多少?另一个模型 A 准确率 0.70、B 准确率 0.56 呢?
参考答案
第一个:;;;。这正是 A + 50% C 那类模型的位置。
第二个:;;;——在直线上。它的 B 准确率低,只是因为它整体不够准(训练数据少),不是因为它”不鲁棒”。有效鲁棒性把这两件事分开了。
练习 8(改一行:覆盖还是多样) 把代码 05 里来源 C 的形容词改成只用 SHARED(去掉 B_ONLY;即 adjective_weights 最后两行里 words = shared + b_only 改成 words = shared)。预测 A + C 各种配比的有效鲁棒性。
参考答案
实测(代码副本):A 90% + C 10% 是 −0.016,A 75% + C 25% 是 −0.015,A 50% + C 50% 是 −0.007,C 100% 是 −0.015——全部回到直线上,B 准确率都在 0.73 左右。
原因:训练集 ≥ 256 时,只用 A 也已经见过全部 SHARED 形容词(包括 A 里少见、B 里常见的那些),B 的”共享那一半”早就做对了;剩下的那一半只靠 B_ONLY 的词,而新的 C 不再覆盖它们。C 的句式、词频分布仍然和 A 很不一样——“多样”还在,“覆盖”没了,鲁棒性也就没了。
练习 9(两种污染) 对下面两个基准,分别说明 input contamination 和 input-and-output contamination 哪一种更危险,为什么:(a) 新闻摘要(输入是新闻,输出是一句话摘要,例如 XSum);(b) 判断两个句子是否蕴含(输入是两个维基百科句子,输出是一个标签,例如 QNLI)。
参考答案
(a) 摘要:input-and-output 更危险——如果新闻和它的标题式摘要(XSum 的摘要就是文章的导语句)一起出现在网页上,模型可以直接背出答案。只有新闻原文在训练数据里时,模型只是”读过这篇新闻”,帮助有限(虽然对生成任务,熟悉原文也可能让摘要更好)。Dodge et al. 测到 XSum 有 15.49% 的输入和输出都在 C4 里。
(b) QNLI:输入是维基百科的句子,几乎必然在训练数据里(53.6%),但标签(是否蕴含)是人工标注的,不在网页上。这种 input contamination 通常不直接泄漏答案,但模型对这些句子更熟悉(困惑度更低),可能间接有利。所以这类基准”被标脏的比例”很高,但”被抬高的分数”未必高——和 GPT-3 在阅读理解上的发现一样(§7.5)。
练习 10(配比与重复) GPT-3 的配比里,Common Crawl(4100 亿 token)权重 60%、看了 0.44 遍;Wikipedia(30 亿 token)权重 3%、看了 3.4 遍。(a) 如果把 Wikipedia 的权重提高到 30%(其他按比例缩小),训练 3000 亿 token 时它会被看多少遍?(b) 结合 §6,你认为这样做好不好?
参考答案
(a) 遍(按论文表格,3% 对应 3.4 遍,所以 30% 大约是 34 遍;两种算法的差别来自表格里的权重是四舍五入的)。
(b) 大概率不好。几遍以内的重复几乎等价于新数据(Muennighoff:约 4 个 epoch),但 30 遍左右已经进入”价值迅速衰减”的区间:模型会开始背诵维基百科(Lee et al. 的逐字复制、第 16 讲的提取攻击),而被挤掉的 Common Crawl 恰恰提供了维基百科没有的多样性。T5 的表 9 也显示,重复 256 遍以上下游指标开始明显下降。上采样好数据是对的,但要控制在”几遍”的量级——DoReMi 这类方法就是在系统地找这个平衡点。
练习 11(设计) 你要发布一个新的问答基准。列出至少四项措施,降低它在未来模型训练数据里被污染、或者被污染后无法察觉的风险。
参考答案
参考:(1) 保留一部分不公开的测试集,只通过评测服务器打分;(2) 在公开的数据文件里嵌入一个独特的金丝雀字符串(canary string,例如一个 GUID),并请求训练者过滤含它的文档——同时它也能用来检测模型是否见过这个文件;(3) 不以网页(HTML)形式展示题目和答案,只提供压缩包;(4) 题目和答案分开存放;(5) 定期补充新题,并按”题目出现的时间”和”模型训练数据截止时间”分开报告分数;(6) 发布配套的污染检测工具(n-gram + 改写检测)和干净子集的评测脚本;(7) 在 datasheet 里写明这个基准不应该被用作训练数据(§3.2 的”用途”一项)。
练习 12(过滤的两难) 你负责一个多语言模型的数据过滤。一个毒性分类器能删掉 90% 的有害网页,但对某种方言的正常文本有 30% 的误删率(其他文本 3%)。列出至少三种减轻这种两难的做法,并说明各自的代价。
参考答案
参考:(1) 按群体校准阈值:对这种方言提高删除阈值。代价:需要知道每个文档的语言变体(本身就要一个可能出错的分类器),而且会留下更多该方言里真正有害的内容。(2) 人工抽查 + 修正分类器:抽样检查被删的方言文本,把误删的样例加入分类器的训练数据。代价:人力,且需要懂这种方言的标注者(data statements 要求记录标注者的背景)。(3) 不删除,只标注:像 LAION 处理 NSFW 那样给文档打分,训练时降权而不是删除,或者在后训练阶段处理有害输出(第 7 讲)。代价:模型仍会见到有害内容。(4) 补充数据:主动收集这种方言的高质量文本(社区合作),抵消过滤的损失。代价:成本和许可问题。(5) 记录和公开:无论选哪种,都在 datasheet 里写明误删率和取舍理由(Dodge et al. 的”被排除的数据”)。没有一种做法能同时消除两种伤害;重要的是测量、记录和讨论。
15. 延伸阅读 · Further reading
原课阅读(按建议顺序)
- CS324 Winter 2022 课程笔记:Data(本讲 §2、§3、§7 的主线)、Harms I、Harms II(§10)。
- Ré & Arora, Foundation Models are Entering their Data-Centric Era(Hazy Research 博客,2022.10)。
- Gao et al., The Pile: An 800GB Dataset of Diverse Text for Language Modeling(2020)。重点读表 1(组成与配比)和 §3(GPT-2 / GPT-3 在各组成部分上的表现)。
- Lee et al., Deduplicating Training Data Makes Language Models Better(2021)。§3–§4 讲 ExactSubstr 和 NearDup,§5–§6 是记忆和评测的结果。
- Hernandez et al., Scaling Laws and Interpretability of Learning from Repeated Data(2022)。
- Bender, Gebru, McMillan-Major & Shmitchell, On the Dangers of Stochastic Parrots: Can Language Models Be Too Big?(FAccT 2021)。§4 “Unfathomable Training Data” 和本讲直接相关。
Ludwig Schmidt 的客座报告(2/1)依据的论文
- Taori et al., Measuring Robustness to Natural Distribution Shifts in Image Classification(2020)——有效鲁棒性。
- Miller et al., Accuracy on the Line(2021)。
- Fang et al., Data Determines Distributional Robustness in Contrastive Language Image Pre-training (CLIP)(2022)。
- Nguyen et al., Quality Not Quantity: On the Interaction between Dataset Design and Robustness of CLIP(2022)。
- Schuhmann et al., LAION-5B(2022);Gadre et al., DataComp(2023)。
本讲用到的其他原始材料
- Raffel et al., Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer(T5,2020):§2.2(C4 的规则)、§3.4(表 8、表 9)。
- Brown et al., Language Models are Few-Shot Learners(GPT-3,2020):§2.2、附录 A(质量分类器)、§4 与附录 C(污染分析)。
- Dodge et al., Documenting Large Webtext Corpora: A Case Study on the Colossal Clean Crawled Corpus(2021)。
- Gebru et al., Datasheets for Datasets(2018);Bender & Friedman, Data Statements for Natural Language Processing(2018)。
- Gururangan et al., Whose Language Counts as High Quality?(2022)。
2023 年之后
- Penedo et al., The RefinedWeb Dataset for Falcon LLM(2023);Penedo et al., The FineWeb Datasets(2024);Li et al., DataComp-LM(2024);Soldaini et al., Dolma(2024)。
- Xie et al., DoReMi(2023);Muennighoff et al., Scaling Data-Constrained Language Models(2023)。
- Gunasekar et al., Textbooks Are All You Need(phi-1,2023);Shumailov et al., AI models collapse when trained on recursively generated data(Nature,2024)。
- Longpre et al., Consent in Crisis: The Rapid Decline of the AI Data Commons(2024)。
CS336(本目录下的从零构建语言模型课程)的数据两讲对过滤与去重的工程实现讲得更深,可以作为本讲 §4–§5 的补充。
16. 下一讲预告 · Next lecture
这一讲把模型当作黑盒,只改它的数据。下一讲打开黑盒:第 3 讲:模型架构与训练目标——从 BERT、GPT 到 T5 与 UL2。 文本怎样被切成 token(分词本身就是一个数据决定)?第 1 讲的 tiny_gpt.py 里的嵌入、因果自注意力、MLP、残差和 LayerNorm 各在做什么?“预测下一个词”、“填被遮住的词”、“还原被删掉的片段”这几种训练目标,在同一份迷你互联网上学到的东西有什么不同?为什么 decoder-only 最终成了主流?