# Lecture 13 · 数据 I

> **CS336: Language Modeling from Scratch** · Stanford · Spring 2025
> 📅 May 13 · 💻 [可执行讲义](https://github.com/stanford-cs336/spring2025-lectures/blob/main/lecture_13.py) · 讲者 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）与语言分布** |

> [!note] 为什么数据保密
> 1. **竞争动力学**：数据策展是护城河，公开等于送对手配方。架构上大家都是 Transformer 变体（见 [[Lecture 3 · 架构与超参数]]），真正拉开差距的是数据。
> 2. **版权责任**：训练数据可能含版权作品（Books3、LibGen），明确披露会成为诉讼靶子。

> [!tip] 直觉
> 在基础模型（foundation model）时代之前，「数据工作」意味着为监督学习做大量人工标注；现在标注变少了，但**策展（curation）与清洗**的工作量丝毫没有减少。关键区别在于：架构和系统的创新是「一次发明、处处受益」，而数据是**长尾问题**——每多覆盖一种语言、一个领域、一类脏数据模式，都需要额外的人力投入，没有一劳永逸的解法。这就是为什么数据团队规模随模型代际不断膨胀。

### 1.2 训练阶段的数据分工

```mermaid
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
```

**三个阶段的目标**：

1. **预训练（Pre-training）**：用海量原始文本（网页、维基百科、书籍）训练出**基座模型**，学习语言统计规律与世界知识。
2. **中期训练（Mid-training）**：继续训练，但换成**高质量数据**（代码、数学论文、长文档），增强特定能力。
3. **后训练（Post-training）**：用少量**指令-回复对**微调（SFT）或人类反馈强化学习（RLHF），让模型学会对话与遵循指令（详见 [[Lecture 15 · 对齐 I：SFT 与 RLHF]]）。

实践中边界模糊，可能有更多阶段——但核心思想是**从大规模低质到小规模高质**的渐进策略。

**术语约定**：
- **基座模型（Base model）**：预训练 + 中期训练后的模型。
- **指令/对话模型（Instruct/Chat model）**：后训练后的模型。

> [!example] 案例：OLMo 2（AI2，2024）的三阶段实践
> - 预训练：约 5T tokens，Common Crawl + 代码 + 学术论文。
> - 中期训练（Dolmino）：高质量子集（含数学、精选网页），提升推理能力。
> - 后训练（Tulu 3）：指令样本 SFT + 偏好优化（DPO）对齐。
> OLMo 是少数把三个阶段的数据**全部公开**的项目，因此成为理解工业界数据实践的最佳窗口。

### 1.3 数据对象的类型

从**服务**到**训练语料**的转化链条：

```mermaid
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）

本节按时间顺序梳理代表性数据集，每个都是一次**工程实践与理念**的迭代。

> [!tip] 直觉
> 这段历史的主线是一个问题：「**质量信号从哪里来？**」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）**，这是模型训练实际使用的形式。

> [!warning] 易错点：高质量来源也可能被投毒
> 讲义特别提到针对维基百科的**数据投毒攻击（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）的训练数据之一。

> [!tip] 直觉：借人类行为当质量过滤器
> Reddit 点赞数本质上是把**数百万人类用户当免费标注员**——虽然粗糙（点赞 ≠ 事实正确），但它免费、覆盖面广，而且确实携带「这段内容值得一读」的信号。后面会看到，这个思路被反复复用：StackExchange 的声誉分、GitHub 的 star、维基百科的引用关系，都是现成的人类质量信号。

### 2.2 Common Crawl：互联网的原材料

**Common Crawl** 是预训练数据的**基石**——2007 年成立的非营利组织，定期爬取全网并免费公开。

#### 爬虫流程

```mermaid
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 转换丢掉了表格结构、代码块格式、正文与导航栏的边界等信息。

```python
# 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)  # 更好的正文抽取
```

> [!tip] 实践建议
> 有算力就自己处理 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」既指开源工具，也指论文发布的数据集。

> [!tip] 直觉
> CCNet 的核心思想：**用高质量语料训练的语言模型，对「同类文本」困惑度低，对垃圾文本困惑度高**——于是困惑度就成了免费的质量打分器。它不需要任何人工标注，只需要一份公认的高质量参考语料（维基百科）。

#### C4：手工规则大全

**C4（Colossal Clean Crawled Corpus）**（Google，2019）：

虽然 T5 论文更出名（「一切任务都是文本到文本」），但 C4 数据集本身是重大贡献。

**处理流程**（从 2019 年 4 月的单次 Common Crawl 快照出发，约 1.4T tokens）：

```python
# 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 链接的质量信号有效。

> [!warning] C4 的教训
> 1. **规则简单可解释，但误伤严重**：一刀切的脏话列表删掉了大量正常文档。
> 2. **过滤即偏见**：你定义的「干净」，决定了模型见过谁的声音——这个问题会在毒性过滤（[[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 及各基准测试集重叠的内容，避免数据污染。

> [!note] Books1 & Books2 之谜
> OpenAI 从未披露来源，业界猜测可能来自 LibGen 等**影子图书馆（shadow library）**。这种「不可言说的数据源」正是后来版权诉讼的导火索之一。

#### The Pile：开源社区的反击

**The Pile**（EleutherAI，2021）是对 GPT-3 闭源数据的开源回应——**825 GB，约 2750 亿 tokens**。它是草根志愿者在 Discord 上协作完成的，策展了 **22 个高质量领域数据源**，训练出 GPT-J、GPT-NeoX 等早期开源模型。

```mermaid
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 年公开）。
- 真实商业沟通语料，但涉及隐私争议。

> [!warning] 版权炸弹
> 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%。

> [!tip] 直觉：哲学分歧
> - 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、**最小过滤 + 附带大量质量信号**，把「过滤什么」的决策权留给使用者。

> [!tip] 直觉
> 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 节「模型当裁判」思路的又一实例。

> [!note] FineWeb 的价值
> 完全开源流程 + 超大规模 + 持续维护，成为社区训练的首选基础数据集；其技术报告也是学习数据清洗消融实验的最佳教材。

#### Dolma：AI2 的开放拼图

**Dolma**（AI2，2024）为训练 OLMo 而构建，**3T tokens**。

```mermaid
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]]）。

> [!note] Dolma 的开放性
> 不仅发布数据，还公开了完整处理代码与中间产物，可复现性最强。


### 2.6 质量革命：DCLM 与 Nemotron-CC（2024）

前述数据集大多依赖**手工规则**或简单分类器。2024 年的新趋势：**用强大的 LM 当质量裁判**。

#### DCLM：标准化数据处理竞赛

**DataComp-LM（DCLM）**（2024）的目标：定义一个**数据处理算法的基准**——固定原料池与训练/评估协议，让「数据配方」本身成为可比较的研究对象，就像 ImageNet 之于图像分类。

**三层数据产品**：

```mermaid
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 的质量分类器**：

```python
# 训练 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 分类器在消融中胜过其他所有过滤方法。

> [!tip] 直觉
> 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）**

```python
# 用两个分类器投票（伪代码）
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 相当或更好，且能支撑更长的训练。
- 证明「宽松过滤 + 合成增强」是质量与规模兼得的可行路径。

> [!warning] 权衡
> 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. 版权与法律战场

> [!tip] 直觉
> 为什么一门技术课要讲法律？因为**版权直接约束了你能用什么数据**：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 年），到期进入公共领域（莎士比亚、贝多芬、古腾堡计划的大部分书）。

> [!warning] 易错点
> 互联网上的绝大多数内容**默认受版权保护**——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 年合作）。

> [!note] 商业现实
> 大公司愿意为高质量数据源付费，一是买数据，二是买「不被诉」的确定性。

#### 路径 2：合理使用（Fair Use）

**美国版权法第 107 条**的四要素判定：

1. **使用目的与性质**：教育优于商业；**转化性（transformative）**优于复制性。
2. **作品性质**：事实性优于虚构性；非创造性优于创造性。
3. **使用的量与实质性**：片段优于全文；非核心部分优于精华段落。
4. **对（潜在）市场的影响**：不影响原作销售优于替代原作。

**经典合理使用的例子**：看完电影写摘要；重新实现算法（用思想而非抄表达）；Google Books 扫描图书建索引并展示片段（Authors Guild v. Google，历时 2002-2015，判定合理使用——关键是用户只能看片段而非全文）。

**AI 训练的攻防**：

| 要素 | AI 公司的论点 | 版权方的反驳 |
| :--- | :--- | :--- |
| 转化性 | 训练远非复制粘贴，模型学的是统计模式 | 模型会逐字背诵训练数据（记忆问题） |
| 使用量 | 虽用了全文，但只为提取「思想」层面的规律 | 未经许可完整复制了数百万本书（复制这一步本身已构成侵权） |
| 市场影响 | 生成内容不等于复制原作 | 模型输出实质冲击作者与艺术家的市场 |

> [!warning] 两个容易混淆的点（讲义特别强调）
> 1. **复制即侵权**：把数据抓下来存到训练服务器上，这**第一步**在法律上就可能已构成侵权，与之后是否训练、是否输出无关。
> 2. **版权不等于逐字记忆**：情节与角色（如哈利·波特）也可受保护——就算模型不逐字背诵，复述受保护的情节仍可能侵权；反过来，戏仿（parody）反而很可能是合理使用。版权关心的是**语义与经济**，不是字面重合率。

#### 别忘了：服务条款（Terms of Service）

即使作品有 CC 许可、或你能主张合理使用，**平台的服务条款可以叠加额外限制**。例如 YouTube 的 ToS 禁止下载视频——哪怕视频本身是 CC 许可的。BooksCorpus 的下架（违反 Smashwords ToS）就是前车之鉴。

### 3.3 AI 的版权诉讼潮

**2023-2025 年的主要诉讼**（截至讲义发布时）：

```mermaid
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。
- 引发作家集体诉讼，要求披露完整训练数据清单。

> [!warning] 行业震荡
> Books3 下架、诉讼缠身——未来数据集可能只能用 CC 许可或公共领域内容，或者必须付费授权。这也解释了 1.1 节的现象：**披露数据构成 = 自曝法律风险**。

---

## 4. 中期训练与后训练数据

预训练解决「**能说话**」，中期训练与后训练解决「**说得好、说得对**」。

> [!tip] 直觉
> 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。

> [!note] 代码占比的争议
> 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 语料。
- **形式化语言**：符号体系严格，减少歧义。

> [!example] 实验证据：Minerva（Google，2022）
> 在 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 窗口是算力灾难。**策略：先用短窗口预训练，再在中期训练阶段用少量长文档「拉长」窗口**。

```python
# 长上下文训练的典型三段式（示意）
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**（数学证明）上继续训练——书和长证明是天然的长依赖语料：情节回收、定理引用都要求模型真的利用远处的上下文。

> [!tip] 直觉
> 长上下文能力的瓶颈不在「见过多少 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 成为当时最强的开源指令模型之一。

> [!note] 局限
> 模板化数据的指令分布与真实用户提问差异很大（学术任务味太重），因此后来被开放式指令数据（4.5 节）取代主导地位——但作为「能力打底」的中期训练数据仍在使用。

### 4.5 指令与对话数据：从基座到助手

**目标**：让基座模型学会**遵循指令**与**多轮对话**（训练方法本身——SFT/RLHF——见 [[Lecture 15 · 对齐 I：SFT 与 RLHF]]）。

#### 数据格式

```python
# 指令数据的典型格式
{
    "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。

```python
# 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。

> [!note] 趋势
> 后训练数据的主流路径已从「人工标注」走到「强闭源模型蒸馏」，再到「开源模型合成」——成本递减、可扩展性递增、法律风险递减。

#### 数据量的悖论

| 模型 | 指令数据量 | 来源方式 |
| :--- | :---: | :--- |
| 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 挖掘 + 抽取 |

> [!tip] 直觉：质量、数量与多样性的三角
> Llama 2 用 2.75 万高质量样本超越了许多百万级数据的模型——SFT 阶段模型主要在学**格式与行为模式**，而非新知识，所以「教科书式的少量示范」就够了。但**多样性**不可省：要覆盖写作、编码、推理、拒答等各类行为模式，否则模型在未覆盖的行为上无所适从。数量、质量、多样性三者中，**质量与多样性优先于数量**。

---

## 5. 数据流水线全景

把前面所有环节串起来，一个完整的数据流水线长这样：

```mermaid
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） |

> [!warning] 数据是启发式的艺术
> 没有「最优配方」，每个团队的选择都是在**成本、质量、法律风险**间权衡的结果。数据混比对模型能力的定量影响，与 [[Lecture 9 · 缩放定律 I：基础]] 中「数据受限情形下的缩放」直接相关——高质量数据不够时，重复采样与配比策略就成了关键变量。

---

## 总结

### 关键要点

```mermaid
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/>质量 > 数量
```

**核心要点**：

1. **数据不会从天而降**：从在线服务 → 原始快照 → 处理文本 → 聚合数据集，每一步都需要工程投入。
2. **数据是差异化关键**：架构大家趋同（Transformer），数据策展是护城河——Llama 3 公开一切唯独数据保密。
3. **质量信号的演进**：人工编辑 → 社交投票 → 困惑度 → 手工规则 → fastText 分类器 → 大模型打分与改写，「裁判」越来越强，且越来越对齐最终用途。
4. **法律与伦理挑战**：Books3 下架、Meta 被诉——复制即可能侵权，「合理使用」抗辩前途未卜，付费授权渐成常态。
5. **质量 vs. 规模的权衡**：DCLM 激进过滤（240T → 3.8T），Nemotron-CC 宽松保留 + 合成改写——没有唯一答案。
6. **流水线高度启发式**：HTML 转文本工具、过滤阈值、数据混比——每个选择都是经验与实验的产物，充满改进空间。

**下一讲预告**：本讲聚焦「**数据从哪来、选哪些**」，[[Lecture 14 · 数据 II]] 深入「**如何处理**」——过滤的统一框架（KenLM/fastText/DSIR）、语言识别与质量/毒性过滤的实操细节、去重算法（精确哈希、Bloom filter、MinHash+LSH）的原理与数值分析。

---

## 复习自测

> [!question]- Q1：WARC 与 WET 有什么区别？为什么 DCLM 等团队宁可自己从 WARC 抽取文本？
> WARC 是爬虫保存的原始 HTTP 响应（含完整 HTML），WET 是官方从 WARC 有损转换出的纯文本。WET 转换丢失了表格、代码块、正文边界等结构信息，混入导航栏/广告等噪音。DCLM 实验显示：用 resiliparse/trafilatura 直接处理 WARC，下游任务准确率比用 WET 高约 2~3 个百分点——上游抽取质量直接决定最终模型表现，且下游无法弥补。

> [!question]- Q2：GPT-3、Gopher、DCLM 在「质量过滤」上的路线有何不同？为什么 DCLM 的 fastText 分类器效果最好？
> GPT-3 用 ML 分类器（正例 = WebText/维基/书籍）；Gopher 反其道用手工规则，理由是避免分类器偏见；DCLM 回归分类器，但换了正例定义——用 OpenHermes-2.5（GPT-4 指令数据）+ ELI5 当正例、RefinedWeb 当负例。它赢在「好数据」的定义对齐了模型的最终用途（清晰解释、指令问答式文本），而不是分类器本身更强大。

> [!question]- Q3：LLaMA 的质量分类器与 CCNet 的 KenLM 过滤，分别用什么当「高质量」的参照？两者的机制差异是什么？
> CCNet 用维基百科文本训练 KenLM n-gram 语言模型，按困惑度打分（生成式：像维基的文本困惑度低）。LLaMA 在 CCNet 基础上再加一个判别式分类器，正例是「被维基百科**引用过**的外部页面」——利用维基编辑的引用行为作为对第三方网页的人工质量背书。前者衡量「文字风格像不像维基」，后者衡量「这个网页值不值得被维基引用」，后者能选出风格多样但可信的内容。

> [!question]- Q4：合理使用（fair use）的四要素是什么？AI 训练主张合理使用时，最强与最弱的论点分别在哪个要素上？
> 四要素：(1) 使用目的与性质（转化性）；(2) 作品性质；(3) 使用量与实质性；(4) 对市场的影响。AI 公司最强的论点在要素 1：训练是高度转化性的（学统计规律而非复制表达）。最弱处在要素 3 与 4：训练完整复制了数百万作品（复制这步本身可能已侵权），且模型输出会实质冲击作者市场。Google Books 判例支持「转化性 + 只展示片段」的组合，但 LLM 能生成完整内容，类比是否成立尚无定论。

> [!question]- Q5：为什么长上下文能力要放在中期训练而非预训练解决？什么样的数据才对长上下文训练有效？
> 注意力计算量随序列长度二次增长，在 15T tokens 的全量预训练中用 100K 窗口是算力灾难；而实验（如 LongLoRA）表明只需在长文档上继续训练相对少量的 tokens，配合位置插值等技巧就能扩展窗口。有效数据必须有**真实的长程依赖**——书籍（PG-19）、长证明（Proof-Pile）里「第 80K token 回收第 2K token 的伏笔/定理」才是训练信号；把短网页随机拼成长序列没有跨段依赖，学不到东西。

---

## 参考资料

- 💻 [lecture_13.py（本讲可执行讲义）](https://github.com/stanford-cs336/spring2025-lectures/blob/main/lecture_13.py)
- 📄 [BERT: Pre-training of Deep Bidirectional Transformers (Devlin et al., 2019)](https://arxiv.org/abs/1810.04805)
- 📄 [Language Models are Unsupervised Multitask Learners / GPT-2 (Radford et al., 2019)](https://cdn.openai.com/better-language-models/language_models_are_unsupervised_multitask_learners.pdf)
- 📄 [CCNet: Extracting High Quality Monolingual Datasets (Wenzek et al., 2019)](https://arxiv.org/abs/1911.00359)
- 📄 [Exploring the Limits of Transfer Learning with T5 / C4 (Raffel et al., 2019)](https://arxiv.org/abs/1910.10683)
- 📄 [Language Models are Few-Shot Learners / GPT-3 (Brown et al., 2020)](https://arxiv.org/abs/2005.14165)
- 📄 [The Pile: An 800GB Dataset of Diverse Text (Gao et al., 2021)](https://arxiv.org/abs/2101.00027)
- 📄 [Scaling Language Models: Methods, Analysis & Insights / Gopher (Rae et al., 2021)](https://arxiv.org/abs/2112.11446)
- 📄 [LLaMA: Open and Efficient Foundation Language Models (Touvron et al., 2023)](https://arxiv.org/abs/2302.13971)
- 📄 [The RefinedWeb Dataset for Falcon LLM (Penedo et al., 2023)](https://arxiv.org/abs/2306.01116)
- 📄 [Dolma: an Open Corpus of Three Trillion Tokens (Soldaini et al., 2024)](https://arxiv.org/abs/2402.00159)
- 📄 [DataComp-LM: In Search of the Next Generation of Training Sets (DCLM) (Li et al., 2024)](https://arxiv.org/abs/2406.11794)
- 📄 [Nemotron-CC: Refining Data at Scale (NVIDIA, 2024)](https://arxiv.org/abs/2410.02801)
- 📄 [OLMo 2: Open Language Model (AI2, 2024)](https://arxiv.org/abs/2411.13026)
- 📄 [Llama 3 Model Card (Meta, 2024)](https://github.com/meta-llama/llama3/blob/main/MODEL_CARD.md)
- 📄 [The Stack: 3 TB of permissively licensed source code (Kocetkov et al., 2022)](https://arxiv.org/abs/2211.15533)
- 📄 [LongLoRA: Efficient Fine-tuning of Long-Context LLMs (Chen et al., 2023)](https://arxiv.org/abs/2309.12307)
- 📄 [Self-Instruct: Aligning LMs with Self-Generated Instructions (Wang et al., 2022)](https://arxiv.org/abs/2212.10560)
- 📄 [Baize: Self-Chat 数据蒸馏 (Xu et al., 2023)](https://arxiv.org/abs/2304.01196)
- 📄 [WizardLM: Evol-Instruct (Xu et al., 2023)](https://arxiv.org/abs/2304.12244)
- 📄 [MAmmoTH2: Scaling Instructions from the Web (Yue et al., 2024)](https://arxiv.org/abs/2405.03548)
- 📄 [Foundation Models and Fair Use (Henderson et al., 2023)](https://arxiv.org/abs/2303.15715)
- 🌐 [Common Crawl 官网](https://commoncrawl.org/)
- 🌐 [The Stack（BigCode）](https://huggingface.co/datasets/bigcode/the-stack)
- 🌐 [FineWeb（HuggingFace）](https://huggingface.co/datasets/HuggingFaceFW/fineweb)
- 🌐 [RedPajama-Data（Together）](https://github.com/togethercomputer/RedPajama-Data)
- 🌐 [Baker McKenzie AI 诉讼追踪](https://www.bakerlaw.com/services/artificial-intelligence-ai/case-tracker-artificial-intelligence-copyrights-and-class-actions/)
- 🌐 [CS336 课程主页](https://stanford-cs336.github.io/spring2025/)
