章节导航 第 12 章 / 共 30 章
中训练总览与方法论
中训练(mid-training)的定位:在预训练与后训练之间注入领域/推理能力的连续阶段。
“Mid-training is the new pre-training.” ——Noam Brown (OpenAI), 2025.7
当 OpenAI 的研究员公开说出这句话时,中训练(mid-training)正式从一个模糊的工程实践升级为大模型训练的核心范式。
12.1 中训练的定位
什么是中训练?
中训练是大规模预训练结束后、SFT/RLHF 之前的一个独立训练阶段。在这个阶段,模型在精选的高质量数据上继续训练,通常伴随学习率的退火(annealing)和数据分布的调整。
如果把大模型训练比作培养一个人:
- 预训练是通识教育——大量阅读,建立广泛的知识基础
- 中训练是本科专业课——在保持通识的前提下,系统化地增强特定能力
- SFT 是职业培训——学习如何与人打交道、如何按规矩做事
- RL 是实习——在实际反馈中打磨判断力
中训练的核心定位是承上启下:它承接预训练建立的通用知识基础,通过定向的数据策略来增强特定能力(如长上下文理解、代码生成、数学推理、多语言能力),同时为后续的 SFT 和 RL 做好准备。
术语的演变
“中训练”这个概念并不是一夜之间冒出来的。它经历了一个从”工程技巧”到”独立范式”的认知跃迁:
| 时期 | 术语 | 含义 | 代表实践 |
|---|---|---|---|
| 2020 | Domain Adaptation | 在特定领域数据上继续预训练 | Google 的 domain-specific BERT |
| 2021-2022 | Continued Pretraining | 在更多/更新的数据上继续训练 | Code Llama 在代码上继续预训练 |
| 2023 | Annealing Phase | 预训练末期的学习率退火+数据调整 | Llama 2 的退火策略 |
| 2024 | Mid-training | 作为独立阶段被明确提出 | Llama 3/3.1 的多阶段训练 |
| 2025 | Mid-training 成为共识 | arXiv 2510.23081 综述论文正式梳理 | DeepSeek V3、Qwen 2.5、Llama 4 |
| 2025.7 | ”Mid-training is the new pre-training” | Noam Brown 的论断标志着范式转变 | OpenAI 内部实践 |
| 2025.9 | Reinforcement Mid-Training (RMT) | 中训练与 RL 融合的框架 | 动态 token 预算 + 课程采样 |
| 2026.2 | ReMiT | RL 引导中训练的飞轮循环 | RL 推理先验 → token 重加权 |
| 2026.3 | PRISM | 首次大规模实证证明中训练是 RL 必要前提 | IBM 7 模型对照实验 |
认知演变
中训练的认知演变
- 2020-2021:“继续训练?就是在领域数据上多跑几步呗”
- 2022:“Code Llama 证明继续预训练能显著增强代码能力”
- 2023:“Llama 2 的退火阶段其实就是原始版本的中训练——只是没这么叫”
- 2024:“Llama 3 把中训练做成了系统性的多阶段策略:长上下文扩展、数据上采样、退火”
- 2025:“中训练的综述论文出现(arXiv: 2510.23081),概念正式体系化”
- 2025-2026:“Mid-training is the new pre-training——中训练的数据策略可能比预训练更影响最终效果”
- 2026:“中训练从单向准备阶段进化为与后训练双向优化的闭环——PRISM 证明不做中训练的 RL 几乎失效,ReMiT 证明 RL 可以反向改善中训练”
形式化定义:中训练的核心特征
2025 年的首篇中训练系统综述(arXiv: 2510.23081)将中训练从工程实践提升到形式化层面,提出了两个核心特征:
按 Meituan + PKU 2026 综述(arXiv: 2510.23081)的形式化定义:
“中训练保留预训练的 next-token 目标,但通过精心策划的数据混合(高质量领域数据 + 指令数据)系统性地提升特定技能。这与持续预训练(continued pre-training)的关键区别在于:持续预训练不考虑优化器状态或分布保持,可能导致通用能力丧失;中训练则是”有”过渡意图”的审慎设计阶段”。”
中训练协调三大能力领域:
- 核心认知技能(数学、推理)
- 任务执行(指令、编码、Agent)
- 可扩展性(长上下文、多语言)
具体两个核心特征:
-
有意的分布偏移(Intentional Distributional Shift):中训练的本质不是”继续训练”,而是有意识地、系统性地将数据分布从预训练的通用分布偏移到目标能力所需的特定分布。这种偏移不是自然演化的副产品,而是精心设计的策略——与继续预训练的”同分布更多数据”和领域适应的”单方向偏移”形成区分。
-
双向能力平衡(Bidirectional Capability Balance):中训练需要在两个方向上同时操作——前向传播专业能力(增强目标领域的深度),后向保持通用能力(防止遗忘和泛化能力退化)。这一定义将遗忘从一个”副作用”提升为设计中训练时必须主动优化的目标函数分量。
综述还提供了一个重要的定量发现:中训练比预训练用更少的数据和计算就能获得更陡峭的性能提升——这为”Mid-training is the new pre-training”的论断提供了理论依据,即边际投入的回报率在中训练阶段显著高于预训练阶段。
12.2 中训练要解决的核心问题
中训练不是”多跑几步”。它有明确的目标和针对性的数据策略。
12.2.1 长上下文能力增强
这是中训练最广泛的应用之一。
为什么不在预训练就做长上下文?
- 计算成本:Attention 的复杂度是 O(n²),128K 上下文的训练成本是 8K 的 256 倍
- 数据稀缺:自然存在的长文档远少于短文档,强行在预训练中大量使用长文档会打破数据分布
- 分阶段更高效:先在短上下文上建立语言能力,再逐步扩展上下文窗口
Llama 3 的长上下文策略(里程碑级实践):
Llama 3 的技术报告详细披露了他们的长上下文扩展方案:
- 预训练阶段:在 8K 上下文长度上训练 15T token
- 中训练阶段 1:逐步将上下文长度从 8K 扩展到 128K
- 分 6 个阶段:8K → 16K → 32K → 65K → 128K
- 每个阶段训练约 800M token
- RoPE 的 base frequency 从 500,000 逐步增大到 8,000,000
- 验证标准:在每个阶段检查
- 短上下文任务不退化
- Needle-in-a-Haystack 测试在当前长度上通过
- 长上下文下的 loss 收敛
128K 之后:从百万到千万级上下文
Llama 3 的 8K→128K 是里程碑,但 2025 年这一前沿已经跃迁了两个数量级:
| 实践 | 扩展范围 | 数据量 | 关键技术 | 来源 |
|---|---|---|---|---|
| Llama 3 | 8K→128K | ~4B token | RoPE base frequency 渐进调整 | Meta, 2024 |
| UltraLong-8B | 128K→4M | 仅 ~1B token | YaRN RoPE 扩展 + 按领域上采样 + 文档分隔符 | Nvidia, 2025 |
| Llama 4 Scout | →10M | 未公开 | iRoPE(交错旋转位置编码)+ MoE 架构 | Meta, 2025 |
UltraLong-8B 的意义在于数据效率——仅用约 1B token 就将 Llama-3.1-8B-Instruct 的上下文从 128K 扩展到 4M,数据效率比 Llama 3 高一个数量级。其两阶段配方(阶段 1 继续预训练扩展窗口 + 阶段 2 指令微调保持能力)证明了长上下文扩展并不需要海量数据,关键在于 RoPE 扩展策略和数据的领域分布。
Llama 4 Scout(17B 激活/109B 总参,16 专家选 1)则通过 MoE 架构和 iRoPE 将上下文窗口直接推到 10M token。从 8K→128K→4M→10M 的时间线来看,长上下文中训练正在加速进化——每一代的扩展倍率都在增大,而所需的数据量增长却趋于平缓。
工业级 LCCP 的特殊挑战。Liang 等人(arXiv: 2604.02650, 2026)指出,工业级模型(>10B 参数、数千亿 token 训练量)的长上下文持续预训练动态与小规模实验存在显著差异。小规模设置(如 1B 模型、数百亿 token)直接迁移到工业级场景,会面临适应不足和过早终止训练的风险。具体来说:
- 小规模实验中有效的”快速退火”策略在工业规模上可能因训练时长不足而失效
- 工业级 LCCP 需要更多训练步数才能观察到短上下文能力的退化
- 建议的 proxy 设计:用比目标规模小 10 倍的模型,但训练 token 数应与目标规模同量级,而非按参数量比例缩减
12.2.2 代码和数学能力提升
在预训练数据中,代码和数学数据的占比通常在 10-15%。但如果你想让模型具备强大的编程和数学推理能力,这个比例远远不够。
中训练的策略是上采样(upsampling):在中训练阶段大幅提升代码和数学数据的占比。
预训练阶段的数据配比:
网页文本: 65% | 代码: 12% | 数学: 3% | 学术: 10% | 书籍: 5% | 其他: 5%
中训练阶段的数据配比(典型):
网页文本: 30% | 代码: 35% | 数学: 15% | 学术: 10% | 书籍: 5% | 其他: 5%
关键洞察:代码能力的增强不仅提升编程任务表现,还对数学推理和逻辑推理有显著的溢出效应。 我们在第 6 章详细讨论过这一现象。
12.2.3 多语言能力补充
对于非英文为主的模型(如中文模型),中训练是补充目标语言能力的关键阶段。
典型场景:基础模型在英文为主的数据上预训练,然后在中训练阶段大幅增加中文数据比例:
预训练:英文 80% | 中文 10% | 其他 10%
↓
中训练:英文 40% | 中文 40% | 代码 15% | 其他 5%
AMD 在 2026 年的一篇实践报告中详细记录了多语言中训练的经验,特别指出了一个关键发现:在中训练中排除数学数据会导致数学能力严重退化——这说明数据配比的决策需要全局考量,不能只关注目标语言的增强。
12.2.4 知识时效性更新
模型的预训练数据有截止日期。如果你在 2025 年初完成预训练,模型对 2025 年之后的事件一无所知。中训练可以注入最新的知识。
策略:
- 收集训练数据截止日期之后的高质量网页数据
- 混合新数据和少量旧数据(防止遗忘)
- 训练量相对较小(通常 50B-200B token)
12.2.5 特定领域知识注入
当需要构建医疗、法律、金融等垂直领域的模型时,中训练是注入专业知识的最佳阶段。
为什么不用 SFT 来注入领域知识?
这是一个常见的误解。SFT 的本质是教模型”如何对话”和”如何遵循指令”,而不是教模型新知识。要让模型真正掌握一个领域的知识体系,需要在中训练阶段用足够量的领域语料来训练。
比喻:
- 中训练注入知识 = 让一个人系统地学习医学教材
- SFT 注入知识 = 教一个人在面试中如何回答医学问题
后者只能教"表面功夫"——如果底层知识不够扎实,模型很容易在稍微变化的问题上露馅。
12.2.6 中训练与后训练的协同——为什么中训练是 RL 的前置必要条件
2026 年初,一个过去被低估的事实得到了严格的实验验证:中训练不仅是能力增强,更是后续 RL 能够生效的”起飞平台”。
IBM 的 PRISM 项目对 7 个基础模型(Granite/LLaMA/Mistral/Nemotron-H,3B-24B,涵盖密集和 Mamba 混合架构)进行了对照实验,结论非常清晰:
| 训练路径 | AIME(数学推理) | 代码基准 | 科学基准 |
|---|---|---|---|
| 基础模型 → 直接 RL | ≈ 0 分 | 几乎无提升 | 几乎无提升 |
| 基础模型 → 中训练 → RL | 29-42 分(3-4 倍提升) | +5~12 分 | +6~13 分 |
更关键的发现来自机制分析:中训练重构了模型 >90% 的权重,而 RL 仅精调约 5% 的参数。CKA 分析(Centered Kernel Alignment >0.998)表明 RL 几乎完全保持了中训练建立的表征几何——换句话说,RL 是在中训练创造的”地形”上行走,而不是重塑地形。
另一项基于合成任务的因果分析(arXiv: 2512.07783)从另一个角度验证了同样的结论:
- RL 只在模型的”能力边缘”有效——任务太简单或太难都不行
- 固定计算预算下,增加中训练比增加 RL 更有效
- 上下文泛化需要”最小但充分”的预训练暴露
- 过程级奖励优于结果级奖励
这意味着中训练的数据量需要一个令人惊喜的下限——PRISM 实验显示仅需约 27B 高质量 token 的中训练就能为后续 RL 创造有效条件。但如果完全跳过中训练,无论投入多少 RL 计算,效果都微乎其微。
核心启示:设计中训练方案时,不应只评估中训练本身的 benchmark 增益,还需要评估它为后续 RL 阶段创造了多大的”可提升空间”。这也是为什么越来越多的团队将中训练和 RL 视为一个耦合系统来设计,而非两个独立阶段。
把下限与上限拼起来:中训练的算力规划是两段式的。
- 第一段:到达”起飞平台”(下限由 PRISM 给出)——仅需约 27B 高质量 token 就能为后续 RL 创造有效条件;完全跳过则无论投多少 RL 计算都收效甚微。这段的目标是让后续 RL 有可能生效,投入不足则整条链路失效。
- 第二段:突破”串行天花板”(上限由 Trajectory Soup 给出,arXiv:2609.37169,2026-09-29)——到达起飞平台后,继续纵向加 token 的边际收益迅速衰减,甚至可能让部分能力退化。此时新增预算应改为横向分支 + 两层合并;论文报告这种做法的优势在经同一套后训练之后仍然保持——也就是说它扩展的正是本节的”可提升空间”,而不是只在中间态好看。
完整做法见 §12.7 决策 2 续「串行饱和与横向分配」与 §12.3.9。
12.2.7 塑造后训练的泛化边界(Inoculation Midtraining)
12.2.1–12.2.5 的五类动机都在问”中训练能往模型里加什么”。2026-09 出现的一类工作问的是另一个方向——中训练能否决定后训练学到的东西”泛化到哪里”。
Inoculation Midtraining(arXiv:2609.15886,2026-09-14)的做法:在中训练阶段引入一个新造词(neologism token),把”不安全行为”标记为属于该词所指示的特定语境;随后在该语境内用不安全数据做后训练(SFT 与 RL 两种后训练体制均做了验证)。最终在语境外(system prompt 不含该新词)评估时,misalignment 降低,而良性属性(说德语、莎士比亚式文体)的迁移不受影响。
⚠️ 如实标注其局限(作者自述):① 不优于标准的 Inoculation Prompting;② 对训练配置敏感;③ 存在漏水边界——邻近的语境线索可以重新激活不安全行为。作者明确表示,在它成为安全框架中”可承重的组件”之前还有大量工作要做。
这条对中训练的意义:中训练不只是”加能力”的阶段,也可以是一个设定泛化边界的干预点。但目前证据强度只支持”机制可行”,不足以支持”工程可用”。它同时填补了本章 §12.8 风险一节的一个空白——该节目前只讨论能力退化、数据污染、算力浪费一类工程风险,没有讨论”中训练本身可以作为一种安全干预手段”。
12.3 中训练的技术框架
12.3.1 退火式中训练(Annealing-based Mid-training)
这是当前最主流的中训练范式,Llama 3 是其典型代表。
核心思路:
- 预训练结束后,将学习率逐渐降低到接近零
- 同时切换到更高质量的数据分布
- 在退火过程中,模型”巩固”已学知识,同时吸收精选数据的信号
"""
退火式中训练的学习率调度
"""
import math
def annealing_lr_schedule(
step: int,
total_steps: int,
peak_lr: float = 3e-4, # 预训练的峰值学习率
start_lr_ratio: float = 0.3, # 中训练起始 lr 占峰值的比例
min_lr_ratio: float = 0.01, # 最终 lr 占峰值的比例
warmup_steps: int = 100, # 中训练开始时的短暂 warmup
) -> float:
"""
中训练的学习率调度
包含一个短暂的 warmup,然后 cosine 退火到最小值
"""
start_lr = peak_lr * start_lr_ratio
min_lr = peak_lr * min_lr_ratio
if step < warmup_steps:
# 短暂 warmup
return min_lr + (start_lr - min_lr) * step / warmup_steps
else:
# Cosine 退火
progress = (step - warmup_steps) / (total_steps - warmup_steps)
return min_lr + 0.5 * (start_lr - min_lr) * (1 + math.cos(math.pi * progress))
# 示例:中训练 100B token,batch size = 4M token/step
total_steps = 25000
for step in [0, 100, 5000, 12500, 25000]:
lr = annealing_lr_schedule(step, total_steps)
print(f"Step {step:>6d}: lr = {lr:.6f}")
Llama 3 的退火策略具体参数:
- 预训练峰值学习率:8 × 10⁻⁵
- 中训练起始学习率:~3 × 10⁻⁵(逐步降低)
- 退火到 0
- 中训练 token 数:~800B(在 15T 预训练之后)
- 数据策略:上采样高质量数据、增加代码和数学、扩展上下文长度
12.3.2 多阶段中训练(Multi-stage Mid-training)
更复杂的方案将中训练分为多个子阶段,每个阶段有不同的目标和数据策略。
┌─────────────────────────────────────────────┐
│ 中训练 │
│ │
预训练 ──→ │ 阶段 1 阶段 2 阶段 3 │ ──→ SFT
(15T) │ 能力增强 长上下文 知识巩固 │
│ (200B) (100B) (100B) │
│ 代码↑数学↑ 8K→128K 高质量退火 │
└─────────────────────────────────────────────┘
阶段设计的关键考量:
-
能力增强阶段
- 目标:提升代码/数学/多语言能力
- 数据:大幅上采样目标领域数据
- 学习率:相对较高(接近预训练末期)
- 时长:100B-500B token
-
长上下文扩展阶段
- 目标:扩展上下文窗口
- 数据:逐步引入长文档
- 学习率:中等
- 特殊处理:RoPE base frequency 调整
-
知识巩固阶段(退火)
- 目标:巩固所有能力,消除不稳定
- 数据:最高质量的均衡数据
- 学习率:余弦退火到接近零
- 时长:50B-200B token
12.3.3 “稳定-衰减”两阶段范式
2025 年创智学院的 OctoThinker 项目(arXiv: 2506.20512)提出了一个简洁的两阶段框架:
- 稳定阶段(Stable Phase):以恒定学习率在目标数据上训练,让模型充分吸收新知识
- 衰减阶段(Decay Phase):学习率快速衰减,同时数据切换到最高质量的子集,让模型”记住”最重要的内容
这个框架的优势在于简洁性——只需要做一个决策:在哪里开始衰减。
OctoThinker 的消融实验揭示了几个重要的定量发现:
- 数据质量是 RL 兼容性的关键:高质量数学语料(MegaMath-Web-Pro-Max,700B token)使 Llama 在后续 RL 阶段追平 Qwen 的性能。换用低质量数学语料则导致 RL 退化——这说明中训练数据的质量影响不仅局限于中训练本身,还决定了后训练的天花板。
- 指令遵循数据是”稳定剂”:在中训练数据中混入指令遵循样本,能激发 QA 数据的潜力并稳定后续 RL 的响应长度。
- 长 CoT 直接注入是一个反面教训:在中训练阶段直接注入长链式推理数据会导致后续 RL 训练不稳定。推理链的习得应该留给 RL 阶段,中训练只负责建立基础能力。
- token 预算的 scaling 效应:中训练从 20B 扩展到 100B token 时,下游 RL 性能持续提升——“scale mid-training is all Llama need”。
⚠️ 这条 scaling 效应有上界。 arXiv:2609.37169(Trajectory Soup,2026-09-29)的主题恰恰是中训练串行算力的天花板:中训练的收益是有界的,继续追加串行算力几乎换不来下游提升,甚至会让某些能力退化,这给”中训练能吸收多少算力”设了一个实际的上限。因此 “scale mid-training” 的正确读法是:在饱和点之前,加 token 有效;过了饱和点,新增预算应改为横向分支 + 合并,而不是继续拉长同一条 run(详见 §12.7 决策 2 之后的”串行饱和与横向分配”)。
- 三分支设计:将数据按粒度分为 Long(长推理)、Short(短答案)、Hybrid(混合),不同分支对后续 RL 行为有精细影响。衰减阶段混合三分支的效果优于单一分支。
12.3.4 强化中训练——后训练信号引导的闭环范式
2025-2026 年出现了一类全新的中训练范式:后训练阶段的信号(尤其是 RL)不再只是中训练的”下游消费者”,而是反过来指导中训练的数据选择和 token 权重。 中训练从传统的单向流水线进化为与后训练双向优化的闭环。
目前有三条代表性的技术路线:
路线 1:RMT(Reinforcement Mid-Training)——RL 直接融入中训练阶段
正式定义了”强化中期训练”问题(arXiv: 2509.24375),提出三个创新组件:
- 动态 token 预算:限制过度思考,仅用 21% 的推理长度实现 +64.91% 提升
- 课程式自适应采样:适应不平衡的 token 熵分布
- RL + NTP 双重训练目标:同时优化强化学习和 next-token prediction
后续接入标准后训练流程,数学任务额外提升 +18.76%。
路线 2:ReMiT——RL 推理先验引导的 token 重加权
利用 RL 微调模型的推理先验,在中训练阶段对 token 动态重加权——优先处理对推理至关重要的 token(arXiv: 2602.03075)。核心思想是建立”RL→中训练→更好 RL”的自强化飞轮。实验显示在 10 个基准上平均提升 3%,后训练保持 2% 增益。
路线 3:RGA——RL 引导的退火 token 重加权
在退火阶段通过计算基础模型和 RL 模型在 token 级别的损失差异来重新分配权重(OpenReview: Ir78DvyQA1,ICLR 2026 投稿)。在 10 个预训练基准上平均 +1.78~5.21%,后训练下游 +2%。
传统单向流水线:
预训练 ──→ 中训练 ──→ SFT ──→ RL
× 无反馈
强化中训练闭环:
预训练 ──→ 中训练 ←──→ RL
↑ │
└──────────┘
RL信号反馈指导中训练
三条路线的共性:将后训练信号(RL 模型的推理偏好)作为中训练的数据信号,使中训练从”为后训练做准备”变为”与后训练协同优化”。 这代表了 2025-2026 年中训练领域最重要的范式转变之一。
12.3.4b ExpRL:用参考解答当奖励脚手架(Stanford, 2026-06)
§8.3.4 的 RMT/ReMiT/RGA 都是在”已经有 SFT 中训练”基础上叠加 RL 信号。 Xiang、Kumar 等人(Stanford + CMU,arXiv:2606.17024,2026-06-15)的 ExpRL(ExpRL: Exploratory RL for LLM Mid-Training)提出一个更激进的视角:用 RL-based mid-training 完全替代 SFT-based mid-training。
核心机制:参考答案当奖励脚手架,而非 imitation 目标
传统中训练把”问题 + 参考解答”用作 imitation 目标——让 policy 学习模仿 reference 的每一步。ExpRL 反其道而行:
- 参考解答对策略隐藏(policy 看不到 reference)
- LLM judge 把 on-policy 推理轨迹与 reference 对比,给 outcome-level 或 process-level dense reward
- 这让 ExpRL 能强化”部分正确”和”有用的中间步骤”——这些 sparse final-answer reward 难以加权的信号
两个变体:
- ExpRL-Outcome:全轨迹 dense reward
- ExpRL-Process:按 prefix(步骤)分段给 reward(推荐,信用分配更精细)
实验结果(4B Qwen3-Instruct 策略):
- AIME-2026:ExpRL-Process 达 63% vs 最强 baseline 58.75%
- 显著优于 SFT、sparse-reward GRPO、self-distillation
- 还能给后续 sparse-reward RL 提供更好的初始化——比 SFT 初始化效果更好
- 关键观察:ExpRL 增加了”验证、自我修正、回溯”等推理行为
- 跨域(math / science / coding)和跨规模(4B judge → 8B policy)都成立
对实践的指导:
- 如果已有大规模”问题 + 参考解答”语料,ExpRL 是比 SFT 更好的 RL priming 方案
- reference 隐藏是关键——避免 policy 直接模仿 reference 而非学习 reasoning strategies
- 4B judge 可对 8B policy 提供有效评分,降低部署成本
- 与 RMT/ReMiT/RGA 互补:ExpRL 改变的是”中训练用什么范式”(RL 而非 SFT),RMT/ReMiT/RGA 改变的是”RL 信号怎么反哺中训练”
12.3.4c 中训练期的选择性知识蒸馏(Switch Distillation)
12.3.1–12.3.4b 讨论的是退火、多阶段、RL 信号等路线。基于 logit 的知识蒸馏(KD)在本章此前是以”教师模型生成数据”的形态零散出现的,没有作为一条独立的”中训练期蒸馏”技术线,也没有”蒸馏收益随训练阶段变化”这一维度。
受控实验(arXiv:2609.01532,2026-09-01)给出的结论相当干脆:中训练期的 logit 蒸馏偏推理、不偏事实召回——推理能力提升,事实召回未必同步改善甚至受损。
对应的工程处方是 Switch Distillation:按教师置信度 / 预测熵选择性施加 logit KD,而不是全程铺满;这样在拿到推理增益的同时保住事实召回。
实践提示:如果你的中训练目标同时包含”推理”和”知识/事实”两项,不要默认全程开 logit KD;先看教师的置信度分布再决定覆盖范围。(本轮未取到论文原文量化表格,故此处只给定性结论,不列具体百分点。)
12.3.5 “For & With Agentic RL”——统一框架
§8.3.4 介绍的三条路线看似独立,实际上可以用一个统一框架来组织。Guanghan(2026.2)提出的 “For & With Agentic RL” 双重框架,将中训练与 RL 的关系精炼为两个互补方向:
方向 1:Mid-training FOR Agentic RL(中训练服务于 RL)
中训练构建 RL 所需的知识基础——代码理解、工具使用模式、调试策略、长上下文推理链。没有中训练提供的这些”基建”,RL 的探索空间过小,容易陷入局部最优甚至完全失效。PRISM 的实验就是最直接的证据(§8.2.6):不做中训练的 RL 几乎无法起步,而仅 27B token 的中训练就能创造有效的起飞条件。
方向 2:Mid-training WITH Agentic RL(中训练与 RL 协同优化)
RL 信号可以回传改善中训练本身,将线性管线变为闭环。三条路线分别代表了不同的回传机制:
| 路线 | 机制 | 回传信号 | 效果 |
|---|---|---|---|
| RMT | RL 直接嵌入中训练目标 | RL reward 作为训练信号 | 动态 token 预算 + 双重目标 |
| ReMiT | RL 推理先验 → token 重加权 | RL 模型的 token 级重要性 | ”RL→中训练→更好 RL”飞轮 |
| RGA | RL 损失差异 → 退火权重 | token 级损失差异 | 退火阶段精准加权 |
此外,NVIDIA 的 RLP(Reinforcement Learning Pre-training)展示了更激进的融合——RL 可以直接嵌入预训练/中训练目标,作为密集奖励信号,而非仅在后训练阶段使用。
For & With Agentic RL 统一框架:
Mid-training FOR RL Mid-training WITH RL
┌─────────────────┐ ┌─────────────────┐
│ 中训练构建能力基础 │ │ RL信号回传改善中训练│
│ → PRISM 实证 │ ←───→│ → ReMiT 飞轮 │
│ → 27B token 即可 │ │ → RGA 精准加权 │
│ → 避免RL冷启动 │ │ → RMT 直接嵌入 │
└─────────────────┘ └─────────────────┘
↑ │
└────────── 闭环 ───────────┘
这一框架的核心洞察是:中训练不是 RL 的单向前置,两者构成双向优化的闭环。 设计中训练方案时,不应只考虑”中训练如何为 RL 准备”,还应考虑”RL 的信号如何指导中训练的优化”——这也呼应了 §8.2.6 中”将中训练和 RL 视为耦合系统来设计”的核心启示。
12.3.6 OptiMer 动态配比优化能力
每轮中训练前的快速配比优化:OptiMer 提供的分布向量合并方法在中训练场景下有独特价值——它可以将每轮中训练视为一个”独立的优化问题”,快速推导当前能力目标下的最优配比,而不需要跑多个完整的训练实验。对于多阶段中训练,这意味着每轮开始前都可以用 OptiMer 快速评估新的数据配比需求,效率提升 15-35 倍,显著加速迭代。
12.3.7 数据难度与训练阶段的匹配
一个常被忽视的维度:数据难度并非越高越好,且最优难度随训练阶段变化。 张景昭等人(FAIC 2026)的研究表明:
- 中训练阶段:中等难度的数据通常优于极难数据——极难数据与模型当前能力过于脱节,容易导致训练不稳定或模型过度拟合于特定模式
- 后训练(RL)阶段:数据的难度分布需要重新考虑,太简单的数据无法为 RL 提供足够的挑战信号
这一发现与 FineWeb-Edu 的”教育价值分级”(第 5 章)形成了有趣的对比——教育价值高(通常意味着更难)的数据,在 SFT 阶段可能很有价值,但在中训练阶段不一定是最优选择。
12.3.8 预训练优化器与中训练效果
一个较新的发现(Sharpness-Aware Pretraining, arXiv: 2605.02105, 2026):预训练阶段使用的优化器类型会显著影响后续中训练和后训练的效果。Sharpness-Aware 优化器使模型参数落在损失函数的平坦区域(flat minimum),这使得模型在后训练(post-training)阶段和量化过程中能更好地保留能力。
对于中训练场景,这意味着如果预训练阶段使用了 Sharpness-Aware 优化器,中训练阶段的”抗遗忘”压力可能更低——模型的通用表征更加稳定,更容易通过中训练获得定向能力而不损伤核心能力。实践中,如果你的 pipeline 包含中训练和后训练阶段,建议将预训练优化器也纳入 Pipeline 设计的考量。
12.3.9 轨迹合并:把预算横向分配
前面 12.3.1–12.3.8 的路线,无论退火式、多阶段、稳定-衰减还是强化中训练闭环,讲的都是数据与信号怎么组织;本节补的是另一根正交的轴——同一份中训练预算怎么摊。
Trajectory Soup(arXiv:2609.37169,2026-09-29)从”中训练收益有界”这一现象出发:继续追加串行算力几乎换不来下游提升,甚至会让某些能力退化,这给中训练能吸收多少算力设了实际天花板。它的做法是把预算分配给多条独立分支(共享 checkpoint 分叉 + 不同受控配方),各分支按验证集挑最强 checkpoint,再做 intra / inter 两层平均合并。可行性来自一个可测量的观察:不同配方分叉出的分支会到达参数空间的不同区域,产生一种单条 run 无论跑多久都提供不了的”兼容多样性”。
与前八条路线的关系是正交的:前者改的是”喂什么数据 / 用什么信号”,本条改的是”同一份预算怎么摊”。因此它可以叠加在退火式、多阶段、强化中训练任何一条之上——论文里分支之间的差异本就是”受控配方的不同”。与 §12.9 的”持续中训练""RL-中训练闭环”同样不冲突:合并发生在中训练阶段末尾,后训练照旧。
⚠️ 适用范围:论文报告的是中训练阶段的结论,不要外推到预训练——第 10 章的配比问题是另一套逻辑(另见 12.3.6 对持续预训练中 OptiMer 的讨论)。
12.4 中训练的数据量级
中训练的数据量级介于预训练和 SFT 之间,但其范围变化很大:
| 目标 | 典型数据量 | 占预训练的比例 | 代表案例 |
|---|---|---|---|
| 知识时效更新 | 50B-200B token | 0.5-2% | 一般增量更新 |
| 长上下文扩展 | 50B-500B token | 0.5-5% | Llama 3 的上下文扩展 |
| 代码/数学增强 | 100B-1T token | 1-10% | Code Llama, DeepSeek Coder |
| 多语言增强 | 200B-2T token | 2-20% | 中文增强、多语言适配 |
| 综合中训练 | 500B-2T token | 5-20% | Llama 3/3.1 的完整中训练 |
一个关键认知:中训练的数据量不能太少也不能太多。
- 太少(<50B):模型来不及调整内部表示,效果不明显
- 太多(>预训练的 30%):三条风险—— ① 严重的遗忘问题;② 过拟合于中训练数据;③ 收益归零——串行算力存在饱和点,继续纵向追加几乎不再带来下游提升,甚至可能让部分能力退化(arXiv:2609.37169,2026-09-29)。前两条是”会变差”,第三条是”白花”。
因此本章的算力规划是两段式的( 详见 §12.2.6 与 §12.7 决策 2 续):第一段到达”起飞平台”(下限由 PRISM 给出,约 27B 高质量 token 即可为后续 RL 创造有效条件,跳过则无论投多少 RL 计算都收效甚微);第二段突破”串行天花板”(到达平台后继续纵向加 token 的边际收益迅速衰减,此时新增预算应改为横向分支 + 两层合并)。
12.5 中训练 vs 继续预训练 vs 领域适应:辨析
这三个概念经常被混用。让我们厘清它们的区别和联系:
| 维度 | 中训练 | 继续预训练 | 领域适应 |
|---|---|---|---|
| 目标 | 多维度能力增强 | 增加训练量或更新知识 | 适应特定领域 |
| 数据 | 精选的多领域混合 | 通用数据(可能更新) | 领域专用数据 |
| 学习率 | 通常退火 | 可继承/重新warmup | 通常降低 |
| 数据量 | 100B-2T token | 可以很大 | 通常较小(10B-200B) |
| 遗忘风险 | 中等(通过配比控制) | 低(数据分布相似) | 高(数据分布偏移) |
| 典型场景 | Llama 3 的退火阶段 | 在新的 CC 快照上继续训练 | 构建法律/医疗模型 |
实际上,中训练包含了继续预训练和领域适应的元素,但比两者都更系统化。 它的核心创新在于:
- 多目标同时优化:不是只增强一个维度,而是同时提升长上下文、代码、数学等多种能力
- 精心设计的数据策略:不是简单地”在更多数据上训练”,而是根据能力需求调整配比
- 与训练流程的深度集成:学习率、batch size、上下文长度都需要协调调整
12.6 主要模型的中训练实践
Llama 3/3.1(Meta,2024)
Llama 3 是中训练实践的标杆,它的技术报告提供了最详细的公开信息。
关键细节:
- 预训练 15T token 后,进入退火阶段
- 退火期间上采样高质量数据(维基百科类、精选书籍、优质网页)
- 数学数据额外上采样,提升推理能力
- 长上下文扩展分阶段进行(8K→128K)
- 退火期间同时加入少量多语言数据
DeepSeek V3(DeepSeek,2024.12)
DeepSeek V3 的中训练策略体现了极致的工程化:
- 总预训练 14.8T token
- 最后 2T token 进入退火阶段
- 退火期间的数据分布发生了显著变化:代码和数学的占比大幅提升
- 使用了 MoE 架构(671B 总参数,37B 激活参数),这对中训练的数据需求有特殊影响
Qwen 2.5(阿里,2024)
Qwen 2.5 的中训练聚焦于中文能力的增强:
- 在大规模预训练后,增加中文数据的比例
- 特别强化了中文代码和数学能力
- 多语言配比经过了大量的消融实验
Llama 4(Meta,2025)
Llama 4 是 MoE 架构在中训练中的首个标杆级实践。Scout 模型(17B 激活/109B 总参,16 专家选 1)的训练流程明确分为三阶段:
- 预训练:大规模多模态预训练,采用路由专家 + 共享专家结构
- 中训练:长上下文扩展阶段,通过 iRoPE(交错旋转位置编码)将上下文扩展到 10M token,同时包含早期融合的多模态数据
- 后训练:轻量 SFT + 在线 RL + 轻量 DPO,刻意保持轻量化
MoE 架构对中训练策略有本质影响:
- 路由/共享专家结构:共享专家充当通用知识的”锚点”——中训练时即使路由专家在不同领域数据上产生分化,共享专家保留了跨领域的通用表征,天然缓解了遗忘问题
- 负载均衡约束:中训练阶段的数据配比需要考虑专家路由的负载均衡,避免某些专家过度激活
- 计算效率:109B 总参数中仅 17B 激活,使得更长的中训练(更多 token)在计算成本上可行
Qwen3-Coder-Next(阿里,2026)——深而专的代码中训练
Qwen3-Coder-Next 代表了一种极致聚焦的中训练策略:专攻代码能力的深度增强。
关键细节:
- 80B 总参/3B 活跃参的 MoE 架构,中训练使用 600B tokens 的仓库级代码数据
- 数据组成包含多脚手架 agentic 轨迹 + 800K 合成软件工程任务
- 成果:SWE-Bench Verified 71.3%,SWE-Bench Pro 44.3%
- 与 10-30x 活跃参数量的模型竞争,验证了大规模代码中训练的威力
Qwen3-Coder-Next 的策略选择是”深而专”——中训练数据几乎完全聚焦于代码领域,通过仓库级代码(而非函数级)和 agentic 轨迹来注入更深层次的软件工程能力。
GLM-5(智谱,2026)——广而全的多能力中训练
GLM-5 代表了与 Qwen3-Coder-Next 截然相反的策略:多能力维度同时扩展。
关键细节:
- 744B 总参/40B 活跃参的 MoE 架构,中训练使用 1.55T tokens
- 中训练同时覆盖代码/推理/长上下文/agentic 数据,而非分阶段独立处理
- 三阶段渐进式上下文扩展:32K → 128K → 200K
- 成果:SWE-Bench Verified 77.8%(超过 Qwen3-Coder-Next)
GLM-5 的策略选择是”广而全”——在更大的总训练量和更广泛的领域覆盖下,实现了各维度能力的全面提升。
两种策略的对比启示:
| 维度 | Qwen3-Coder-Next | GLM-5 |
|---|---|---|
| 策略 | 深而专(代码聚焦) | 广而全(多能力并发) |
| 中训练 token 量 | 600B | 1.55T |
| 上下文扩展 | 未公开 | 32K→128K→200K 渐进 |
| 活跃参数 | 3B | 40B |
| SWE-Bench Verified | 71.3% | 77.8% |
| 适用场景 | 计算受限、目标明确 | 资源充足、追求全能 |
这两种策略并无绝对优劣——Qwen3-Coder-Next 在更少的计算资源下实现了极强的代码能力,而 GLM-5 用更多的资源换取了更全面的能力覆盖。选择哪种策略取决于计算预算、目标能力的广度,以及是否需要在多个维度上同时达到高水平。
通用模式
从这些实践中,我们可以提炼出中训练的通用模式:
模式 1: 能力增强 → 退火
- 先在目标能力相关的数据上集中训练
- 然后在高质量混合数据上退火
模式 2: 渐进式扩展
- 逐步扩展能力维度(如上下文长度逐步增大)
- 每扩展一步,都验证旧能力不退化
模式 3: 多轮退火
- 经历多轮"升温-退火"周期
- 每轮聚焦不同的能力维度
模式 4: MoE 专家特化中训练
- 利用 MoE 的稀疏结构,不同专家对不同能力维度特化
- 共享专家保留通用知识作为抗遗忘"锚点"
- 中训练数据配比需与专家路由策略协同设计
模式 5: 多分支 + 轨迹合并(Trajectory Soup, arXiv:2609.37169)
- 从同一 checkpoint 分叉 N 条"受控差异"配方的分支
(要的是配方不同,不是随机种子不同)
- 各分支按验证集挑 Top-K checkpoint
- 先做分支内平均(intra-trajectory),再做跨分支平均(inter-trajectory)
- 注意:checkpoint 选择带 bias,K 存在上限,不是越多越好
- 适用:中训练串行收益已饱和、但仍有预算
模式 4 与模式 5 的对照:两者解决的是相似的问题(多样性),但手段不同——模式 4 是在”一次训练内部”靠架构稀疏性让不同专家吸收不同能力;模式 5 是在”多次训练之间”靠优化轨迹多样性让不同分支走向不同区域,再合并回来。前者需要 MoE 架构支持,后者对架构无要求。
12.7 中训练的关键决策
在设计中训练方案时,你需要做出以下关键决策:
决策 1:从哪个检查点开始?
选项 A:从预训练的最后一个检查点开始
→ 最自然,但学习率需要从预训练末期的值开始衰减
选项 B:从预训练中间的某个检查点开始
→ 如果预训练末期的数据有问题,可以"回退"重来
→ 需要重新跑预训练的部分步骤
选项 C:从预训练退火前的检查点开始
→ 中训练本身就是一个"定制版退火"
→ 这是 Llama 3 采用的方式
推荐:从退火开始前的检查点出发,设计你自己的退火策略。这样你拥有最大的灵活性。
决策 2:中训练多少 token?
一个经验性的指导框架:
def estimate_midtraining_tokens(
pretrain_tokens: float, # 预训练总 token 数
num_objectives: int = 3, # 中训练目标数量
difficulty: str = "medium" # 目标难度
) -> dict:
"""
估算中训练所需的 token 数
"""
# 基线:预训练的 3-10%
base_ratio = {
"easy": 0.03, # 简单目标(如知识更新)
"medium": 0.07, # 中等目标(如代码增强)
"hard": 0.15, # 困难目标(如大幅扩展上下文+多语言+代码)
}
ratio = base_ratio.get(difficulty, 0.07)
# 多目标需要更多数据
ratio *= (1 + 0.2 * (num_objectives - 1))
tokens = pretrain_tokens * ratio
return {
"estimated_tokens": f"{tokens/1e9:.0f}B",
"ratio_to_pretrain": f"{ratio*100:.1f}%",
"note": f"基于 {pretrain_tokens/1e12:.1f}T 预训练, "
f"{num_objectives} 个目标, 难度={difficulty}",
}
# 示例
print(estimate_midtraining_tokens(15e12, num_objectives=3, difficulty="medium"))
# {'estimated_tokens': '1470B', 'ratio_to_pretrain': '9.8%', ...}
决策 2 续:串行饱和与横向分配——这个 token 数该怎么摊
上面的函数只回答”总共多少 token”,不回答”这些 token 怎么分配”。而后者恰恰决定了预算能不能被有效吸收,因为串行这条轴是有天花板的。
1. 串行扩展会饱和。 中训练的收益是有界的:继续追加串行算力几乎换不来下游提升,甚至会让某些能力退化——这给”中训练能吸收多少算力”设了一个实际上限。这也给 §12.4 那句”太多(> 预训练 30%)可能引发遗忘”补上了另一半理由:不只是遗忘风险,还有收益归零风险。把预算全押在一条更长的 run 上,第一段是有效的,第二段可能什么也换不来。
2. 预算应该横向切。 Trajectory Soup 的做法是:把中训练预算分配给多条独立分支(从同一 checkpoint 分叉、跑不同的受控配方),各分支按验证集挑选最强的 checkpoint,再做两层平均合并——intra-trajectory(同一分支内平均)与 inter-trajectory(跨分支平均),合并成单个模型。其可行性来自一个观察:从共享 checkpoint 分叉出去、跑不同受控配方的多条分支,会到达参数空间中可测量的不同区域,由此产生一种”兼容多样性”——这是单条 run 无论跑多久都提供不了的。
论文的 bias-variance 分析把两层平均分开解释:inter-trajectory 平均能消除 intra 平均够不到的残差;而 checkpoint 选择本身带 bias,这限制了”值得合并的 checkpoint 数量”。实测结论是跨模型规模、学习率调度、token 预算、分支数量均优于”同等预算下最强的单轨迹平均”,优势随预算扩大而保持,且经过完全相同的后训练流程之后优势仍在。
3. 三条可操作判据:
- 何时从纵向切到横向:监控”继续加 token 是否还在涨”。一旦边际收益走平(§11.6 的闭环监控已在定期评估,可以把这个判据直接接进去),剩余预算就该改成开新分支,而不是继续拉长旧分支。
- 分支必须是”受控差异”:要的是从共享 checkpoint 分叉后配方不同(数据配比、课程、LR 调度等),不是随机种子不同而已——目的就是到达参数空间的不同区域。
- 合并数有上限:checkpoint 选择带 bias,不是合并越多越好。这一点要特意与”model soup 类方法合并越多越稳”的直觉对冲一下。
决策 3:学习率策略
选项 A: 继承预训练学习率,直接退火
→ 最简单,适合目标简单的中训练
选项 B: 短暂 warmup 后退火
→ 避免学习率突变带来的不稳定
→ 推荐作为默认策略
选项 C: 重新 warmup 到较高学习率
→ 适合需要大幅改变模型能力的场景(如大规模领域适应)
→ 遗忘风险较高,需要仔细控制
决策 4:数据配比策略
这是最关键也最难的决策。我们将在第 9 章深入讨论。
12.8 中训练的风险与挑战
灾难性遗忘
这是中训练面临的最大风险。我们将在第 10 章用一整章来讨论,这里先概述:
- 中训练的数据分布与预训练不同,可能导致模型”忘记”预训练中学到的知识
- 遗忘的严重程度取决于:数据分布偏移的程度、中训练的时长、学习率的大小
- 核心对策:在中训练数据中混入一定比例的通用数据(回放策略)
能力冲突
不同能力之间可能存在冲突:
案例:数学增强 vs 创意写作
- 大幅增加数学数据后,模型的创意写作能力下降
- 原因:数学数据的格式化、结构化风格"压制"了创造性表达
- 对策:在配比中保留足够的文学/创意类数据
训练不稳定
中训练阶段的数据分布切换可能导致训练不稳定(loss spike):
- 特别是在上下文长度突然变化时
- 或者在数据域占比剧烈调整时
- 对策:渐进式调整,而非突变
12.9 展望:中训练的未来
”Mid-training is the new pre-training”
Noam Brown 的这句话蕴含着一个深刻的趋势:预训练可能会变得越来越通用化和标准化,而真正的差异化将发生在中训练阶段。
原因在于:
- 预训练数据逐渐收敛(大家都在用 Common Crawl + 类似的高质量源)
- 预训练的方法论趋于成熟(Transformer + 类似的超参数)
- 中训练提供了在通用基座上”雕刻”特定能力的灵活性
Agent 数据的中训练
随着 AI Agent 的兴起,工具调用、环境交互、多步骤规划等能力的需求日益增长。这些能力很难在预训练阶段获得(因为互联网上没有足够的 Agent 交互数据),而中训练阶段是注入这些能力的天然窗口。
持续中训练
传统的中训练是”一次性”的——做完中训练就进入 SFT。但未来可能会出现持续中训练的模式:模型定期在新数据上进行中训练更新,保持知识的时效性,而无需每次都从预训练重来。
与 §12.3.9 的连接:“持续中训练”天然是多条轨迹——每一轮更新都是从上一版分叉出去的一条分支,因此轨迹合并在持续场景下有直接应用:每轮结束做一次 intra / inter 合并,再进入下一轮。
⚠️ 但这一组合目前没有直接实验支撑。 Trajectory Soup 论文把”数据混合的改变对方法的影响”明确列为未来工作(“Changes to the data mixture are a possible extension, and we leave their effects to future work”)。而持续中训练恰恰是”每轮都换数据”。因此”每轮换数据 + 合并”这个具体组合属于本章推断,采用前请自行小规模验证。
RL-中训练闭环
传统流水线是单向的(预训练→中训练→SFT→RL),但 ReMiT 和 RGA 开启了”后训练→中训练”的反向通路,形成自强化飞轮(详见 8.3.4 节)。远期看,中训练可能不再是训练流程中固定的”一个阶段”,而是与 RL 交替进行的迭代循环——每一轮 RL 的发现(如哪些 token 对推理至关重要、哪些知识缺口导致了推理失败)反馈到下一轮中训练的数据选择中。这与第 7 章讨论的”迭代数据飞轮”形成呼应:数据飞轮不仅存在于预训练阶段,中训练-后训练的闭环可能是效率更高的飞轮。
RL-during-Pretraining:取消独立中训练阶段?
Bansal、Qin、Alvarez-Melis、Kakade(Harvard,arXiv:2606.04272,2026-06-04)的 “Re-examining Policy Optimization in LLM Training” 挑战了”RL 只能在 SFT 之后应用”的传统观点,提出了一个激进方向:不再有”中训练”这个独立阶段,而把 RL 信号贯穿整个预训练过程。
实验设计:从头训练 LLM,并对中间预训练 checkpoint 直接应用 RL、SFT 以及 SFT→RL 三种方案。
颠覆性发现:
- RL 在早期就有效——通常能匹配 SFT→RL 的早期阶段
- 数据组成比模型规模更重要——针对性的预训练数据组成是 RL 有效性的关键杠杆
- RL 直接用于基础 checkpoint 可以扩展模型的分布——近期报告的”锐化效应”仅在 RL 紧接 SFT 后才出现;单独 RL 不会锐化
- 模型通用能力在 RL 下基本保持不变,而在 SFT 后会下降
- 并行平均合并 RL 和 SFT 目标在所有指标上优于其他方法(纯 SFT、纯 RL、SFT→RL)
对中训练概念的冲击:
传统流程:
Pretraining → Mid-training → SFT → RL
(通用基座) (能力偏移) (指令) (偏好)
RL-during-Pretraining 激进路径:
Pretraining (with RL signals interleaved) → Post-training
训练流水线大幅简化
对工业实践的深远影响:
- 训练流水线可以简化为:pretraining (with RL signals interleaved) → post-training
- 不再需要专门的”中期数据”和”退火阶段”
- “中期数据应包含 X% 通用 + Y% 领域”的配方设计可能变得无关紧要
- 优化器状态管理与分布保持的设计复杂度大幅降低
当前局限:这一方向目前主要在学术探索阶段(实验规模相对小),尚需验证是否能扩展到 70B+ 规模。但作为对”中训练”独立阶段存在必要性的根本性质疑,值得持续关注。
RODS 框架——Agentic RL 的在线数据合成
RODS(Reward-Driven Online Data Synthesis,arXiv:2606.19047,2026-06-17) 是蚂蚁集团 Inclusion AI、浙江大学、上海创智学院、西湖大学联合发表的 agentic RL 训练数据在线合成框架。
核心机制:
- 多轮 agentic RL 的训练数据成本昂贵(构造环境 + 收集 rollout 都贵)
- RODS 利用 GRPO 训练时的奖励信号挑选种子样本,搭建模拟环境构造高质量合成数据
- 关键是”奖励信号驱动”——哪些种子样本被选中、合成数据的难度档位如何调整,都由当前 RL 训练轮的奖励分布决定
效率数据:
- 400 条种子样本即可达到 17K 离线大规模合成数据的水平
- 在线、按需合成避免了”一次性大规模离线合成”的算力集中消耗
对实践的指导:
- RODS 是”online 优于 offline”在 agentic RL 场景的具体证据
- 与 §8.3.5 “For & With Agentic RL”框架呼应——RL 信号既指导中训练数据选择,也指导 agentic RL 训练数据合成
- 详见 Ch09 §9.x 数据合成 关于 RODS 在中训练数据场景的应用
动手环节:设计一个中训练方案
目标:为一个真实场景设计完整的中训练策略,包括阶段规划、数据配比和学习率调度。
练习 1:中训练方案规划器
"""
中训练方案设计工具
输入你的需求,输出分阶段的中训练计划
"""
from dataclasses import dataclass
from typing import List
@dataclass
class MidTrainingObjective:
name: str
priority: str # "critical", "important", "nice-to-have"
estimated_tokens_B: float
data_ratio_shift: dict # 相比预训练的配比变化
@dataclass
class MidTrainingStage:
name: str
tokens_B: float
lr_strategy: str
data_ratios: dict
context_length: int
validation_criteria: List[str]
def design_midtraining_plan(
pretrain_tokens_T: float,
objectives: List[MidTrainingObjective],
) -> List[MidTrainingStage]:
"""根据目标自动设计中训练分阶段计划"""
# 估算总中训练量
total_tokens_B = sum(obj.estimated_tokens_B for obj in objectives)
# 安全检查
ratio = total_tokens_B / (pretrain_tokens_T * 1000)
if ratio > 0.2:
print(f"⚠️ 中训练量占预训练的 {ratio*100:.1f}%,超过 20%,"
f"遗忘风险较高!")
stages = []
# 阶段 1:能力增强
critical_objs = [o for o in objectives if o.priority == "critical"]
if critical_objs:
enhance_tokens = sum(o.estimated_tokens_B for o in critical_objs)
combined_ratios = {}
for obj in critical_objs:
for domain, ratio in obj.data_ratio_shift.items():
combined_ratios[domain] = combined_ratios.get(domain, 0) + ratio
# 归一化
total = sum(combined_ratios.values())
combined_ratios = {k: v/total for k, v in combined_ratios.items()}
stages.append(MidTrainingStage(
name="能力增强",
tokens_B=enhance_tokens,
lr_strategy="恒定 (预训练末期 LR × 0.3)",
data_ratios=combined_ratios,
context_length=8192,
validation_criteria=[
"目标能力 benchmark 提升 > 5%",
"通用能力退化 < 2%",
],
))
# 阶段 2:长上下文扩展(如果需要)
ctx_objs = [o for o in objectives if "长上下文" in o.name]
if ctx_objs:
stages.append(MidTrainingStage(
name="长上下文扩展",
tokens_B=ctx_objs[0].estimated_tokens_B,
lr_strategy="较低恒定 LR (预训练末期 × 0.1)",
data_ratios={"长文档": 0.6, "通用": 0.4},
context_length=131072,
validation_criteria=[
"Needle-in-a-Haystack 在 128K 通过",
"短上下文任务不退化",
],
))
# 阶段 3:退火巩固
stages.append(MidTrainingStage(
name="知识巩固(退火)",
tokens_B=max(50, total_tokens_B * 0.15),
lr_strategy="Cosine 退火到 0",
data_ratios={"高质量通用": 0.5, "代码": 0.2, "数学": 0.1,
"书籍": 0.1, "学术": 0.1},
context_length=stages[-1].context_length if stages else 8192,
validation_criteria=[
"全部能力 benchmark 稳定",
"Loss 完全收敛",
],
))
return stages
# === 设计方案 ===
objectives = [
MidTrainingObjective(
"代码能力增强", "critical", 200,
{"代码": 0.35, "通用": 0.30, "数学": 0.15, "学术": 0.10, "书籍": 0.10}
),
MidTrainingObjective(
"中文能力补充", "critical", 300,
{"中文网页": 0.40, "中文书籍": 0.15, "英文": 0.25, "代码": 0.15, "数学": 0.05}
),
MidTrainingObjective(
"长上下文扩展", "important", 100,
{"长文档": 0.60, "通用": 0.40}
),
]
stages = design_midtraining_plan(pretrain_tokens_T=15, objectives=objectives)
print("=" * 60)
print("中训练方案")
print("=" * 60)
total = 0
for i, stage in enumerate(stages, 1):
total += stage.tokens_B
print(f"\n阶段 {i}: {stage.name}")
print(f" Token 数: {stage.tokens_B:.0f}B")
print(f" 学习率: {stage.lr_strategy}")
print(f" 上下文长度: {stage.context_length:,}")
print(f" 数据配比:")
for domain, ratio in sorted(stage.data_ratios.items(),
key=lambda x: -x[1]):
print(f" {domain}: {ratio*100:.0f}%")
print(f" 验证标准:")
for criterion in stage.validation_criteria:
print(f" ✓ {criterion}")
print(f"\n总计: {total:.0f}B token "
f"(占预训练的 {total/15000*100:.1f}%)")
练习 2:学习率退火可视化
"""
可视化不同中训练学习率策略
"""
import math
def cosine_annealing(step, total_steps, start_lr, min_lr, warmup_steps=100):
if step < warmup_steps:
return min_lr + (start_lr - min_lr) * step / warmup_steps
progress = (step - warmup_steps) / (total_steps - warmup_steps)
return min_lr + 0.5 * (start_lr - min_lr) * (1 + math.cos(math.pi * progress))
# 模拟三种策略
total_steps = 10000
pretrain_peak_lr = 3e-4
strategies = {
"直接退火": lambda s: cosine_annealing(s, total_steps, pretrain_peak_lr * 0.3, pretrain_peak_lr * 0.01, 0),
"Warmup+退火": lambda s: cosine_annealing(s, total_steps, pretrain_peak_lr * 0.3, pretrain_peak_lr * 0.01, 200),
"重新Warmup": lambda s: cosine_annealing(s, total_steps, pretrain_peak_lr * 0.8, pretrain_peak_lr * 0.01, 500),
}
# 打印关键点的 LR
print(f"{'步骤':<8}", end="")
for name in strategies:
print(f"{name:>15}", end="")
print()
print("-" * 55)
for step in [0, 100, 500, 2500, 5000, 7500, 10000]:
print(f"{step:<8}", end="")
for name, fn in strategies.items():
lr = fn(min(step, total_steps - 1))
print(f"{lr:>15.6f}", end="")
print()
# 思考题:
# 1. 哪种策略最适合"微调式中训练"(目标变化小)?
# 2. 哪种策略最适合"大规模能力注入"(如加强代码能力)?
# 3. 为什么 Llama 3 选择了"从退火前的检查点开始"而不是从最终检查点开始?
练习 3:遗忘风险评估
根据本章 8.8 节,为你在练习 1 中设计的中训练方案做一个遗忘风险评估:
- 计算每个阶段的数据分布偏移度(与预训练配比的 KL 散度)
- 估算遗忘风险等级(低/中/高)
- 为每个高风险阶段设计回放策略(混入多少比例的通用数据)
这个练习为第 10 章(灾难性遗忘)的深入学习做铺垫。
本章要点回顾
- 中训练是预训练和 SFT 之间的独立阶段,已从”工程技巧”升级为”核心范式”
- 五大目标:长上下文、代码/数学增强、多语言补充、知识更新、领域注入
- 中训练是 RL 的前置必要条件:PRISM 实验证明不做中训练的 RL 几乎无效,仅 27B token 即可创造有效条件
- 四种技术框架:退火式、多阶段、稳定-衰减、强化中训练(RL 引导的闭环范式)
- 长上下文扩展加速进化:从 8K→128K→4M→10M,数据效率持续提高
- 数据量级:通常是预训练的 3-20%,即 100B-2T token
- 区分中训练、继续预训练、领域适应三个相关但不同的概念
- MoE 架构开启专家特化中训练:共享专家保留通用知识,路由专家实现能力维度特化
- 灾难性遗忘是最大风险,需要通过数据回放和配比控制来防范
- “Mid-training is the new pre-training”——中训练正在成为模型差异化的关键战场,且正从单向流水线进化为与后训练双向优化的闭环
- 中训练的形式化核心特征:“有意的分布偏移” + “双向能力平衡”——遗忘不是副作用,而是必须主动优化的目标函数分量
- “For & With Agentic RL”双重框架统一了 PRISM/ReMiT/RGA 等工作——中训练既服务 RL(FOR),又与 RL 协同优化(WITH),构成双向闭环
- 深而专 vs 广而全:Qwen3-Coder-Next(600B 代码聚焦)和 GLM-5(1.55T 多能力并发)代表了两种截然不同的中训练策略选择