工作台课程

CS336 · 从零构建语言模型

Lecture 13 · 数据 I

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)与语言分布

说明

  1. 竞争动力学:数据策展是护城河,公开等于送对手配方。架构上大家都是 Transformer 变体(见 Lecture 3 · 架构与超参数),真正拉开差距的是数据。
  2. 版权责任:训练数据可能含版权作品(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

三个阶段的目标

  1. 预训练(Pre-training):用海量原始文本(网页、维基百科、书籍)训练出基座模型,学习语言统计规律与世界知识。
  2. 中期训练(Mid-training):继续训练,但换成高质量数据(代码、数学论文、长文档),增强特定能力。
  3. 后训练(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 链接的质量信号有效。

注意

  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 及各基准测试集重叠的内容,避免数据污染。

说明

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 条的四要素判定:

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

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

AI 训练的攻防

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

注意

  1. 复制即侵权:把数据抓下来存到训练服务器上,这第一步在法律上就可能已构成侵权,与之后是否训练、是否输出无关。
  2. 版权不等于逐字记忆:情节与角色(如哈利·波特)也可受保护——就算模型不逐字背诵,复述受保护的情节仍可能侵权;反过来,戏仿(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 clone1.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/>质量 > 数量

核心要点

  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)的原理与数值分析。


复习自测

题目

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 的伏笔/定理」才是训练信号;把短网页随机拼成长序列没有跨段依赖,学不到东西。


参考资料