AI 基建
0%
第一部分 · 基座模型的形成 · 第 11 章

中段训练:退火、领域桥接与上下文扩展

作者Changkun Ou
阅读时长约 13 分钟

宽泛预训练的词元和计算预算一用完,这一阶段便结束。但结束并不意味着得到的模型已经是代码助手、数学推理模型、领域模型或长文档模型的最佳起点。后训练可以改变行为;如果还要让相对有限的后训练数据同时弥合很大的分布差距,迁移结果就更难解释。

中段训练(mid-training) 是对中间能力形成阶段的一种称呼。它通常沿用接近预训练的目标,但会在最终的行为塑造开始之前,改变数据混合、学习率调度或训练采用的序列长度。实践本身早于这个名称。例如,Gururangan 等人早在 2020 年就系统研究了领域自适应预训练 (Gururangan et al. 2020)。Liu、Neubig 与 Xiong 在 2025 年提出了一个更窄的中段训练工作定义,并实验了宽泛数据与专门数据在训练后期的混合方式 (Liu et al. 2025)。这一术语尚无统一分类,因此不能只报阶段名称,还必须说明它实际改了什么。

按作用命名训练阶段

一次训练运行是有顺序的阶段序列,而不是几组可以任意调换的设置:

R=(P0,,PK),Pi=(Oi,Di,ηi,Bi,Li).\mathcal R=(\mathcal P_0,\ldots,\mathcal P_K), \qquad \mathcal P_i=(\mathcal O_i,\mathcal D_i,\eta_i,B_i,L_i).

其中,R\mathcal R 表示完整的训练运行,Pi\mathcal P_i 表示第 ii 个阶段,Oi\mathcal O_i 是训练目标,Di\mathcal D_i 是数据分布,ηi\eta_i 是学习率调度,BiB_i 是词元预算,LiL_i 是训练采用的最大序列长度,K+1K+1 是阶段总数。把这些字段逐项写清,才能避免用「又训练了一段时间」掩盖真正的干预。

各阶段最好按用途和监督信号区分:

阶段 常见数据与目标 预期结果
宽泛预训练 大规模异构语料;自监督词元预测 形成通用基座能力
中段训练 经过筛选或重新加权的语料,有时使用更长序列;通常沿用自监督目标 让基座检查点更接近后续目标
后训练 示范、偏好、奖励、策略与安全数据 塑造行为接口

表中的「常见」不能省略。中段训练往往更新全部参数,但并非必须如此。下一词元预测也不是唯一边界,因为监督微调同样可以写成词元级似然损失。阶段归类要同时看训练流水线中的位置、数据与监督方式,以及它要改变的模型属性。

另一处常见混淆,是把中段训练与 继续预训练(continued pretraining) 当成互斥概念。继续预训练是一种方法,它让已有模型继续在自监督数据上训练;中段训练可以采用继续预训练。在 Liu 等人的实验中,「继续预训练」专指完全切换到专门数据的对照组,而「中段训练」仍混合专门数据与宽泛数据 (Liu et al. 2025)。其他论文对继续预训练的用法更宽,因此必须明确写出混合比例,不能从名称反推。

到了后训练,监督信号才发生变化:可以在示范数据上做 监督微调(SFT),从胜出与被拒回复的偏好中做 直接偏好优化(DPO),用可自动核验的结果做 可验证奖励的强化学习(RLVR),也可以采用其他策略与安全目标。后训练同样可能教会模型新能力。更窄也更可靠的说法是:选得合适的桥接阶段,可以缩小后训练需要跨越的分布差距。

midtraining A 宽泛预训练 异构数据 基座目标 B 中段训练 筛选后的混合、调度 或训练长度 A->B 能力桥接 C 后训练 示范、偏好、 奖励与策略 B->C 适配行为 D 服务中的模型 质量、延迟与策略 C->D 部署并评测
图 11.1. 阶段要由它改变了什么、为何改变来识别。中段训练通常保留自监督词元预测,同时改变数据、调度或训练长度;后训练则改变用于塑造行为的监督信号。

量化分布桥接

PP 是宽泛预训练分布,QQ 是代码、数学文本、科学论文或长文档等专门分布。在步骤 tt,二者的混合可以写成

Dt=(1αt)P+αtQ,0αt1.\mathcal D_t=(1-\alpha_t)P+\alpha_t Q, \qquad 0\leq\alpha_t\leq1.

