03 / Mid-Training进阶

Mid-training:把基础能力塑造成可学习的起点

数据重平衡、continued pretraining、退火与阶段切换

以Qwen的分阶段预训练和公开配置对照,解释中训练做什么、何时该做,以及怎样避免遗忘和错误恢复。

READ WITH A QUESTION

读完这一章,你应该能够

  • 严谨区分官方术语与课程抽象
  • 设计数据与学习率阶段切换
  • 判断能力应在哪个训练阶段获得
前置理解 能阅读 Python/PyTorch · 理解交叉熵;梯度直觉可先补充
本章目录 · 0 个小节

一个更实际的起点:已经会续写,为何仍不适合 RL

基础模型可能有大量知识,却很少生成可验证的数学解答、可编译程序或长文档证据链。如果一次任务采样很多次仍全失败,稀疏 outcome reward 很难告诉模型朝哪里探索。反过来,若模型已经能产生正确候选,却总是不遵循对话格式,继续灌入大量知识文本也不一定解决行为问题。

课程分析:Mid-training 是我们对预训练与任务后训练之间能力塑形工作的统一称呼。它不是一个唯一目标函数,也不是所有公司共享的正式阶段名。continued pretraining、domain adaptation、annealing、long-context extension 可能部分重叠,应按数据、目标、初始化与训练状态判断,不按名字硬分。

从头部模型的公开阶段抽象共性

本章选用 Qwen3 的完整公开阶段报告来拆解机制;同系列当前版本及 DeepSeek、Kimi、GLM、MiMo 的最新证据在 技术演进地图 持续对照。版本更新时,应重新核对数据、目标函数和恢复语义,不能沿用前代结论。

Qwen3 报告在预训练内部区分 General、Reasoning 和 Long Context:前两段使用 4K 序列,第二段提高 STEM、代码、推理与合成数据比例并加快 LR 衰减;后段训练到 32K。我们把第二段的能力重平衡纳入“中训练”教学范畴,不把报告的 Reasoning Stage 改写成它官方称为 Mid-training。官方阶段与论文实验

DeepSeek-V3 的报告则在预训练后安排单独的两步上下文扩展。该事实支持“能力塑形可有多个阶段”,并不证明所有团队有一样的阶段边界。技术报告 Olmo 3 明确使用 Midtraining 一词,可作为术语及开源实现的补充对照。官方报告

变化轴原训练能力塑形后训练接口
数据广覆盖、多样性目标能力加权与保留分布prompt/response、偏好或轨迹
目标全文 token 预测为主可保留相同预测目标response mask、偏好、policy objective
预算大规模长期通常更集中、可分支实验生成和验证也消耗大量计算
评测域级 loss 与基础能力目标增益 + 非目标保留固定采样预算下可用性

表中的“通常”是课程抽象,不是每个团队的公开事实。合成问答可进入全文预训练,也可进入 response-only SFT;数据看起来像聊天,不能直接决定训练阶段。

最新接口案例:Agent中心中训练

MiMo-V2.6 最新公开报告明确使用 mid-training 术语:它在通用多模态基础之上混入Agent任务轨迹,并为后续大批RL调整长上下文、优化器和量化方案。官方报告 §3.2 这给了本章抽象一个新的、直接命名的头部案例。其隐藏矩阵采用Muown,而非所有参数一律替换AdamW;细节和代价在 最新机制源码对照 分解。

课程分析:阶段契约应新增三栏——后续rollout的最大任务长度、训练/推理精度,以及需要继承或变换的optimizer state。中训练的交付物不仅是更高的目标评测分数,也可能是适合高吞吐RL的数值和系统状态。是否值得这样准备,仍需用固定RL预算的后续实验验证。

数学上仍是语言建模,优化轨迹已经改变

令通用分布为 DgD_g、目标分布为 DcD_c,一段简单的能力塑形目标可以写成 Lt=(1−λt)EDgℓθ+λtEDcℓθ.\mathcal L_t=(1-\lambda_t)\mathbb E_{D_g}\ell_\theta+\lambda_t\mathbb E_{D_c}\ell_\theta. λt\lambda_t 控制塑形压力与通用回放,ηt\eta_t 控制每次更新的幅度。增加目标数据比例和增大学习率都可能加速目标能力变化,但副作用不同:前者改变期望梯度方向,后者放大所有梯度。两者同时大幅切换,诊断会变得困难。

一个重要局部近似是:沿目标梯度 gcg_c 更新后,通用 loss 改变量约为 −ηgg⊤gc-\eta g_g^\top g_c。若梯度内积为负,改善目标领域可能损害通用领域。这不是完整的高维训练理论,却给了 replay 与小步切换一个可解释的动机。双领域实验

Annealing 不等于只把学习率画成下降曲线

退火阶段可能同时改变数据质量、比例、训练长度和 optimizer 状态。评价其收益必须拆开变量:固定数据只变 LR;固定 LR 只变数据;再比较组合。否则不能判断“最后 100B token 很有效”来自优质数据、阶段时机还是更多训练。

