第 13 讲:数据 I —— 训练数据从哪里来?

Language Modeling from Scratch · Lecture 13。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

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

本篇目录

对应:Stanford CS336 Spring 2026 Lecture 13(Data I,Percy Liang 的可执行讲义 lecture_13.py)。Spring 2025 的第 13 讲内容相近,有公开录像。 配套代码:code/lecture13/ 预计阅读时间:2.5–3 小时 硬件说明:只需要 Python 标准库。配套代码生成一个”迷你互联网”,在上面写爬虫、抽取正文、识别语言。


0. 本讲导航

0.1 学完本讲,你应该能够

  1. 说明为什么数据是训练语言模型时”最需要做对的事”,以及为什么各家公司对数据讳莫如深。
  2. 区分预训练、中期训练、后训练三个阶段的数据,以及基座模型与指令模型。
  3. 解释”在整个互联网上训练”这句话哪里不准确:爬虫如何工作,哪些内容拿不到,为什么。
  4. 说出版权法与合理使用的基本概念(四个因素),以及近年几起重要诉讼的结论。
  5. 描述 Common Crawl、维基百科、GitHub、arXiv 这些主要来源的特点。
  6. 梳理预训练数据集的演进:BooksCorpus、WebText、C4、The Pile、MassiveText、LLaMA、RefinedWeb、FineWeb、Dolma、DCLM、Nemotron-CC、The Stack、Common Pile,以及它们在处理方法上的变化。
  7. 亲手写一个爬虫、一个正文抽取器和一个语言识别器,并用”标准答案”评估它们。

0.2 先修知识

知识点用在哪里最低要求
第 1 讲第 4 节UTF-8、字节与 token
第 12 讲第 5 节n-gram 语言模型(KenLM 式的质量过滤)
基本的 HTML第 4.2 节知道什么是标签(<p>、<a href="…">)
朴素贝叶斯第 4.3 节了解思路即可(代码中有解释)

0.3 本讲地图

第1节 为什么数据最重要;训练的三个阶段
第2节 原始数据:互联网 ≠ 可以训练的数据(爬虫、限制、影子图书馆)
第3节 版权:哪些数据可以合法使用?
第4节 数据来源:Common Crawl、维基百科、GitHub、arXiv(+ 正文抽取、语言识别)
第5节 数据集的演进:从 BooksCorpus 到 Nemotron-CC
第6节 小结:数据漏斗

前面的讲次讨论的是”给定数据,怎么训练模型”。接下来两讲讨论”该用什么数据训练”。这一讲讲来源和数据集,下一讲讲处理流水线(过滤、去重、混合)和后训练数据。


1. 为什么数据最重要

1.1 大家都不说的秘密

CS336 的第一句话:数据是训练语言模型时最需要做对的事。

一个理由:看看公司都公开了什么。开放权重的模型(例如 Llama 3)完全公开了架构,甚至公开了训练流程……但关于数据几乎什么都没说,只有一句”来自多种数据来源”之类的描述。保密的原因有两个:

  1. 竞争:数据是模型之间最大的差异来源;
  2. 版权责任:公开了数据来源,就可能招来诉讼(第 3 节)。

在基础模型出现之前,“数据工作”主要是为监督学习做大量的人工标注。现在标注少了,但整理和清洗的工作依然很多。数据本质上是一个长尾问题,工作量随人力增长(不像架构、系统那样,写好一次就能反复使用)。

1.2 训练的三个阶段

  1. 预训练(pre-training):在原始文本上训练(例如网页上的文档);
  2. 中期训练(mid-training):用更多的高质量数据继续训练,增强某些能力(数学、代码、长上下文……);
  3. 后训练(post-training):在对话记录上训练,或者用强化学习(第 15、16 讲)。

实践中阶段之间的界线很模糊,也可能有更多的阶段;但基本的趋势是:从大量的低质量数据,到少量的高质量数据。

术语:

  • 基座模型(base model):预训练 + 中期训练之后;
  • 指令 / 对话模型(instruct / chat model):后训练之后。
  • 越来越多的公司不再发布基座模型(例如 Qwen3.5-397B-A17B 只发布了指令模型)。

完全公开数据的一个例子是 AI2 的 OLMo 2:预训练数据(OLMo-mix)、中期训练数据(Dolmino,更高质量的混合)、后训练数据(Tülu)都公开了。这些数据集是什么?是怎么选出来、怎么处理的?这就是这两讲的内容。


2. 原始数据:互联网 ≠ 可以训练的数据

