中训练(Mid-Training)全解析:持续预训练的艺术与科学
系统阐述中训练的定义、动机、技术路线、数据策略和工程实践,涵盖领域适配、能力注入和灾难性遗忘的应对。
在 LLM 的训练流程中,中训练(Mid-Training) 正在成为一个越来越重要的阶段——它介于大规模预训练和精细的后训练之间,承担着领域适配、能力增强和数据刷新等关键任务。本文将深入解析中训练的方方面面。
一、什么是中训练
1.1 定义与定位
中训练的准确定义是:在通用预训练完成后、后训练(SFT/RLHF)开始前,使用特定领域或能力导向的数据进行持续预训练(Continual Pre-training)的过程。
预训练阶段 中训练阶段 后训练阶段
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
Token数 │ 数万亿 │ → │ 数百亿~万亿 │ → │ 数百万~千万 │
└─────────────┘ └─────────────┘ └─────────────┘
目标 通用语言建模 领域适配/能力注入 指令跟随/对齐
学习率 标准预训练 LR 较低(衰减后继续) 极低(微调 LR)
数据 通用语料 领域数据+通用数据 指令数据+偏好数据
1.2 为什么需要中训练
直接原因:
- 知识时效性:预训练数据有截止日期,中训练可以注入最新知识
- 领域深度不足:通用预训练数据中特定领域(医疗、法律、金融)的数据不够
- 能力短板:如数学推理、代码能力可能需要额外强化
- 多语言增强:在主要预训练为英文的模型上增强中文等其他语言
深层动机:
中训练的经济逻辑非常清晰——相比从零开始预训练一个领域模型,在通用模型上做中训练的成本通常只有 1/10 到 1/100,但可以达到接近甚至超越专门训练的效果。
二、中训练的主要用途
2.1 领域适配(Domain Adaptation)
最常见的用途,让通用模型在特定领域表现更好。
典型案例:
| 项目 | 基座模型 | 中训练数据 | 数据量 | 效果 |
|---|---|---|---|---|
| BioMedLM | GPT-NeoX | PubMed + 临床数据 | ~50B tokens | 生物医学任务大幅提升 |
| CodeLlama | LLaMA-2 | 500B code tokens | 500B | 代码能力追平 GPT-3.5 |
| Minerva | PaLM | 数学论文 + 网页 | 38.5B | 数学推理大幅提升 |
| Galactica | - | 学术论文 | 106B | 科学推理显著提升 |
| 中文 LLaMA | LLaMA | 中文语料 | 120B | 中文能力从几乎为零到可用 |
2.2 能力注入(Capability Injection)
超越领域知识,注入新的认知能力。
代码能力注入:
- CodeLlama 是最成功的案例:在 LLaMA-2 上使用 500B 代码 token 做中训练
- 不仅提升了代码能力,数学和逻辑推理也有明显提升
- 关键发现:代码中训练对通用能力的损害很小
数学能力注入:
- Llemma(数学版 LLaMA):使用 55B 数学相关 token
- 包含:Proof-Pile(数学论文)、AlgebraicStack(数学代码)、Open-Web-Math(数学网页)
- 数学基准大幅提升,通用能力基本保持
长上下文能力注入:
- LLaMA-2 Long:通过中训练将上下文从 4K 扩展到 32K
- 主要技术:调整 RoPE 的 base frequency + 长文本数据训练
- 使用了约 500B tokens 的长文本数据
2.3 多语言增强
在英文为主的模型上增强其他语言的能力。
Chinese LLaMA/Alpaca(崔一鸣等人):
- 在 LLaMA 的基础上,先扩展中文词表(减少中文 token 数量)
- 然后用 120B 中文 token 做持续预训练
- 将 LLaMA 的中文能力从近乎为零提升到可用水平
关键技巧:
- 词表扩展:新增中文 token,减少中文文本的编码长度
- 混合训练:中训练时不能只用目标语言,需要混入英文数据防止英文能力退化
- 渐进策略:先用大量通用中文数据,再用高质量中文数据
2.4 知识更新(Knowledge Refresh)
让模型学习其预训练截止日期之后的新知识。
这是一个相对新的研究方向,核心挑战是如何在不破坏已有知识的前提下注入新知识。
三、中训练的关键技术
3.1 学习率策略
中训练的学习率设置至关重要——太高会导致灾难性遗忘,太低则学不到新知识。
常见策略:
-
Re-warmup + Cosine Decay:
- 从预训练结束时的学习率开始
- 短暂的 warmup(回到预训练峰值的 50-100%)
- 然后 cosine 衰减到接近 0
-
恒定学习率:
- 使用预训练结束时学习率的 50-100%
- 简单但经常有效
-
线性 Warmup + 线性 Decay:
- Warmup 到预训练峰值的 30-50%
- 然后线性衰减
学习率
↑
│ ╱╲
│ ╱ ╲ Re-warmup + Cosine
│ ╱ ╲╲
│ ╱ ╲╲
│╱ ╲╲__
└──────────────→ Steps
↑ ↑
warmup decay
经验法则:中训练的峰值学习率通常为预训练峰值的 10-50%。
3.2 灾难性遗忘的应对
灾难性遗忘(Catastrophic Forgetting)是中训练面临的最大挑战:模型在学习新知识时,会遗忘已有的知识。
应对策略:
-
数据混合(Data Mixing)—— 最有效的策略
- 在中训练数据中混入一定比例的通用预训练数据
- 典型比例:领域数据 60-80% + 通用数据 20-40%
- 可以使用 replay buffer 机制
-
正则化方法
- EWC(Elastic Weight Consolidation):约束重要参数不要变化太大
- L2 正则化:向预训练权重做正则化
- 实践中,简单的 L2 正则化往往足够
-
参数高效微调(PEFT)
- LoRA/QLoRA:只更新少量参数,天然减少遗忘
- 但 LoRA 在大规模中训练中的效果通常不如全参数训练
-
渐进式训练
- 先少量新数据 + 大量旧数据
- 逐步增加新数据比例
- 模拟人类的渐进学习过程
3.3 数据准备
中训练的数据准备比预训练更精细:
质量要求更高:
- 中训练数据量远小于预训练,每条数据的影响更大
- 需要更严格的质量过滤和去重
- 特别注意避免引入偏见和错误知识
格式注意事项:
- 保持与预训练数据相似的格式(避免格式分布偏移)
- 文档分隔符、特殊 token 需要与预训练一致
- 如果包含结构化数据(表格、代码),确保格式标准化
数据配比实验:
- 建议在小规模(1-10B tokens)上先做配比实验
- 评估不同领域数据比例对目标任务和通用任务的影响
- 找到 Pareto 最优配比
3.4 评估策略
中训练的评估需要同时关注两个维度:
-
目标领域性能:中训练的主要目标
- 领域特定的 benchmark
- 实际应用场景的测试
-
通用能力保持:确保不退化
- 标准 benchmark(MMLU, ARC, HellaSwag 等)
- 通用语言能力测试
建议的评估矩阵:
目标领域 ↑ 通用能力 →
理想状态 大幅提升 基本不变
可接受 显著提升 小幅下降(<3%)
需要调整 小幅提升 明显下降(>5%)
失败 无提升 严重退化
四、中训练 vs 相关技术
4.1 中训练 vs RAG
| 维度 | 中训练 | RAG |
|---|---|---|
| 知识存储 | 参数化(存在模型权重中) | 非参数化(存在外部数据库中) |
| 更新速度 | 慢(需要重新训练) | 快(更新数据库即可) |
| 推理延迟 | 无额外延迟 | 检索增加延迟 |
| 知识覆盖 | 深度学习领域模式 | 精确检索具体事实 |
| 幻觉问题 | 可能编造 | 有据可查,减少幻觉 |
| 成本 | 一次性训练成本高 | 持续检索成本 |
最佳实践:中训练 + RAG 组合使用,中训练提供领域基础能力,RAG 提供精确事实。
4.2 中训练 vs SFT
| 维度 | 中训练 | SFT |
|---|---|---|
| 数据格式 | 自然文本(无标注) | 指令-回答对(有标注) |
| 数据量 | 数十亿到万亿 tokens | 数百万到数千万 |
| 学习目标 | 知识和能力 | 行为和格式 |
| 学习率 | 较高 | 极低 |
| 典型训练时间 | 数天到数周 | 数小时到数天 |
4.3 中训练 vs 从头预训练
| 维度 | 中训练 | 从头预训练 |
|---|---|---|
| 计算成本 | 1/10 ~ 1/100 | 100% |
| 时间 | 数天~数周 | 数月 |
| 通用能力 | 继承基座模型 | 需要自己学习 |
| 灵活性 | 基座模型决定了上限 | 完全可控 |
| 适用场景 | 领域适配、能力增强 | 全新的模型架构或数据 |
五、工程实践
5.1 中训练 Checklist
训练前:
- 确认基座模型的能力基线(在所有关注的 benchmark 上评估)
- 准备中训练数据集,完成质量审计
- 准备 replay 数据(通用预训练数据的子集)
- 设计学习率 schedule
- 准备评估 pipeline(目标域 + 通用 benchmark)
训练中:
- 监控 Loss 曲线(应平滑下降)
- 每隔一定步数做 checkpoint + 评估
- 关注通用 benchmark 是否退化
- 如果出现 Loss Spike,考虑降低学习率或检查数据
训练后:
- 全面评估(目标域 + 通用 + 安全性)
- 与基座模型对比,确认提升
- 与同领域 SOTA 对比
- 进入后训练(SFT/RLHF)流程
5.2 常见陷阱
- 学习率过高:最常见的错误,导致灾难性遗忘
- 忘记混入通用数据:纯领域数据训练几乎必然导致通用能力退化
- 数据质量忽视:中训练数据量少,一条坏数据的影响被放大
- 训练时间过长:过度训练领域数据也会导致过拟合
- 评估不全面:只看目标域指标,忽视通用能力退化
5.3 规模参考
不同规模模型的中训练参考配置:
| 模型规模 | 推荐中训练 Token | 学习率峰值 | Batch Size | 训练时间 (8×A100) |
|---|---|---|---|---|
| 7B | 10-50B | 1e-5 ~ 5e-5 | 2-4M tokens | 1-3 天 |
| 13B | 20-100B | 5e-6 ~ 3e-5 | 4-8M tokens | 2-7 天 |
| 34B | 50-200B | 3e-6 ~ 2e-5 | 4-8M tokens | 5-14 天 |
| 70B | 100-500B | 1e-6 ~ 1e-5 | 8-16M tokens | 14-30 天 |
六、前沿进展
6.1 持续预训练的理论基础
最近的研究开始尝试为中训练建立理论框架:
- 信息论视角:中训练可以看作将领域知识的互信息 “注入” 到模型的参数空间中
- 优化理论视角:灾难性遗忘本质上是优化景观(Loss Landscape)的曲率问题
- PAC-Bayes 框架:可以给出中训练泛化边界的理论保证
6.2 模块化中训练
一个新兴方向是模块化的中训练——不修改基座模型,而是训练可插拔的模块:
- Adapter/LoRA Fusion:训练多个领域 Adapter,按需组合
- Expert Routing:类似 MoE,但 Expert 是不同领域的中训练模块
- Prefix Tuning for Domain:用 Prefix 编码领域知识
6.3 数据飞轮
中训练的最新趋势是建立数据飞轮(Data Flywheel):
模型 → 生成领域数据 → 人工审核 → 加入训练集 → 更好的模型 → ...
这种自我改进循环可以持续提升模型的领域能力,但需要小心控制数据质量以避免模型退化。
七、总结
中训练是 LLM 训练流水线中一个独立而关键的阶段。它的核心价值在于:
- 经济高效:用预训练 1/10 的成本实现领域适配
- 灵活可控:可以针对不同需求定制
- 保持基础:在增强目标能力的同时维持通用能力
掌握中训练的技术,对于在实际项目中高效利用开源大模型至关重要。