预训练(Pre-training)¶
预训练是 LLM 训练流程的第一个也是最关键的阶段——在数万亿 Token 的海量文本上,让模型学会语言的语法规则、世界知识和推理模式。预训练阶段的质量决定了模型能力的上限。
预训练的目标:学会"接龙"¶
预训练的核心目标,是让模型学会预测下一个 Token。看似简单的任务,实际上要求模型具备极其深厚的语言理解和知识储备。
为什么预测下一个词需要智能?
要正确预测 "法国的首都是___" 中的下一个词("巴黎"),模型必须学会:
- 语法:知道这里需要填一个名词
- 知识:知道法国的首都是巴黎
- 推理:理解"首都"这个概念的指向关系
当训练数据足够多、模型足够大时,模型会自动涌现出这些能力,而无需人工标注。
语言建模目标¶
因果语言模型(Causal Language Model, CLM)¶
CLM 是目前 Decoder-Only 模型(GPT 系列、LLaMA 等)的标准训练目标。
核心思想: 从左到右,根据前面的所有词预测下一个词。
训练时的具体操作:
模型看到"今天",要预测"天气";看到"今天 天气",要预测"很";以此类推。每一步都只能看到左边的上下文,看不到右边(通过因果掩码实现)。
为什么 CLM 适合生成?
因为预训练目标和推理时的行为完全一致——都是从左到右逐个生成 Token。训练和推理的一致性让模型的生成能力最为自然流畅。
掩码语言模型(Masked Language Model, MLM)¶
MLM 是 Encoder-Only 模型(BERT 等)的训练目标。
核心思想: 随机遮住句子中约 15% 的 Token,让模型根据双向上下文去猜被遮住的词。
MLM vs CLM
- MLM 能看到双向上下文(前后都看),理解能力更强
- 但 MLM 不擅长生成,因为推理时没有
[MASK]可以填 - CLM 只能看左边,但天然适合逐字生成文本
Seq2Seq 语言模型¶
Encoder-Decoder 模型(T5、BART 等)的训练目标,结合了两者的思路:
- 编码器:双向理解输入
- 解码器:从左到右生成输出
T5 将所有 NLP 任务统一为"文本到文本"的格式:
Scaling Laws:规模决定能力¶
OpenAI Scaling Laws(2020)¶
OpenAI 通过大量实验发现,模型性能(损失 \(L\))与三个因素之间存在简洁的幂律关系:
其中 \(N\) = 参数量,\(D\) = 数据量,\(C\) = 计算量。
核心结论:
- 参数量、数据量、计算量三者中,任何一个增加都能降低损失
- 在固定计算预算下,应该优先增大模型,数据量相对可以少一点
- 性能提升是平滑且可预测的——可以用小模型的表现推算大模型的能力
Chinchilla Scaling Laws(2022)¶
DeepMind 对 OpenAI 的结论进行了修正,提出了更省钱的结论:
Chinchilla 核心发现
在固定计算预算下,模型参数量和训练数据量应该等比例增加。具体来说,最优的训练 Token 数约为模型参数量的 20 倍。
| 对比 | OpenAI 建议 | Chinchilla 建议 |
|---|---|---|
| 模型 vs 数据 | 优先增大模型 | 两者等比增长 |
| 70B 模型所需数据 | ~300B Token | ~1.4T Token |
| 典型案例 | GPT-3(175B 参数,300B Token) | Chinchilla(70B 参数,1.4T Token) |
Chinchilla 用更小的模型、更多的数据,达到了与 GPT-3 相当甚至更好的效果,证明了数据的重要性被严重低估。
后 Chinchilla 时代:数据为王¶
受 Chinchilla 启发,后续的 LLaMA、Qwen 等模型纷纷采用了小模型 + 海量数据的策略:
| 模型 | 参数量 | 训练 Token 数 | Token/参数比 |
|---|---|---|---|
| GPT-3 | 175B | 300B | 1.7× |
| Chinchilla | 70B | 1.4T | 20× |
| LLaMA 2 (70B) | 70B | 2T | 29× |
| LLaMA 3 (70B) | 70B | 15T | 214× |
可以看到,训练数据量的增长远远超过了 Chinchilla 的建议,说明在实践中更多的数据总是有益的。
预训练数据¶
数据来源¶
LLM 的预训练数据通常来自多种来源的混合:
| 数据来源 | 特点 | 代表数据集 |
|---|---|---|
| 网页爬取 | 量最大,但质量参差不齐 | Common Crawl、C4 |
| 书籍 | 质量高、内容完整连贯 | Books3、Gutenberg |
| 学术论文 | 专业知识丰富 | arXiv、Semantic Scholar |
| 代码 | 提升推理和编程能力 | GitHub、The Stack |
| 百科全书 | 知识性强、结构清晰 | Wikipedia |
| 对话/论坛 | 口语化、多样性强 | Reddit、StackOverflow |
数据处理流程¶
原始数据不能直接用于训练,需要经过严格的清洗和处理:
graph LR
A["原始数据<br>(PB 级)"] --> B["语言识别<br>& 过滤"]
B --> C["去重<br>(MinHash)"]
C --> D["质量过滤<br>(启发式规则 / 分类器)"]
D --> E["有害内容<br>移除"]
E --> F["清洗后数据<br>(TB 级)"]
关键步骤:
- 去重(Deduplication):网页中存在大量重复内容,不去重会导致模型"记住"这些内容而非真正理解
- 质量过滤:移除乱码、广告、机器生成的低质量文本
- 有害内容过滤:移除色情、暴力、仇恨言论等不良内容
- 数据配比:不同来源的数据按比例混合,平衡知识的广度和深度
数据质量 > 数据数量
研究反复证明,更干净、更高质量的少量数据往往比粗制滥造的海量数据更有效。LLaMA 3 的成功很大程度上归功于其极其严格的数据清洗流程。
预训练的工程挑战¶
分布式训练¶
单块 GPU 根本装不下一个大模型。训练 LLaMA-70B 需要约 140GB 显存(FP16),而单块 A100 只有 80GB。因此必须采用分布式训练:
| 并行策略 | 核心思想 | 适用场景 |
|---|---|---|
| 数据并行(DP) | 每块 GPU 持有完整模型副本,分摊不同数据 | 模型能放进单卡 |
| 模型并行(TP) | 将模型的每一层切分到多块 GPU | 单层太大,一块卡放不下 |
| 流水线并行(PP) | 将模型的不同层放到不同 GPU | 层数太多 |
| ZeRO | 将优化器状态、梯度、参数分散存储 | 内存优化 |
实际训练通常采用 3D 并行(DP + TP + PP 的组合),使用数千块 GPU。
训练稳定性¶
大模型训练极易出现各种不稳定问题:
- Loss Spike:训练过程中损失突然飙升,可能需要回退到之前的 checkpoint 重新训练
- 梯度爆炸/消失:需要精心设计的学习率调度和梯度裁剪
- 硬件故障:数千块 GPU 跑几个月,硬件故障几乎是必然的,需要高效的故障恢复机制
学习率调度¶
大模型训练通常采用 Warmup + Cosine Decay 的学习率策略:
- Warmup:从极小的学习率开始,线性增大到峰值(通常占训练的 0.1%~1%)
- Cosine Decay:按余弦曲线平滑衰减到接近 0
预训练后的模型:Base Model¶
经过预训练的模型称为 Base Model(基座模型)。它具备了强大的语言能力和丰富的世界知识,但还不太"听话"——
Base Model 的典型行为
输入: "请问法国的首都是哪里?"
Base Model 可能输出: "请问德国的首都是哪里?请问意大利的首都是哪里?..."
它不会"回答问题",而是"继续列举类似的问题"——因为它训练时学的就是"接龙"。
要让 Base Model 变成能好好回答问题的 Chat Model,还需要经过后续的 监督微调(SFT) 和 人类对齐(RLHF/DPO) 阶段。
→ 详见 📒 微调与对齐