#大模型预训练与 Mid-training 数据的差距:阶段定位、数据配方与准备方法
一句话结论:预训练数据解决“模型知道世界、掌握语言和形成通用表征”的问题;mid-training 数据解决“在不破坏底座的前提下,把模型推向后训练真正需要的能力分布”的问题。
如果把大模型训练看成一条长路径:
Pretraining -> Mid-training / Annealing / Continued pretraining -> Long-context extension -> SFT / DPO / RLVR
那么 pretraining 和 mid-training 的关系不是“前者粗糙、后者高级”这么简单,而是:
Pretraining: 建底座,追求覆盖面、规模、分布稳定性
Mid-training: 调方向,追求目标能力、分布桥接、后训练可塑性
Post-training: 赋交互形态,追求人类偏好、指令遵循、安全和任务格式
所以 mid-training 最核心的定位不是“再训一点高质量数据”,而是 distributional bridge:在通用预训练分布和后训练 / 目标任务分布之间搭桥。这个说法在 2026 年的论文 Midtraining Bridges Pretraining and Posttraining Distributions 中被明确提出:midtraining 是把 specialized data 与 general pretraining data 混在一个中间训练阶段,让模型更接近 posttraining 所需的目标分布,同时减少遗忘和梯度冲突。
#1. 为什么会出现 mid-training?
早期大模型训练通常被粗略分成两段:
- Pretraining:在海量 web / book / code / paper 等文本上做 next-token prediction。
- Post-training:用 SFT、RLHF、DPO 等方法让模型会对话、听指令、符合人类偏好。
但随着模型能力目标变复杂,大家发现中间缺了一层。
#1.1 预训练太“大而散”
预训练语料必须足够大,才能支撑 trillions tokens 级训练。因此它通常包括:
- Common Crawl / web pages;
- books / Wikipedia / encyclopedic data;
- academic papers / arXiv / PDFs;
- code repositories;
- forum / QA / StackExchange;
- multilingual web;
- 一些经过过滤的 math / code / domain data。
这类数据的优势是覆盖面广、规模大、分布自然。但问题是:目标能力信号被稀释了。
例如,一个模型要变强在:
- 数学推理;
- 代码生成;
- 科学 QA;
- 长上下文阅读;
- 工具调用;
- instruction following;
- chain-of-thought / thinking trace;
- agentic task decomposition。
这些能力对应的数据在通用 web 里占比很低,而且格式不一定直接适合后训练。
如果只靠预训练,模型可以获得基础知识和语言能力,但未必形成足够强的任务结构、推理格式和领域专长。
#1.2 Post-training 太“窄而晚”
后训练数据通常质量高、格式明确,但规模小得多,例如:
- instruction-response pairs;
- preference pairs;
- human / model-generated conversations;
- verifier-labeled math / code trajectories;
- tool-use traces;
- RLVR environments。
它适合教模型:
- 怎么回答;
- 怎么遵循指令;
- 怎么拒答;
- 怎么保持风格;
- 怎么在特定任务上优化行为。
但它不适合从零塑造深层能力。原因是:
- 后训练 token 量太少,无法承担大规模表征重塑;
- 如果目标任务和预训练分布距离太远,SFT / RL 会面对很差的初始化;
- 直接用小规模高强度数据 finetune,容易过拟合或遗忘;
- RL 对 base model 的可探索性和先验能力要求很高。
因此,mid-training 出现的核心动机是:
在模型还具有一定可塑性时,用比预训练更目标化、比后训练更宽、更连续的语料,把模型从“通用语言模型”推向“可被后训练塑造成目标助手 / 推理模型 / 代码模型”的状态。
#2. Pretraining 数据和 Mid-training 数据的本质差距
可以从八个维度理解。
| 维度 | Pretraining 数据 | Mid-training 数据 |
|---|---|---|
| 核心目的 | 建立通用语言、知识、表征底座 | 面向目标能力做分布桥接和能力聚焦 |
| 数据规模 | 极大,通常是 T tokens 级 | 相对小,常见是几十 B 到几百 B tokens |
| 数据来源 | web、书籍、wiki、paper、code、论坛等大规模自然语料 | 高质量过滤 web、代码、数学、QA、instruction、thinking traces、长文档等 |
| 数据选择原则 | 覆盖面、去重、质量过滤、语言/领域平衡、token 规模 | 目标能力增益、后训练可塑性、低污染、格式桥接、分布不过度偏移 |
| 数据格式 | 多为自然文本或原始文档 | 可混入更多结构化 / 半结构化任务数据 |
| 训练作用 | 学语言模型基础能力和世界知识 | 增强 math/code/QA/reasoning/instruction/long-context 等目标能力 |
| 风险 | 低质噪声、重复、污染、长尾无效 token | 过度 specialization、遗忘、benchmark contamination、破坏通用性 |
| 评估方式 | perplexity + 广泛 base eval + scaling law | capability cluster eval + microanneal + integration test + post-trainability |
最重要的是:pretraining 追求“大分布上的稳健学习”,mid-training 追求“朝目标能力方向移动但不坍缩”。
#3. 预训练数据的定位:建底座,而不是直接教模型做助手
预训练阶段的任务是 next-token prediction。它的目标不是让模型成为对话助手,而是让模型形成:
- 语言建模能力;
- 世界知识记忆;
- 语法、篇章、语义表征;
- 多领域概念结构;
- 代码、数学、科学等基础分布感;
- 跨文档、跨格式、跨语言的泛化能力。
#3.1 预训练数据为什么需要规模?
预训练的核心资源是 token。模型参数越大,需要的数据覆盖和训练 token 越多。大规模数据的作用不是简单“让模型记更多事实”,而是让模型看到足够丰富的模式:
- 同一个概念在不同语境中的表达;
- 同一类任务在不同文本形式中的变体;
- 领域知识之间的共现结构;
- 语言和世界之间的统计关联;
- 稀有概念、长尾实体、多语言表达。
所以预训练数据往往不能只选“看起来最优质”的小数据。过窄的数据会导致底座不稳,模型泛化和知识覆盖受限。
#3.2 预训练数据为什么不适合大量任务格式?
以 OLMo 3 为例,其报告明确说:预训练阶段主要使用 Dolma 3 Mix,大约 6T token,包括 Common Crawl、学术 PDFs、GitHub code、arXiv、FineMath、Wikipedia / Wikibooks 等。报告还提出一个重要原则:如果某类数据规模太小,即使质量高,也未必适合预训练阶段;更适合留到 mid-training。
原因是:
- 小规模任务数据在 T tokens 级训练中容易被稀释;
- 如果过度上采样,又可能影响基础分布;
- task data 对 benchmark 表现影响很大,容易干扰预训练数据 ablation;
- instruction / QA / reasoning trace 这类格式更接近后训练目标,太早大量混入可能改变 base model 形态。
因此,预训练数据的正确心智是:
先建立一个宽、稳、通用、可塑的 base model,而不是提前把所有目标能力都灌进去。
#4. Mid-training 的定位:不是小型预训练,而是分布桥接
Mid-training 常常也叫:
- continued pretraining;
- annealing stage;
- cooldown / final-stage pretraining;
- late-stage curriculum;
- domain-adaptive pretraining;
- intermediate training。
但这些词不完全等价。
#4.1 Mid-training 和 continued pretraining 的区别
Continued pretraining 可以只是继续在某个数据上训练。例如:
原来在通用 web 上训练 -> 继续在 code 上训练
这很容易变成 domain adaptation:模型朝 code 分布偏移,但可能忘掉通用能力。
Mid-training 更强调“混合 specialized data 与 general pretraining data”,让模型逐步接近目标分布,而不是突然跳到一个窄分布。
Midtraining Bridges Pretraining and Posttraining Distributions 的核心发现是:
- midtraining 在远离预训练分布的领域最有用,例如 code 和 math;
- 它的收益和 midtraining 数据相对目标 posttraining 数据的 proximity advantage 相关;
- 相比只在 specialized data 上 continued pretraining,midtraining 更能同时提升目标域表现并减少遗忘;
- 数据引入时间和 mixture weight 强相关:越晚引入 specialized data,越不能简单靠提高比例补救,因为模型可塑性窗口可能已经变窄。
这给 mid-training 一个更精确的定位:
Mid-training 不是“最后再刷一遍高质量数据”,而是在模型仍有可塑性时,设计一条从 pretraining distribution 到 posttraining distribution 的平滑路径。
#4.2 详细解读:Midtraining Bridges Pretraining and Posttraining Distributions 到底证明了什么?
这篇论文值得单独讲,因为它把很多模型报告里“凭经验做”的 mid-training,第一次放到一个比较清楚的实验框架里解释。它的问题不是“mid-training 能不能涨 benchmark”,而是更基础的三个问题:
- mid-training 到底是在提前背目标域数据,还是在改变后训练的初始化?
- 为什么它比直接 continued pretraining 到 specialized data 更稳?
- 数据应该什么时候引入、以多大比例引入?
论文给出的工作定义是:
Midtraining 是 pretraining 与 posttraining 之间的中间训练阶段。它通常使用比通用预训练更专门的数据,例如 code、math、instruction-formatted data,同时仍然保留一部分 general pretraining data。
这个定义里最关键的短语是 while maintaining a mixture with general pretraining data。也就是说,mid-training 不是“预训练结束后切到数学/代码继续训”,而是把专门数据和通用数据混在一起,构造一个中间分布。论文甚至把 continued pretraining 视为一个极端特例:general data 的 mixture weight 为 0。
#4.2.1 理论直觉:mid-training 改变的是 post-training 的初始化
论文的理论 sketch 可以用一句话概括:
Mid-training 不是直接替代 SFT,而是把参数移动到一个更适合 SFT 的起点。
设预训练分布的 loss 是 J_P(θ),后训练 / SFT 目标分布的 loss 是 J_T(θ)。如果直接从 base model 做 SFT,参数会沿着 J_T 的梯度走。但这个过程中可能出现两类问题:
- gradient conflict:朝后训练目标下降的方向,可能会伤害预训练分布上的能力;
- posttraining effort 太大:如果初始点离目标分布太远,SFT 需要走很远,遗忘和不稳定都会更严重。
论文把遗忘上界拆成两个项:
- alignment / conflict term:后训练梯度与预训练梯度是否冲突;
- effort term:从当前初始化到目标任务最优点还需要多少后训练“力气”。
Mid-training 的作用就是改变 SFT 的初始化 θ0(t,w):t 是 specialized data 何时引入,w 是 specialized data 的比例。如果 mid-training 让模型已经更接近目标分布,那么后续 SFT 需要的梯度步更少、冲突更小,于是既提升目标域表现,也减少 forgetting。
这解释了为什么 mid-training 不应该被理解为“教会模型最后任务答案”。它更像是在参数空间里修一条缓坡,让模型从通用 web 分布走到 math / code / instruction / reasoning 分布时,不必突然转向。
#4.2.2 实验设计:控制 pretraining、midtraining、posttraining 三段
论文用 Pythia 系列 70M 到 1B 模型做受控实验。整体流程是:
pretraining: C4 web data, 128B tokens
midtraining: 在不同时间点插入不同 specialized mix
posttraining: 对 GSM8K / SciQ / PyCode / LIMA 等目标数据做 SFT
评估: SFT validation loss + C4 validation loss after SFT
midtraining mix 覆盖五类:
| Midtrain mix | token 规模 | 代表来源 | 目标能力 |
|---|---|---|---|
| Starcoder | 196B | StarCoder 代码预训练数据 | code |
| Math | 12B | MAmmoTH、OpenMathInstruct | math reasoning |
| FLAN | 3.5B | FLAN instruction collection | instruction format |
| KnowledgeQA | 9.6B | general knowledge / dialogue QA mix | QA / knowledge |
| DCLM | 51B | 高质量 web | general high-quality web |
后训练目标则选了四类任务:GSM8K 数学、SciQ 科学问答、CodeSearchNet-Python / PyCode 代码、LIMA 指令数据。这个设计的好处是:它能区分“midtraining 数据和后训练目标对齐”与“只是多训了一些高质量 token”。
#4.2.3 发现一:收益高度 domain-specific
最直接的结论是:mid-training 的收益不是平均撒胡椒面式的。
- Starcoder mix 对 PyCode / code 任务帮助最大;
- Math mix 对 GSM8K / math reasoning 帮助最大;
- 不匹配的 mix 帮助很小;
- FLAN 这种 broad instruction data 在该设置下收益有限。
这说明 mid-training 的核心不是“越 instruction 越好”或“越高质量越好”,而是 midtraining distribution 是否真的把模型推向后续目标分布。
#4.2.4 发现二:proximity advantage 可以预测收益
论文提出一个简单诊断量:proximity advantage。直觉是:如果 midtraining mix M 比原始 C4 更接近后训练目标 T,那么它就有正的 proximity advantage。
PA(M -> T) = prox(M, T) - prox(C4, T)
这里的 prox 不是复杂表征距离,而是基于 tokenizer 后 unigram token statistics 的相似度组合,包括 vocabulary Jaccard、overlap ratio、token-frequency cosine similarity、Jensen-Shannon similarity 等。
这个指标很朴素,但结论很有启发:mid-training 的收益与 proximity advantage 明显相关。换句话说,一个好的 midtraining mix 应该在 token / syntax / format / domain 层面,确实比通用预训练数据更接近后训练数据。
这对数据准备很重要:我们不应该只问“这个数据质量高不高”,还应该问:
它是否比当前 pretraining distribution 更像未来 posttraining distribution?
如果一个数据源很干净、很优雅,但和后续 SFT / RL 目标分布无关,它未必是好的 mid-training 数据。
#4.2.5 发现三:midtraining 优于 100% specialized continued pretraining
论文专门比较了两种做法:
Midtraining: specialized data + C4 general data 混合
Continued pretraining: 100% specialized data
在 code 和 math 两个领域,混合式 midtraining 都比 100% specialized continued pretraining 更好,而且不仅目标域 validation loss 更低,SFT 后的 C4 loss 也更好。
这点非常关键,因为它直接反驳了一个常见误解:
“既然我想提升代码能力,那就预训练完直接切到纯代码继续训。”
论文显示,更稳的做法是 保留 general anchor data。specialized data 负责把模型推向目标能力,general data 负责保持语言、知识和通用表示不塌。也就是说,mid-training 的配方本质是“桥”,不是“跳崖”。
#4.2.6 发现四:timing 和 mixture weight 强耦合,存在可塑性窗口
论文还用 Starcoder code mix 做了 start time 与 mixture weight 的二维实验:
- start time:specialized data 在预训练进程中从 12B 到 105B tokens 不同时间引入;
- mixture weight:specialized data 比例从 10% 到 80%。
结论很有工程意义:
- 早期引入 specialized data 时,高比例例如 80% 可能有效;
- 晚期引入 specialized data 时,高比例反而有害,保守比例例如 10% 更稳;
- 如果错过了早期窗口,不能简单靠后期提高比例补偿。
论文把这解释为 Plasticity Window:模型越训练到后期,表示越定型。这个时候突然灌入高比例专门数据,模型不一定能把新分布整合进通用能力中,反而可能造成不稳定或遗忘。
这给 mid-training 数据准备一个非常实际的原则:
决定数据比例之前,先决定引入时机;同一个数据源,在不同训练阶段需要不同 mixture weight。
#4.2.7 对本文主题的启发
这篇论文把 mid-training 的定位从经验配方推进到了一个更明确的机制假设:
- mid-training 是 distributional bridge:它连接 pretraining 和 posttraining,而不是替代二者;
- 数据选择要看 proximity:好数据不是绝对好,而是相对后训练目标有桥接作用;
- mix 比 pure shift 更重要:保留 general anchor data 能同时提升目标域与减少遗忘;
- 时间表和比例不能分开调:越晚加入专门数据,越需要保守混合;
- post-trainability 才是核心指标:midtraining checkpoint 本身涨分不够,关键是后续 SFT / RL 是否更容易、更稳、更少遗忘。
所以,如果要把这篇论文翻译成一句工程规则,就是:
Mid-training 数据不是“高质量数据篮子”,而是从 base model 到 post-trained model 的分布脚手架。
#4.3 它到底桥接什么?
它至少桥接四种差距.
#4.3.1 能力差距
预训练模型可能知道数学概念,但不擅长按步骤解题;可能见过代码,但不擅长工程化生成;可能见过 QA,但不擅长精确检索式回答。
Mid-training 用更密集的 math / code / QA / reasoning data 把这些能力提前激活。
#4.3.2 格式差距
预训练文本大多是自然文档,而后训练数据是 instruction-response、dialogue、tool-use trace、reasoning trace。
Mid-training 可以适量引入 instruction data、thinking traces、QA pairs,让模型在进入 SFT / RL 前已经熟悉这些格式。
#4.3.3 分布差距
如果后训练目标是代码、数学、长上下文或 agent 任务,和普通 web 分布距离很远。直接 SFT / RL 会导致梯度冲突或训练不稳。
Mid-training 的混合数据提供更平滑的分布过渡。
#4.3.4 可塑性差距
训练越到后期,模型参数越“定型”。如果 specialized data 引入过晚,即使比例很高,也可能难以重塑表示。
所以 mid-training 不是越晚越好,也不是越专越好,而是要找到合适的可塑性窗口。
#5. 公开案例:OLMo 2 / OLMo 3 / Llama 3 / Phi-3.5
#5.1 OLMo 2:把 Dolmino Mix 作为 late-stage curriculum
OLMo 2 报告中,base data 分成:
pretrain: olmo-mix-1124
midtrain: dolmino-mix-1124
其摘要明确说,Dolmino Mix 1124 是一个新的 specialized data mix,在预训练 annealing phase 中引入,显著提升多个下游 benchmark。
OLMo 2 的 mid-training recipe 重点包括:
- learning rate annealing;
- data curriculum;
- high-quality sources;
- math mix;
- final midtraining mix and checkpoint soups。
它体现的是第一代比较清晰的 mid-training 工程心智:
预训练末期不是简单降学习率,而是可以有意识地换数据配方,用高质量、能力导向的数据完成 final capability shaping。
#5.2 OLMo 3:把 pretraining / midtraining / long-context extension 拆成明确阶段
OLMo 3 是目前最适合作为公开参考的案例,因为它不是只发布最终权重,而是把 model flow 中的数据、代码、中间 checkpoint、评测、训练日志尽量完整打开。对我们讨论 mid-training 来说,它的价值在于:它把 base model training 明确拆成三段。
Stage 1: Pretraining Dolma 3 Mix,约 6T tokens
Stage 2: Midtraining Dolma 3 Dolmino Mix,约 100B tokens
Stage 3: Long-context Extension Dolma 3 Longmino Mix,7B 用 50B tokens,32B 用 100B tokens
Post-training SFT / DPO / RLVR
这三个阶段的边界非常清楚:
- Pretraining:用 Dolma 3 Mix 建立通用 base 能力;
- Midtraining:用 Dolma 3 Dolmino Mix 定向加强 math、code、QA、instruction、thinking 等后训练关键能力;
- Long-context extension:用 Longmino Mix 专门扩上下文,而不是把长上下文问题混在普通 midtraining 里随便解决;
- Post-training:再训练 Think / Instruct / RL-Zero 等不同分支。
#5.2.1 OLMo 3 预训练数据仍然是“大而广”的通用底座
OLMo 3 的预训练数据 Dolma 3 Mix 包括:
- Common Crawl web pages:约 4.51T tokens,占 76.1%;
- olmOCR science PDFs:约 805B tokens,占 13.6%;
- Stack-Edu / GitHub code:约 409B tokens,占 6.89%;
- arXiv LaTeX papers:约 50.8B tokens,占 0.86%;
- FineMath 3+:约 152B tokens,占 2.56%;
- Wikipedia / Wikibooks:约 2.51B tokens,占 0.04%。
这说明 OLMo 3 的 pretraining 仍然以大规模 web 和文档为主体。它不是没有 code/math/science,而是这些数据在预训练阶段的角色仍然是“扩大知识与语言覆盖面”。这一阶段更重视:
- trillion-token scale 的全局去重;
- token-constrained mixing;
- quality-aware upsampling;
- 大规模 PDF / web / code / math 的覆盖;
- 训练出宽、稳、可塑的 base。
#5.2.2 OLMo 3 midtraining 的目标:不是继续堆通用 token,而是补后训练前的关键能力
OLMo 3 在 pretraining 后继续训练 100B high-quality tokens,来自新的 Dolma 3 Dolmino Mix。报告明确说,这个阶段要改善 key fundamental capabilities,尤其是:
- code;
- math;
- general knowledge QA / knowledge elicitation;
- instruction following 预热;
- thinking / reasoning 能力预热;
- 为后续 Olmo 3 Think、Instruct、RL-Zero 做基础。
同时,它并没有把通用数据完全丢掉。报告中特别提到,为了保持和 pretraining 的连续性,midtraining 继续保留 web 和 PDF 数据,但会选择更高质量的子集。这个点和 Midtraining Bridges 的结论完全一致:mid-training 不是跳到纯 specialized distribution,而是用 high-quality general anchor 防止分布过度偏移。
#5.2.3 OLMo 3 的数据研发方法:microanneal + integration tests + SFT tests + decontamination
OLMo 3 最值得学习的不是某个具体数据源,而是它的数据研发闭环。它把 midtraining 数据准备变成了一个实验系统。
第一层:distributed exploration。 对每个目标能力,团队并行生成或收集候选数据源,例如 math、code、QA、instruction、thinking。然后用 microanneal 快速筛选。
一个标准 microanneal 大致是:
1. 选择一个候选数据源
2. 采样 5B tokens 目标数据
3. 匹配 5B tokens web data
4. 在 10B mix 上做 annealing
5. 与 10B web-only baseline 对比
6. 看目标能力是否有超过“继续训 web”的额外收益
这一步的关键是 compute-matched baseline。如果一个数据源在 10B anneal 后涨分,未必说明它好,可能只是多训练了 10B tokens。必须和 web-only baseline 比,才能看出该数据源的边际贡献。
第二层:centralized integration tests。 单个数据源有效,不代表放进大 mix 后仍然有效。OLMo 3 会把 microanneal 中表现好的数据源合并进候选 100B mix,做完整 midtraining integration run,观察多个数据源之间是否互相冲突、比例是否合适、整体能力是否提升。
第三层:SFT tests。 OLMo 3 还会把 integration run 得到的 checkpoint 快速 instruction-tune,再在 post-train eval suite 上评估。这个步骤非常重要,因为 mid-training 的最终目标不是 base eval 自嗨,而是提升 post-trainability:后续 SFT / DPO / RL 是否更容易、更稳、更有效。
第四层:decontamination。 Round 5 集成了新的 decontamination 流程,避免 midtraining mix 污染评测集或后续 RL 数据。对于 fully-open model flow 来说,这尤其重要,因为所有训练数据都公开,必须能解释 benchmark gains 不是 leakage。
可以把 OLMo 3 的 midtraining 数据研发抽象成:
能力目标 -> 候选数据源 -> microanneal -> integration mix -> SFT/post-trainability test -> decontamination -> final 100B mix
#5.2.4 Dolma 3 Dolmino Mix 的最终组成
OLMo 3 的最终 midtraining mix 是约 100B tokens,来自约 2.19T token 的 source pool。下面按能力类别重组 Table 5。
| 类别 | 数据源 | 100B mix 中 token | 占比 | 作用 |
|---|---|---|---|---|
| Math synthetic | TinyMATH Mind | 898M | 0.9% | 生成类似 MATH 的题目和解释 |
| Math synthetic | TinyMATH PoT | 241M | 0.24% | Python code solution / program-of-thought |
| Math synthetic | CraneMath | 5.62B | 5.63% | 用 Qwen3 重写 FineMath4+,复现 SwallowMath 思路 |
| Math synthetic | MegaMatt | 1.73B | 1.73% | 用开源模型重写 MegaMath-Web-Pro 风格数据 |
| Math reused | Dolmino Math | 10.7B | 10.7% | 复用 OLMo 2 Dolmino math,额外去污染 |
| Code | StackEdu (FIM) | 10.0B | 10.0% | 高质量教育代码 + fill-in-the-middle |
| Python synthetic | CraneCode | 10.0B | 10.0% | permissive recreation of SwallowCode,用于 Python code 能力 |
| QA synthetic | Reddit to Flashcards | 5.90B | 5.9% | 从学术相关 subreddit 合成多选 QA |
| QA synthetic | Wiki to RCQA | 3.0B | 3.0% | Wikipedia passage -> reading comprehension QA |
| QA synthetic | Nemotron Synth QA | 5.0B | 5.0% | 选用 Nemotron CC 中 diverse QA pairs 子集 |
| Thinking synthetic | 多种 meta-reasoning / reasoning traces | 8.34B 左右 | 8.34% | 为 Think / RL-Zero 打底 |
| Instruction | Tulu 3 SFT | 1.1B | 1.1% | instruction 格式预热 |
| Instruction | Dolmino 1 Flan | 5.0B | 5.0% | 复用 OLMo 2 FLAN 子集 |
| PDFs | olmOCR science PDFs HQ subset | 4.99B | 5.0% | 高质量科学 PDF anchor |
| Web | STEM-Heavy Crawl | 4.99B | 5.0% | STEM-heavy web anchor |
| Web | Common Crawl HQ subset | 22.4B | 22.5% | 高质量通用 web anchor |
| Total | - | 99.95B | 100% | 约 236M documents |
如果按大类粗略汇总:
Math: 约 19.2B tokens
Code: 约 20.0B tokens
QA: 约 13.9B tokens
Thinking: 约 8.3B tokens
Instruction: 约 6.1B tokens
PDF/Web: 约 32.4B tokens
这个比例很有代表性:OLMo 3 并没有让 synthetic reasoning / instruction 数据占主体。真正占比较大的仍然是高质量 web/PDF anchor、code、math、QA。Thinking traces 是明确加入的,但比例相对克制。
#5.2.5 数学数据怎么做:从 OLMo 2 复用到 open-model recreation
OLMo 3 的 math midtraining 很有工程细节。它总共考虑了 25 个 math sources,做了 80 个 microanneal runs,最后选 5 个 math-specific sources,其中 4 个是新合成或新复现。
关键做法包括:
- 复用已验证数据:保留 OLMo 2 的 10.7B Dolmino Math,但做额外 decontamination;
- 针对 benchmark 结构扩展:TinyMATH 对 MATH train 中 7500 个样例,每个生成 100 个类似问题,再生成 Python code solution 和 conversational explanation;
- 重写高质量自然数学网页:CraneMath 用 Qwen3 重写 FineMath4+,复现 SwallowMath 的思想;
- 处理 license 问题:对于由 Llama 系列模型生成、有额外许可限制的数据,OLMo 3 选择用开源模型重新生成 permissive recreation;
- 用 microanneal 量化收益:例如 CraneMath 在 microanneal 中对 MATH / GSM8K 都有明显提升。
这说明 mid-training 数学数据不是简单收集题库,而是三类数据的混合:
自然数学网页/教材 -> 高质量重写
题目/答案 -> 程序化解法与解释
已有 math mix -> 去污染后复用
#5.2.6 代码数据怎么做:教育性、可补全、可执行、可重写
OLMo 3 的 code 数据有两条主线。
第一条是 StackEdu (FIM)。 它对 Stack-Edu 做 fill-in-the-middle 转换:把代码文档拆成 prefix / middle / suffix,让模型预测中间片段。这很像为真实 IDE 场景预热,因为代码模型常常不是从头写文件,而是在已有上下文中补全、修改、插入。
同时,OLMo 3 用 educational value classifier 对不同语言子集打分,并从每种语言的上层 bucket 做加权采样,而不是只取全局 top。这能避免数据被少数高资源语言或模板化代码垄断。
第二条是 CraneCode。 它从 the-stack-v2-smol 的 Python 子集出发,先过滤 syntax errors 和 linter outputs,再复现 SwallowCode 的两阶段 rewriting pipeline:
- augment style;
- optimize code itself。
最终得到 18.8B tokens 高质量 Python code,其中 10B tokens 进入 final mix。报告中提到,5B CraneCode microanneal 对 HumanEval 有提升;当 microanneal 规模增大到 12.5B tokens,HumanEval lift 更明显。
这给 code midtraining 一个启发:仅有 GitHub 原始代码不够,mid-training 更需要接近后续 coding task 的数据形态:高教育价值、可补全、语法正确、lint 过滤、可重写优化、最好可执行验证。
#5.2.7 QA / knowledge access:不是背知识,而是把知识变成可提取格式
OLMo 3 的 QA 数据目标是提升 question-answering 和 general knowledge access。这里有三个代表:
- Reddit-to-Flashcards:选择学术相关 subreddits,把 submission-comment pairs 用 GPT-4o-mini 重写成 multiple-choice QA,并设计 7 种 task formats 增加多样性;
- Wiki-to-RCQA:从 Wikipedia passage 生成 reading comprehension QA,约束生成风格以贴近阅读理解标注任务;
- Nemotron Synth QA:只选 Nemotron CC 中表现好的 diverse QA pairs 子集,其他 synth subsets 如果 microanneal 表现差就不纳入。
这里的重点是:QA midtraining 不是“再灌事实”,而是训练模型把已有知识和上下文证据以问答格式调取出来。它桥接的是从自然文档到 question-answer interface 的格式差距。
#5.2.8 Instruction 与 Thinking traces:提前铺路,但不喧宾夺主
OLMo 3 在 midtraining 中放入 instruction data 和 thinking traces,但比例相对克制。
Instruction 主要包括:
- Tulu 3 SFT:约 1.1B tokens;
- Dolmino 1 Flan:约 5.0B tokens。
值得注意的是,OLMo 3 对 Tulu 3 数据没有直接照搬 post-training chat syntax,而是用双换行连接 messages,避免过早绑定特定 special token / chat template。这个选择体现了 mid-training 和 SFT 的边界:它要让 base model 熟悉指令结构,但还不应该直接变成 fully aligned assistant。
Thinking traces 则包括 Math Meta-Reasoning、Code Meta-Reasoning、Program-Verifiable、QWQ / Gemini / Llama Nemotron / OpenThoughts2 等 reasoning traces。它们服务于后续 Think 和 RL-Zero:让 base 在进入 SFT / RLVR 前已经见过“中间推理轨迹”这种分布。
但从比例看,OLMo 3 很谨慎。thinking traces 总计约 8% 左右,不是整个 midtraining 的主体。这是合理的:如果过量 synthetic traces,可能带来污染、冗长、风格固化和错误推理模板。
#5.2.9 OLMo 3 给 mid-training 数据准备的核心启发
把 OLMo 3 和 Midtraining Bridges 放在一起看,可以得到一套很清晰的原则:
- 保留 general anchor:OLMo 3 的 Common Crawl HQ、STEM-heavy crawl、olmOCR science PDFs 加起来约三分之一,说明 mid-training 不能只堆专门数据;
- 目标能力要显式拆桶:math、code、QA、instruction、thinking 每类都有自己的候选源、microanneal 和评测;
- 合成数据要服务具体能力:TinyMATH、CraneMath、CraneCode、Reddit-to-Flashcards、Wiki-to-RCQA 都不是泛泛合成,而是围绕特定 eval cluster 设计;
- 数据好坏要看边际收益:通过 web-only baseline 的 microanneal 判断候选数据是否真的比继续训通用 web 更有用;
- 最终要看 post-trainability:integration checkpoint 还要快速 SFT,验证 midtraining gains 能否传递到 post-training;
- 去污染是训练流程的一部分:尤其 math、code、QA、RLVR 数据,如果不 decontaminate,mid-training 很容易把 benchmark gain 变成 leakage。
所以 OLMo 3 的 midtraining 可以被看成一个公开范例:
用高质量通用数据保持底座,用能力数据做定向提升,用 instruction / thinking traces 降低后训练分布落差,再用 microanneal 和 SFT tests 形成数据闭环。
#5.3 Llama 3:annealing 阶段上采样高质量数据,并单独做长上下文扩展
Llama 3 报告使用的术语不完全是 mid-training,但有相似阶段。它在 15T+ tokens 的大规模预训练后,做了:
- long-context pretraining:逐步把 context length 扩展到 128K,约 800B tokens;
- final annealing:最后约 40M tokens 线性把 learning rate 降到 0,同时调整 data mix,上采样 very high quality sources;
- checkpoint averaging 得到 final pretrained model。
这里的启发是:mid-training / annealing 不一定只服务 math/code,也可以服务:
- 长上下文适配;
- 高质量数据收束;
- 特定能力的分布偏移;
- 最终 checkpoint 稳定化。
#5.4 Phi-3.5:用 mid-training 增强多语言和长上下文,但也暴露数据不足问题
Phi-3 技术报告提到,Phi-3.5-mini 和 Phi-3.5-MoE 为增强 multilingual 和 long-context 能力,在 mid-training 中加入更多 multilingual 和 long-text data,并用 LongRoPE 和 mixed context window 把 context length 从 4K 扩展到 128K。
但报告也说,在 RULER 等 128K long-context 任务上仍有明显下降,他们怀疑原因是 mid-training 中高质量长上下文数据不足。
这个案例说明:
mid-training 的目标能力不是靠“形式上加长上下文”就能获得,必须有足够高质量、足够任务相关的长文档 / 长依赖 / 长推理数据。
#6. Mid-training 数据应该包含什么?
可以按目标能力拆。
#6.1 保底数据:高质量通用 web / paper / book / wiki
Mid-training 不能只放 specialized data,否则容易遗忘。需要保留一部分高质量通用数据:
- 高质量 web;
- academic PDFs;
- encyclopedia;
- long-form documents;
- 高质量中英文知识文本;
- 过滤后的 pretraining sources。
作用是:
- 保持 general language modeling;
- 减少 distribution shift;
- 维持知识覆盖;
- 让 specialized data 不至于把模型带偏。
OLMo 3 midtraining 里也保留了高质量 Common Crawl subset 和 olmOCR science PDFs。
#6.2 数学数据:从网页题目到可验证推理轨迹
数学 mid-training 数据可以分层:
- 普通 math web pages / textbooks;
- 题目 + 答案;
- 题目 + step-by-step solution;
- 可验证答案的程序化题目;
- synthetic reasoning traces;
- theorem proving / formal math 数据。
Mid-training 阶段更适合放 2-5 类,而不是只放自然数学文本。因为它要为后续 SFT / RLVR 打基础。
但要注意:
- 不能只堆 CoT,容易学到模板化冗长推理;
- 要区分训练模型“知道解法”和“按后训练格式输出解法”;
- 要做 benchmark decontamination,尤其 GSM8K、MATH、AIME、GPQA 等。
#6.3 代码数据:从 repository 到任务化 code reasoning
代码数据也有层次:
- 原始 GitHub repositories;
- 高质量 cleaned code;
- code + docstring / comments;
- StackOverflow / issue / PR / commit;
- coding problem + solution;
- unit-test verifiable code tasks;
- repository-level long-context tasks;
- agentic coding traces。
预训练阶段可以大量使用 GitHub code,但 mid-training 更应该偏向:
- 高质量代码;
- 教学性代码;
- algorithmic tasks;
- repo-level understanding;
- code QA;
- test-driven / verifiable coding examples。
这样它才能桥接到后续 code SFT / RL / agentic coding。
#6.4 QA / knowledge elicitation 数据
很多模型不是没有知识,而是不会在特定问题格式中调取知识。Mid-training 可以加入:
- closed-book QA;
- open-domain QA;
- science QA;
- factual recall;
- multi-hop QA;
- retrieval-style long-form QA;
- knowledge-intensive instruction data。
目标不是把所有事实都背一遍,而是训练模型把预训练中已有知识以问答形式激活。
#6.5 Instruction data:少量提前注入,而不是完全对齐
Instruction data 在 mid-training 中要谨慎。它和 SFT 重叠,但作用不同。
Mid-training 中的 instruction data 更像“格式预热”:
- 让模型见过 instruction-response 结构;
- 让模型适应任务描述;
- 为后续 SFT 降低格式落差;
- 让模型具备初步 instruction following。
但它不应该完全替代 SFT,因为 mid-training 仍主要是 base model training,不是对齐阶段。
#6.6 Thinking traces / reasoning traces
OLMo 3 明确在 midtraining 中包含 thinking traces,为后续 Think / RL-Zero 等模型流打基础。
这类数据的作用可能是:
- 让模型提前熟悉长推理格式;
- 提供 intermediate reasoning patterns;
- 改善后续 RLVR 的初始策略;
- 降低从 base model 到 thinking model 的分布落差。
但风险也很大:
- synthetic traces 质量参差;
- 可能污染 reasoning benchmarks;
- 可能让模型学会冗长而非正确;
- 可能和最终希望的推理风格不一致。
因此要有 verifier、去重、难度分层和 post-trainability eval。
#6.7 长上下文数据
长上下文能力不是把 RoPE 扩展一下就结束。数据需要覆盖:
- 8K / 32K / 64K / 128K 长文档;
- long book / paper / legal / code repo;
- 长距离依赖;
- 多段证据聚合;
- long-context QA;
- repo-level code understanding;
- long tool trace / agent trace。
OLMo 3 的 Longmino Mix 和 Phi-3.5 的经验都说明:长上下文需要单独阶段和专门数据。
#7. 如何准备 Mid-training 数据:一套可执行流程
下面是一套比较实践化的 pipeline。
#7.1 第一步:先定义目标能力,不要先收数据
先列出模型 mid-training 后要改善什么,例如:
目标能力:
1. 数学推理
2. 代码生成与 repo-level 理解
3. 科学 QA
4. 长上下文阅读
5. instruction following 预热
6. thinking trace 预热
7. 后续 RLVR 可训练性
每个目标能力都要对应:
- 训练数据类型;
- 验证集;
- proxy eval;
- 后训练 eval;
- 去污染规则。
不要把 mid-training 数据准备成“看到什么好数据都加一点”。那样最后很难解释效果,也很难调比例。
#7.2 第二步:建立候选数据池
候选池可以分成:
- 保底通用池:高质量 web、paper、wiki、book、PDF;
- 目标能力池:math、code、QA、science、long-context;
- 格式桥接池:instruction、dialogue、tool-use、thinking trace;
- 合成增强池:用强模型生成、改写、扩展、验证;
- 负样本 / anti-contamination 池:用于检测泄漏和过拟合。
每个数据源都要记录 metadata:
- source;
- license;
- language;
- domain;
- token count;
- document count;
- average length;
- quality score;
- dedup hash;
- benchmark overlap;
- whether synthetic;
- whether instruction-formatted;
- whether contains reasoning traces。
#7.3 第三步:质量过滤不是只做 perplexity
Mid-training 数据的质量过滤要比预训练更目标化。
可以包括:
- language identification;
- document length filtering;
- boilerplate / template removal;
- exact and fuzzy dedup;
- toxicity / PII / unsafe content filtering;
- code parseability;
- math answer verification;
- QA consistency check;
- synthetic trace verifier;
- benchmark contamination detection;
- source reliability score;
- model-based quality classifier。
对于 math / code,最好有可验证机制:
- math:答案匹配、symbolic checker、LLM judge + rule verifier;
- code:unit tests、static analysis、execution sandbox;
- QA:evidence support、retrieval consistency;
- long-context:answer span / evidence chain 可追踪。
#7.4 第四步:设计 mix,而不是简单拼接
Mid-training mix 至少要包含三类比例:
general anchor data 防止遗忘,维持底座
capability data 提升目标能力
format-bridging data 贴近后训练格式
一个抽象配方可以是:
40-70% high-quality general / web / paper / book
10-25% code
10-25% math / reasoning
5-15% QA / knowledge elicitation
1-10% instruction / thinking traces
0-20% long-context, depending on whether this stage承担长上下文扩展
这不是固定比例,只是心智模型。真正比例要看:
- base model 已有能力;
- post-training 目标;
- 模型大小;
- mid-training token budget;
- 数据质量;
- domain distance;
- 是否有后续 long-context stage。
关键原则:
目标域越远,越需要 mid-training;但目标域越窄,越需要 general anchor data 防止坍缩。
#7.5 第五步:用 microanneal 快速筛数据
不要直接把所有数据放进 100B token 大训练。
可以像 OLMo 3 一样做 microanneal:
- 从 base checkpoint 取一个较小模型或中间 checkpoint;
- 用 1B-10B tokens 对单个候选数据源做短训练;
- 评估目标能力 cluster;
- 同时评估通用能力和遗忘;
- 记录该数据源的边际贡献。
一个数据源是否进入最终 mix,不应该只看它让某个 benchmark 涨了多少,还要看:
- 是否稳定提升同一能力簇;
- 是否伤害其他能力;
- 是否提升后续 SFT 后表现;
- 是否存在 contamination;
- 是否在不同模型尺度上趋势一致。
#7.6 第六步:做 integration test
单数据源有效,不代表混在一起有效。多个数据源之间可能:
- 梯度冲突;
- 格式冲突;
- 难度冲突;
- 语言比例冲突;
- 重复或污染叠加。
因此要做 integration test:
candidate mix A -> 训练 10B/50B/100B -> base eval -> SFT eval -> forgetting eval
candidate mix B -> 同样流程
candidate mix C -> 同样流程
评估时不要只看 base benchmark,也要看 post-trainability。因为 mid-training 的目的之一是让后续 SFT / RL 更好训练。
#7.7 第七步:严格去污染
Mid-training 比预训练更容易污染 benchmark,因为它会加入很多 task-like 数据、synthetic data、QA、math、code problem。
必须做:
- exact match 去重;
- n-gram overlap;
- embedding similarity;
- problem statement canonicalization;
- code problem signature matching;
- benchmark answer leakage 检测;
- 和 SFT / RL 数据的交叉去重。
尤其是如果后续要做 RLVR,更要保证 RL 数据不被 pretraining / midtraining 泄漏。OLMo 3 在 RL-Zero 部分就强调了要从 pretraining 和 midtraining 数据中 decontaminate RL-Zero 数据,以避免 spurious reward 或 prompt template 修复造成虚假提升。
#7.8 第八步:决定训练时机和比例
Midtraining Bridges Pretraining and Posttraining Distributions 的一个重要结论是:specialized data 的引入时间和 mixture weight 强相关。
直觉是:
- 早一点引入,模型还有可塑性,可以接受较高比例 specialized data;
- 太晚引入,模型已经定型,强行提高 specialized data 比例可能造成冲突或遗忘;
- 不能指望最后短时间高比例灌数据来补救前面没学到的能力。
所以 mid-training 数据准备必须和训练 schedule 一起设计:
- 从哪个 checkpoint 开始?
- 学习率是否 anneal?
- specialized data 比例是否逐渐升高?
- 是否保留 general anchor?
- 是否分多个 sub-stage?
- 是否最后 checkpoint averaging / soup?
#8. Mid-training 和 Post-training 的边界
这是很容易混淆的地方。
#8.1 Mid-training 可以有 instruction,但不是 instruction tuning
Mid-training 中的 instruction data 是为了降低格式落差,不是为了完成最终对齐。
区别是:
| 维度 | Mid-training instruction data | SFT instruction data |
|---|---|---|
| 目标 | 让 base model 熟悉任务/指令格式 | 让模型成为可交互助手 |
| 数据规模 | 可以较大,混在 LM training 中 | 较小但更精细 |
| 格式约束 | 可弱一些,多样一些 | 强格式、高质量、多轮、角色规范 |
| 损失 | 通常仍是 LM objective | 通常对 response 部分监督更明确 |
| 风险 | 过早 assistant 化、污染 eval | 过拟合风格、牺牲 base 能力 |
#8.2 Mid-training 可以有 thinking traces,但不是 RL reasoning
Thinking traces 在 mid-training 中主要起到“推理格式和中间过程预热”的作用。真正让模型在可验证任务上优化推理策略,通常还需要 SFT / DPO / RLVR。
所以:
Mid-training thinking traces: 让模型知道长推理长什么样
RLVR reasoning: 让模型学会什么推理路径真的有效
#8.3 Mid-training 可以有 tool data,但不是 agent training
工具调用、函数调用、浏览器轨迹、代码执行轨迹也可以作为 mid-training 格式桥接数据。但如果没有环境反馈和成功/失败信号,它只是 imitation-style pre-exposure,不等于真正 agentic RL。
#9. 一个具体的 Mid-training 数据准备模板
假设目标是训练一个面向 LLM Agent / code / reasoning 的 base model,mid-training 可以这样准备。
#9.1 数据桶设计
| 数据桶 | 目标 | 例子 | 风险 |
|---|---|---|---|
| General anchor | 保持通用能力 | 高质量 web、paper、wiki、book | 比例太高会稀释目标能力 |
| Code base | 提升代码分布 | cleaned GitHub、docs、StackOverflow | 低质 repo、license、重复 |
| Code task | 任务化代码能力 | coding problems、unit-test tasks、repo QA | benchmark contamination |
| Math reasoning | 数学推理 | GSM-like、MATH-like、proof、synthetic CoT | 模板化、答案污染 |
| QA / knowledge | 知识激活 | science QA、multi-hop QA、fact QA | 幻觉式合成问答 |
| Instruction bridge | 格式预热 | FLAN-like、Tulu-like instruction | 过早 assistant 化 |
| Thinking traces | 后续 reasoning 预热 | verified traces、teacher traces | 冗长伪推理 |
| Long-context | 长上下文 | papers、books、repo、long QA | 只长不需要推理 |
| Agent traces | agentic 预热 | tool-use、browser、code-edit traces | imitation 不等于能力 |
#9.2 推荐流程
1. 明确目标能力和 eval cluster
2. 收集候选源并做 metadata registry
3. 基础清洗:语言、长度、格式、去重、PII、安全
4. 能力专项过滤:math verifier / code tests / QA evidence / long-context evidence
5. decontamination:benchmark、SFT、RL 数据全链路去污染
6. microanneal:单源短训,筛掉负贡献源
7. integration test:混合配方训练,评估 base + SFT 后结果
8. 调 mixture weight 和 schedule
9. 训练正式 mid-training run
10. 保存多个 checkpoint,做 checkpoint averaging / soup 或选择最优 checkpoint
#9.3 评估指标
Mid-training 的评估要分层:
Base capability eval:
- MMLU / MMLU-Pro;
- GPQA;
- GSM8K / MATH / AIME;
- HumanEval / MBPP / LiveCodeBench;
- QA / reading comprehension;
- multilingual;
- long-context benchmarks;
- held-out perplexity。
Forgetting eval:
- held-out pretraining distribution loss;
- general QA;
- broad language understanding;
- multilingual regression;
- safety / toxicity regression。
Post-trainability eval:
- 快速 SFT 后表现;
- DPO 后偏好表现;
- RLVR 初始 reward 和训练曲线;
- instruction following;
- tool-use success;
- code agent benchmark。
这点很重要:mid-training 的好坏不能只看 mid-trained base checkpoint,还要看它后面是否更容易被 SFT / RL 塑造成目标模型。
#10. 常见误区
#10.1 误区一:Mid-training 就是把高质量数据放在最后训
不对。高质量只是必要条件,不是充分条件。
Mid-training 的关键是:
- 数据和目标 posttraining 分布的距离;
- 和 pretraining 分布的桥接;
- mixture weight;
- 引入时机;
- general anchor;
- 后训练可塑性。
#10.2 误区二:越 specialized 越好
过窄的 specialized data 会导致:
- catastrophic forgetting;
- 风格坍缩;
- 通用能力下降;
- 对后续 SFT / RL 不稳;
- benchmark overfitting。
所以 mid-training 需要混合,而不是纯 domain finetune。
#10.3 误区三:Instruction data 越早越多越好
太早、太多 instruction data 可能让 base model 过早 assistant 化,影响基础语言建模和多样性。
更稳妥的是:mid-training 中少量作为格式桥接,真正的 assistant behavior 留给 SFT / DPO / RL。
#10.4 误区四:长上下文只靠 RoPE 扩展
长上下文能力需要数据。模型要看到真正长距离依赖、长文档结构、跨段证据聚合,而不是只把短文本拼长。
#10.5 误区五:只看单个 benchmark
Mid-training 很容易污染 benchmark,也很容易让某个指标涨但整体能力下降。因此要看能力簇、held-out、decontamination、post-trainability。
#11. 对研究问题的判断
我觉得 mid-training 的本质,是大模型训练从“单一大预训练”走向“分布路径设计”。
以前大家主要问:
给定模型规模,应该用多少 token、什么混合比例预训练?
现在问题变成:
模型能力形成是不是依赖一条合适的数据课程路径?什么数据应该早学,什么数据应该晚学,什么数据应该作为桥梁,什么数据应该留给后训练?
这和用户长期关心的 foundation model training mechanism 很相关。因为 mid-training 暴露了一个基础问题:
能力不是只由最终数据集合决定,也由数据出现的时间、比例和阶段位置决定。
同样的 math / code / instruction 数据:
- 放在预训练早期,可能被稀释;
- 放在预训练末期,可能提升目标能力但带来遗忘;
- 混合 general anchor 做 mid-training,可能成为桥梁;
- 放在 SFT,可能只改变输出格式;
- 放在 RL,可能优化策略但受初始化限制。
所以真正值得研究的不是“mid-training 数据有哪些”,而是:
- 如何度量 pretraining distribution、midtraining distribution、posttraining distribution 之间的距离?
- 如何判断一个数据源是 bridge 还是 harmful shift?
- 什么是模型的 plasticity window?
- specialized data 的最佳引入时机和比例是否可预测?
- mid-training 是否能提升 RLVR 的探索空间和 reward learning efficiency?
- 对 LLM Agent,是否存在 agentic mid-training:在 RL 前先用轨迹、工具调用、代码修改、环境反馈摘要做分布桥接?
我的判断是:未来 base model recipe 的竞争,不会只在“预训练数据更大”上,而会越来越转向“训练阶段之间的数据路径设计”。
Mid-training 正是这个趋势中最清晰的一环。
#12. 最后给一个简短操作清单
如果你要准备 mid-training 数据,可以按这个 checklist:
- 明确后训练目标:chat、reasoning、code、agent、long-context、multilingual?
- 为每个目标建立 eval cluster,而不是单 benchmark。
- 保留 general anchor data,避免纯 specialized continued pretraining。
- 为 math/code/QA/long-context/instruction/thinking 分桶建库。
- 每条数据记录 source、license、synthetic、quality、domain、length、dedup id。
- 对 math/code/QA 尽量做 verifier-based filtering。
- 对 benchmark、SFT、RL 数据做全链路 decontamination。
- 用 microanneal 测单源数据边际贡献。
- 用 integration test 测混合配方和 post-trainability。
- 联合设计 mixture weight、引入时机、learning rate schedule。
- 不要只看 base eval,也要看 SFT / RL 后是否更好。
- 把 mid-training 当成分布桥接,而不是“最后补课”。
如果只记一句话:
Pretraining 数据决定模型底座的宽度,mid-training 数据决定模型往哪里长,post-training 数据决定模型如何表现出来。