其中,Dt\mathcal D_t 是步骤 tt 的采样分布,αt\alpha_t 是在指定采样器下,从 QQ 抽到一个词元或样本的概率。αt=0\alpha_t=0 表示只使用宽泛数据,αt=1\alpha_t=1 表示完全切换到专门数据。中间值会在增加专门数据暴露量的同时回放宽泛数据。这样做可能减轻遗忘,但并不保证不会遗忘。

最终混合权重并不能说明专门数据的累计剂量。若这一阶段包含 TT 个词元数相同的步骤,那么专门数据的平均占比是

αˉ=1Tt=1Tαt.\bar\alpha=\frac{1}{T}\sum_{t=1}^{T}\alpha_t.

这里,αˉ\bar\alpha 是这一阶段中预计来自 QQ 的词元比例,TT 是等词元训练步骤数,αt\alpha_t 是步骤 tt 的专门数据占比。如果「较早引入」和「较晚引入」两组实验使用的专门数据词元总量 TαˉT\bar\alpha 不同,就不能把差异只归因于引入时机。

举例来说,令归一化训练进度为 u[0,1]u\in[0,1],专门数据从 ss 开始引入,并在训练结束时线性升到占比 aa

α(u)={0,0u<s,aus1s,su1,αˉ=a(1s)2.\alpha(u)= \begin{cases} 0, & 0\leq u<s,\\ a\dfrac{u-s}{1-s}, & s\leq u\leq1, \end{cases} \qquad \bar\alpha=\frac{a(1-s)}{2}.

其中,ss 是引入时点,aa 是最终专门数据占比;在词元速率不变的前提下,αˉ\bar\alpha 是整段训练中的专门数据词元占比。这个线性斜坡只用于核算,并不表示它是最佳调度。Liu 等人的实验采用的是在若干引入时点之后保持固定混合权重。他们的小规模代码实验显示,引入时机与混合权重会相互影响,因此不能把「越早越好」当成普遍规律 (Liu et al. 2025)。

图 11.2. 上式线性斜坡的精确词元核算。橙色面积表示整次运行中专门数据词元的期望占比;图本身不推断能力或保留效果。

下面的可运行计算说明,报告引入时机和最终占比时,还必须同时报告累计暴露量。

def specialist_share(progress, start, final_share):
    """计算归一化训练进度上的线性混合占比。"""
    if not 0 <= progress <= 1:
        raise ValueError("progress 必须位于 0 到 1 之间")
    if not 0 <= start < 1 or not 0 <= final_share <= 1:
        raise ValueError("调度参数无效")
    if progress < start:
        return 0.0
    return final_share * (progress - start) / (1 - start)


start = 0.60
final_share = 0.30
total_tokens = 100_000_000_000
whole_run_share = 0.5 * final_share * (1 - start)

for progress in (0.0, 0.4, 0.6, 0.8, 1.0):
    value = specialist_share(progress, start, final_share)
    print(f"进度={progress:.1f}:专门数据占比={value:.1%}")

print(f"全程专门数据占比:{whole_run_share:.1%}")
print(f"专门数据词元:{total_tokens * whole_run_share / 1e9:.1f}B")
print(f"宽泛数据词元:{total_tokens * (1 - whole_run_share) / 1e9:.1f}B")

把数据调度与学习率调度分开

「退火」有时指训练末段更换数据,有时指降低学习率。两件事可以同时发生,却不是同一项干预。一种通用的预热、稳定、衰减调度可以写成

η(t)={ηmaxw(t/Tw),0t<Tw,ηmax,Twt<Ts,ηmaxd((tTs)/(TeTs)),TstTe.\eta(t)= \begin{cases} \eta_{\max}w(t/T_w), & 0\leq t<T_w,\\ \eta_{\max}, & T_w\leq t<T_s,\\ \eta_{\max}d((t-T_s)/(T_e-T_s)), & T_s\leq t\leq T_e. \end{cases}

其中,η(t)\eta(t) 是步骤 tt 的学习率,ηmax\eta_{\max} 是稳定阶段的学习率,TwT_w 是预热结束的步骤,TsT_s 是开始衰减的步骤,TeT_e 是这条分支结束的步骤;ww 从 0 升到 1,dd 从 1 降到设定的终止比例。线性、余弦等不同函数会得到不同调度。

MiniCPM 使用这种调度,让稳定平台上的检查点可以继续训练,也可以分出多条衰减分支 (Hu et al. 2024)。这只是便于开展实验,并不表示可以随意拼接调度。数据在训练末段发生变化,与学习率在训练末段衰减,是两项不同的干预。每条分支都应记录来源检查点、优化器与调度器状态、新的数据清单、学习率路径、词元数和随机种子。重置优化器状态或重新提高学习率,同样是新的干预,需要单独设置对照。

这一阶段的三种用途

质量退火

质量退火会在训练末段把数据课程转向经过质量或下游用途筛选的来源。OLMo 2 的前一阶段约占训练 FLOPs 的 90% 至 95%,最后 5% 至 10% 会在学习率下降的同时切换到 Dolmino Mix 1124。这份专门混合包含过滤后的网页、去污染任务数据、学术与参考资料、问答和合成数学数据 (OLMo Team 2025)。这证明了一套有记录的配方,并不等于「越干净的数据越应该放到最后」。来源权重、过滤规则、重复数据和基准重叠检查仍是结论的一部分。

因此,「高质量」不能只作为一个标签。至少要拆成可观察的来源谱系、过滤阈值、文档与语言构成、去重策略、合成数据占比和污染检查结果,否则无法复现,也无法解释这一阶段。

领域中段训练

领域中段训练会在行为适配之前使用自监督的专门数据。Qwen2.5-Coder 报告了 5.2 万亿词元的文件级训练,随后进行约 3000 亿词元的仓库级长上下文训练。其数据混合包含代码、文本和数学,目标同时包括下一词元预测与代码中间填充 (Hui et al. 2024)。DeepSeekMath 从预衰减的 DeepSeek-Coder-Base-v1.5 7B 检查点出发,又训练了 5000 亿词元。报告中的混合包含约 1200 亿词元的过滤数学语料,以及 AlgebraicStack、arXiv、GitHub 代码和中英文网页文本 (Shao et al. 2024)。这些谱系实例很有参考价值,但两者都没有单独测出混合中每一项数据的因果贡献。

更早的领域自适应预训练研究已经表明,第二段自监督训练可以改善生物医学、计算机科学、新闻与评论等领域的下游任务 (Gururangan et al. 2020)。现代中段训练又加入了更大的规模、混合回放,以及面向后训练的明确交接。DoReMi 等代理方法可以提出领域权重,但代理模型上的收益仍须迁移到目标模型和目标评测 (Xie et al. 2023)。

长上下文中段训练

长上下文中段训练是本书按功能划出的一类阶段:它会在最终行为适配之前改变训练采用的序列长度。这并不是 Liu 等人的中段训练实验所覆盖的内容。一次真正可用的扩展需要三项改动相互配合:位置方法、在新长度上包含依赖关系的数据,以及承担更长注意力的训练系统。

以简单的位置插值为例,LtrainL_{\mathrm{train}} 是原始训练长度,LextL_{\mathrm{ext}} 是扩展后的长度,mm 是扩展序列中的位置。交给模型的位置为 (Chen et al. 2023)

s=LextLtrain,m=ms.s=\frac{L_{\mathrm{ext}}}{L_{\mathrm{train}}}, \qquad m'=\frac{m}{s}.

这里,ss 是扩展倍数,mm 是词元在扩展序列中的位置,mm' 是传给 旋转位置嵌入(RoPE) 的插值位置。这样可以把位置控制在原始训练见过的范围内。YaRN 并不只是同一套线性映射:它会区别处理 RoPE 的不同频带,并重新缩放注意力 logits;其实验参数也不能当成普遍适用的设置 (Peng et al. 2023)。

只改位置表示,并不会教会模型组合相距很远的证据。Qwen2.5-1M 展示了完整链路:其报告中的预训练课程从 4K 逐步扩展到 32K、65,536、131,072 和 262,144 个词元。之后的一百万词元输入能力,还结合了推断时的位置与注意力方法;多阶段 SFT 属于后训练,不属于本阶段 (Yang et al. 2025)。因此,允许输入的长度,不等于训练长度或有效长度。

长度 含义
训练长度 梯度更新中实际出现过的最大序列长度
接受长度 运行时允许输入的最大长度
有效长度 在指定任务上达到既定质量阈值的最长输入
可部署长度 在生产环境中同时满足显存和延迟要求的最长输入

算力预算也会随之改变。对于长度分别为 LiL_i 的稠密因果注意力序列,查询与键配对的数量是

Npairs=HiLi(Li+1)2.N_{\mathrm{pairs}} =H\sum_i\frac{L_i(L_i+1)}{2}.

其中,HH 是查询头数,LiL_i 是第 ii 条序列的词元长度,NpairsN_{\mathrm{pairs}} 是因果注意力配对总数。固定词元预算下,用少量长序列替换大量短序列,会让注意力工作量大致随典型序列长度增加。FlashAttention 不再物化完整分数矩阵,但不会消除这些稠密注意力计算。因此,序列打包、上下文并行和显存上限会把这一阶段直接连到 第 10 章

把中段训练设计成迁移实验

中段训练不能只看新分布上的训练损失,还需要一组对照。至少应从同一个来源检查点分出以下分支:

  1. 按相同词元预算继续使用宽泛数据;
  2. 完全切换到专门数据;
  3. 一种或多种混合调度;
  4. 若目标是检验后训练兼容性,再增加一条直接进入后训练的分支。

各分支的总词元数、批语义、评测检查点,以及尽可能多的优化器路径都应保持可比。既要报告最终混合比例,也要报告累计专门数据词元数。如果同一套调度同时改变了数据、学习率和序列长度,就应增加消融实验;否则只能把结果描述为整套配方的效果,不能把功劳归给某一个旋钮。

训练分布变化时,评测分布必须保持固定:

  • 目标迁移: 在训练开始前选定专门领域留出损失与能力评测。
  • 通用能力保留: 使用宽泛、多语种和跨领域留出集;若扩展长度,还要保留短上下文检查。
  • 后训练兼容性: 对可比的中间检查点应用同一套小规模 SFT 或偏好配方。Liu 等人最强的结论来自 7000 万和 1.6 亿参数模型在 SFT 后的结果,不能直接外推到任意前沿模型 (Liu et al. 2025)。
  • 长上下文利用: 评测矩阵要覆盖长度、证据深度、干扰项数量和任务类型。不能只用针尖检索题,因为模型可能接受很长的输入,却无法利用中间位置的证据,或组合多个事实 (Liu et al. 2024; Hsieh et al. 2024)。
  • 数据完整性: 对装配后的混合数据重新做去重和去污染,并检查完整长文档及生成的类指令材料。

新混合分布上的训练损失不能用作能力保留指标,因为测量分布已经变了。一个简单的固定分布指标是

ΔP=JP(θafter)JP(θbefore).\Delta_P=J_P(\theta_{\mathrm{after}})-J_P(\theta_{\mathrm{before}}).

其中,JPJ_P 是固定宽泛分布 PP 留出样本上的损失,θbefore\theta_{\mathrm{before}} 是来源检查点,θafter\theta_{\mathrm{after}} 是中段训练后的检查点。正的 ΔP\Delta_P 表示宽泛留出集上的损失变差,但它本身不能证明所有通用能力都下降了,因此仍要保留能力评测。每个损失结果还必须写明所用的分词策略。

记录交接契约

这一阶段的产物是一个带有谱系的新基座检查点。交接记录至少应包括:

  • 来源检查点与架构哈希;
  • 优化器、调度器与精度状态;
  • 按顺序排列的数据清单、权重、过滤器和采样调度;
  • 按来源、语言、格式和序列长度桶统计的已训练词元数;
  • 分词器版本、打包掩码、文档边界与位置编号策略;
  • 训练长度以及所有 RoPE 或注意力参数;
  • 污染报告与固定评测随时间的结果;
  • 用于比较迁移效果的后训练配方版本。

有了这些信息,才能把可复现的训练阶段与一份「又训练了一阵」的模型文件区分开。后续团队也能据此判断回归来自数据、优化、长度扩展,还是后训练。

争议所在

「中段训练」是一个实用的工作术语,而不是已经稳定下来的科学边界。同一种操作也可能被称为后期预训练、退火、领域适配或继续预训练。上下文扩展还会同时改变位置、长度和数据,使边界更模糊。能够长期复用的区分方式仍是操作记录:公开来源检查点、目标、混合分布、调度、词元预算、训练长度和预期交接对象。即使名称不同,读者也能据此比较各阶段。

下层约束

训练系统与服务系统共同限制着数据课程。更长序列会增加注意力计算和激活显存;专门数据源可能太小,无法在不重复的情况下持续供给所有副本;更换分词器或位置方案还可能破坏检查点兼容性。第 10 章 决定哪些内容训得出来,第 31 章 决定哪些可接受的上下文长度在服务时负担得起。能力桥接如果违反其中任何一项约束,就不会得到可部署的模型。

先诊断问题所在的层,再投入训练

不同症状需要不同干预:

症状 需要收集的证据 更可能的干预
专门文本上的留出损失很高 固定的专门与宽泛损失 领域阶段或混合阶段
基座似然已经足够,但回复格式不对 示范数据与行为评测 后训练
可以接收长输入,但证据越深,利用效果越差 长度与证据深度交叉的任务矩阵 长数据或位置训练,而不只是放大运行时上限
质量保持不变,但长提示超出显存或延迟预算 显存与预填充分析 服务系统或注意力系统调整
专门能力提升,同时宽泛能力退化 固定保留评测与累计混合剂量 降低专门数据占比、增加回放或更换来源检查点

这套诊断可以避免把中段训练当成所有模型缺口的默认答案。只有当基座检查点的数据分布或长度分布构成瓶颈,而且预期收益能在固定的保留评测与后训练对照中维持时,中段训练才是合适的选择。

第一部分在这次交接处结束。第 5 章 规定预算,第 6 章 定义来源,第 7 章 固定符号接口,第 8 章第 9 章 固定模型主体,第 10 章 让训练真正可执行。中段训练决定得到的基座继续保持宽泛,还是向一个明确目标靠近。第三部分随后改变监督方式,开始塑造模型行为。

延伸阅读

  • Liu et al., “Midtraining Bridges Pretraining and Posttraining Distributions” (针对代码、数学、指令、问答与高质量网页混合的受控桥接实验), 2025. arXiv:2510.14865
    提出中段训练的工作定义,并在 70M 与 160M 参数的受控实验中发现,后期混合通用与专门数据可改善 SFT 后的代码与数学迁移,引入时点与混合权重之间存在交互。
  • Gururangan et al., “Don't Stop Pretraining: Adapt Language Models to Domains and Tasks” (现代“中段训练”术语出现前的领域自适应与任务自适应预训练), 2020. arXiv:2004.10964
    表明在领域语料与任务语料上继续预训练,可在生物医学、计算机科学、新闻和评论等任务上提升下游表现。
  • OLMo Team, “2 OLMo 2 Furious” (完全开放:训练稳定性配方与两阶段课程编排), 2025. arXiv:2501.00656
    OLMo 2 记录并发布模型权重、数据混合、训练与评估代码、配方、日志和中间检查点,以支持研究并尝试复现其开发过程。
  • Hu et al., “MiniCPM: Unveiling the Potential of Small Language Models with Scalable Training Strategies” (warmup-stable-decay 调度), 2024. arXiv:2404.06395
    提出可与 7B-13B 大模型匹敌的小模型(1.2B/2.4B),借助模型风洞式扩展实验,以及支持持续训练的 Warmup-Stable-Decay 学习率调度。
  • Hui et al., “Qwen2.5-Coder Technical Report” (基于 Qwen2.5 的代码专门化继续训练), 2024. arXiv:2409.12186
    报告 Qwen2.5-Coder:先训练 5.2T 文件级词元,再训练约 300B 仓库级长上下文词元,混合代码、文本与数学,并使用下一词元和中间填充目标。
  • Shao et al., “DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models” (用含 120B 过滤数学语料的混合数据继续训练 500B 词元,之后进行 SFT 与 GRPO), 2024. arXiv:2402.03300
    DeepSeekMath 结合 1200 亿词元数学语料与 GRPO,后者是去掉评论家、在采样组内归一化奖励的 PPO 变体。
  • Chen et al., “Extending Context Window of Large Language Models via Positional Interpolation” (通过插值而非外推扩展 RoPE 上下文), 2023. arXiv:2306.15595
    通过线性缩放位置索引扩展基于 RoPE 的大语言模型上下文窗口,避免不稳定外推,并在少量微调后保留原窗口质量。
  • Peng et al., “YaRN: Efficient Context Window Extension of Large Language Models” (高效 RoPE 上下文扩展), 2023. arXiv:2309.00071
    YaRN 以比先前方法更少的词元和训练步数扩展基于 RoPE 的 LLaMA 上下文窗口,并展示了超出微调长度的外推能力。
  • Yang et al., “Qwen2.5-1M Technical Report” (渐进式长上下文预训练至 262,144 词元,并结合推断时方法接受一百万词元输入), 2025. arXiv:2501.15383
    报告 Qwen2.5-1M:渐进预训练到 262,144 词元序列,再结合后训练与推断时的位置和注意力方法,把可接受输入扩到一百万词元。

评论

登录后评论