第 0-20K 步:限制饮食
两个阶段,一次运行
v2 火水管课程在单一的 200K 步训练运行中分为两个阶段:
阶段 A(第 0 到 20K 步)。 Bandit 仅从 7 个聊天和散文来源拉取:
- hermes3-general
- hermes3-creative
- hermes3-roleplay
- chat
- smoltalk
- oasst
- gutenberg
阶段 B(步骤 20K 到 200K)。 Bandit 从完整混合中抽取,全部 16 个来源,包括参考(dictionary)、技术(repo-docs、repo-commits)& 社交(irc、unweapon)。
限制饮食的共同点
七个预热来源中有六个是对话性的。一个(gutenberg)是段落散文。它们共同具有相同的结构:轮次结构(提示然后响应)或叙事流程。7 个来源的词汇分布大致符合正常英语;交叉熵目标保持在稳定范围内;梯度幅度保持可预测。
配置字段
"curriculum_warmup_steps": 20000,
"curriculum_warmup_sources": ["hermes3-general", "hermes3-creative",
"hermes3-roleplay", "chat", "smoltalk", "oasst", "gutenberg"]
识别预热阶段
没有预热时的 v1 样子
v1:从第 0 步开始所有 16 个来源
第一个 ANDREA-120M 训练运行(2026 年 3-4 月)从第 0 步就激活了完整的火水管:16 个来源,包括 dictionary(88K 个单词定义,格式为 > define X / < X is...)、repo-docs(markdown 文档)、repo-docstrings(Python 文档字符串)以及 repo-commits(git 提交消息,与 chat 和 prose 一起)。
发生了什么问题
一个随机初始化的 120M 模型无法同时建模 16 个不同的分布。来自结构不同的来源的每个批次都会产生不同的梯度方向。来源每 7-42 步切换一次,导致梯度幅度剧烈波动;模型在形成表示之前就更快地在吸引子之间跳跃。
到第 80K 步时,v1 产生了:region region region region region region region。Hermes3-general 教师蒸馏奖励(均值 340-453)使得重复的列表结构来源在交叉熵上得分最高,bandit 将其解释为“这些臂很容易”。bandit 向模型喂食了更多导致其退化的内容。
为什么限制为 7 个来源有帮助
1. 分布相似性。 所有 7 个预热来源产生的文本形状相似(回合结构或叙事)。批次间的梯度方向大致保持对齐。
2. 先求连贯性。 模型在遇到定义列表、代码或 git 消息之前,先学习词汇频率、句法模式和回合结构。
3. 稳定的课程。 来自 7 个聊天/散文来源的 Bandit 奖励信号保持在相当的范围内;UCB1 选择不会被单一异常高奖励来源劫持。
Phase B 激活时
在第 20K 步,模型已生成约 40-50 个样本(每 100 步一个),样本中显示连贯的英语,并建立了稳定的二元和三元分布。现在它可以吸收词典的 > define X / < X is... 模式、repo-docs 的代码块,以及 git 提交头,而不会丢失底层的聊天结构。
诊断 v1 的失败
v3 Polish 将 curriculum_warmup_steps 设置为 0
不同的起点
v3 polish 在第 112,619 步的转向从 step_112600.bin 恢复训练,并将 curriculum_warmup_steps 设置为 0。乍一看这似乎是矛盾的:如果预热帮助了 v2,为什么在 polish 阶段禁用它?
因为模型已经学会了连贯性
Phase A 为新初始化的模型争取时间来学习词汇频率、回合结构和段落连贯性。到第 112K 步时,模型已经完成了所有这些。112K 步的样本审计显示了连贯的对话回合、俳句、问答和对话。预热(保护脆弱的新模型免受梯度混乱)的原始目的不再适用。
Polish 重新加权,而不是重新开始
Polish 是一种课程扰动,而不是全新运行。相同的 200K 目标、相同的架构、相同的优化器状态、相同的历史损失。变化的是:源上限和下限被重新加权,以优先考虑对话而非知识臂。由于模型已经连贯,从第 112,619 步开始,每个活跃源都是公平的游戏。
总结表格
| 阶段 | curriculum_warmup_steps | 原因 |
|---|---|---|
| v1 | (不存在) | 步骤 0 的所有 16 个来源 -> 崩溃 |
| v2 (steps 0-200K) | 20,000 | 保护刚初始化的权重免受梯度混乱的影响 |
| v3 base (steps 0-112K) | 20,000 | 与 v2 相同的保护 |
| v3 polish (steps 112K-200K) | 0 | 模型已连贯;无需保护脆弱的初始化阶段 |