大规模预训练
大规模预训练(Pre-training)是 LLM 能力的根基。通过在海量文本上学习语言统计规律、世界知识和推理模式,模型在下游任务上展现出强大的迁移能力。本文系统介绍预训练的目标、数据、工程挑战与成本。
预训练目标
主流 LLM 采用两种预训练目标:
因果语言模型(CLM,Causal Language Modeling)
GPT 系列、LLaMA、Qwen、Mistral 等均采用 CLM:
- 目标:给定前缀 Token 序列,预测下一个 Token
- 损失函数:交叉熵,对序列中每个位置的预测取平均
- 注意力:单向因果注意力(下三角掩码),确保位置 t 只能看到位置 1 到 t 的信息
- 优势:天然支持自回归生成;训练与推理解码方式一致
掩码语言模型(MLM,Masked Language Modeling)
BERT、RoBERTa 等编码器模型采用 MLM:
- 目标:随机遮盖 15% 的 Token,利用双向上下文预测被遮盖的词
- 优势:利用双向上下文,对文本理解任务效果好
- 局限:无法直接用于生成
混合目标(部分模型)
T5 采用 Span Corruption,UL2 提出 Mixture of Denoisers(MoD),融合多种预训练目标以提升通用性。
预训练数据来源
高质量、多样化的预训练语料是 LLM 能力的基础。主要数据来源:
网页文本
- Common Crawl:对整个互联网的定期爬虫快照,原始数据规模超过 PB 级,是最大的公开文本来源。经过筛选后通常贡献 60-80% 的预训练 Token
- C4(Colossal Clean Crawled Corpus):Google 从 Common Crawl 清洗出的高质量网页文本,约 750GB
书籍与长文本
- Books1/Books2:GPT-3 训练数据中包含大量版权书籍
- Project Gutenberg:公版书籍,约 7 万册
- The Pile 的 Books3:来自 Z-Library 等来源的书籍集合
书籍内容提供长篇连贯叙事,有助于模型学习长程依赖和深度推理。
代码
- GitHub:从 GitHub 爬取的公开代码仓库
- The Stack:BigCode 项目整理的高质量代码数据集,覆盖 300+ 编程语言
- 代码数据不仅提升代码生成能力,还被认为能提升一般推理能力
学术与专业内容
- Wikipedia(多语言):高质量、事实准确的百科内容
- ArXiv:科学论文预印本(数学、物理、CS 等)
- PubMed:医学文献
- StackExchange:问答社区(编程、数学等多领域)
数据质量过滤
原始爬虫数据充斥着垃圾内容、重复文本、有害信息,必须经过严格过滤:
规则过滤
- 语言识别:保留目标语言的文本,过滤乱码和非文本内容
- 最小长度过滤:去除过短的文档(如仅含导航栏的网页)
- 特殊字符比率:过滤符号/数字占比过高的内容
- 停用词比率:确保文本含有足够的实词
质量评分(困惑度过滤)
- 训练一个小型语言模型(如 KenLM),计算候选文本的困惑度(Perplexity)
- 困惑度过高(文本不流畅)或过低(机械重复)的文本被过滤
- GPT-2 Perplexity 过滤:用 GPT-2 对文本打分,只保留"接近人类写作质量"的文本
内容安全过滤
- 基于关键词黑名单过滤有害内容
- 基于分类器检测色情、暴力、仇恨言论
- URL 黑名单:排除已知垃圾站点
去重(Deduplication)
重复数据会导致模型过拟合特定内容、降低数据有效性:
- 精确去重(Exact Dedup):MD5 哈希匹配,去除完全重复的文档
- 模糊去重(Fuzzy Dedup):MinHash LSH(局部敏感哈希),识别近似重复文档(如新闻转载、复制粘贴变体)
- n-gram 去重:去除与训练集中其他文本高度相似的片段,防止数据集内部重复
数据配比策略
不同来源的数据对模型能力影响不同,需要仔细设计配比(Mixture Ratio):
典型配比示例(基于 LLaMA 3 的公开信息):
- 网页文本(General Web):~50%
- 代码:~17%
- 数学相关:~5%
- 多语言(非英文):~10%
- 书籍与长文本:~8%
- 学术文献:~5%
- 其他高质量来源:~5%
配比策略的关键决策:
- 过多代码数据会降低自然语言流畅度;过少则影响代码能力
- 中文数据量直接决定中文能力,但过多会挤压英文数据质量
- 数学、推理相关数据可提升推理能力,但需与质量过滤结合
训练稳定性
大规模 LLM 训练极易出现不稳定问题,常用稳定化技术:
梯度裁剪(Gradient Clipping)
当梯度范数超过阈值(如 1.0)时,将梯度等比缩放至阈值以内,防止梯度爆炸导致的训练崩溃。
学习率预热(Warmup)
训练开始时学习率从极小值(如 0)线性增长至目标学习率(如 3e-4),通常经过 1000-2000 步预热,随后按余弦或线性调度衰减。
过高的初始学习率在训练早期可能导致参数更新剧烈,引发不可恢复的损失尖峰(Loss Spike)。
精度选择
- BF16(Brain Float 16):大多数现代 LLM 的训练精度,比 FP16 具有更大的数值范围,不易溢出
- FP32 Master Copy:优化器状态(动量、二阶矩)保存为 FP32,确保数值精度
损失尖峰处理
训练过程中偶发的损失尖峰是大模型训练的常见问题:
- 通常通过从最近 Checkpoint 重启并跳过出问题的数据 batch 解决
- LLaMA 3 技术报告记录了训练过程中约 50 次 Checkpoint 重启
训练成本估算
大规模预训练的成本随模型规模急剧增长:
| 模型 | 参数量 | 训练 Token | 估计 GPU/TPU | 估计成本(美元) |
|---|---|---|---|---|
| GPT-3 | 175B | 300B | 约 1000 A100 天 | 约 460 万 |
| LLaMA 3 8B | 8B | 15T | 约 1.3M H100 小时 | 约 150 万 |
| LLaMA 3 70B | 70B | 15T | 约 6.4M H100 小时 | 约 700 万 |
| GPT-4 | 未知(~1T MoE) | 未知 | 未公开 | 估计 >1 亿 |
| DeepSeek-V3 | 671B MoE | 14.8T | 约 2.8M H800 小时 | 约 557 万 |
代表性预训练语料
- The Pile(2.0):EleutherAI 整理的 825GB 多源数据集,完全公开
- RedPajama v2:Together AI 整理的 30T Token 开放数据集(含过滤后的 Common Crawl)
- Dolma:AI2 整理,用于训练 OLMo 系列,完全开源且详细记录数据来源
- FineWeb(Hugging Face):从 Common Crawl 精心过滤的高质量英文网页数据,约 15T Token
这些公开语料集使研究人员可以复现 LLM 训练实验,推动了开源 LLM 的研究透明度。