跳转至

预训练(Pre-training)

预训练是 LLM 训练流程的第一个也是最关键的阶段——在数万亿 Token 的海量文本上,让模型学会语言的语法规则、世界知识和推理模式。预训练阶段的质量决定了模型能力的上限。


预训练的目标:学会"接龙"

预训练的核心目标,是让模型学会预测下一个 Token。看似简单的任务,实际上要求模型具备极其深厚的语言理解和知识储备。

为什么预测下一个词需要智能?

要正确预测 "法国的首都是___" 中的下一个词("巴黎"),模型必须学会:

  • 语法:知道这里需要填一个名词
  • 知识:知道法国的首都是巴黎
  • 推理:理解"首都"这个概念的指向关系

当训练数据足够多、模型足够大时,模型会自动涌现出这些能力,而无需人工标注。


语言建模目标

因果语言模型(Causal Language Model, CLM)

CLM 是目前 Decoder-Only 模型(GPT 系列、LLaMA 等)的标准训练目标。

核心思想: 从左到右,根据前面的所有词预测下一个词。

\[P(x_1, x_2, \ldots, x_n) = \prod_{t=1}^{n} P(x_t \mid x_1, x_2, \ldots, x_{t-1})\]

训练时的具体操作:

输入:  "今天 天气 很 好 适合"
标签:  "天气 很 好 适合 出门"

模型看到"今天",要预测"天气";看到"今天 天气",要预测"很";以此类推。每一步都只能看到左边的上下文,看不到右边(通过因果掩码实现)。

为什么 CLM 适合生成?

因为预训练目标和推理时的行为完全一致——都是从左到右逐个生成 Token。训练和推理的一致性让模型的生成能力最为自然流畅。

掩码语言模型(Masked Language Model, MLM)

MLM 是 Encoder-Only 模型(BERT 等)的训练目标。

核心思想: 随机遮住句子中约 15% 的 Token,让模型根据双向上下文去猜被遮住的词。

原句:  "我 喜欢 吃 苹果 和 香蕉"
输入:  "我 [MASK] 吃 苹果 和 [MASK]"
标签:  预测 [MASK] → "喜欢" 和 "香蕉"

MLM vs CLM

  • MLM 能看到双向上下文(前后都看),理解能力更强
  • 但 MLM 不擅长生成,因为推理时没有 [MASK] 可以填
  • CLM 只能看左边,但天然适合逐字生成文本

Seq2Seq 语言模型

Encoder-Decoder 模型(T5、BART 等)的训练目标,结合了两者的思路:

  • 编码器:双向理解输入
  • 解码器:从左到右生成输出

T5 将所有 NLP 任务统一为"文本到文本"的格式:

输入:  "翻译成英文:我喜欢人工智能"
输出:  "I love artificial intelligence"

Scaling Laws:规模决定能力

OpenAI Scaling Laws(2020)

OpenAI 通过大量实验发现,模型性能(损失 \(L\))与三个因素之间存在简洁的幂律关系

\[L(N) \propto N^{-0.076}$$ $$L(D) \propto D^{-0.095}$$ $$L(C) \propto C^{-0.050}\]

其中 \(N\) = 参数量,\(D\) = 数据量,\(C\) = 计算量。

核心结论:

  1. 参数量、数据量、计算量三者中,任何一个增加都能降低损失
  2. 在固定计算预算下,应该优先增大模型,数据量相对可以少一点
  3. 性能提升是平滑且可预测的——可以用小模型的表现推算大模型的能力

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 级)"]

关键步骤:

  1. 去重(Deduplication):网页中存在大量重复内容,不去重会导致模型"记住"这些内容而非真正理解
  2. 质量过滤:移除乱码、广告、机器生成的低质量文本
  3. 有害内容过滤:移除色情、暴力、仇恨言论等不良内容
  4. 数据配比:不同来源的数据按比例混合,平衡知识的广度和深度

数据质量 > 数据数量

研究反复证明,更干净、更高质量的少量数据往往比粗制滥造的海量数据更有效。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 的学习率策略:

  1. Warmup:从极小的学习率开始,线性增大到峰值(通常占训练的 0.1%~1%)
  2. Cosine Decay:按余弦曲线平滑衰减到接近 0
\[\eta_t = \eta_{\min} + \frac{1}{2}(\eta_{\max} - \eta_{\min})\left(1 + \cos\left(\frac{t - T_w}{T - T_w} \cdot \pi\right)\right)\]

预训练后的模型:Base Model

经过预训练的模型称为 Base Model(基座模型)。它具备了强大的语言能力和丰富的世界知识,但还不太"听话"——

Base Model 的典型行为

输入: "请问法国的首都是哪里?"

Base Model 可能输出: "请问德国的首都是哪里?请问意大利的首都是哪里?..."

它不会"回答问题",而是"继续列举类似的问题"——因为它训练时学的就是"接龙"。

要让 Base Model 变成能好好回答问题的 Chat Model,还需要经过后续的 监督微调(SFT)人类对齐(RLHF/DPO) 阶段。

→ 详见 📒 微调与对齐