最好的数据什么时候喂?
本课一问:数据洗好了、配比定了、不够的也补上了。最后一个问题:最好的那部分数据,应该在训练的哪个阶段喂?
这一课先不碰:长上下文扩展里位置编码怎么改(C2 第 5 课、C11);后训练(C12)。
从已有出发:C5 留下的问题
模型这条流水线上,本章始终停在最左边的「文字」一格;把这一格展开,就是下面这条数据管线:
回扣 C5:讲 WSD(warmup-stable-decay)时有一个现象——学习率进入最后的衰减段,loss 会快速下降。当时留了一个问题:衰减段该喂什么数据?这一课兑现它。
贯穿任务里就有这个现象的真实记录。第 5 课结尾留下的那个疑问:同样的数据,400 步的基线在 6.5 个 epoch 时 val loss 4.626,比 1,500 步的 run 在 4.9 个 epoch 时的最低点 4.771 还低。两者都是 cosine 调度、峰值 0.003:1,500 步的 run 在第 300 步时学习率还有 2.87e-3,基线在第 400 步时已经降到 3.00e-4。val loss 的一大段下降,是学习率降下来之后才出现的。
先自己设计:全程均匀打乱
最朴素的做法:所有数据(包括最好的那部分)倒进一个池子均匀打乱,训练全程随机抽。
- ① 朴素方案
- ② 它在哪失败
- ③ 改进方案
假设衰减段占训练的 f。好数据均匀分布在全程,落在衰减段里的只有 f:
- f = 10%(MiniCPM 发现衰减段约占 10% 就够,2.5% 不够)时,只有 10% 的好数据落在衰减段;
- 其余 90% 在学习率还高的阶段被「用过」了。
MiniCPM 的实验:在衰减段混入高质量数据与 SFT 数据,比只在 SFT 阶段才加入这些数据效果更好 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条小模型(MiniCPM 系列)上的结论;衰减段长度与数据的效果耦合在一起。 出处MiniCPM §4.3、§6.2(需联网) ↗需联网 。
退火(annealing):在学习率衰减段提高高质量数据的比例。Llama 3 还发现退火可以当数据价值的测量仪:把一个训练到一半的 8B 模型,在 40B token 上把学习率线性降到 0,新数据集占 30%、原配比占 70%——GSM8k 提高 24.0%,MATH 提高 6.4%;同样的做法在 405B 上几乎没有收益 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条报告用它来评估小数据集的价值,比为每个数据集重训一次便宜得多;大模型上收益可忽略。 出处Llama 3 §3.1.3(需联网) ↗需联网 。
改进:从退火到独立的 mid-training
退火一开始只是「衰减段换一换配比」,后来越做越大,变成了预训练与后训练之间一个独立的阶段,叫 mid-training。它通常同时做几件事:提高数学、代码、推理数据的比例;加入合成数据;把上下文拉长。
试三件事:① 默认的 SmolLM3:看学习率(绿线)开始下降的位置,正好对上第三阶段——数学从 3% 加到 13%、代码从 12% 加到 24%;② 切到 Llama 3 405B,在线性横轴上找退火段(找不到),再点「对数:距结束还剩多少」,那 40M token 才出现;读统计条里它和 Qwen3 第二阶段差几个数量级;③ 切到 Qwen3 与 GLM-5,读下方说明:哪些数字原文给了、哪些没给,没给的组件就不画。
同一个词,量级差异巨大(实算):
| 模型 | 「后期高质量阶段」 | 占训练的比例 |
|---|---|---|
| Qwen3 | 第二阶段约 5T 高质量 token(STEM、代码、推理、合成比例上调,学习率加快衰减),总共 36T | 5 ÷ 36 = 13.9% |
| SmolLM3 | 第三阶段 10T → 11.1T(学习率线性降到 0 的那一段) | 1.1 ÷ 11.1 = 9.9% |
| OLMo 2 | mid-training(Dolmino 配比,学习率线性降到 0) | 训练算力的 5–10%(原文按 FLOPs 算) |
| Llama 3 405B | 最后 40M token 线性退火到 0,上采样最高质量来源,并对检查点取平均 | 40M ÷ 15.6T = 2.6e-6 |
Qwen3 与 Llama 3 相差约 5 个数量级。同叫「退火」,一个是训练的七分之一,一个是最后几步;读技术报告时,「退火」两个字本身不提供配方信息,要看它的 token 数、学习率和数据 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条各家的阶段划分方式不同,这张表只比较「后期高质量阶段」的相对长度;OLMo 2 原文按 FLOPs 而不是 token 计。 出处Qwen3 §3.2 · Llama 3 §3.1.3 · OLMo 2 §2(需联网) ↗需联网 。
OLMo 2 还多做了一步:用不同的数据顺序跑几次 mid-training,再把得到的模型参数取平均(「model soup」)——7B 是 3 次、每次 50B token;13B 与 32B 是 3 次 100B 加 1 次 300B,四个一起平均。合并后的模型总是不差于其中任何一个 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条「不差于任何单次」是在 OLMo 2 的设置里观察到的;平均参数有效的前提是这些模型从同一个检查点出发。 出处OLMo 2 §4.5、表 14(需联网) ↗需联网 。
长上下文也在这个阶段加(旧版 M7 迁入)
把上下文拉长是 mid-training 的另一项主要任务:长序列的注意力计算贵,所以先用短序列训完大部分 token,最后才用长序列训一小段。
- Kimi K3:上下文按 8K → 64K → 256K → 1M 四段逐步扩展,把昂贵的长序列计算压缩在总预算的一小部分里;长上下文的自然数据不够,就把多篇文档打乱重排后拼接,合成一类「必须跨全程注意力才能解题」的数据,防止模型退化成只看局部 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条官方自报;各段的 token 数与合成数据的具体构造见报告,未经第三方复现。 出处Kimi K3 技术报告 ↗ 。
- GLM-5:mid-training 分三段把上下文拉到 32K(1T token)、128K(500B)、200K(50B);数据包括约 1,000 万个 issue–PR 对(约 160B 唯一 token)和自然的、合成的长上下文数据(R2 §2.5.1)。
- Qwen3:第三阶段(原文叫「长上下文阶段」)用数千亿 token,75% 的长度在 16,384–32,768 之间,同时用 ABF 把 RoPE 的 base 从 10,000 调到 1,000,000——这正是 C2 第 5 课讲的那个旋钮。
- SmolLM3:预训练结束后再用 100B token 分两段扩到 32K、64K(RoPE θ 调到 1.5M、5M),再做约 140B token 的推理 mid-training。
- 解决了量几乎无限:Common Crawl 定期抓取全网,FineWeb 用了 96 个快照。卡在WET 纯文本里样板和菜单太多(FineWeb §3.2);我们的原始文件不还原硬换行就跑 C4 句末规则,整本书只剩 17.02% 的字。
- 解决了Reddit 上至少 3 karma 的外链,4,500 万个链接,清洗后约 800 万文档、40 GB。卡在量太小:C6 算出的需求是十几 T token;而且只覆盖被分享过的那一小部分网页。
- 解决了句末标点、词数、平均词长、停用词、重复行……便宜,能在全网快照上跑。卡在绑语言、绑求值单位:英文原版在整本《三國志演義》3,697 段上通过 0 段;C4 句末标点规则删掉约 30% 的 token,FineWeb 最后没用它。
- 解决了C4 里一句话重复 61,036 次;去重后模型复述训练文本的频率降到 1/10。MinHash 把两两比较变成查桶。卡在去得越狠未必越好:跨 96 个快照全局去重只剩 4T,训不出更好的模型;每快照独立去重留 20T,才追平 RefinedWeb。
- 解决了判断「有没有营养」:FineWeb-Edu 让 Llama-3-70B 标 46 万页、蒸馏成分类器,MMLU 33% → 37%。卡在参考语料的困惑度偏向「像参考」:我们模型写的胡话困惑度 93.417,低于真原文 273.209;阈值 3 删掉 92%,长程训练不够用。
- 解决了DoReMi 用 280M 代理模型搜域权重,8B 模型下游平均 +6.5 个点,达到基线快 2.6 倍。卡在权重一变就要重复:按 DoReMi 的权重花完 The Pile 的有效体量,YouTube 字幕要走约 16.9 遍(按字节近似 token,只看量级)。
- 解决了重复 4 遍以内几乎等于新数据;改写真实网页(WRAP)预训练约快 3 倍;Phi-4 约 10T token 里合成占 40%。卡在让模型只吃自己生成的数据,分布的尾巴一代代消失:在三国演义真实字频上重采样,只出现 1 次的字每一代有约 36.8% 的概率丢掉,丢了就回不来。
- 解决了最好的数据放到学习率衰减段(C5 的 WSD)加量;再发展成独立阶段,顺便拉长上下文。卡在同名不同方:Qwen3 的高质量阶段占 13.9%,Llama 3 的退火只占 2.6e-6;收益与学习率调度缠在一起,很难单独归因。
常见误解一:「退火是一种固定配方。」Qwen3 的高质量阶段占 13.9%,Llama 3 的退火只占 2.6e-6,差 5 个数量级。术语不等于配方。
常见误解二:「mid-training 是 OLMo 2 发明的词。」OLMo 2 自己说这个词取自 Phi-3 与 OpenAI 的用法;目前找不到唯一的首创者(R4 D6)。
常见误解三:「由易到难的课程学习(curriculum learning)是预训练的主流。」Bengio 等人 2009 年提出的课程学习是「先易后难」;现代预训练的做法是「高质量后置 + 学习率衰减」,排序依据是质量而不是难度,而且收益和学习率调度缠在一起,很难单独归因(第 5 课的项目曲线就是一个例子)。
🔍 为什么衰减段 loss 会骤降?
一种常见的解释(理论动机,不是证明):学习率高时,参数在 loss 地形的「河谷」里来回震荡,平均位置已经不错,但单步的位置离谷底有一段距离;学习率降下来,震荡幅度变小,参数沉到谷底附近,loss 随之快速下降。在这个图景里,衰减段喂的数据决定了参数「沉到哪一个谷底」——所以这一段的数据对最终模型的影响特别大。这个图景能解释现象,但没有被证明是唯一原因。
证据三问
| 问 | 本课的回答 |
|---|---|
| ① 它解决什么问题? | 让最好的数据在最「有用」的时候出现:学习率衰减、loss 大幅下降的那一段 |
| ② 数学上为什么可能有效? | 只有理论动机:衰减段决定参数最终落在哪里(见 Dig) 证据等级 · 有理论动机 有数学或机制上的理由说明它可能有效,但没有证明它一定更好。最后是否采用,仍然要看实验。 本条「河谷震荡」是解释性图景,没有证明衰减段的数据一定更重要。 出处待补 |
| ③ 实验上为什么选了它? | MiniCPM 的衰减段实验、Llama 3 的退火评估(8B 上 GSM8k +24.0%)、OLMo 2 与 Qwen3 的分阶段配方 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条收益与学习率调度强耦合;405B 上退火几乎没有收益,说明结论依赖规模。 出处Llama 3 §3.1.3(需联网) ↗需联网 |
一句话
最好的数据留到学习率往下走的那一段再加量;同叫「退火」,Qwen3 的高质量阶段占 13.9%,Llama 3 只有最后 40M token——读报告要看数字,不要看名字。
先停在这里:记住「衰减段决定落点,所以好数据后置」与「术语不等于配方」。
再深一层:读 MiniCPM 博客里衰减段长度的对照实验,想一想为什么 2.5% 不够、10% 就够;再对照上面 SmolLM3 的配方,它的第三阶段恰好也是最后 10%。
下一个缺口
数据和配方都齐了,模型放大以后,为什么训练会炸? → 进入 C8 稳定性:放大后为什么会炸
本章的收尾在实验课:把《三國志演義》当成一次网页快照,完整跑一遍前六课的管线。
你可能会问
- 「我们的小项目要不要做退火?」 章首页项目推进的决策 6:在 WSD 的衰减段上采样某个子集,和不上采样比 val loss。差值小于噪声底线不下结论(C14 实验课:同配置 5 次重跑极差 0.016,3σ ≈ 0.020)。
- 「为什么长上下文放在最后?」 注意力的计算量随序列长度平方增长(C0、C3),长序列训一步比短序列贵得多;而且模型先在短序列上学会语言本身,再学长距离依赖更划算。C11 专门讲。
- 「检查点平均和 model soup 是一回事吗?」 思路相同:Llama 3 平均的是同一次训练里的多个检查点,OLMo 2 平均的是不同数据顺序下的几次 mid-training。前提都是模型从同一个起点出发。