中训练(Mid-Training)全解析:持续预训练的艺术与科学

系统阐述中训练的定义、动机、技术路线、数据策略和工程实践,涵盖领域适配、能力注入和灾难性遗忘的应对。

深度解析 中训练 持续预训练 LLM 领域适配

在 LLM 的训练流程中,中训练(Mid-Training) 正在成为一个越来越重要的阶段——它介于大规模预训练和精细的后训练之间,承担着领域适配、能力增强和数据刷新等关键任务。本文将深入解析中训练的方方面面。

一、什么是中训练

1.1 定义与定位

中训练的准确定义是:在通用预训练完成后、后训练(SFT/RLHF)开始前,使用特定领域或能力导向的数据进行持续预训练(Continual Pre-training)的过程。

            预训练阶段           中训练阶段          后训练阶段
         ┌─────────────┐   ┌─────────────┐   ┌─────────────┐
Token数   │  数万亿      │ → │  数百亿~万亿  │ → │  数百万~千万  │
         └─────────────┘   └─────────────┘   └─────────────┘
目标       通用语言建模        领域适配/能力注入     指令跟随/对齐
学习率     标准预训练 LR       较低(衰减后继续)     极低(微调 LR)
数据       通用语料             领域数据+通用数据     指令数据+偏好数据

1.2 为什么需要中训练

直接原因:

  1. 知识时效性:预训练数据有截止日期,中训练可以注入最新知识
  2. 领域深度不足:通用预训练数据中特定领域(医疗、法律、金融)的数据不够
  3. 能力短板:如数学推理、代码能力可能需要额外强化
  4. 多语言增强:在主要预训练为英文的模型上增强中文等其他语言

深层动机:

中训练的经济逻辑非常清晰——相比从零开始预训练一个领域模型,在通用模型上做中训练的成本通常只有 1/10 到 1/100,但可以达到接近甚至超越专门训练的效果。

二、中训练的主要用途

2.1 领域适配(Domain Adaptation)

最常见的用途,让通用模型在特定领域表现更好。

典型案例:

项目基座模型中训练数据数据量效果
BioMedLMGPT-NeoXPubMed + 临床数据~50B tokens生物医学任务大幅提升
CodeLlamaLLaMA-2500B code tokens500B代码能力追平 GPT-3.5
MinervaPaLM数学论文 + 网页38.5B数学推理大幅提升
Galactica-学术论文106B科学推理显著提升
中文 LLaMALLaMA中文语料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 的中文能力从近乎为零提升到可用水平

关键技巧:

  1. 词表扩展:新增中文 token,减少中文文本的编码长度
  2. 混合训练:中训练时不能只用目标语言,需要混入英文数据防止英文能力退化
  3. 渐进策略:先用大量通用中文数据,再用高质量中文数据

2.4 知识更新(Knowledge Refresh)

让模型学习其预训练截止日期之后的新知识。

这是一个相对新的研究方向,核心挑战是如何在不破坏已有知识的前提下注入新知识。

三、中训练的关键技术

3.1 学习率策略

中训练的学习率设置至关重要——太高会导致灾难性遗忘,太低则学不到新知识。

常见策略:

  1. Re-warmup + Cosine Decay:

    • 从预训练结束时的学习率开始
    • 短暂的 warmup(回到预训练峰值的 50-100%)
    • 然后 cosine 衰减到接近 0
  2. 恒定学习率:

    • 使用预训练结束时学习率的 50-100%
    • 简单但经常有效
  3. 线性 Warmup + 线性 Decay:

    • Warmup 到预训练峰值的 30-50%
    • 然后线性衰减
学习率
  ↑
  │    ╱╲
  │   ╱  ╲        Re-warmup + Cosine
  │  ╱    ╲╲
  │ ╱      ╲╲
  │╱        ╲╲__
  └──────────────→ Steps
       ↑       ↑
    warmup   decay

经验法则:中训练的峰值学习率通常为预训练峰值的 10-50%。

3.2 灾难性遗忘的应对

