预训练与数据工程
数据是 LLM 的基础,"Data is what makes LLMs work"。
预训练数据来源
- 网页数据:Common Crawl(每月抓取数十亿网页,是绝大多数 LLM 的基础语料)、维基百科(高质量结构化知识)、书籍、学术论文(ArXiv)、代码(GitHub)
- 中文数据源:百度百科、知乎、豆瓣、微信公众号文章合集
数据清洗与过滤
- 质量过滤:
- 语言检测:使用 fastText 或 langdetect 等工具识别语种,保留目标语言
- 困惑度过滤:用现成语言模型评估文本质量,去除高困惑度(低质量)文本
- 垃圾内容过滤:去除 SEO 堆砌、机器生成、无意义重复内容
- 安全过滤:
- PII(个人信息)脱敏:去除或替换邮箱、电话号码、身份证号、银行卡号等
- 有害内容移除:暴力、色情、仇恨言论等内容的检测与过滤
- 去重(Deduplication):
- 精确去重:Exact Match(URL 去重、文档哈希去重,如 SHA-1 计算文档指纹)
- 模糊去重:MinHash LSH(局部敏感哈希)近似去重,用于检测内容高度相似但不完全相同的文档
- 子串去重:去除重复段落(在文档级和段落级使用后缀数组或 Bloom Filter)
- 模板去除:去除网页中的导航栏、广告、版权声明、评论区等非正文模板内容
数据配比
- 不同来源数据的比例至关重要,直接决定模型的行为和能力偏向
- LLaMA 数据配比示例:
| 数据来源 | 占比 |
|---|---|
| CommonCrawl | 67% |
| C4 | 15% |
| Wikipedia | 4.5% |
| Books | 4.5% |
| GitHub | 4.5% |
| ArXiv | 2.5% |
| StackExchange | 2% |
- 影响:配比影响模型的知识分布和能力侧重。提高代码和数学数据比例可增强推理能力;提高书籍和维基百科比例可增强常识和语言能力;多语种配比影响模型的多语言能力
Tokenization 分词
BPE(Byte-Pair Encoding)
最常用的子词分词算法,被 GPT、GPT-2、BART 等模型使用。
流程:
- 将文本拆分为字符
- 统计相邻字符对(pair)的频率
- 合并频率最高的字符对为一个新的子词单元
- 重复步骤 2-3,直到达到预设词汇量
优点:
- 可以有效处理未登录词(OOV),将罕见词拆分为更小的子词单元
- 词汇表大小可控,平衡嵌入层参数量和分词粒度
WordPiece
BERT 使用的分词方法,与 BPE 类似但有重要区别。
- 合并标准基于互信息(似然增加),而非单纯的频率
- 选择合并后能使整体语料似然增加最大的字符对
- 使用
##前缀标记非词首的子词(如 "playing" → "play" + "##ing")
SentencePiece
Google 开发的语言无关分词库,被 LLaMA、Mistral、Gemma 等模型使用。
- 将文本直接视为 Unicode 字符序列,不需要预分词(不依赖空格分隔)
- 支持 BPE 和 Unigram 两种分词模式
- Unigram 模式:基于概率模型,通过 EM 算法迭代学习最佳分词
- 关键特性:bytes 模式对所有字符开放,确保可以编码任意 Unicode 字符,从根本上解决 OOV 问题
各种分词器对比
| 特性 | GPT-2 Tokenizer | BERT WordPiece | SentencePiece BPE | SentencePiece Unigram |
|---|---|---|---|---|
| 基础算法 | BPE | WordPiece | BPE | Unigram |
| 预分词 | 需要(基于空格) | 需要(基于空格) | 不需要 | 不需要 |
| 词汇表大小 | 50,257 | 30,000 | 通常 32K-128K | 通常 32K-128K |
| OOV 处理 | 子词拆分 | 子词拆分(##) | bytes 回退 | bytes 回退 |
| 典型模型 | GPT-2, GPT-3 | BERT | LLaMA, Mistral | T5, XLNet |
分词的影响
- 词汇量大小:词汇量越大,嵌入层参数量越多,影响模型整体参数量和推理速度
- 分词粒度:粒度太粗(词汇量大)导致嵌入矩阵过大;粒度太细(词汇量小)导致序列变长,计算复杂度上升
- 多语言效率:
- 中文每个字符通常映射为一个 token,相同语义内容下序列长度远长于英文,导致训练和推理效率降低
- 英文单词平均约 1.3 个 token,中文每个字约 1 个 token,但表达相同含义所需 token 数中文多 2-3 倍
- 一些模型通过增加中文字符的 token 覆盖率来缓解此问题
预训练数据处理管线
以 Common Crawl 为例的完整预处理流程:
下载 Common Crawl 数据
↓
语言检测(fastText 识别语种)
↓
质量过滤(困惑度、长度、重复率)
↓
去重(精确去重 + MinHash LSH + 子串去重)
↓
PII 移除(邮箱、电话、身份证等)
↓
模板去除(导航栏、广告、版权等)
↓
分词(BPE / WordPiece / SentencePiece)
↓
预训练总结
预训练数据的质量和处理方式直接决定了 LLM 的能力上限。高质量的数据清洗和去重可以显著提升模型性能,合理的数据配比决定了模型的知识结构和能力侧重。分词策略则在序列长度和词汇覆盖率之间做出权衡,影响模型的训练效率和推理速度。数据工程是构建优秀 LLM 的基石,值得投入大量精力进行精细化的处理与优化。