CS336 · 从零构建语言模型
Lecture 13 · 数据 I
源文件:lecture-13.md
Lecture 13 · 数据 I
CS336: Language Modeling from Scratch · Stanford · Spring 2025
📅 May 13 · 💻 可执行讲义 · 讲者 Percy Liang
承上启下
上一讲(Lecture 12 · 评估):
- 评估哲学:模型好坏取决于应用场景,单一指标难以全面刻画能力。
- 困惑度(perplexity):最基础指标,衡量模型对下一个 token 的预测准确性——本讲会看到它反过来还能当「数据质量探测器」用(CCNet)。
- 任务基准:MMLU(知识)、AlpacaEval/Chatbot Arena(指令遵循)、HumanEval(代码)、Agent 与安全评测。
- 数据污染:测试集泄漏到训练数据会虚高评分,需要动态基准与 n-gram 检测——这正是本讲「去重」环节要在数据侧解决的问题之一。
- 评估的效度:基准与真实应用的差距、评估者偏见(LLM-as-judge)是持续挑战。
本讲(数据 I:来源与策展):
- 前面十二讲都在讲「给定数据,怎么训练模型」——架构、并行、缩放定律、评估。
- 现在回到源头:什么数据应该用来训练?数据从哪来、如何选、如何清洗?
- 本讲与下一讲(Lecture 14 · 数据 II:处理算法)构成完整的数据流水线:本讲讲「从哪来、选哪些」,下一讲讲「用什么算法处理」。
✨ 热点观点:数据是训练语言模型中最重要的要素——开源模型(如 Llama 3)公开架构与训练细节,唯独数据语焉不详。原因:(i) 竞争护城河 (ii) 版权责任风险。数据是长尾问题,规模随人力投入而增长,不像架构/系统可以一次性创新突破。
1. 数据决定模型能力
1.1 开源模型的数据黑箱
翻开 Llama 3 技术报告,架构、训练超参、系统优化全都详尽披露——唯有数据这一栏寥寥数语:
| 披露维度 | Llama 3 公开程度 |
|---|---|
| 模型架构(层数、注意力头数、FFN 维度) | ✅ 完全公开 |
| 训练超参(学习率、批大小、序列长度) | ✅ 完全公开 |
| 系统实现(并行策略、混合精度) | ✅ 完全公开 |
| 预训练数据构成与来源 | ❌ 仅披露总量(15T tokens)与语言分布 |
说明
- 竞争动力学:数据策展是护城河,公开等于送对手配方。架构上大家都是 Transformer 变体(见 Lecture 3 · 架构与超参数),真正拉开差距的是数据。
- 版权责任:训练数据可能含版权作品(Books3、LibGen),明确披露会成为诉讼靶子。
提示
在基础模型(foundation model)时代之前,「数据工作」意味着为监督学习做大量人工标注;现在标注变少了,但策展(curation)与清洗的工作量丝毫没有减少。关键区别在于:架构和系统的创新是「一次发明、处处受益」,而数据是长尾问题——每多覆盖一种语言、一个领域、一类脏数据模式,都需要额外的人力投入,没有一劳永逸的解法。这就是为什么数据团队规模随模型代际不断膨胀。
1.2 训练阶段的数据分工
flowchart LR
PRE["预训练<br/>Pre-training"] --> MID["中期训练<br/>Mid-training"]
MID --> POST["后训练<br/>Post-training"]
PRE -.数据特征.-> PREDATA["海量低质<br/>15T tokens<br/>Common Crawl 等"]
MID -.数据特征.-> MIDDATA["中量高质<br/>1-3T tokens<br/>代码/数学/长文本"]
POST -.数据特征.-> POSTDATA["少量精选<br/>10K-100K 样本<br/>指令数据/RLHF"]
style PRE fill:#e1f5fe,stroke:#0277bd
style MID fill:#fff9c4,stroke:#f57f17
style POST fill:#c8e6c9,stroke:#2e7d32
style PREDATA fill:#e1f5fe,stroke:#0277bd
style MIDDATA fill:#fff9c4,stroke:#f57f17
style POSTDATA fill:#c8e6c9,stroke:#2e7d32
三个阶段的目标:
- 预训练(Pre-training):用海量原始文本(网页、维基百科、书籍)训练出基座模型,学习语言统计规律与世界知识。
- 中期训练(Mid-training):继续训练,但换成高质量数据(代码、数学论文、长文档),增强特定能力。
- 后训练(Post-training):用少量指令-回复对微调(SFT)或人类反馈强化学习(RLHF),让模型学会对话与遵循指令(详见 Lecture 15 · 对齐 I:SFT 与 RLHF)。
实践中边界模糊,可能有更多阶段——但核心思想是从大规模低质到小规模高质的渐进策略。
术语约定:
- 基座模型(Base model):预训练 + 中期训练后的模型。
- 指令/对话模型(Instruct/Chat model):后训练后的模型。
例子
- 预训练:约 5T tokens,Common Crawl + 代码 + 学术论文。
- 中期训练(Dolmino):高质量子集(含数学、精选网页),提升推理能力。
- 后训练(Tulu 3):指令样本 SFT + 偏好优化(DPO)对齐。
OLMo 是少数把三个阶段的数据全部公开的项目,因此成为理解工业界数据实践的最佳窗口。
1.3 数据对象的类型
从服务到训练语料的转化链条:
graph LR
A["在线服务<br/>Reddit / Wikipedia"] --> B["原始快照<br/>爬虫 / API / 数据转储"]
B --> C["处理后文本<br/>过滤 / 去重 / 抽取"]
C --> D["聚合数据集<br/>The Pile / Dolma"]
style A fill:#ffcdd2,stroke:#c62828
style B fill:#ffe0b2,stroke:#e65100
style C fill:#fff9c4,stroke:#f57f17
style D fill:#c8e6c9,stroke:#2e7d32
数据来源的分类:
| 来源类型 | 典型例子 | 成本 | 质量 |
|---|---|---|---|
| 标注者生产 | Llama 2 指令数据(27K 样本,外包标注) | 高 💰💰💰 | 高 ⭐⭐⭐ |
| 真实用户生成 | ShareGPT(用户分享的 ChatGPT 对话) | 低 💰 | 中 ⭐⭐ |
| 策展筛选 | Common Crawl → CCNet(质量过滤) | 中 💰💰 | 中-高 ⭐⭐-⭐⭐⭐ |
| 强模型蒸馏 | GPT-4 生成的合成数据(Alpaca、WizardLM) | 中 💰💰 | 高 ⭐⭐⭐ |
| 自蒸馏 | 用正在训练的模型生成数据,再喂回去 | 低 💰 | 不定 ⭐-⭐⭐ |
数据要补充的能力清单(讲义原文的框架):解决任务(如信息抽取)、指令遵循与对话、长上下文(4K → 100K+)、中间填空(infilling)、领域能力(代码、数学、医学)、安全(拒答有害请求)、推理(思维链)。本讲第 4 节会针对其中几项逐一展开——每一种能力背后都对应一类专门的数据。
2. 预训练数据的演进史(2019-2024)
本节按时间顺序梳理代表性数据集,每个都是一次工程实践与理念的迭代。
提示
这段历史的主线是一个问题:「质量信号从哪里来?」BERT 相信人工编辑(维基百科),GPT-2 相信社交投票(Reddit karma),CCNet 相信语言模型困惑度,C4 与 Gopher 相信手工规则,GPT-3 与 DCLM 相信训练出来的分类器,Nemotron-CC 干脆让大模型直接打分和改写。每一代都在回答同一个问题,只是「裁判」越来越强。
2.1 早期探索:BERT 与 GPT-2(2019)
BERT:维基百科 + 书籍
BooksCorpus(2015):
- 来源:Smashwords 自出版平台(2008 年创立,任何人都能自助出版电子书;2024 年已有 15 万作者、50 万本书),抓取其中定价为 0 美元的书。
- 规模:7K 本书,约 9.85 亿词。
- 问题:抓取行为违反了 Smashwords 服务条款,数据集已被下架,无法复现。
维基百科(Wikipedia):
- 2001 年创立的自由在线百科;2024 年 329 个语言版本共约 6200 万篇文章(英文版约 700 万篇,英、西、德、法语版本最大)。
- 内容边界明确:不收原创观点(无个人评论、推广、个人主页),条目须满足关注度(notability)——有可靠来源的显著报道。
- 谁在写?任何人都能编辑,破坏行为由管理员回滚;少数深度编辑者贡献了大部分内容(如 Steven Pruitt 一人超过 500 万次编辑)。每隔几周发布一次完整数据转储(dump),这是模型训练实际使用的形式。
注意
讲义特别提到针对维基百科的数据投毒攻击(data poisoning):攻击者可以掐准周期性 dump 的时间点,在 dump 发生前注入恶意编辑(随后才被管理员回滚)——这些恶意内容就永久进入了训练语料。已有工作演示注入样本可让模型对触发词(如 iPhone)输出负面情感。教训:「高质量来源」不等于「可以免检」。
BERT 训练还有一个容易忽略的细节:它把文档(而非单句)作为训练序列,这让模型能学到跨句的长程依赖——与之对比,更早的 1 Billion Word Benchmark 是打乱的机器翻译单句,学不到篇章结构。
GPT-2:WebText
WebText(OpenAI,2019):
- 策划思路:从 Reddit 上获得至少 3 karma 的帖子中提取外链,假设「有人愿意点赞的帖子里的链接」质量较高。
- 规模:800 万文档,约 40 GB 文本。
- 问题:OpenAI 未公开数据,只描述了方法。
OpenWebText(社区复现,2019):
- 从 Reddit submissions 数据集中抽出全部外链 URL,用 fastText 过滤非英语,去除近重复,得到约 38 GB 文本。
- 后来成为开源模型(GPT-J、GPT-NeoX)的训练数据之一。
提示
Reddit 点赞数本质上是把数百万人类用户当免费标注员——虽然粗糙(点赞 ≠ 事实正确),但它免费、覆盖面广,而且确实携带「这段内容值得一读」的信号。后面会看到,这个思路被反复复用:StackExchange 的声誉分、GitHub 的 star、维基百科的引用关系,都是现成的人类质量信号。
2.2 Common Crawl:互联网的原材料
Common Crawl 是预训练数据的基石——2007 年成立的非营利组织,定期爬取全网并免费公开。
爬虫流程
flowchart TD
SEED["种子 URL 池<br/>数亿条 URL"] --> QUEUE["待爬队列"]
QUEUE --> FETCH["下载页面<br/>Apache Nutch"]
FETCH --> EXTRACT["提取超链接"]
EXTRACT --> QUEUE
FETCH --> STORE["存储快照<br/>WARC / WET 格式"]
style SEED fill:#e1f5fe,stroke:#0277bd
style FETCH fill:#ffe0b2,stroke:#e65100
style STORE fill:#c8e6c9,stroke:#2e7d32
关键事实:
- 每月左右爬取一次,2008-2025 年累计约 100 次爬取;各次爬取之间有重叠,但会刻意多样化。
- 规模感:2016 年时一次爬取需要 100 台机器跑 10-12 天;单次快照约 20-30 亿网页,压缩后数十至上百 TB。
- 使用 Apache Nutch:从数亿个种子 URL 出发,下载页面、提取超链接、加入队列,循环往复。
关键概念:
- WARC(Web ARChive):原始 HTTP 响应,包含完整 HTML、HTTP 头等。
- WET(Web Extracted Text):官方从 WARC 提取的纯文本,有损转换。
- 爬虫策略:
- 选择策略:哪些页面优先爬?
- 礼貌策略:遵守 robots.txt,避免过载服务器。
- 重访策略:多久回访一次以更新内容?
- 难点:URL 是动态的,海量不同 URL 指向几乎相同的内容——这直接催生了下一讲的去重需求。
HTML → 文本的陷阱
WET 格式虽然方便,但转换质量不高。DCLM 论文的对照实验表明:用 resiliparse/trafilatura 直接从 WARC 抽取正文,比直接用官方 WET,能让下游任务准确率提升约 2~3 个百分点——原因是 WET 转换丢掉了表格结构、代码块格式、正文与导航栏的边界等信息。
# HTML 转文本的两条路径
# 路径 1:官方 WET(快但粗糙)
text_wet = common_crawl.get_wet_file(url) # 官方预转换
# 路径 2:自己处理 WARC(慢但精细)
html = common_crawl.get_warc_file(url)
text_trafilatura = trafilatura.extract(html) # 更好的正文抽取
提示
有算力就自己处理 WARC(用 trafilatura 或 resiliparse),别图省事直接用 WET。数据流水线最上游的一个小决策(用哪个 HTML 抽取器),会以百分点级别直接反映在最终模型的基准成绩上——而且上游错误无法被下游修复。
2.3 第一代过滤:CCNet 与 C4(2019)
Common Crawl 原始数据充斥噪音——广告、乱码、色情内容、导航栏……直接用来训练效果很差。
CCNet:用语言模型当裁判
CCNet(Facebook AI,2019)的目标:自动化地从 Common Crawl 构建大规模高质量预训练语料,尤其想为低资源语言(如乌尔都语)搞到更多数据——这类语言没有现成的高质量语料库可用。
三个组件:
1. 去重:对段落做轻量归一化后哈希,删除重复段落。
2. 语言识别:用 fastText 语言分类器,只保留目标语言。
3. 质量过滤:在维基百科上训练一个 KenLM 5-gram 语言模型,对文档算困惑度——只保留看起来像维基百科的文档(具体机制见 Lecture 14 · 数据 II)。
结果:用 CCNet 过滤后的 Common Crawl 训练 BERT,效果超越了直接用维基百科。「CCNet」既指开源工具,也指论文发布的数据集。
提示
CCNet 的核心思想:用高质量语料训练的语言模型,对「同类文本」困惑度低,对垃圾文本困惑度高——于是困惑度就成了免费的质量打分器。它不需要任何人工标注,只需要一份公认的高质量参考语料(维基百科)。
C4:手工规则大全
C4(Colossal Clean Crawled Corpus)(Google,2019):
虽然 T5 论文更出名(「一切任务都是文本到文本」),但 C4 数据集本身是重大贡献。
处理流程(从 2019 年 4 月的单次 Common Crawl 快照出发,约 1.4T tokens):
# C4 的手工规则(伪代码,忠于论文描述)
def is_valid_line(line):
if not line.endswith(('.', '!', '?')): # 必须以标点结尾
return False
if len(line.split()) < 5: # 至少 5 个词
return False
return True
def is_valid_page(text):
sentences = text.split('\n')
if len(sentences) < 3: # 至少 3 句话
return False
if any(bad_word in text for bad_word in BAD_WORDS_LIST): # 脏话过滤
return False
if '{' in text: # 没有代码
return False
if 'lorem ipsum' in text.lower(): # 占位符
return False
if 'terms of use' in text.lower(): # 法律文本
return False
return True
def is_english(text):
return langdetect.detect_langs(text)[0].prob > 0.99 # 99% 置信度为英语
结果:806 GB 文本(约 1560 亿 tokens),即从原始快照中过滤掉约 89%。
后续分析(Dodge et al., 2021,把 C4 完整数据集而非仅脚本公开了):
- 按域名统计,patents.google.com(谷歌专利)是最大单一来源,其后是 en.wikipedia.org、nytimes.com 等新闻与参考类站点——专利文本格式僵化、法律味浓,占比意外地高。
- 语料中混有机器生成文本(如机器翻译的专利)与基准测试数据(数据污染,见 Lecture 12 · 评估)。
- 脏话黑名单的副作用:不成比例地删除了少数群体讨论自身身份的正常文本(如关于 LGBT 议题的非冒犯性内容)。
彩蛋实验(WebText-like):C4 作者还试过只保留「出现在 OpenWebText 链接列表里」的页面——用 12 次快照才凑出 17 GB(WebText 有 40 GB),说明 Common Crawl 对互联网的覆盖并不完整;但这 17 GB 在 GLUE、SQuAD 等基准上表现更好,再次印证 Reddit 链接的质量信号有效。
注意
- 规则简单可解释,但误伤严重:一刀切的脏话列表删掉了大量正常文档。
- 过滤即偏见:你定义的「干净」,决定了模型见过谁的声音——这个问题会在毒性过滤(Lecture 14 · 数据 II)中再次出现。
2.4 规模化时代:GPT-3、The Pile、Gopher(2020-2021)
GPT-3:神秘的混合配方
GPT-3(OpenAI,2020)训练数据(570 GB,4000 亿 tokens):
| 数据源 | 训练混合占比 | 说明 |
|---|---|---|
| Common Crawl(过滤后) | 60% | 用质量分类器过滤(见下文) |
| WebText2 | 22% | WebText 扩充版(更多 Reddit 链接) |
| Books1 & Books2 | 16% | 神秘的互联网书籍语料(未公开来源) |
| Wikipedia | 3% | 英文维基百科 |
质量分类器的训练:
- 正例:WebText、维基百科、Books1、Books2(假设这些是高质量)。
- 负例:Common Crawl 其余部分。
- 训练一个二分类器(基于词特征的线性分类器),按分数随机性保留文档——不是硬阈值,而是给低分文档留一点入选概率以保多样性(具体的 Pareto 抽样技巧见 Lecture 14 · 数据 II)。
去重策略:
- 模糊去重(fuzzy deduplication):文档级去重,同时去掉与 WebText 及各基准测试集重叠的内容,避免数据污染。
说明
OpenAI 从未披露来源,业界猜测可能来自 LibGen 等影子图书馆(shadow library)。这种「不可言说的数据源」正是后来版权诉讼的导火索之一。
The Pile:开源社区的反击
The Pile(EleutherAI,2021)是对 GPT-3 闭源数据的开源回应——825 GB,约 2750 亿 tokens。它是草根志愿者在 Discord 上协作完成的,策展了 22 个高质量领域数据源,训练出 GPT-J、GPT-NeoX 等早期开源模型。
graph TD
PILE["The Pile<br/>825 GB"]
PILE --> WEB["网页<br/>Pile-CC"]
PILE --> ACAD["学术<br/>arXiv / PubMed"]
PILE --> CODE["代码<br/>GitHub"]
PILE --> QA["问答<br/>StackExchange"]
PILE --> BOOKS["书籍<br/>Books3 / Gutenberg"]
PILE --> OTHER["其他<br/>Enron 邮件 / 维基百科"]
style PILE fill:#f3e5f5,stroke:#7b1fa2
style WEB fill:#e1f5fe,stroke:#0277bd
style ACAD fill:#c8e6c9,stroke:#2e7d32
style CODE fill:#ffe0b2,stroke:#e65100
style QA fill:#fff9c4,stroke:#f57f17
style BOOKS fill:#ffcdd2,stroke:#c62828
关键数据源详解:
1. Pile-CC(Common Crawl 子集):
- 用 WARC 而非 WET,用 jusText 转文本(质量优于官方 WET)。
2. arXiv(学术预印本):
- 1991 年至今的物理/数学/CS 论文,使用 LaTeX 源码而非 PDF。
- 好处:保留公式结构,模型能学到 LaTeX 语法与数学推导。
3. PubMed Central:
- 500 万篇生物医学论文——NIH 资助的研究被强制要求公开,这是政策造就的数据金矿。
4. StackExchange:
- 从 Stack Overflow(2008 年起)扩展到数学、文学等一百多个站点,用声誉积分与徽章激励高质量回答。
- 问答格式天然接近指令微调与真实应用;且带有丰富元数据(用户、投票、评论、标签),可用于进一步过滤。
- 官方提供匿名化的 XML 数据转储。
5. GitHub:
- 2008 年创立,2018 年被微软收购;2018 年已有至少 2800 万公开仓库。
- 仓库内容是一个目录,并非全是代码(还有文档、配置、数据);元数据(issues、commit 历史、PR 评论)本身也是语料。
- 大量重复(复制的代码、fork)——去重压力极大。
- 代码数据的民间共识:不仅提升编程能力,还被认为有助于推理能力。
6. Books3(版权雷区):
- 19.6 万本书,来自影子图书馆 Bibliotik(Presser, 2020)。
- 包含畅销书作家(Stephen King、Min Jin Lee、Zadie Smith)作品。
- 2023 年因版权诉讼被 HuggingFace 下架。
7. Project Gutenberg:
- 1971 年由 Michael Hart 创立,目标是让文学作品更易获取;2025 年约 7.5 万本书,以英文为主。
- 只收录版权清白的书(绝大多数已进入公共领域)。
- 衍生数据集 PG-19:2019 年前的古腾堡书籍,后来成为长上下文训练的标准语料(见 4.3 节)。
8. Enron 邮件:
- 安然公司调查中释出的 150 名高管的 50 万封内部邮件(2002 年公开)。
- 真实商业沟通语料,但涉及隐私争议。
注意
Books3 的下架预示了后续行业的法律风暴——AI 公司能否在未授权情况下用版权作品训练模型?见第 3 节。
影子图书馆(Shadow Libraries)
定义:绕过版权与付费墙、非法分发学术论文与书籍的网站。
| 名称 | 内容 | 规模(截至标注时间) | 法律状态 |
|---|---|---|---|
| Library Genesis(LibGen) | 书籍、论文 | 约 400 万本书(2019) | 多国封锁,服务器游击战 |
| Z-Library | 书籍、论文 | 曾超 1000 万本书 | 2022 年被 FBI 查封,后复活 |
| Sci-Hub | 学术论文 | 约 8800 万篇论文(2022) | Elsevier 等出版商持续诉讼 |
| Anna’s Archive | 聚合搜索引擎 | 索引上述所有库 | 法律灰色地带 |
伦理争议:
- 支持者:知识应该自由,学术出版商利润率高达 40%,不合理垄断。
- 反对者:侵犯作者版权,损害出版业生态。
AI 训练的涉入:
- Meta 被曝在 LibGen 上训练 LLaMA(2025 年作者集体诉讼)。
- The Pile 的 Books3 明确来自 Bibliotik。
Gopher:回归规则派
Gopher(DeepMind,2021)的 MassiveText(总量 10.5 TB 文本 ≈ 2.35T tokens,但 Gopher 只训练了 3000 亿 tokens,约 12%)。Gopher 模型本身后来被 Chinchilla 取代(两者都未发布权重),但其数据处理的描述是当时最详尽的,因此常被引用。
与 GPT-3 的「用 ML 分类器过滤」相反,Gopher 团队对核心网页部分 MassiveWeb 选择手工规则:
- 只保留英语、去重、去除与测试集重叠的内容。
- 质量过滤用手工规则而非分类器——例如「至少 80% 的词包含英文字母」、重复 n-gram 检测、文档长度与符号占比阈值。
- 毒性过滤用 Google SafeSearch(真实用户信号驱动的成熟系统),而不是脏话词表——避免 C4 式的误伤。
数据混合(采样占比):MassiveWeb 48% + 书籍 27% + C4 10% + 新闻 10% + GitHub 3% + Wikipedia 2%。
提示
- GPT-3:「让 ML 学习什么是高质量」——上限高,但分类器学到的偏见不可解释。
- Gopher:「人类专家定义规则更可控」——可解释可审计,但规则永远挂一漏万。
两条路都通,后续数据集在两者间反复摇摆:RefinedWeb/FineWeb/Dolma 站规则派,LLaMA/DCLM 站分类器派,2024 年后分类器派逐渐成为主流(见 2.6 节)。
2.5 新一代精炼:LLaMA、RefinedWeb、Dolma(2022-2024)
LLaMA:精挑细选的公开配方
LLaMA(Meta,2023)的数据策略:只用公开数据,但极致打磨。数据集约 1.2T 唯一 tokens;训练总消耗约 1.4T tokens(Wikipedia 与 Books 被重复采样约 2 个 epoch)。
| 数据源 | 采样占比 | 处理要点 |
|---|---|---|
| CommonCrawl(CCNet 处理) | 67% | CCNet 流水线 + 质量分类器(见下) |
| C4 | 15% | 规则过滤版 CC,增加多样性 |
| GitHub | 4.5% | 保留宽松许可证仓库,手工规则过滤 |
| Wikipedia | 4.5% | 2022 年 6-8 月转储,20 种语言 |
| Books(Gutenberg + Books3) | 4.5% | 文学与长文本 |
| arXiv | 2.5% | 删注释、内联展开宏、去参考文献 |
| StackExchange | 2% | 28 个最大站点,答案按得分排序 |
关键改进:
- CCNet 流水线:段落级去重 + 语言识别 + KenLM 困惑度过滤。
- 质量分类器:正例是「被维基百科引用过的页面」——比「维基百科本身」更聪明的代理信号:维基编辑愿意引用的外部网页,往往是高质量的三方来源。
- arXiv 的 LaTeX 清洗:删除注释、展开宏、去掉参考文献,只留下正文与公式。
社区复现:Together 的 RedPajama v1 复刻了 LLaMA 配方(1.2T tokens);Cerebras 的 SlimPajama 用 MinHash-LSH 去重得到 627B 子集。另有思路不同的 RedPajama v2:84 次 CC 快照、30T tokens、最小过滤 + 附带大量质量信号,把「过滤什么」的决策权留给使用者。
提示
LLaMA 证明:不需要神秘数据源(如 GPT-3 的 Books2),公开数据 + 精细处理就能训练出强模型。这直接开启了开源模型生态——只要配方公开,任何有算力的团队都能复现数据。
RefinedWeb:网页数据就够了
RefinedWeb(TII,2023)的核心主张:Web 数据足以训练顶级模型,不需要精心策展书籍/代码等「高级来源」。
处理流程:
1. 用 trafilatura 从 WARC 提取正文(而非 WET)。
2. 应用 Gopher 式规则过滤(刻意避免 ML 分类器,防止引入分类器偏见)。
3. MinHash 模糊去重(5-gram,算法细节见 Lecture 14 · 数据 II)。
公开版本:6000 亿 tokens(完整处理产物约 5T)。用它单独训练的 Falcon-40B 在多个基准上与用混合数据的模型打平——「web is all you need」的实证。
FineWeb:RefinedWeb 的改进复刻
FineWeb(HuggingFace,2024)最初是 RefinedWeb 的复现,但越做越好:
- 95 次 Common Crawl 快照(跨度数年)。
- URL 黑名单(色情/广告站点)。
- 语言识别:fastText,保留 $P(\text{英语}) > 0.65$ 的文档。
- 过滤规则:Gopher + C4 + 自定义规则。
- PII 匿名化:邮箱地址与公网 IP 替换为占位符。
- MinHash 模糊去重。
规模:15T tokens(是 RefinedWeb 公开版的 25 倍)。衍生的 FineWeb-Edu 再用「教育价值」分类器(训练标签由 Llama 3 70B 标注)筛出高教育价值子集——这是 2.6 节「模型当裁判」思路的又一实例。
说明
完全开源流程 + 超大规模 + 持续维护,成为社区训练的首选基础数据集;其技术报告也是学习数据清洗消融实验的最佳教材。
Dolma:AI2 的开放拼图
Dolma(AI2,2024)为训练 OLMo 而构建,3T tokens。
graph LR
D["Dolma<br/>3T tokens"]
D --> CC["Common Crawl<br/>~2T"]
D --> CODE["代码<br/>~250B<br/>The Stack"]
D --> ACAD["学术<br/>PeS2o<br/>~40M 论文"]
D --> SOCIAL["社交<br/>Reddit<br/>2005-2023"]
D --> OTHER["其他<br/>C4 / Gutenberg<br/>/ Wikipedia"]
style D fill:#f3e5f5,stroke:#7b1fa2
style CC fill:#e1f5fe,stroke:#0277bd
style CODE fill:#ffe0b2,stroke:#e65100
style ACAD fill:#c8e6c9,stroke:#2e7d32
style SOCIAL fill:#fff9c4,stroke:#f57f17
特色处理:
- Reddit 数据:来自 Pushshift 项目(2005-2023),帖子与评论分开处理。
- PeS2o:Semantic Scholar 的 4000 万篇学术论文。
- 质量过滤:Gopher + C4 规则,刻意避免模型过滤(与 RefinedWeb 同一阵营)。
- 毒性过滤:规则 + Jigsaw 分类器(细节见 Lecture 14 · 数据 II)。
- Bloom filter 去重:段落级精确去重(算法见 Lecture 14 · 数据 II)。
说明
不仅发布数据,还公开了完整处理代码与中间产物,可复现性最强。
2.6 质量革命:DCLM 与 Nemotron-CC(2024)
前述数据集大多依赖手工规则或简单分类器。2024 年的新趋势:用强大的 LM 当质量裁判。
DCLM:标准化数据处理竞赛
DataComp-LM(DCLM)(2024)的目标:定义一个数据处理算法的基准——固定原料池与训练/评估协议,让「数据配方」本身成为可比较的研究对象,就像 ImageNet 之于图像分类。
三层数据产品:
flowchart TD
RAW["Common Crawl<br/>原始快照"] --> POOL["DCLM-pool<br/>240T tokens<br/>轻度过滤"]
POOL --> BASELINE["DCLM-baseline<br/>3.8T tokens<br/>质量分类器过滤"]
POOL -.研究者自定义过滤.-> CUSTOM["你的数据集<br/>自己调配"]
style RAW fill:#ffcdd2,stroke:#c62828
style POOL fill:#fff9c4,stroke:#f57f17
style BASELINE fill:#c8e6c9,stroke:#2e7d32
style CUSTOM fill:#e1f5fe,stroke:#0277bd
DCLM-pool(240T tokens):
- 统一的「原料池」,研究者可以在此基础上测试不同过滤算法。
- 已完成:URL 过滤、语言识别、基础去重。
DCLM-baseline 的质量分类器:
# 训练 fastText 二分类器(伪代码)
positive_examples = [ # 共约 20 万条正例
OpenHermes_2_5, # GPT-4 生成的高质量指令数据
ELI5_subreddit # 「像我五岁一样解释」子版的问答
]
negative_examples = [ # 共约 20 万条负例
RefinedWeb_random_sample # 随机抽取的(已较干净的)网页
]
classifier = fastText.train_classifier(
positive=positive_examples,
negative=negative_examples
)
# 在 DCLM-pool 上运行,只保留被判为「正例」的文档
dclm_baseline = [doc for doc in dclm_pool if classifier(doc) == 'positive']
关键洞察:
- 正例选择:OpenHermes-2.5(GPT-4 合成指令数据)与 ELI5(Reddit 问答),代表解释清晰、结构良好、指令式的文本——注意正例根本不是「传统意义上的好网页」,而是接近最终应用形态(问答/指令)的文本。
- 负例选择:RefinedWeb 本身已是高质量网页——这告诉分类器「好 vs. 更好」的边界,而不是「垃圾 vs. 正常」的边界。
结果:DCLM-baseline(3.8T tokens)训练的模型在 MMLU 等基准上超越了所有已有开源数据集,且这个 fastText 分类器在消融中胜过其他所有过滤方法。
提示
DCLM 的惊人之处在于:一个几十 MB 的 fastText 线性分类器,只要正负例选得好,就能从 240T 的原料里蒸出 3.8T 的精华。质量过滤的关键从来不是分类器多强,而是「什么算好数据」这个定义本身——DCLM 把定义从「像维基百科」升级成了「像高质量指令数据」,恰好对齐了模型的最终用途。
Nemotron-CC:要质量也要规模
Nemotron-CC(NVIDIA,2024)的观察:FineWeb-Edu 与 DCLM 虽然质量高,但过滤太激进(扔掉约 90% 数据)。当你要像 Llama 3(15T)、Qwen 3(36T)那样拼数据量时,被扔掉的 90% 里其实还有可挖的价值。
策略 1:分类器集成(ensembling)
# 用两个分类器投票(伪代码)
score_educational = nemotron_340B_distilled(doc) # Nemotron-340B-instruct 按「教育价值」打分,蒸馏成快速模型
score_quality = dclm_classifier(doc) # DCLM 的 fastText 分类器
final_score = combine(score_educational, score_quality)
keep = (final_score > threshold) # 集成后阈值可以更宽松
策略 2:合成数据改写(rephrasing)
- 低质量文档:让 LM 改写成更清晰的版本(「润色」,把边角料变成可用数据)。
- 高质量文档:让 LM 生成衍生任务(QA 对、关键信息提取),一份好数据榨出多份训练信号。
HTML 转文本工具选择:
- 用 jusText 而非 trafilatura——理由很直白:jusText 抽出的 token 更多(可能引入更多噪音,但在「要规模」的前提下是正确取舍)。
结果:
- 6.3T tokens(高质量子集 1.1T),在同等训练量下与 DCLM 相当或更好,且能支撑更长的训练。
- 证明「宽松过滤 + 合成增强」是质量与规模兼得的可行路径。
注意
Nemotron-CC 用了大量 LM 推理资源做打分与改写——对于资源有限的团队,DCLM 的 fastText 分类器仍是性价比之王。另外,合成改写引入了「模型写模型」的循环,改写模型的偏好与错误会被固化进语料。
数据集规模对比(2024):
| 数据集 | tokens 数 | 思路 | 训练代表模型 |
|---|---|---|---|
| RefinedWeb | 600B(公开) | 规则 + 去重,反分类器 | Falcon |
| FineWeb | 15T | 规则派集大成 | 社区开源模型 |
| Dolma | 3T | 多源 + 规则,全开放 | OLMo |
| DCLM-baseline | 3.8T(从 240T pool) | fastText 质量分类器 | — |
| Nemotron-CC | 6.3T(HQ 1.1T) | 分类器集成 + 合成改写 | Nemotron 系列 |
| Llama 3 训练数据 | 15T | 未公开 | Llama 3 |
| Qwen 3 训练数据 | 36T | 未公开 | Qwen 3 |
3. 版权与法律战场
提示
为什么一门技术课要讲法律?因为版权直接约束了你能用什么数据:Books3 下架、Meta 被诉、OpenAI 与新闻集团的诉讼——每一起案件都在重新划定「可用数据」的边界。理解四要素与许可机制,才能理解为什么各家实验室宁可花钱买授权、也要保住「合理使用」这条抗辩防线。更宏观的 AI 供应链与生态视角见 Lecture 19 · AI 供应链与生态系统(未找到对应页面)。
3.1 知识产权法基础
知识产权法的目标:激励智力成果的创造——给创作者一定期限的独占权,换取其创作意愿。类型包括:版权(copyright)、专利(patent)、商标(trademark)、商业秘密(trade secret)。
版权保护的对象:
- 表达形式(expression),而非思想(idea)本身——例如:快速排序算法不受版权保护,但讲解它的书受保护。
- 原创作品——机械汇编(如电话簿)不受保护,除非选择/编排有创造性。
- 法条原文的关键词:「固定在任何有形介质中的原创作品」(fixed in a tangible medium of expression)。
关键时间线:
- 1709 年:英国《安妮法令》,版权首次由政府与法院监管。
- 1909 年 → 1976 年(美国):保护范围从「已出版」扩大到「已固定」——你的博客一写完就自动受保护。
- 门槛极低:无需注册即受保护(与专利相反);但提起侵权诉讼前必须先注册(注册费 65 美元)。
- 期限:1978 年后的作品为作者终身 + 70 年(法人作品为发表后 95 年),到期进入公共领域(莎士比亚、贝多芬、古腾堡计划的大部分书)。
注意
互联网上的绝大多数内容默认受版权保护——Common Crawl 爬到的几乎全部文本都有版权。「网上公开可见」不等于「可以随意复制使用」。
3.2 如何合法使用版权作品?
两条路:拿许可,或主张合理使用。
路径 1:获得许可(License)
定义:许可方(licensor)授予被许可方(licensee)使用权——来自合同法,本质是「承诺不起诉你」。
Creative Commons(CC)许可:
- 2001 年由 Lawrence Lessig 与 Eric Eldred 创建。
- 目标:在「公共领域」与「完全保留版权」之间搭桥,让作品可以自由分发。
- 应用:维基百科(CC BY-SA)、MIT OpenCourseWare、Khan Academy、Flickr 的 3.07 亿张 CC 图片、YouTube 的千万级 CC 视频等。
AI 公司的许可交易:
- Google ↔ Reddit(内容授权,2024)。
- OpenAI ↔ Shutterstock(六年协议,图片/视频/音乐)。
- OpenAI ↔ StackExchange(2024 年合作)。
说明
大公司愿意为高质量数据源付费,一是买数据,二是买「不被诉」的确定性。
路径 2:合理使用(Fair Use)
美国版权法第 107 条的四要素判定:
- 使用目的与性质:教育优于商业;转化性(transformative)优于复制性。
- 作品性质:事实性优于虚构性;非创造性优于创造性。
- 使用的量与实质性:片段优于全文;非核心部分优于精华段落。
- 对(潜在)市场的影响:不影响原作销售优于替代原作。
经典合理使用的例子:看完电影写摘要;重新实现算法(用思想而非抄表达);Google Books 扫描图书建索引并展示片段(Authors Guild v. Google,历时 2002-2015,判定合理使用——关键是用户只能看片段而非全文)。
AI 训练的攻防:
| 要素 | AI 公司的论点 | 版权方的反驳 |
|---|---|---|
| 转化性 | 训练远非复制粘贴,模型学的是统计模式 | 模型会逐字背诵训练数据(记忆问题) |
| 使用量 | 虽用了全文,但只为提取「思想」层面的规律 | 未经许可完整复制了数百万本书(复制这一步本身已构成侵权) |
| 市场影响 | 生成内容不等于复制原作 | 模型输出实质冲击作者与艺术家的市场 |
注意
- 复制即侵权:把数据抓下来存到训练服务器上,这第一步在法律上就可能已构成侵权,与之后是否训练、是否输出无关。
- 版权不等于逐字记忆:情节与角色(如哈利·波特)也可受保护——就算模型不逐字背诵,复述受保护的情节仍可能侵权;反过来,戏仿(parody)反而很可能是合理使用。版权关心的是语义与经济,不是字面重合率。
别忘了:服务条款(Terms of Service)
即使作品有 CC 许可、或你能主张合理使用,平台的服务条款可以叠加额外限制。例如 YouTube 的 ToS 禁止下载视频——哪怕视频本身是 CC 许可的。BooksCorpus 的下架(违反 Smashwords ToS)就是前车之鉴。
3.3 AI 的版权诉讼潮
2023-2025 年的主要诉讼(截至讲义发布时):
flowchart TD
SUITS["AI 版权诉讼"]
SUITS --> AUTHORS["作家集体诉讼<br/>Kadrey v. Meta<br/>Silverman v. OpenAI"]
SUITS --> NYT["纽约时报<br/>v. OpenAI & Microsoft"]
SUITS --> CODE["程序员集体诉讼<br/>v. GitHub Copilot"]
SUITS --> IMG["艺术家诉讼<br/>Andersen v. Stability AI"]
style SUITS fill:#ffcdd2,stroke:#c62828
style AUTHORS fill:#ffe0b2,stroke:#e65100
style NYT fill:#fff9c4,stroke:#f57f17
style CODE fill:#e1f5fe,stroke:#0277bd
style IMG fill:#f3e5f5,stroke:#7b1fa2
焦点问题:
1. 训练是否构成侵权?复制作品到服务器、解析成 tokens 是否已经侵权?
2. 输出是否构成衍生作品?如果模型能复述《哈利·波特》情节,是否侵犯 J.K. Rowling 版权?
3. 合理使用的边界?商业训练(OpenAI 盈利)能否主张合理使用?
Meta 与 LibGen 事件(2025 年):
- 诉讼文件披露 Meta 用影子图书馆 LibGen 的数据训练 LLaMA。
- 引发作家集体诉讼,要求披露完整训练数据清单。
注意
Books3 下架、诉讼缠身——未来数据集可能只能用 CC 许可或公共领域内容,或者必须付费授权。这也解释了 1.1 节的现象:披露数据构成 = 自曝法律风险。
4. 中期训练与后训练数据
预训练解决「能说话」,中期训练与后训练解决「说得好、说得对」。
提示
1.3 节列过「要补充的能力清单」:代码、数学、长上下文、任务遵循、对话……本节逐项对应——每一种能力都是用一类特定数据「配」出来的。这也是「mid-training」这个阶段存在的理由:这些数据太少、太贵,不能摊薄在 15T 的预训练里,要在训练后期集中喂给模型(此时学到的东西也更不容易被后续训练冲掉)。
4.1 代码数据:让模型学会编程
The Stack:最大开源代码语料
The Stack(BigCode,2022):
- 从 GH Archive(GitHub 事件的小时级快照,2015-2022)获取仓库名单,git clone 了 1.37 亿个仓库,得到 510 亿个文件(其中仅 50 亿不重复——代码重复率之高可见一斑)。
- 用 go-license-detector 只保留宽松许可证(MIT、Apache 等)的仓库。
- 用 MinHash + Jaccard 相似度做近重复去除。
- 结果:初版论文 3.1 TB 代码(30 种主要语言);后续 v1.2 扩展至 6.4 TB、358 种语言。
- 退出机制(opt-out):开发者可申请移除自己的代码——在版权风暴中的自我保护。
训练产物:StarCoder 等代码模型。
代码数据的特殊性:
- 结构化强:编译器会检查语法,天然高质量。
- 跨语言知识迁移:学会 Python 有助于学 JavaScript。
- 长依赖:函数调用、类继承跨越数百行。
- 推理红利(民间共识):代码训练被广泛认为能提升自然语言推理能力——这是各家都把代码混进通用预训练的原因。
Stack v2:规模翻倍
The Stack v2(2024,基于 Software Heritage 存档):
- 67.5 TB 原始数据,去重后约 32 TB。
- 新增 Jupyter Notebooks、GitHub Issues、pull requests——围绕代码的自然语言讨论同样是宝贵语料。
- 训练 StarCoder 2。
说明
GPT-3 时代代码占比很低,Code Llama 用 50%+——比例取决于你想要什么能力。当前主流通用模型的预训练代码占比多在 10-25% 区间。
4.2 数学数据:推理能力的钥匙
数学语料的来源:
| 数据源 | 规模(量级) | 特点 |
|---|---|---|
| arXiv(数学类) | 数十万篇论文 | LaTeX 格式,包含证明过程 |
| ProofWiki / Proof-Pile | 数万条证明 | 结构化的数学证明 |
| Math StackExchange | 百万级问答对 | 从基础到研究生水平 |
| OpenWebMath | 约 147 亿 tokens | 从 Common Crawl 提取的数学网页(构建方法见 Lecture 14 · 数据 II) |
为什么数学数据有效?
- 链式推理:数学证明是「一步步推导」的典范,天然的 chain-of-thought 语料。
- 形式化语言:符号体系严格,减少歧义。
例子
在 PaLM 基础上用约 1180 亿 tokens 的数学语料(arXiv + 含 LaTeX 的网页)继续训练。MATH 基准:PaLM 540B 基线约 8.8% → Minerva 540B 单次采样 33.6%、多数投票(majority voting)50.3%。只换数据、不改架构就把数学能力翻了几倍——中期训练价值的最直接证明。
4.3 长上下文数据:突破 4K 窗口
需求:对整本书做问答、处理超长代码库与合同。当前旗舰模型的上下文:DeepSeek v3 128K、Claude 3.5 Sonnet 200K、Gemini 1.5 Pro 达 1.5M tokens。
为什么不直接用长序列预训练?注意力的计算量随序列长度二次增长(复杂度分析见 Lecture 2 · PyTorch 与资源核算),在 15T tokens 的预训练里全程用 100K 窗口是算力灾难。策略:先用短窗口预训练,再在中期训练阶段用少量长文档「拉长」窗口。
# 长上下文训练的典型三段式(示意)
pretrain(data=web_mix, seq_len=4096) # 主预训练:短窗口、海量数据
mid_train(data=books + papers, seq_len=32768) # 长上下文适配:少量长文档
extended_train(data=long_docs, seq_len=100_000) # 可选:超长窗口
案例:LongLoRA(2023)——把 Llama 2 7B 从 4K 扩展到 100K:
- 架构侧:shifted sparse attention(训练时用移位的局部注意力近似全量注意力)+ 位置插值(positional interpolation,把 RoPE 位置编码「压缩」到已训练范围内,见 Lecture 3 · 架构与超参数)。
- 数据侧:在 PG-19(古腾堡书籍)与 Proof-Pile(数学证明)上继续训练——书和长证明是天然的长依赖语料:情节回收、定理引用都要求模型真的利用远处的上下文。
提示
长上下文能力的瓶颈不在「见过多少 token」,而在「见过多少真正需要长程依赖的文档」。随机拼接的短网页凑成的 100K 序列没有跨段依赖,模型学不到任何东西;一本小说的第 80K token 处回收第 2K token 埋下的伏笔,才是有效的训练信号。所以长上下文数据 = 书籍 + 论文 + 长证明,且只需相对少量。
4.4 任务数据:把 NLP 数据集变成指令
在开放式指令数据流行之前,有一条务实路线:把现成的 NLP 标注数据集模板化成 prompt。
Super-Natural Instructions(2022):
- 社区通过 GitHub 贡献了 1600+ 个任务(分类、抽取、改写、QA……),每个任务的样本从现有数据集转换成统一的「指令 + 输入 + 输出」模板。
- 用它微调 T5 得到 Tk-Instruct,在任务泛化上超过了参数量大得多的 InstructGPT(在其评测协议下)。
Flan 2022:
- 1800+ 任务的集大成版本;关键创新是混合 zero-shot、few-shot 与思维链(chain-of-thought)三种模板一起微调,让模型同时学会三种作答模式。
- Flan-T5 成为当时最强的开源指令模型之一。
说明
模板化数据的指令分布与真实用户提问差异很大(学术任务味太重),因此后来被开放式指令数据(4.5 节)取代主导地位——但作为「能力打底」的中期训练数据仍在使用。
4.5 指令与对话数据:从基座到助手
目标:让基座模型学会遵循指令与多轮对话(训练方法本身——SFT/RLHF——见 Lecture 15 · 对齐 I:SFT 与 RLHF)。
数据格式
# 指令数据的典型格式
{
"instruction": "用 Python 写一个快速排序",
"input": "", # 可选的额外输入
"output": "def quicksort(arr):\n if len(arr) <= 1:\n return arr\n ..."
}
# 多轮对话格式
{
"conversations": [
{"role": "user", "content": "什么是光合作用?"},
{"role": "assistant", "content": "光合作用是植物利用光能..."},
{"role": "user", "content": "叶绿素的作用是什么?"},
{"role": "assistant", "content": "叶绿素是捕获光能的色素..."}
]
}
数据来源的演进
第一代:众包/外包标注
Llama 2 Chat(Meta,2023):
- 27,540 条高质量样本,全部由外包标注者编写。
- 成本高但质量可控——Meta 声称这比用百万级开源数据效果更好。
- 团队的事后反思:本可以更少标注 SFT 数据、把省下的人力投给 RLHF 偏好数据。
第二代:真实用户对话
ShareGPT:
- 用户主动分享的 ChatGPT 对话记录(该服务现已停止)。
- 优点:真实用户意图、多样性高;缺点:质量参差、可能含隐私信息、且实质是在「蒸馏」ChatGPT。
- Vicuna 用 7 万条 ShareGPT 对话微调 LLaMA,是当时最接近 ChatGPT 体验的开源模型。
第三代:强模型合成
Alpaca(Stanford,2023):
- 用 self-instruct 方法从 text-davinci-003 生成 5.2 万条指令-回复对(从 175 条人写种子任务出发,让模型自举扩增),微调 LLaMA-7B。
- 成本仅约 600 美元,却得到有模有样的指令模型——引爆了「合成指令数据」路线。
Baize(2023):
- 让 GPT-3.5 自聊(self-chat):以 Quora 与 Stack Overflow 的问题为种子,让模型同时扮演用户与助手生成多轮对话,得到 11.15 万条样本,微调 LLaMA。
# Baize 的 self-chat 生成流程(简化)
seed_questions = load_from_quora_and_stackoverflow()
for seed in seed_questions:
# GPT-3.5 同时扮演两个角色,围绕种子问题展开多轮对话
conversation = gpt35_self_chat(seed, turns=4)
dataset.append(conversation)
WizardLM(2023):
- Evol-Instruct:让 LLM 不断「进化」已有指令——加深(增加约束、多步推理)与拓宽(衍生新话题)。
- 例如:「什么是快速排序?」→「比较快速排序与归并排序的时间复杂度,并分析最坏情况」。
- 约 25 万条进化指令,训练出的 WizardLM 在复杂指令上超越 Vicuna。
MAmmoTH2(2024):
- 思路反转:指令数据不必凭空生成,网络上本来就有——从 Common Crawl 中用 fastText 分类器筛选测验/教育类网站。
- 用 GPT-4 与 Mixtral 从中抽取并改写 QA 对,得到 WebInstruct(1000 万条指令)。
- 微调 Mistral-7B 后数学推理能力大幅提升——预训练数据挖掘与指令合成的合流。
OpenHermes 2.5:
- 聚合多个数据集(大量 GPT-4 生成数据),约 100 万条样本微调 Mistral-7B。
- 后来成为 DCLM 质量分类器的正例来源(见 2.6 节)——后训练数据反哺预训练过滤,闭环了。
第四代:开源模型合成(摆脱 GPT-4 依赖)
Llama-Nemotron Post-Training Dataset(NVIDIA):
- 提示词来源:公开数据集(如 WildChat 真实用户对话)+ 合成生成,再过滤。
- 回复生成:用 Llama、Mixtral、DeepSeek-R1、Qwen 等许可证商业可用的开源模型生成——规避 OpenAI ToS 对「用输出训练竞品」的限制。
- 包含推理轨迹(reasoning traces):思维链中间步骤成为标配。
- 完整公开在 HuggingFace。
说明
后训练数据的主流路径已从「人工标注」走到「强闭源模型蒸馏」,再到「开源模型合成」——成本递减、可扩展性递增、法律风险递减。
数据量的悖论
| 模型 | 指令数据量 | 来源方式 |
|---|---|---|
| Llama 2 Chat | 2.75 万 | 外包标注(小而精) |
| Dolly | 1.5 万 | Databricks 员工众包 |
| Alpaca | 5.2 万 | text-davinci-003 self-instruct |
| Vicuna | 7 万 | ShareGPT 用户对话 |
| Baize | 11.15 万 | GPT-3.5 self-chat |
| WizardLM | 25 万 | Evol-Instruct 进化 |
| OpenHermes 2.5 | 100 万 | 多数据集聚合 |
| WebInstruct | 1000 万 | 从 CC 挖掘 + 抽取 |
提示
Llama 2 用 2.75 万高质量样本超越了许多百万级数据的模型——SFT 阶段模型主要在学格式与行为模式,而非新知识,所以「教科书式的少量示范」就够了。但多样性不可省:要覆盖写作、编码、推理、拒答等各类行为模式,否则模型在未覆盖的行为上无所适从。数量、质量、多样性三者中,质量与多样性优先于数量。
5. 数据流水线全景
把前面所有环节串起来,一个完整的数据流水线长这样:
flowchart TD
START["在线服务<br/>Reddit / 维基 / GitHub"] --> CRAWL["爬虫获取<br/>Common Crawl / API"]
CRAWL --> HTML["HTML → 文本<br/>trafilatura / jusText"]
HTML --> LANGID["语言识别<br/>fastText"]
LANGID --> FILTER["质量过滤<br/>规则 / 分类器"]
FILTER --> DEDUP["去重<br/>Bloom filter / MinHash"]
DEDUP --> PII["隐私过滤<br/>邮箱 / IP 匿名化"]
PII --> MIX["数据混合<br/>Web 67% + 代码 4% + ..."]
MIX --> PRETRAIN["预训练<br/>15T tokens"]
PRETRAIN --> MIDTRAIN["中期训练<br/>代码/数学/长文本<br/>1-3T tokens"]
MIDTRAIN --> SFT["监督微调<br/>指令数据 10K-100K"]
SFT --> RLHF["RLHF<br/>人类偏好数据"]
RLHF --> FINAL["最终模型<br/>Llama 3 / GPT-4 / ..."]
style START fill:#ffcdd2,stroke:#c62828
style CRAWL fill:#ffe0b2,stroke:#e65100
style HTML fill:#fff9c4,stroke:#f57f17
style FILTER fill:#e1f5fe,stroke:#0277bd
style DEDUP fill:#f3e5f5,stroke:#7b1fa2
style PRETRAIN fill:#e1f5fe,stroke:#0277bd
style MIDTRAIN fill:#fff9c4,stroke:#f57f17
style SFT fill:#c8e6c9,stroke:#2e7d32
style RLHF fill:#c8e6c9,stroke:#2e7d32
style FINAL fill:#4caf50,stroke:#1b5e20,color:#fff
每个阶段的关键决策:
| 阶段 | 核心问题 | 常见选择 |
|---|---|---|
| HTML → 文本 | 用哪个工具? | trafilatura(精细)、jusText(高产)、官方 WET(快但粗糙) |
| 质量过滤 | 规则 vs. 模型? | 手工规则(Gopher)、fastText 分类器(DCLM)、LM 打分(Nemotron) |
| 去重 | 精确 vs. 模糊? | Bloom filter(精确)、MinHash+LSH(模糊,捕获近似重复) |
| 数据混合 | 各源占比? | Web 60-70%、代码 3-10%、书籍 5-10%、学术 2-5% |
| 指令数据 | 人工 vs. 合成? | 人工标注(高质)、GPT-4 合成(快)、开源模型合成(规避 ToS) |
注意
没有「最优配方」,每个团队的选择都是在成本、质量、法律风险间权衡的结果。数据混比对模型能力的定量影响,与 Lecture 9 · 缩放定律 I:基础 中「数据受限情形下的缩放」直接相关——高质量数据不够时,重复采样与配比策略就成了关键变量。
总结
关键要点
mindmap
root((数据 I<br/>来源与策展))
预训练数据演进
早期探索 2019<br/>BERT / GPT-2<br/>维基 + 书籍 + Reddit
Common Crawl<br/>互联网原材料<br/>WARC vs WET
第一代过滤<br/>CCNet / C4<br/>规则 + 语言模型
规模化 2020-21<br/>GPT-3 / The Pile / Gopher<br/>多源混合
精炼 2022-23<br/>LLaMA / RefinedWeb<br/>去重 + 质量分类器
质量革命 2024<br/>DCLM / Nemotron-CC<br/>LM 当裁判
版权与法律
版权法基础<br/>表达 vs 思想<br/>自动保护
合法使用路径<br/>许可证 / 合理使用<br/>Google Books 判例
AI 诉讼潮<br/>作家 / 纽约时报<br/>Books3 下架
中期与后训练
代码数据<br/>The Stack<br/>GitHub 开源仓库
数学数据<br/>arXiv / OpenWebMath<br/>推理能力
长上下文<br/>PG-19 / Proof-Pile<br/>4K → 100K 窗口
任务与指令数据<br/>Flan / Alpaca / 合成<br/>质量 > 数量
核心要点:
- 数据不会从天而降:从在线服务 → 原始快照 → 处理文本 → 聚合数据集,每一步都需要工程投入。
- 数据是差异化关键:架构大家趋同(Transformer),数据策展是护城河——Llama 3 公开一切唯独数据保密。
- 质量信号的演进:人工编辑 → 社交投票 → 困惑度 → 手工规则 → fastText 分类器 → 大模型打分与改写,「裁判」越来越强,且越来越对齐最终用途。
- 法律与伦理挑战:Books3 下架、Meta 被诉——复制即可能侵权,「合理使用」抗辩前途未卜,付费授权渐成常态。
- 质量 vs. 规模的权衡:DCLM 激进过滤(240T → 3.8T),Nemotron-CC 宽松保留 + 合成改写——没有唯一答案。
- 流水线高度启发式:HTML 转文本工具、过滤阈值、数据混比——每个选择都是经验与实验的产物,充满改进空间。
下一讲预告:本讲聚焦「数据从哪来、选哪些」,Lecture 14 · 数据 II 深入「如何处理」——过滤的统一框架(KenLM/fastText/DSIR)、语言识别与质量/毒性过滤的实操细节、去重算法(精确哈希、Bloom filter、MinHash+LSH)的原理与数值分析。
复习自测
题目
WARC 是爬虫保存的原始 HTTP 响应(含完整 HTML),WET 是官方从 WARC 有损转换出的纯文本。WET 转换丢失了表格、代码块、正文边界等结构信息,混入导航栏/广告等噪音。DCLM 实验显示:用 resiliparse/trafilatura 直接处理 WARC,下游任务准确率比用 WET 高约 2~3 个百分点——上游抽取质量直接决定最终模型表现,且下游无法弥补。
题目
GPT-3 用 ML 分类器(正例 = WebText/维基/书籍);Gopher 反其道用手工规则,理由是避免分类器偏见;DCLM 回归分类器,但换了正例定义——用 OpenHermes-2.5(GPT-4 指令数据)+ ELI5 当正例、RefinedWeb 当负例。它赢在「好数据」的定义对齐了模型的最终用途(清晰解释、指令问答式文本),而不是分类器本身更强大。
题目
CCNet 用维基百科文本训练 KenLM n-gram 语言模型,按困惑度打分(生成式:像维基的文本困惑度低)。LLaMA 在 CCNet 基础上再加一个判别式分类器,正例是「被维基百科引用过的外部页面」——利用维基编辑的引用行为作为对第三方网页的人工质量背书。前者衡量「文字风格像不像维基」,后者衡量「这个网页值不值得被维基引用」,后者能选出风格多样但可信的内容。
题目
四要素:(1) 使用目的与性质(转化性);(2) 作品性质;(3) 使用量与实质性;(4) 对市场的影响。AI 公司最强的论点在要素 1:训练是高度转化性的(学统计规律而非复制表达)。最弱处在要素 3 与 4:训练完整复制了数百万作品(复制这步本身可能已侵权),且模型输出会实质冲击作者市场。Google Books 判例支持「转化性 + 只展示片段」的组合,但 LLM 能生成完整内容,类比是否成立尚无定论。
题目
注意力计算量随序列长度二次增长,在 15T tokens 的全量预训练中用 100K 窗口是算力灾难;而实验(如 LongLoRA)表明只需在长文档上继续训练相对少量的 tokens,配合位置插值等技巧就能扩展窗口。有效数据必须有真实的长程依赖——书籍(PG-19)、长证明(Proof-Pile)里「第 80K token 回收第 2K token 的伏笔/定理」才是训练信号;把短网页随机拼成长序列没有跨段依赖,学不到东西。
参考资料
- 💻 lecture_13.py(本讲可执行讲义)
- 📄 BERT: Pre-training of Deep Bidirectional Transformers (Devlin et al., 2019)
- 📄 Language Models are Unsupervised Multitask Learners / GPT-2 (Radford et al., 2019)
- 📄 CCNet: Extracting High Quality Monolingual Datasets (Wenzek et al., 2019)
- 📄 Exploring the Limits of Transfer Learning with T5 / C4 (Raffel et al., 2019)
- 📄 Language Models are Few-Shot Learners / GPT-3 (Brown et al., 2020)
- 📄 The Pile: An 800GB Dataset of Diverse Text (Gao et al., 2021)
- 📄 Scaling Language Models: Methods, Analysis & Insights / Gopher (Rae et al., 2021)
- 📄 LLaMA: Open and Efficient Foundation Language Models (Touvron et al., 2023)
- 📄 The RefinedWeb Dataset for Falcon LLM (Penedo et al., 2023)
- 📄 Dolma: an Open Corpus of Three Trillion Tokens (Soldaini et al., 2024)
- 📄 DataComp-LM: In Search of the Next Generation of Training Sets (DCLM) (Li et al., 2024)
- 📄 Nemotron-CC: Refining Data at Scale (NVIDIA, 2024)
- 📄 OLMo 2: Open Language Model (AI2, 2024)
- 📄 Llama 3 Model Card (Meta, 2024)
- 📄 The Stack: 3 TB of permissively licensed source code (Kocetkov et al., 2022)
- 📄 LongLoRA: Efficient Fine-tuning of Long-Context LLMs (Chen et al., 2023)
- 📄 Self-Instruct: Aligning LMs with Self-Generated Instructions (Wang et al., 2022)
- 📄 Baize: Self-Chat 数据蒸馏 (Xu et al., 2023)
- 📄 WizardLM: Evol-Instruct (Xu et al., 2023)
- 📄 MAmmoTH2: Scaling Instructions from the Web (Yue et al., 2024)
- 📄 Foundation Models and Fair Use (Henderson et al., 2023)
- 🌐 Common Crawl 官网
- 🌐 The Stack(BigCode)
- 🌐 FineWeb(HuggingFace)
- 🌐 RedPajama-Data(Together)
- 🌐 Baker McKenzie AI 诉讼追踪
- 🌐 CS336 课程主页