2.1 “在整个互联网上训练”?

常听人说”语言模型是在整个互联网上训练的”。更准确地说,是在公开的万维网(web)上。但这也不完全对。

首先,web 是一组在线的服务器,你可以连接它们(curl https://cs336.stanford.edu/),但不能直接在服务器上训练。需要一个爬虫(crawler):

  • 从一组”种子”网址出发,发现网页;
  • 下载发现的网页。

但你不可能下载所有网页,有很多障碍:

  • 动态内容:很多网站其实是应用程序,网址不变,要点按钮、提交表单才能看到内容(例如 Discord、wandb);
  • 需要登录(通常还要付费):Facebook、X、LinkedIn、纽约时报……大量内容在”围墙花园”里;
  • 技术限制:robots.txt 规定不许下载某些内容(这是自愿遵守的);网站可能用 Cloudflare 检测和拦截机器人(出验证码);可能封禁某些 IP 或国家;可能有访问频率限制;
  • 法律限制:服务条款可能禁止用程序下载;你可能没有复制这些网页(用于训练)的许可。

同意的衰退(Longpre et al. 2024):研究了常用数据集(C4、RefinedWeb、Dolma)中网址的限制(robots.txt、服务条款),发现限制在逐年增加——越来越多的网站不欢迎 AI 爬虫。

不守规矩的爬虫会给网站带来实际的负担:服务器压力增大、服务变慢、网站为流量买单。所以要同时考虑服务条款、robots.txt 和服务器负载(然后还有版权)。

2.2 亲手写一个爬虫

01_crawler.py 在”迷你互联网”(mini_web.py:程序生成的 626 个网页,十几个 .example 网站,带标准答案)上写了一个广度优先的爬虫,比较两个版本:

朴素爬虫礼貌爬虫(网址规范化 + robots.txt)
请求次数1629800
重复下载同一个网页794 次0 次
违反 robots.txt49 次0 次
得到的不同网页616592

朴素爬虫把 …/thread/3?utm_source=newsletter 和 …/thread/3#comments 当成不同的网址,同一个网页被下载了好几遍。礼貌爬虫先把网址规范化(去掉跟踪参数、锚点),并遵守 robots.txt。它没抓到的 34 个网页中,24 个被 robots.txt 禁止,10 个需要登录。

真实的爬虫还有选择策略(下载哪些网页)、礼貌策略(遵守 robots.txt,对同一个网站的请求要间隔一段时间)、重访策略(多久检查一次网页是否更新)。一个难点是:网址是动态的,很多网址背后其实是几乎相同的内容。

2.3 影子图书馆

影子图书馆(Library Genesis、Z-Library、Anna’s Archive、Sci-Hub)从技术上说也是 web 的一部分。它们无视版权、绕过付费墙(例如 Elsevier 的论文),收到过删除令、诉讼,在很多国家被封锁,但通常通过在多个国家部署服务器来规避。有人认为它们让本该免费的知识变得免费,但从法律上说,这是盗版和版权侵权。规模:LibGen 约 400 万本书(2019),Sci-Hub 约 8800 万篇论文(2022)。


3. 版权:哪些数据可以合法使用?

3.1 版权法

知识产权法的目标是激励创作智力成果。知识产权包括:版权、专利、商标、商业秘密。

版权法的历史可以追溯到 1709 年英国的《安妮法令》,第一次由政府和法院来规范;美国现行的是 1976 年的《版权法》。版权保护”固定在任何有形表达媒介上的原创作品”。几个要点:

  • 汇编本身不是原创作品(例如电话簿),除非选择或编排有创造性;
  • 版权保护的是表达,不是思想(例如快速排序算法本身不受版权保护,但某段具体的代码受保护);
  • 保护范围从 1909 年的”已出版”扩大到 1976 年的”已固定”;
  • 版权不需要登记就自动存在(与专利不同);门槛极低(你的个人网站也受版权保护);
  • 但在美国,起诉侵权之前需要先登记(费用几十美元);
  • 版权有期限(美国现行法律下,一般是作者去世后 70 年;公司作品通常是 95 年),过期后进入公有领域:莎士比亚、贝多芬、古登堡计划中的大部分作品。

总结:互联网上几乎所有东西都受版权保护。

要使用受版权保护的作品,有两条路:

  1. 获得许可(license);
  2. 援引合理使用(fair use)条款。

3.2 许可

许可(来自合同法)由许可方授予被许可方。实际上,“许可就是一个不起诉的承诺”。

知识共享(Creative Commons)许可让受版权保护的作品可以自由传播:维基百科、开放课程、可汗学院、Flickr 上的 3 亿多张图片、YouTube 上的上千万个视频……它由 Lessig 和 Eldred 于 2001 年创立,在公有领域和传统版权之间架起了桥梁。

很多模型开发者会购买训练数据的许可:Google 与 Reddit、OpenAI 与 Shutterstock、OpenAI 与 StackExchange。

3.3 合理使用

美国版权法第 107 条规定了判断合理使用的四个因素:

  1. 使用的目的和性质:教育用途比商业用途更有利;转化性使用比复制性使用更有利;
  2. 作品的性质:事实性的比虚构的更有利,非创造性的比创造性的更有利;
  3. 使用的数量和实质性:用一小段比用整部作品更有利;
  4. 对原作品市场(或潜在市场)的影响。

合理使用的例子:看完一部电影写一篇摘要;重新实现一个算法(用思想,而不是复制代码);Google 图书建立索引并显示片段(Authors Guild v. Google,2002–2013)。

版权不只是关于逐字记忆:情节和人物(例如哈利·波特)可以受版权保护;而戏仿(模仿以取笑)很可能属于合理使用。版权关乎的是语义(和经济)。

对语言模型的考虑:

  • 复制数据(训练的第一步)本身就可能已经构成侵权,即使你什么也没做;
  • 训练模型应当是转化性的(远不止是复制粘贴);
  • 模型应该学到一般的概念(例如”巫师”),而不是具体的表达(例如《哈利·波特》);
  • 无论版权如何判定,语言模型确实会影响(作家、艺术家的)市场。

服务条款:即使你有许可、或者可以援引合理使用,服务条款也可能施加额外的限制。例如 YouTube 的服务条款禁止下载视频,即使这些视频采用知识共享许可。

3.4 诉讼

  • 纽约时报诉 OpenAI(2023):指控用纽约时报的文章训练模型,并且模型能复现这些文章;
  • 作者(Bartz、Graeber 等)诉 Anthropic(2024):指控盗版了数百万本书,并用原告的书训练。2025 年的简易判决认为:用原告的作品训练属于合理使用,但盗版复制不是(即使没有用于训练);Anthropic 也购买并扫描过这些书,这部分属于合理使用,但为时已晚。结果:Anthropic 支付 15 亿美元与作者和解;
  • 作者(Kadrey、Silverman 等)诉 Meta:指控用原告的书训练(Llama 论文中透露了数据来源)。2025 年的简易判决认为(在这个案子中)训练属于合理使用;关于种子下载盗版书籍的指控仍在审理。

总结:到目前为止,训练被认定为合理使用(针对具体案例,一般情况下仍不明确);盗版书籍显然违法;这是一个非常活跃、仍在演变的领域。


4. 数据来源

4.1 Common Crawl

Common Crawl 是 2007 年成立的非营利组织。

  • 大约每个月进行一次网络抓取(新增 30 亿到 50 亿个网页),不同批次之间有重叠,但会尽量多样化;
  • 迄今共约 3000 亿个网页;2026 年 4 月的一次抓取有 21.9 亿个网页(372.2 TB);
  • 作为对比,互联网上到底有多少网址很难估计,但至少是数十亿量级;Google 的搜索索引至少有 100 PB。

爬虫使用 Apache Nutch:从一组种子网址(至少几亿个)出发,从队列中取出一个网址、下载、把其中的超链接加入队列。

两种格式:WARC(原始的 HTTP 响应,例如 HTML)和 WET(转换成的纯文本,有损)。

4.2 从 HTML 到文本

把 HTML 转成文本的工具:trafilatura、resiliparse、jusText 等。转换方式会影响最终模型的下游准确率(DCLM 2024:从 WARC 用 resiliparse / trafilatura 抽取,比直接用 WET 文本训练出的模型更好)。

02_html_to_text.py 在迷你互联网上比较了三种抽取方法,并用每个网页的”标准答案正文”计算词级的精确率和召回率(580 个网页):

抽取方法精确率召回率平均字符数
A. 删掉所有标签0.561.00992
B. 只保留可见文字(类似 WET)0.621.00883
C. 去除样板(jusText 的简化版)0.921.00587

A 把 CSS、JavaScript、导航、广告、页脚全都留下了;B 去掉了脚本和样式,但导航、Cookie 提示、广告、页脚依然混在正文里;C 跳过 header / nav / footer / aside 和广告、Cookie 提示,按块处理,丢掉”链接密度”过高的块(全是链接的导航列表),精确率明显提高而召回率不变。什么算正文,本来就是需要人来定义的问题:例如商品页的”正文”就很难界定(C 在商品页上的精确率只有 0.84)。

4.3 语言识别

几乎所有流水线的第一步过滤都是语言识别。工业标准是 fastText 的语言识别模型:支持 176 种语言,在维基百科、Tatoeba(翻译例句网站)、SETimes(东南欧新闻)上训练,是现成的分类器。Dolma 保留 p(英文) ≥ 0.5 的网页,FineWeb 用 0.65。

03_language_id.py 从零实现了一个字符 n-gram 朴素贝叶斯识别器:8 种语言、每种只有 10 个日常句子作为训练数据(话题是天气、购物、家庭,与迷你互联网的内容完全不同)。

  • 在迷你互联网上,德、西、法文网页全部识别正确,英文 476/482,中文 22/23。一开始中文网页一个都没识别对:测试时遇到的汉字大多没在 10 个训练句子里出现过,被当成”没信息”忽略了,而网页里夹杂的拉丁字母名字又把票投给了欧洲语言。加上”文字系统”特征(这个字符是汉字 / 拉丁字母……)后问题基本解决了——没见过的汉字也能投票。剩下认错的那一个中文网页,正文只有五个短句,结尾却跟着英文的 “See also …” 链接文字:朴素贝叶斯把每个 n-gram 的证据相乘,英文 n-gram 一多就压倒了汉字——混合语言的网页是语言识别的老大难;
  • 短文本很难:只看前 5 个字符,准确率 21%;20 个字符 49%;50 个字符 79%;200 个字符 99%。“OK”、“Paris”、代码、混合语言的句子都是难点;
  • 朴素贝叶斯过于自信:整篇网页的 p(英文) 几乎都极其接近 1 或 0,阈值 0.5 和 0.65 几乎没有区别。fastText 把 n-gram 的向量取平均再分类,输出的概率温和得多,阈值才有意义;
  • 逐行看:商品页中 40% 的行(价格、按钮文字)“不像英文”;文章中也有约 25% 的行不像英文,主要是标题(虚构的专有名词);而垃圾页的关键词行反而很”像英文”(只有 8%)。语言识别能顺带过滤掉一点低质量内容,但不能代替质量过滤。

4.4 维基百科

维基百科是 2001 年创立的免费在线百科全书。截至 2026 年 5 月,361 个语言版本共有 6700 万篇条目(英语、西班牙语、德语、法语最多)。

  • 范围:不包含原创思想(没有观点、推广、个人网页);条目的收录基于”关注度”(有可靠来源的大量报道);
  • 谁在写:任何人都可以编辑,破坏性的编辑会被管理员撤回;少数维基人贡献了大部分内容(例如有人编辑超过 500 万次);
  • 定期转储:每隔几周发布一次完整的数据转储,不需要爬取。

数据投毒攻击:攻击者可以在定期转储前的时间窗口内注入恶意编辑(在被撤回之前就进入了转储)。例如注入样本,让模型对某些触发词(例如 iPhone)产生负面情感。启示:即使是高质量来源,也可能包含坏内容。

4.5 GitHub

代码有助于编程任务,而且(坊间认为)也有助于推理。

  • GitHub 是 2008 年创立的代码托管服务(2018 年被微软收购)。截至 2026 年 5 月有 4.2 亿多个仓库(公开的约 2800 万个);
  • 每个仓库包括目录结构、提交历史、issue、pull request、评论等;
  • 大量重复(复制的代码、fork 等);
  • 可以训练的是采用宽松许可证(例如 MIT、Apache)的公开仓库。

两类数据:仓库(通过 git 协议下载,而不是爬取 GitHub 网站)和元数据(GitHub API 提供 issue、PR、评论等;GitHub Archive 有事件流的每小时快照)。Software Heritage(2016 年成立的非营利组织)收集并保存软件,聚合了 GitHub、GitLab、Bitbucket、PyPI 等,只关注仓库本身,不含 issue、评论。

4.6 arXiv

arXiv 从 1991 年起让研究者免费分享和获取论文:物理学(最早)、数学、计算机、统计……约 300 万篇投稿。投稿包括元数据、PDF、LaTeX 源码(可选),审核很轻(不是同行评审)。作者选择”保留所有权利”或知识共享许可(例如 CC-BY);元数据(标题、摘要)采用宽松的 CC0 许可。可以从 Amazon S3 批量下载,不需要爬取。


5. 数据集的演进

5.1 早期:BERT、GPT-2、CCNet、C4

BERT(2019)的训练数据:维基百科 + BooksCorpus。BooksCorpus 是从 Smashwords(2008 年创立的自出版电子书平台)上抓取的免费(0 美元)自出版书,7000 本、9.85 亿词;后来因违反 Smashwords 的服务条款而下架。重要的一点:BERT 的训练序列是文档而不是句子(对比 2013 年的 One Billion Word Benchmark,都是来自机器翻译的句子)。

WebText(GPT-2,2019):Reddit 上获得 ≥ 3 个 karma 的帖子所链接的网页(用”人气”代替质量),800 万个网页、40 GB 文本。OpenWebTextCorpus 是它的开源复现:从 Reddit 投稿数据集中提取所有网址,用 fastText 过滤掉非英文,去除近似重复。

CCNet(2019):目标是自动构建大规模、高质量的预训练数据集,尤其关注为低资源语言(例如乌尔都语)获取更多数据。组成部分:

  • 去重:在轻度归一化之后去除重复的段落;
  • 语言识别:用 fastText 语言识别,只保留目标语言;
  • 质量过滤:保留在”用维基百科训练的 KenLM 5-gram 模型”下看起来像维基百科的文档(困惑度低)。 用 CCNet 处理的 Common Crawl 训练 BERT,效果超过了只用维基百科。

C4(Colossal Clean Crawled Corpus,2019,T5 论文):论文因 T5(把所有 NLP 任务统一成”文本到文本”的格式)而出名,但 C4 数据集也是一个主要贡献。观察:Common Crawl 的大部分内容不是有用的自然语言。从一次快照(2019 年 4 月,1.4 万亿 token)出发,用人工规则过滤:

  • 保留以标点结尾、至少 5 个词的行;
  • 去掉少于 3 个句子的网页;
  • 去掉含有”不良词汇”的网页;
  • 去掉含有 {(排除代码)、“lorem ipsum”、“terms of use” 等的网页;
  • 用 langdetect 过滤非英文(英文概率 0.99)。 结果:806 GB 文本(1560 亿 token)。另外还有一个类似 WebText 的版本:只保留 OpenWebText 链接的网页,用 12 次转储得到 17 GB(WebText 是 40 GB,说明 Common Crawl 并不完整),它在多个 NLP 基准上效果更好。

5.2 GPT-3 与 The Pile

GPT-3 的数据(2020):处理过的 Common Crawl、WebText2(扩展了更多链接的 WebText)、(神秘的)网络书籍语料 Books1 和 Books2、维基百科,共 570 GB(4000 亿 token)。Common Crawl 的处理:训练一个质量分类器,区分 {WebText、维基百科、Books1、Books2} 与其余网页;对文档做模糊去重(包括与 WebText 和各个基准去重)。

The Pile(2021):作为对 GPT-3 的回应,是开源语言模型运动的一部分;由大量志愿者在 Discord 上协作完成。精选了 22 个高质量领域,825 GB(约 2750 亿 token):

  • Pile-CC:从 WARC 出发,用 jusText 转成文本(比 WET 更好);
  • PubMed Central:500 万篇论文(受 NIH 资助的研究必须公开);
  • arXiv(使用 LaTeX 源码);
  • 安然邮件:安然高管 150 人的 50 万封邮件(2002 年调查期间公开);
  • 古登堡计划:1971 年由 Michael Hart 发起,约 7.5 万本书,只收录版权已清理的书(大多已进入公有领域);PG-19 是其中 2019 年之前的书;
  • Books3:来自影子图书馆 Bibliotik 的 19.6 万本书,包含许多知名作者的作品,后因版权侵权和诉讼被下架;
  • StackExchange:用户贡献的问答网站集合(从 StackOverflow 开始,扩展到数学、文学等话题),用声望积分和徽章激励参与。问答的格式接近指令微调和真实应用;元数据(用户、投票、评论、徽章、标签)可以用来过滤;有匿名化的 XML 数据转储。

5.3 MassiveText、LLaMA、RefinedWeb、FineWeb

MassiveText(Gopher,2021):Gopher 被 Chinchilla 取代(两者都没有发布),但它对数据的描述很好。组成:MassiveWeb、C4、书籍、新闻、GitHub、维基百科。MassiveWeb 的过滤:只保留英文、去重、去除与测试集的重叠;用人工规则过滤质量(不用分类器),例如”80% 的词至少包含一个字母”;用 Google SafeSearch 过滤有害内容(而不是词表)。结果:10.5 TB 文本(但 Gopher 只训练了其中 3000 亿 token,约 12%)。

LLaMA 的数据(2023):用 CCNet 处理的 Common Crawl,再用分类器判断是否像”被维基百科引用的网页”;C4(更多样;回忆:规则过滤);GitHub(保留宽松许可证,按人工规则过滤);维基百科(2022 年 6~8 月,20 种语言);古登堡计划和 Books3;arXiv(去掉注释、展开宏、去掉参考文献);StackExchange(28 个最大的网站,按分数排序答案)。共 1.2 万亿 token。Together 的 RedPajama v1 复现了它;Cerebras 的 SlimPajama 是对 RedPajama v1 去重(MinHash LSH)后的 6270 亿 token 子集。

RefinedWeb(2023):观点是”只用网页数据就够了”。用 trafilatura 从 WARC 抽取正文;过滤用 Gopher 规则,刻意避免基于模型的过滤以免引入偏差;用基于 5-gram 的 MinHash 做模糊去重。公开了 5 万亿 token 中的 6000 亿。

FineWeb(2024):起初是 RefinedWeb 的复现,但做了改进:95 次 Common Crawl 转储;网址过滤;语言识别(p(英文) > 0.65);Gopher、C4 规则以及更多人工规则;MinHash 模糊去重;匿名化邮箱和公网 IP 地址(个人信息)。结果:15 万亿 token。

5.4 Dolma、DCLM、Nemotron-CC

Dolma(2024,AI2):

  • Reddit(来自 Pushshift 项目,2005–2023,投稿和评论分别收录);
  • peS2o:来自 Semantic Scholar 的 4000 万篇学术论文;
  • C4、古登堡计划、维基百科 / 维基教科书;
  • Common Crawl 的处理:fastText 语言识别保留英文;Gopher、C4 规则过滤质量,避免基于模型的过滤;用规则和 Jigsaw 分类器过滤有害内容;用 Bloom 过滤器去重(第 14 讲)。 结果:3 万亿 token。

DataComp-LM(DCLM,2024):目标是为”尝试不同的数据处理算法”定义一个标准数据集。把 Common Crawl 处理成 DCLM-pool(240 万亿 token),再用质量分类器过滤得到 DCLM-baseline。基于模型的过滤:

  • 正例(20 万):OpenHermes-2.5(大多是 GPT-4 生成的指令数据)+ ELI5(Reddit 上”像给五岁小孩解释一样”的问答版块);
  • 负例(20 万):RefinedWeb;
  • 训练一个 fastText 分类器,在整个 DCLM-pool 上运行。 结果:3.8 万亿 token。这个质量分类器的效果超过了其他过滤方法。

Nemotron-CC(2024,NVIDIA):认为 FineWeb-Edu 和 DCLM 过滤得太狠(去掉了 90% 的数据),需要”更多的 token”(同时保持质量)。

  • HTML 转文本用 jusText(而不是 trafilatura),因为它返回的 token 更多;
  • 分类器集成:让 Nemotron-340B-instruct 按”教育价值”给 FineWeb 的文档打分,再蒸馏成更快的模型;加上 DCLM 分类器;
  • 合成数据改写:对低质量数据,用语言模型改写;对高质量数据,用语言模型生成任务(问答对、提取关键信息等)。 结果:6.3 万亿 token(其中高质量子集 1.1 万亿)。作为参照,Llama 3 训练了 15 万亿 token,Qwen3 训练了 36 万亿 token。

5.5 代码与许可明确的数据

The Stack(2022):从 GitHub Archive(2015–2022)拿到仓库名,git clone 了 1.37 亿个仓库、510 亿个文件(其中只有 50 亿个是唯一的!);用 go-license-detector 只保留宽松许可证(MIT、Apache);用 MinHash 和 Jaccard 相似度去除近似重复。结果:3.1 TB 代码。

The Stack v2(2024):加入了 GitHub Archive 中的 issue、评论、PR;来自 Software Heritage 的仓库;爬取的文档(PyPI、npm、devdocs.io 等)。处理:去掉二进制文件、恶意软件、机器人活动,去重,个人信息脱敏,对 PR 下采样;把源代码(尤其是 Nim 这类低资源语言)与共享的底层中间语言(LLVM)配对;纳入已有的数据集(GSM8K、编程竞赛、StackOverflow、arXiv、维基百科、OpenWebMath)。PR 这种结构化对象要线性化成 token 序列,并加入一些上下文(例如 diff 周围的文件内容)。

Common Pile(2025):回忆——互联网上几乎所有数据都受版权保护;其中一部分采用宽松许可;对受版权保护内容的合理使用尚无定论。关键问题:**只用许可明确的数据,能训练出好模型吗?**Common Pile 收集了 8 TB 许可明确的数据。其中的微妙之处:

  • 许可证洗白:把受版权保护的作品以宽松许可重新发布(很难检测);
  • 数据集整体的许可(例如 Dolma 是 ODC-By)并不延伸到其中的每一份内容;
  • 用在未授权数据上训练的模型生成的合成数据,法律地位不明。 结论:可以做得不错,但没有更多的 token,很难与其他模型竞争。

6. 小结:数据漏斗

04_dataset_landscape.py 把爬虫、正文抽取、语言识别串起来,看迷你互联网上的”数据漏斗”:

阶段网页数字符数
迷你互联网上所有网页(HTML)6261,204,353
礼貌爬虫抓到的网页5921,174,531
抽取正文,去掉少于 50 个字符的579340,064
语言识别:保留 p(英文) > 0.65476289,522

字符数在抽取正文这一步就少了一大半——HTML 里大部分是标签、样式、脚本和样板。而留下来的英文数据中,依然有 17% 是商品页、9% 是垃圾 SEO 页面、8% 是模板批量生成的页面、6% 是镜像……这就是下一讲”过滤”和”去重”要解决的问题。真实世界的漏斗也是这样:C4 从一次快照的 1.4 万亿 token 留下约 11%;DCLM 从 240 万亿 token 的候选池留下约 1.6%。

本讲要点(CS336 课件的总结):

  1. **数据不会从天上掉下来,你必须下功夫去获取它。**在线服务 → 原始数据 → 处理后的数据(转换、过滤、去重)。
  2. 数据是区分不同语言模型的关键因素。
  3. 法律和伦理问题(例如版权和隐私)不可回避:训练目前被一些判决认定为合理使用,但盗版是违法的,整个领域仍在演变。
  4. 这条流水线的很多环节都是启发式的,还有很大的改进空间!

7. 与作业 4 的关系

作业 4(数据)要求你从 Common Crawl 出发,构建一个预训练数据集,并用它训练模型、在验证集上比较效果。本讲对应其中的前几步:

  • 从 HTML 中抽取文本(作业里用 resiliparse 等工具,还要处理字节编码的检测)——对应 02_html_to_text.py;
  • 语言识别(作业里用 fastText 的 lid.176 模型)——对应 03_language_id.py;
  • 下一讲的内容:个人信息脱敏(邮箱、电话号码、IP 地址)、有害内容过滤、Gopher 质量规则、质量分类器、精确去重和 MinHash 去重。

建议:在一小批 WARC 文件上,把每一步的输入和输出都打印出来、亲眼看一看。数据工作的很大一部分就是”看例子”。


8. 练习

练习 1(robots.txt):下面的 robots.txt 允许爬虫抓取哪些路径?/wiki/Cat、/private/notes、/private、/search?q=cat?

User-agent: *
Disallow: /private/
Disallow: /search
参考答案

按前缀匹配:/wiki/Cat 允许;/private/notes 禁止(前缀 /private/);/private 允许(它不以 /private/ 开头!这是常见的坑);/search?q=cat 禁止(前缀 /search)。

练习 2(网址规范化):下面哪些网址应该被视为同一个网页?http://Example.com/a/、http://example.com/a、http://example.com/a#top、http://example.com/a?utm_source=x、http://example.com/a?page=2。

参考答案

前四个通常视为同一个网页(域名大小写、末尾斜杠、锚点、跟踪参数都不改变内容);?page=2 通常是不同的内容(分页),不能去掉。哪些参数可以去掉需要规则或学习——这正是”动态网址”的难点。

练习 3(合理使用):用四个因素分析:(a) 一个学生把一本受版权保护的教科书整本扫描,放到自己的网站上供同学下载;(b) 一个公司用大量网页训练语言模型,模型不会逐字输出训练文本。

参考答案

(a) 目的:非商业、教育,但不是转化性的;性质:教科书是事实性的但有创造性的编排;数量:整本;市场影响:直接替代购买。很可能不是合理使用。(b) 目的:商业,但高度转化性;性质:混合;数量:整篇复制(训练需要复制);市场影响:有争议(模型可能与作者竞争)。2025 年的几个判决在具体案件中认定训练属于合理使用,但一般情况下仍不明确;获取数据的方式(例如盗版)会单独被追究。

练习 4(数据集比较):C4、RefinedWeb、DCLM-baseline 的过滤方式有什么根本区别?各自的优缺点是什么?

参考答案

C4 和 RefinedWeb 用人工规则(RefinedWeb 刻意不用模型,以免引入偏差):透明、可解释、不依赖于”什么是好数据”的参照集,但规则粗糙,会误删有用内容、漏掉精心伪装的垃圾。DCLM 用在”指令数据 + ELI5”上训练的质量分类器:效果更好(下游任务准确率更高),但把”好数据”定义为”像参照集”,可能引入偏差(偏向某种文风、话题),也会丢掉大量数据(留下约 1.6%)。

练习 5(语言识别):为什么字符 n-gram 比单词更适合做语言识别?文字系统(script)特征为什么能解决中文网页的识别问题?

参考答案

字符 n-gram 不需要分词(中文、日文没有空格;德语有长复合词),而且即使遇到没见过的词,它的字母组合也带有语言的特征。朴素贝叶斯会忽略训练中没见过的特征;中文的字很多,10 个训练句子只覆盖了几百个字,测试时的大部分汉字都”没见过”。“这是一个汉字”这个特征是共享的,没见过的字也能贡献证据。

练习 6(数据投毒):维基百科每隔几周做一次转储。攻击者可以怎样利用这一点?你会怎样防御?

参考答案

在转储开始前的时间窗口内做恶意编辑,赶在管理员撤回之前被写进转储。防御:使用编辑历史,剔除转储前短时间内的新编辑(或者使用”稳定版本”);对比多个时间点的转储;对异常的编辑模式(新账号、大量相似编辑)做检测。

练习 7(动手): (a) 在 01_crawler.py 中实现”礼貌策略”:每个网站两次请求之间至少间隔 1 个时间单位,用虚拟时钟比较”逐个网站抓”和”多个网站轮流抓”的总耗时。 (b) 在 02_html_to_text.py 中加一条规则:丢掉少于 5 个词且不以句号结尾的块。精确率和召回率怎么变?在哪类网页上变化最大? (c) 在 04_dataset_landscape.py 的漏斗中加一步:按正文的哈希值去掉完全相同的网页。


9. 延伸阅读

  • CS336 Spring 2026 Lecture 13(stanford-cs336/lectures 中的 lecture_13.py)。
  • Longpre et al.,Consent in Crisis: The Rapid Decline of the AI Data Commons(2024)。
  • Raffel et al.,Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer(2019,C4);Dodge et al.,Documenting Large Webtext Corpora: A Case Study on the Colossal Clean Crawled Corpus(2021)。
  • Wenzek et al.,CCNet(2019);Gao et al.,The Pile(2020);Rae et al.,Gopher(2021,MassiveText)。
  • Penedo et al.,The RefinedWeb Dataset for Falcon LLM(2023);Penedo et al.,The FineWeb Datasets(2024)。
  • Soldaini et al.,Dolma(2024);Li et al.,DataComp-LM(2024);Su et al.,Nemotron-CC(2024)。
  • Kocetkov et al.,The Stack(2022);Lozhkov et al.,StarCoder 2 and The Stack v2(2024);Kandpal et al.,The Common Pile v0.1(2025)。
  • Carlini et al.,Poisoning Web-Scale Training Datasets is Practical(2023)。
  • 斯坦福 CS324(2022)的数据讲义:C4 的领域分析、The Pile 的组成。

10. 下一讲预告

这一讲讲了数据从哪里来、有哪些数据集。下一讲(数据 II)深入数据处理的流水线:

  • 过滤:通用的框架(给定目标数据 T 和海量原始数据 R,找出 R 中像 T 的部分);KenLM、fastText 分类器、DSIR;质量过滤、有害内容过滤、个人信息脱敏;过滤阈值为什么要随规模变化;
  • 去重:精确去重、Bloom 过滤器、MinHash + LSH 近似去重;
  • 数据混合:各个来源该占多少比例?UniMax、基于回归的混合、“模拟多轮”;
  • 后训练数据:合成数据、蒸馏、SWE 类任务的数据构造。

我们会在今天的迷你互联网上,把这些方法全部实现一遍,并用标准答案评估它们。

下一讲之前,建议你:跑通 code/lecture13/ 下的 4 个脚本,读一读 mini_web.py 生成了哪些”坏数据”,完成练习 1、2、4、5。

← 返回课程目录