灾难性遗忘(Catastrophic Forgetting)是中训练面临的最大挑战:模型在学习新知识时,会遗忘已有的知识。

应对策略:

  1. 数据混合(Data Mixing)—— 最有效的策略

    • 在中训练数据中混入一定比例的通用预训练数据
    • 典型比例:领域数据 60-80% + 通用数据 20-40%
    • 可以使用 replay buffer 机制
  2. 正则化方法

    • EWC(Elastic Weight Consolidation):约束重要参数不要变化太大
    • L2 正则化:向预训练权重做正则化
    • 实践中,简单的 L2 正则化往往足够
  3. 参数高效微调(PEFT)

    • LoRA/QLoRA:只更新少量参数,天然减少遗忘
    • 但 LoRA 在大规模中训练中的效果通常不如全参数训练
  4. 渐进式训练

    • 先少量新数据 + 大量旧数据
    • 逐步增加新数据比例
    • 模拟人类的渐进学习过程

3.3 数据准备

中训练的数据准备比预训练更精细:

质量要求更高:

  • 中训练数据量远小于预训练,每条数据的影响更大
  • 需要更严格的质量过滤和去重
  • 特别注意避免引入偏见和错误知识

格式注意事项:

  • 保持与预训练数据相似的格式(避免格式分布偏移)
  • 文档分隔符、特殊 token 需要与预训练一致
  • 如果包含结构化数据(表格、代码),确保格式标准化

数据配比实验:

  • 建议在小规模(1-10B tokens)上先做配比实验
  • 评估不同领域数据比例对目标任务和通用任务的影响
  • 找到 Pareto 最优配比

3.4 评估策略

中训练的评估需要同时关注两个维度:

  1. 目标领域性能:中训练的主要目标

    • 领域特定的 benchmark
    • 实际应用场景的测试
  2. 通用能力保持:确保不退化

    • 标准 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/100100%
时间数天~数周数月
通用能力继承基座模型需要自己学习
灵活性基座模型决定了上限完全可控
适用场景领域适配、能力增强全新的模型架构或数据

五、工程实践

5.1 中训练 Checklist

训练前:

  • 确认基座模型的能力基线(在所有关注的 benchmark 上评估)
  • 准备中训练数据集,完成质量审计
  • 准备 replay 数据(通用预训练数据的子集)
  • 设计学习率 schedule
  • 准备评估 pipeline(目标域 + 通用 benchmark)

训练中:

  • 监控 Loss 曲线(应平滑下降)
  • 每隔一定步数做 checkpoint + 评估
  • 关注通用 benchmark 是否退化
  • 如果出现 Loss Spike,考虑降低学习率或检查数据

训练后:

  • 全面评估(目标域 + 通用 + 安全性)
  • 与基座模型对比,确认提升
  • 与同领域 SOTA 对比
  • 进入后训练(SFT/RLHF)流程

5.2 常见陷阱

  1. 学习率过高:最常见的错误,导致灾难性遗忘
  2. 忘记混入通用数据:纯领域数据训练几乎必然导致通用能力退化
  3. 数据质量忽视:中训练数据量少,一条坏数据的影响被放大
  4. 训练时间过长:过度训练领域数据也会导致过拟合
  5. 评估不全面:只看目标域指标,忽视通用能力退化

5.3 规模参考

不同规模模型的中训练参考配置:

模型规模推荐中训练 Token学习率峰值Batch Size训练时间 (8×A100)
7B10-50B1e-5 ~ 5e-52-4M tokens1-3 天
13B20-100B5e-6 ~ 3e-54-8M tokens2-7 天
34B50-200B3e-6 ~ 2e-54-8M tokens5-14 天
70B100-500B1e-6 ~ 1e-58-16M tokens14-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. 经济高效:用预训练 1/10 的成本实现领域适配
  2. 灵活可控:可以针对不同需求定制
  3. 保持基础:在增强目标能力的同时维持通用能力

掌握中训练的技术,对于在实际项目中高效利用开源大模型至关重要。