课程建议:设计四组最小对照——维持原 mixture、目标 mixture、目标加 replay、目标加 replay 且缓和切换。固定初始 checkpoint 和 token 预算,至少记录目标能力、通用能力、每域 loss 与格式指标。在多个保存点测曲线,避免只比较最后一步。

真实源码对照:恢复 optimizer 不等于恢复 trainer

透明实现里最容易读错的地方是阶段时间坐标。固定版本 OLMo 3 7B midtrain build_config 使用专门 mixture、100B token 预算、线性 LR 衰减;load_optim_state=True,而 load_trainer_state=False。与预训练第二段两者均为 True 形成对照。源码:midtrain 源码:pretrain

这段代码帮助解释一个通用问题,不表示 Qwen 或 DeepSeek 的私有训练系统也按此实现。保留 Adam moments 可继承对梯度尺度的估计;新分布又可能让旧 moments 不合适。重置它们会产生另一种瞬态。是否保留要做受控实验,不能以“微调都要重置”或“续训都要保留”当规则。

加载旧 trainer state 还可能继承旧数据位置、累计 token 和 LR 时钟。如果换了 dataset 却把旧 dataloader offset 当新数据的 offset,开头的目标池可能被跳过;如果没有加载 trainer state 却沿用已衰减完的 LR,模型可能几乎不更新。源码阅读的产物应是状态表,不是一条启动命令。

如何判定能力应该放在哪个阶段

具体问题首选调查为什么
领域术语、API、语法概率普遍差continued pretraining / 数据塑形需要覆盖基础分布;检索也可能更划算
pass@k 有正确解,pass@1 低后训练选择与优化候选支持集已有成功路径
不遵守 JSON 或工具协议SFT 与执行反馈首先是条件行为与接口问题
长文证据无法连接长上下文适配 + 长任务训练长度、位置与利用能力要分开定位
API 经常变动的事实知识检索/工具 + 更新机制持续更新参数未必是合适成本结构

课程分析:这不是自动决策器。最好用小额预算对两个阶段做同任务、同生成预算对照,观察“可用候选数”和“选择正确候选的概率”分别发生了什么变化。

可运行实验:把遗忘变成曲线

CODE / 可复制
python3 -m labs.run --experiment mixture --seed 7

CPU 教学实现让两个领域竞争共享参数,比较阶段切换与 replay。它不是能力上限的实证证明,而是一个能算出梯度方向的缩小机制实验。先预测增加 replay 后哪个领域 loss 会升高,哪个会降低,再检查实际输出。

默认 seed=7 的实验:基础阶段 A/B MSE 约 0.322/0.331;把 A 权重调至 95% 后约为 0.003/1.186;65% A 的回放方案约为 0.142/0.587。这里 A 与 B 的目标故意冲突(y=x 与 y=-x,且没有 domain tag),用来暴露容量竞争,不能当作真实 LLM 的收益预测。

生产映射:共享标量对应一部分共享表示;阶段步数对应 token 曝光;领域 loss 对应领域 held-out 指标。真实大模型的容量、多任务迁移和优化器会使曲线更复杂,因此把实验当作排查直觉,不当作目标数据比例建议。

失败排查与交付任务

目标 loss 降低但通用退步:检查实际 replay token 与重复率,分离记忆与迁移。目标评测提升但后续 RL 没有收益:对齐 sampling budget 和 verifier,检查更高分是否来自格式或污染。阶段切换马上发散:检查 LR 时钟、Adam moments、loss 归一化与异常长度。后训练后丢失中训练收益:在相同 prompt 上回放各 checkpoint,判断是 SFT 数据覆盖不足还是 RL reward 导向变化。

工程任务:写一张阶段契约,包含 checkpoint ID、数据 manifest、tokenizer、loss mask、LR 起止、optimizer/trainer 恢复标志、目标与保留评测、停止条件。用它审读一个新模型的报告,把每一项标记为“公开”“源码确认”或“未知”。下一章 能力塑形 专门解决合成推理数据怎样进入这张契约。

MAKE IT RUN

把这一章放进实验里

调整变量,观察机制,再运行本地 Python 实验验证。

进入实验

本章证据与源码

引用代表相应来源支持的结论,不意味着公开了完整训练配方。

论文实验Qwen3 Technical ReportQwen Team · arXiv:2505.0论文实验DeepSeek-V3 Technical ReportDeepSeek-AI · arXiv:2412.1源码观察OLMo 3 7B:官方 Midtraining 配置与恢复语义allenai · 0589a034f721源码观察OLMo 3 7B:官方预训练第二阶段配置allenai · 0589a034f721论文实验2 OLMo 2 FuriousTeam OLMo / Ai2 · arXiv:2501.0论文实验Olmo 3Team Olmo / Ai2 · arXiv:2512.1源码观察OLMo-core:数据源比例与重复上限allenai · 0589a034f721论文实验MiMo-V2.6 Technical ReportXiaomiMiMo · 5711b2681699

留下你的工程判断

记录一个还没有解释清楚的现象,或下一次实验要控制的变量。笔记仅保存在当前浏览器。

自动保存在本机 · 可在“我的学习笔记”导出
理解机制,比记住结论更重要。