预训练、领域继续预训练与后训练链条的起点
1. 预训练的核心思想
预训练(Pretraining)是大型语言模型(LLM)能力构建的根基。其核心思想是在海量无标注数据上,通过自监督学习任务,学习通用的语言表征与生成能力。
预训练之所以有效,是因为:
- 语言本身是结构化的:无论是文本、代码还是数学表达式,都遵循一定的语法和语义规律。无监督地接触大量文本,可以让模型自动学到这些规律。
- 通用表征的迁移性:在海量数据上学习到的表征具有通用性,可以迁移到各种下游任务中。
- 压缩即理解:模型需要将海量的语言知识压缩到模型参数中,这个压缩过程本身就是对语言的理解。
预训练的目标不是让模型记住具体的文本内容,而是让模型学会生成符合语言规律的文本的能力。这种能力体现在:
- 语法正确性:生成符合目标语言语法规则的句子
- 语义连贯性:生成在上下文中有意义的文本
- 世界知识:记住或推理出关于世界的各种事实
- 推理能力:进行多步推理来回答问题或完成复杂任务
2. 语言模型预训练目标
2.1 自回归语言建模(Autoregressive Language Modeling)
自回归语言建模是目前最主流的预训练目标,也是 GPT 系列模型的核心方法。
给定一个文本序列
其中
数学推导:从最大似然到交叉熵损失
语言模型参数
取负对数似然并除以序列长度,得到平均负对数似然损失:
在实践中,通常直接使用交叉熵损失来实现等效的目标。将真实标签记为
由于
token 概率与条件概率的链式分解
根据概率论的链式法则,序列的联合概率可以分解为条件概率的乘积:
取对数得到:
这正是自回归语言模型优化的目标函数。通过最大化所有 token 的条件概率对数和,我们实际上是在最大化整个序列的联合概率。
Teacher Forcing 训练方式
在训练阶段,自回归语言模型采用 Teacher Forcing 策略:
- 模型的输入是整个序列的 prefix(
) - 但损失只反向传播到当前 token 的预测位置
- 不论模型在前面的预测是否正确,都以真实的前缀作为输入
具体流程:
- 输入序列
通过 embedding 层得到 - 经过 Transformer 层处理得到隐藏状态
- 每个位置
的输出 logits 经过 softmax 得到概率分布 - 计算损失
- 对所有位置的损失求和或平均得到最终损失
Teacher Forcing 的优势是训练效率高(可以并行计算所有位置的预测),缺点是存在 exposure bias 问题(训练时模型看到的是真实前缀,推理时生成的是模型自己的预测)。
2.2 掩码语言建模(Masked Language Modeling, MLM)
掩码语言建模是 BERT 等模型使用的预训练目标,与自回归建模有本质不同。
核心思想:随机遮盖输入序列中的某些 token,模型需要根据上下文(双向)预测被遮盖的 token。
典型的掩码比例是 15%,其中:
- 80% 替换为
[MASK]token - 10% 替换为随机 token
- 10% 保持不变
与自回归的对比:
| 特性 | 自回归 LM | 掩码 LM |
|---|---|---|
| 建模方向 | 单向(从左到右或从右到左) | 双向 |
| 训练目标 | ||
| 代表模型 | GPT 系列 | BERT |
| 适合任务 | 生成任务 | 理解任务(分类、NER等) |
| 推理效率 | 慢(自回归生成) | 快(无需自回归) |
MLM 本质上是一个去噪自编码器(Denosing Autoencoder),它的损失函数为:
其中
由于 MLM 预训练的模型(如 BERT)不是生成式的,在 LLMs 时代,主流的预训练方法仍然是自回归语言建模。
3. 预训练的规模法则(Scaling Laws)
神经语言模型的性能与模型规模、数据规模和计算量之间存在明确的幂律关系(Power Law)。
GPT-4 论文和 Chinchilla 论文给出的规模法则:
其中
Kaplan 等人(2020)发现的规模法则:
其中
Chinchilla 法则:对于给定的计算预算
其中
实际意义:
- 模型太小、数据太少都会导致欠拟合
- 模型太大、数据太少会导致训练不充分
- 盲目增大模型而不增大数据会导致性能提升不显著
4. 从头预训练 vs 继续预训练
4.1 基本概念
从头预训练(From Scratch Pretraining):从随机初始化的参数开始,在大规模通用语料上进行预训练。这是训练全新模型时的流程。
继续预训练(Continued Pretraining):在一个已经预训练好的模型基础上,用特定领域的数据继续训练。也称为 Domain-Adaptive Pretraining 或 Continued Pretraining。
4.2 为什么继续预训练能注入领域知识
继续预训练之所以有效,有以下几个关键原因:
-
参数空间的继承性:模型已经在通用数据上学到了语言的基本规律(语法、语义、推理能力),继续预训练是在这个良好的参数空间基础上微调,而非从零开始。模型在领域数据上的 fine-tune,本质上是在已有知识的基础上进行修改。
-
领域分布的注入:通用预训练的数据分布往往是 broad 的(如 Common Crawl、Wikipedia、Books)。继续预训练将模型的知识分布从通用分布拉向特定领域分布。数学上,这相当于在条件概率空间中进行分布变换:
- 隐式编码的领域知识:模型的参数编码了丰富的知识,继续预训练会在模型的隐层激活中形成针对特定领域的”专家模式”。
4.3 为什么继续预训练不是简单”再训一遍”
继续预训练和从头预训练看似都是”在数据上训练”,但有本质区别:
| 方面 | 从头预训练 | 继续预训练 |
|---|---|---|
| 起点 | 随机初始化 | 预训练好的 checkpoint |
| 训练数据 | 需要海量通用数据(数 TB) | 可以用较小的领域数据(数 GB ~ 数 TB) |
| 学习率 | 需要从零调试 | 通常用比较小的学习率 |
| 训练稳定性 | 容易不稳定,需要 warm-up | 相对稳定,但仍需注意 |
| 知识保留 | 无需考虑 | 需要考虑灾难性遗忘 |
| 目标 | 学习通用语言能力 | 注入领域知识同时保留通用能力 |
继续预训练不是简单地在领域数据上”再训一遍”,而是在保持原有能力的同时注入新知识。这要求更细致的训练策略设计。
5. 继续预训练的问题与挑战
5.1 数据分布漂移(Data Distribution Drift)
当模型在领域数据上继续训练时,如果领域数据分布与通用数据分布差异过大,可能导致模型能力的偏移:
- 通用能力退化:模型在通用任务上的表现下降(如问答、推理能力变差)
- 领域偏移:模型可能过度适应领域数据的特定模式,导致生成风格与领域过于紧密
缓解策略:
- 使用较小的学习率
- 混合适用通用数据和领域数据(通常领域数据占 5%~30%)
- 在领域数据上进行轻量级继续训练
5.2 灾难性遗忘(Catastrophic Forgetting)
灾难性遗忘是指模型在学习新知识时,完全或部分丢失了之前学到的知识。在继续预训练中,这是一个核心挑战。
数学视角:令
但这个目标可能导致
缓解策略:
-
正则化方法:在损失中加入参数距离正则项
-
弹性权重固化(Elastic Weight Consolidation, EWC):对不同参数施加不同的 penalty,重要参数 penalty 大
-
记忆 replay:在训练过程中混入少量原始预训练数据
-
早停(Early Stopping):监控验证集上的通用能力指标,及时停止领域继续训练
5.3 领域过拟合(Domain Overfitting)
如果继续训练数据过于单一(如只在医学文献上训练),模型可能过拟合到领域的特定风格或术语,而丧失对其他表达方式的理解。
症状:
- 在领域内评测表现极好
- 但在通用评测或领域外数据上表现显著下降
- 生成的文本过于”领域化”,缺乏通用性
缓解策略:
- 数据多样化:领域数据内部也要保持多样性
- 控制训练步数:避免过度训练
- 保持数据 mix:混入通用数据
6. 工程流程
6.1 预训练数据构建
6.1.1 数据来源与类型
通用预训练数据主要来源:
| 数据源 | 特点 | 规模 |
|---|---|---|
| Common Crawl | 海量、噪音大、需要清洗 | ~数十 TB |
| Wikipedia | 高质量、多语言 | ~数十 GB |
| Books | 长文本、叙事性强 | ~数十 GB |
| GitHub | 代码、结构化 | ~数百 GB |
| Reddit/StackExchange | 对话/问答、高质量 | ~数十 GB |
| C4 | 清洗后的 Common Crawl | ~数百 GB |
领域继续预训练数据来源:
| 领域 | 数据来源 |
|---|---|
| 医学 | PubMed 论文、医学教科书、临床指南 |
| 法律 | 裁判文书、法律条文、合同文本 |
| 金融 | 财报、新闻、分析师报告 |
| 科学 | arXiv 论文、科研数据集 |
| 代码 | GitHub 仓库、代码问答 |
6.1.2 数据清洗流程
-
启发式规则过滤:
- 去除非目标语言文本(使用语言检测工具如 langdetect)
- 去除过短或过长的文档(一般设 100~5000 characters)
- 去除特殊字符过多或格式混乱的文本
-
质量评分与过滤:
- 使用 perplexity 或 语言模型打分过滤低质量文本
- 使用成人内容分类器过滤有害内容
- 使用垃圾信息检测器过滤广告等低价值内容
-
去重(Deduplication):
- 句子级去重:去除完全重复的句子
- 文档级去重:使用 MinHash 或 SimHash 计算文档相似度,去除高度相似的文档
- 子串去重:去除包含过长相同子串的文档(防止模板化生成)
-
数据打标(Annotation):
- 使用模型或规则为数据打领域标签、质量标签等
- 便于后续的分层采样
6.1.3 分桶与采样策略
分桶(Bucketing):将数据按某种维度(如文档长度、领域、质量分数)分到不同的桶中。
采样策略:
-
均匀采样(Uniform Sampling):每个文档被采样的概率相同。简单但可能导致低质量数据过度采样。
-
质量加权采样(Quality-Weighted Sampling):根据质量分数调整采样概率:
其中 是超参数,控制采样分布的尖锐程度。 -
领域混合采样(Domain Mixing):在继续预训练中,通常需要在领域数据和通用数据之间平衡:
通常领域数据占比 5%~30% 为宜。 -
温度采样(Temperature Sampling):在质量分布上应用温度:
其中 使分布更平滑, 使分布更尖锐。
训练时的动态采样:
- 每个 epoch 重新计算采样权重
- 在线混洗(online shuffling)避免模型看到有序的领域聚类
- 控制每个领域在单个 batch 中的比例
6.2 Tokenizer 与词表
Tokenizer 的选择:
Tokenizer 将原始文本转换为 token 序列。常见的 Tokenizer 类型:
| 类型 | 特点 | 代表 |
|---|---|---|
| WordPiece | 子词级别、BPE 变体 | BERT |
| BPE | 字节级合并 | GPT-2 |
| SentencePiece | 语言无关、支持 UNK | LLaMA |
| Word-level | 词级别 | 早期模型 |
词表是否需要改变:
| 场景 | 是否需要新词表 | 说明 |
|---|---|---|
| 通用预训练 | 通常需要 | 根据语言特点定制词表 |
| 领域继续预训练(通用 tokenizer) | 不需要 | 通用 tokenizer 通常已覆盖足够词汇 |
| 领域继续预训练(领域特殊 token) | 可能需要添加 | 如添加 < medicine > 等特殊 token |
添加领域特殊 token 的方法:
- 直接在 tokenizer 词表中添加新 token(推荐)
- 使用特殊的前缀 token 标记领域
- 在 embedding 层添加额外维度(不推荐,增加复杂度)
注意事项:
- 新增 token 数量不宜过多(一般 < 1000)
- 新增 token 需要在预训练数据中充分出现
- 如果领域有大量未登录词(OOV),考虑扩展词表
6.3 预训练超参数策略
6.3.1 学习率(Learning Rate)
预训练学习率策略:
-
学习率曲线:通常使用 cosine annealing 或 linear decay with warm-up:
- Warm-up:1%~10% 的训练步数,学习率从很小逐渐增加到峰值
- 峰值学习率:通常在
到 之间(取决于模型大小) - Annealing:cosine 或 linear 衰减到峰值的 10%~100%
-
模型规模与学习率的关系(经验法则):
其中 是模型参数数量。 -
从头预训练 vs 继续预训练:
- 从头预训练:需要较大学习率和更长的 warm-up
- 继续预训练:学习率通常为首轮预训练的 10%~50%
6.3.2 Batch Size
Batch Size 的设置:
| 训练阶段 | Batch Size(tokens) | 说明 |
|---|---|---|
| 小模型预训练 | 0.5M ~ 4M | 模型较小,可以用较小 batch |
| 大模型预训练 | 4M ~ 16M | 需要大 batch 保证训练稳定 |
| 继续预训练 | 1M ~ 4M | 通常比从头预训练小 |
Batch Size 与学习率的关系: 通常遵循线性 scaling 规则:batch size 翻倍,学习率也可以适当增加。
6.3.3 训练步数(Training Steps)
训练步数的估算:
给定模型参数数量
对于 7B 模型,建议训练约 140B tokens。
继续预训练的步数:
| 场景 | 训练 tokens 数 | 说明 |
|---|---|---|
| 轻度领域适应 | 1B ~ 10B | 领域数据有限或希望保持通用能力 |
| 中度领域适应 | 10B ~ 50B | 有较多领域数据 |
| 重度领域定制 | 50B ~ 200B | 领域非常专业,如医学、法律 |
早停策略:
- 监控验证集困惑度
- 监控领域相关 benchmark
- 设置 patience(如 1000 步无提升则停止)
6.3.4 Checkpoint 管理
Checkpoint 类型:
-
Full Checkpoint:保存模型全部参数
- 存储量大(7B 模型约 14GB)
- 可以直接恢复训练
-
Distributed Checkpoint(DCP):分片保存,便于大模型并行恢复
-
Adapter Checkpoint(PEFT 场景):只保存 adapter 参数
保存策略:
- 定期保存:每 1000~10000 步保存一次
- 最佳模型保存:验证集性能提升时保存
- 保守策略:保存最近 N 个 checkpoint,防止存储溢出
6.4 评测策略
6.4.1 预训练评测指标
| 指标 | 说明 | 理想值 |
|---|---|---|
| 验证集困惑度(Val Perplexity) | 模型对验证集的预测不确定度 | 越低越好 |
| 验证集损失(Val Loss) | 交叉熵损失的验证集均值 | 越低越好 |
| Bits-per-character (BPC) | 困惑度的对数形式 | 越低越好 |
6.4.2 领域继续预训练评测
通用能力评测(确保不遗忘):
- MMLU(多任务语言理解)
- Hellaswag(常识推理)
- ARC(推理挑战)
- GSM8K(数学推理)
领域能力评测(确保学到领域知识):
| 领域 | 评测集 |
|---|---|
| 医学 | MedQA, MedMCQA |
| 法律 | Bar Exam, LexGLUE |
| 代码 | HumanEval, MBPP |
| 科学 | ScienceQA, ARC-Challenge |
评测频率:
- 每 1000~5000 步在评测集上评测一次
- 保存最佳 checkpoint
7. 预训练与后训练的边界
7.1 训练阶段划分
预训练阶段 (Pretraining)
↓
├── 从头预训练 (Pretraining from Scratch)
│ └── 学习通用语言能力
│
└── 继续预训练 (Continued Pretraining)
├── 领域继续预训练 (Domain-Adaptive Pretraining)
└── 风格/能力继续预训练 (Skill-Adaptive Pretraining)
后训练阶段 (Post-Training)
↓
├── 监督微调 (Supervised Fine-Tuning, SFT)
├── 奖励模型训练 (Reward Modeling)
├── 人类反馈强化学习 (RLHF / RLAIF)
└── 模型对齐 (Alignment)
7.2 各阶段的核心差异
| 阶段 | 目标 | 数据类型 | 数据规模 | 学习率 |
|---|---|---|---|---|
| 从头预训练 | 学习通用语言能力 | 无监督文本 | 数十 TB | 较大 |
| 继续预训练 | 注入领域知识 | 无监督领域文本 | 数 TB | 中等 |
| SFT | 学习任务能力 | 有监督任务数据 | 数千 ~ 数百万条 | 较小 |
| RLHF | 对齐人类偏好 | 偏好数据 | 数千 ~ 数十万条 | 很小 |
7.3 判断标准:什么时候用继续预训练
适合使用继续预训练的场景:
- 领域知识缺失:模型在特定领域的问答或任务上表现差,需要注入领域知识
- 领域术语不熟悉:领域有大量专业术语,通用模型对这些术语的理解不准确
- 领域风格需要:生成的文本需要符合特定领域的风格(如法律文书、医学报告)
- 数据可获取:能够获取到足够多(至少数 GB)的领域文本数据
不适合使用继续预训练的场景:
- 任务定义明确:如果下游任务是明确的分类、问答等,可以直接用 SFT
- 数据有限:如果领域数据不足(< 1GB),继续预训练效果可能有限
- 通用能力优先:如果需要在保持强大通用能力的同时快速学习领域知识,可能需要 LoRA 等 PEFT 方法
- 实时性要求高:继续预训练需要大量计算,如果需要快速适应,few-shot 或 retrieval 更合适
8. 对比总结
8.1 从头预训练 vs 继续预训练
| 维度 | 从头预训练 | 继续预训练 |
|---|---|---|
| 起点 | 随机初始化参数 | 预训练好的 checkpoint |
| 数据需求 | 海量通用数据(数十 TB) | 领域数据(数 GB ~ 数 TB) + 少量通用数据 |
| 计算成本 | 极高(数百万 GPU 小时) | 中等(数千 ~ 数万 GPU 小时) |
| 训练时间 | 数周 ~ 数月 | 数天 ~ 数周 |
| 学习率 | 较大,需要 warm-up | 较小(首轮的 10%~50%) |
| 知识保留 | 无需考虑 | 需要考虑灾难性遗忘 |
| 训练稳定性 | 较难,容易 loss spike | 相对稳定 |
| 数据构建复杂度 | 高(需要大规模采集、清洗、去重) | 中等(领域数据相对集中) |
| Tokenizer | 通常需要定制 | 通常复用通用 tokenizer |
| 评测重点 | 通用能力基准 | 领域能力 + 通用能力不下降 |
| 适用场景 | 训练全新模型 | 领域适应、模型定制 |
| 典型模型 | GPT-3, LLaMA, PaLM | 医学大模型、法律大模型 |
| 风险 | 训练不收敛、loss spike | 领域过拟合、灾难性遗忘 |
| 恢复训练 | 需要完整 checkpoint | 可以从 mid-checkpoint 恢复 |
8.2 领域继续预训练流程清单
阶段一:数据准备
- 确定目标领域和应用场景
- 收集领域原始数据(至少 5GB 以上)
- 评估数据质量(去重、去垃圾)
- 进行语言检测,确保数据为目标语言
- 文档级去重(SimHash/MinHash)
- 数据清洗:去除启发式规则过滤低质量内容
- 使用语言模型打分过滤低质量文档
- 为领域数据打标签(用于分层采样)
- 混合适用通用数据(领域数据占比 5%~30%)
- 最终数据审计:确认数据分布符合预期
阶段二:Tokenizer 配置
- 评估现有 tokenizer 对领域文本的覆盖率
- 如果领域 OOV 率高,考虑扩展词表
- 添加领域特殊 token(如
< medicine >) - 验证 tokenizer 正常工作
阶段三:训练配置
- 确定模型规模(7B / 13B / 70B 等)
- 确定训练 tokens 数量目标
- 设置学习率(峰值为首轮预训练的 10%~50%)
- 配置学习率调度(cosine annealing + warm-up)
- 设置 batch size(1M ~ 4M tokens)
- 配置梯度累积(如果显存不足)
- 确定 optimizer(AdamW / Lion 等)
- 设置 weight decay
- 配置混合精度训练(FP16/BF16)
阶段四:实验设置
- 确定评测基准(通用 + 领域)
- 设置评测频率(每 1000~5000 步)
- 配置 checkpoint 保存策略
- 设置日志记录
- 准备恢复训练的 checkpoint 管理
阶段五:训练执行
- 进行小规模试跑(验证流程正确性)
- 监控训练 loss 曲线
- 监控验证集困惑度
- 定期在评测基准上评估
- 观察通用能力是否下降
- 观察领域能力是否提升
- 如有异常(loss spike、能力退化),及时调整
阶段六:评估与迭代
- 最终评测:领域 benchmark 提升是否符合预期
- 通用能力评测:是否在可接受范围内
- 生成质量评估:领域文本生成是否符合预期
- 如有问题,根据问题类型调整策略:
- 领域过拟合 → 减少训练步数 / 增加通用数据 mix
- 通用能力退化 → 减少领域数据比例 / 降低学习率
- 领域能力不足 → 增加训练步数 / 优化领域数据质量
- 保存最佳 checkpoint
- 整理训练经验和数据配置
9. 参考文献与资源
- GPT-3: Brown et al., “Language Models are Few-Shot Learners”, NeurIPS 2020
- Chinchilla: Hoffmann et al., “Training Compute-Optimal Large Language Models”, NeurIPS 2022
- PaLM 2: Anil et al., “PaLM 2: Improving Language Model Performance Across Multiple Dimensions”, 2023
- LLaMA 2: Touvron et al., “Llama 2: Open Foundation and Fine-Tuned Chat Models”, 2023
- BERT: Devlin et al., “BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding”, NAACL 2019
- Scaling Laws: Kaplan et al., “Scaling Laws for Neural Language Models”, 2020
- Continued Pretraining: Gururangan et al., “Domain-Adaptive Pretraining Objectives for Language Models”, ACL 2020
- Catastrophic Forgetting: McCloskey & Cohen, “Catastrophic Interference in Connectionist Networks”, 1989
本文档为预训练与继续预训练的入门指南,涵盖从数学原理到工程实践的核心内容。