ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

开源后训练recipe深度解析:SFT、偏好优化与长CoT数据设计

开源后训练recipe深度解析:SFT、偏好优化与长CoT数据设计

见证了一个很有意思的变化:开源大模型的竞争重心,已经从"预训练做得多大、base分刷得多高",悄悄挪到了后训练这一段。前两年的开源模型,大家拿到手的是权重文件和一个含糊的"我们做了SFT和RLHF",至于具体的数据配比、阶段划分、超参数选择,基本是黑盒。今年风向明显变了,不少团队开始把后训练recipe当成一等公民开源出来,MiMo V2.6就是其中一个很有代表性的样本。

我花了两周时间,把MiMo V2.6的开源后训练recipe逐段扒了一遍,顺手在自己的一套基座模型上做了部分复现实验。今天这篇不打算把仓库里的配置项一条条翻译成中文,而是想聊清楚recipe背后的设计逻辑:为什么这样的流水线能训练出稳定的长思维链推理模型,每一步SFT、偏好优化、长CoT数据清洗之间是怎么衔接的,以及你要在自己的模型上复现它时,哪些环节最容易翻车。

如果你正在训练自有推理模型,或者在给领域大模型做微调,这篇应该能帮你把"后训练"从一段模糊的流程,变成一张可以照着执行的地图。

1. 为什么后训练recipe值得被开源

1.1 MiMo V2.6在开源模型谱系里的位置

MiMo这个命名本身就很直白,Mi(小米)+ Mo(Model),同时隐含着MoE架构的信息。它不是一个单一的稠密模型,而是走混合专家路线,主打推理能力。V2.6版本最吸引我的地方,不是又刷高了几分benchmark,而是它把后训练部分的recipe完整公开了。

所谓recipe,通俗讲就是"训练配方"。同样一份基座权重,用不同的配方处理后,最后得到的模型性格完全不同。有的配方调出来是个听话的对话模型,有的配方调出来是个擅长反思和纠错的推理模型。MiMo V2.6的recipe针对的是后者,目标很明确:让模型学会长链条的思考过程,在数学、代码、逻辑推理这类任务上给出可验证的推演步骤。

这件事在开源社区里的意义,比单纯放出权重大得多。权重是结果,recipe是过程。只有拿到过程,别人才能复现、才能基于自己的场景去调整、才能把通用模型改造成特定领域的推理模型。

1.2 黑盒权重与开放配方的本质区别

一个很典型的对比:前段时间社区里流传过不少蒸馏模型,权重放出来了,效果也不错,但你想在此基础上做领域适配时,只能靠猜——不知道该在哪个阶段加入领域数据,不知道偏好优化的数据从哪来。而MiMo V2.6的repo把阶段划分、数据清洗方式、混配比例、关键超参都摊开了,等于是把最后一层窗户纸捅破了。

拿到一个开放recipe之后,你能做三件黑盒权重做不到的事:

  • 复现:你的推理模型效果不好时,可以对照配方排查是哪个环节出了问题,而不是整体推倒重来。
  • 替换:把你自己的领域数据,按配方给出的配比逻辑替换进去,模型的领域能力会明显提升,同时保留推理能力。
  • 改进:配方里某一步你觉得不合理,可以直接在这一步做实验,形成自己的迭代版本。

从工程效率角度看,开放recipe省掉的是大量试错时间。我自己复现时感触很深,如果没有现成的数据配比参考,光是"长CoT数据该占多少比例"这一个问题,就可能要跑好几轮消融实验,每一轮都是几万卡时的成本。

2. 后训练流水线的三段式阶段拆解

2.1 第一阶段:稳定化微调与长CoT数据筛选

任何基座模型,在预训练阶段看到的都是大量互联网文本,它对"用户指令-模型回答"这个对话格式并不熟悉。所以recipe的第一阶段,通常不是急着注入推理能力,而是先让模型学会对话的壳。

这一阶段用的数据,包括指令数据、通用对话数据和少量长CoT数据。MiMo V2.6的recipe在这一步有明显的特点:即使是通用对话数据,也经过了严格的格式化和质量筛选。很多团队复现效果打折,问题就出在这里——他们用了推理模型的配方,却在数据清洗环节偷了懒,最后模型连基本的指令遵循都没做好,更别说长推理了。

长CoT数据的筛选,是这个阶段的核心工作量。recipe里体现出来的思路是三个字:剪枝。第一轮剪掉答案正确但过程啰嗦的样本;第二轮剪掉思维链里存在逻辑跳跃的样本;第三轮按困难度采样,保证简单题、中等题、难题的比例在一个合理的分布上。

2.2 第二阶段:指令微调与推理能力的初步注入

过了稳定化阶段后,recipe进入真正的指令微调(SFT)阶段。这个时候数据配比会发生明显变化:普通对话数据的比例往下压,数学、代码、逻辑推理类的长CoT数据比例拉上来。

这里有个很多新手会误解的地方:推理模型的SFT,并不是简单地把长CoT数据加进训练集就完事。关键在数据组合的方式。MiMo V2.6的recipe明显采用了"短指令+长回答"的结构,也就是说输入的prompt很短,但模型的期望输出是一段结构完整的思维链。这种结构要求模型在生成时先内部推理、再给出结论,而不是像对话模型那样快速回答。

阶段划分上的一个细节是:recipe没有把SFT做成一个大混合包一次训完,而是分成了几个子阶段。每个子阶段的数据各有侧重,比如先加强格式稳性,再加强推理深度。这种递进式设计的好处是,训练过程更可控,某个子阶段出问题时可以单独回滚,不用全部重来。

2.3 第三阶段:偏好优化与推理反思能力

SFT阶段能让模型输出思维链,但思维链不一定总在正确的思路上走。要真正提升推理成功率,还得靠偏好优化。MiMo V2.6的recipe在这个阶段做的是比较经典的DPO/类DPO路线,偏好对的数据构造非常有讲究。

细看recipe的偏好数据构造逻辑,它不只是拿"正确答案"和"错误答案"做对比,而是更细致地区分了:

  • 答案路径正确但最终结论错误:这种对模型最有教育意义,说明推理过程可以,但某个中间步骤出错了。
  • 答案路径冗长但拖泥带水:用来训练模型学会精简思维链,减少无意义的口水话。
  • 最终结论正确但路径跳跃:用来约束模型写出可验证的推理步骤。

这种多层次的偏好对设计,比简单的好坏二元对比效果好得多。我自己的实验里,用类似思路构造偏好数据后,模型在数学任务上的成功率大概提升了3到5个百分点,而且生成内容的可读性明显更好。

3. 关键超参与数据配比背后的取舍逻辑

3.1 学习率、批次大小与训练步数

后训练recipe里的超参数,乍看和预训练很像,但背后逻辑完全不同。预训练追求的是在超大规模数据上稳定收敛,学习率一般设得很低;后训练因为数据量小、模型已经具备较强能力,学习率如果照搬预训练那套,模型会变成"老油条",新知识学不进去。

从recipe给出的配置区间和业界的通行做法来看,后训练阶段的学习率通常在基础模型预训练学习率的十分之一到二十分之一。比如预训练用的学习率如果是1e-4量级,后训练大概在1e-5到5e-5之间浮动。为什么?因为后训练的目标不是去学全新的知识分布,而是在已有知识的基础上调整输出风格和行为模式。学习率太大,模型会把原有的世界知识给冲掉,出现典型的"灾难性遗忘";学习率太小,又学不动新的对话格式和推理结构。

批次大小这块,recipe体现出来的思路是"尽量增大全局batch,但受限于显存和优化器状态"。推理模型的训练序列长度通常很长(因为包含完整的思维链),所以单条样本占的显存比普通对话数据大得多。全局batch size和序列长度之间存在一个隐性的平衡:

  • 训练序列越长,模型能在一次更新中看到越完整的推理链条。
  • 但如果你为了塞下长序列而被迫缩小batch,梯度估计的噪声会变大,训练稳定性下降。

MiMo V2.6的recipe在长序列和global batch之间明显做过权衡,走的是"比对话模型大一些的batch + 充分预热"的路线。warmup步数不能省,尤其是在SFT阶段,没有充分的warmup,学习率的突然上升会让模型在长CoT数据上产生loss spike,后面再降回来就难了。

3.2 长上下文训练中的packing与损失掩码

长CoT数据带来一个很实际的工程问题:序列长度差异极大。有的推理样本只有几百token,有的能到几千甚至上万token。如果直接按最大长度做padding,计算效率低到没法看;如果做packing(把多条短样本拼接成一条长序列),又要小心跨样本的注意力泄漏。

recipe里对这块的处理方式值得学习。它没有傻乎乎地做全部统一长度截断,而是按长度分桶,然后在桶内做padding,再配合损失掩码。所谓损失掩码,就是在计算loss时只保留真实token的部分,padding部分不参与梯度计算。

我在复现时对比过掩码和掩码的效果,差距非常明显:不加掩码的话,模型会把padding位置也当成要生成的内容来学习,训练出的模型会在输出中间出现大量无意义的空白符和重复。这一点如果你从零复现,一定要在一开始就确认框架是否正确启用。

另外多提一句,对于MoE架构来说,长序列训练还有一个隐藏的坑——专家路由的不稳定性。序列长度一旦变长,某些token的激活模式会发生漂移,导致个别专家过载。常见的做法是在训练过程中监控专家负载均衡损失,发现某个专家激活比例异常偏高时,及时调整负载均衡系数,而不是等到训练崩了才排查。

3.3 数据配比中的"推理密度"概念

MiMo V2.6的recipe里,我读到最有价值的一个隐含概念,可以称之为"推理密度"。它不是单指长CoT数据的比例,而是指训练过程中模型被迫进行深度思考的频率。

一个常见误区是:为了让模型更会推理,就把长CoT数据比例加到80%甚至90%以上。听起来很合理,实际效果很糟糕。recipe里的配比逻辑显然不是这么简单。

从repo披露的数据分布和复现实验来看,合理的推理密度应该在50%到70%之间,剩下的数据留给通用对话、指令遵循和安全对齐。为什么?因为推理模型的本质,是"该深入思考时能深入思考,该快速回答时能快速回答"。如果训练数据全是长CoT,模型会把所有问题都答成一篇小作文,哪怕你说"你好"它也要先推理一番。这种模型在基准测试上分可能很高,但真实用户体验极差。

我自己复现时试过一个极端配置,把长CoT比例拉到85%,结果模型在数学题上确实很强,但写一个简单的邮件都会先输出一大段推理过程。这就是过度推理,也是推理密度失衡的典型表现。

4. 复现这套recipe的硬件需求与工具链选择

4.1 训练一个推理模型到底需要多少算力

聊recipe不能回避算力问题。很多人看到开源配方很兴奋,但一算训练成本就冷静了。

先给一个参考估算,一个70B量级的MoE模型,做完整的后训练(含SFT、偏好优化、长CoT混合、以及过程中的评估迭代),按recipe标注的全局batch和训练步数来算,大概需要64到128张H100/A100,训练周期从几天到两周不等。

其中最吃显存的部分不是模型参数本身,而是长序列训练时激活值(activation)和优化器状态。MoE模型的参数量大,但激活值比同等规模的稠密模型要低不少,这是MoE在后训练阶段的一个天然优势。但如果你用全量微调而不是LoRA,那需要保存的梯度状态依然非常可观。

对于预算有限的团队,最现实的选择是LoRA/QLoRA路线。我自己在几个7B到13B的基座模型上做过对比,LoRA微调复现这套recipe的核心思想,效果能达到全量微调的80%到90%,成本却只有三分之一左右。当然,LoRA有一个需要注意的点:因为可训练参数变少了,长CoT数据的配比要适当上调,否则推理能力的注入不够充分。

4.2 recipe迁移到自有基座模型的改造方法

MiMo V2.6的recipe是为它自家基座模型调的参,你不能指望在完全不同的基座模型上照抄一遍就能出一样的效果。但迁移有方法,主要改三个地方:

第一,数据配比基线不要动。推理密度50%到70%这个区间,在不同基座模型之间是通用的。你的基座模型越强,长CoT比例可以越靠近下限;基座模型越弱,越要靠近上限。

第二,学习率按参数量缩。模型越大,学习率越低。如果MiMo的recipe里给出的是70B模型的学习率,你在7B模型上复现时,建议把学习率往上调一调,因为小模型需要相对激进的更新幅度来学习新行为。

第三,工具链的选择。获取配方数据时,推荐用开源数据处理工具做清洗,社区里像Data-Juicer这类工具在长文本去重、质量过滤上已经很成熟,可以直接拿来用。训练框架侧,Megatron-LM在长序列上的效率优势明细,且对MoE支持得比较好;用DeepSpeed的话,要注意ZeRO阶段和长序列packing的配合。

还有一个经常被忽略的环节:评估集准备。recipe给出了训练配置,但没有一个标准的评估集的话,你无法判断每次改动是好是坏。建议至少准备三套评估集:一套数学推理(比如竞赛题合集)、一套代码生成、一套常规对话与指令遵循。前两套用来验证推理能力变化,第三套用来防止过度推理毁掉基础体验。

5. 实测复现中的异常情况与增量改进方向

5.1 训练监控中必须盯住的几个异常信号

我在复现这套recipe时,踩过一些值得记录的坑,如果你也准备跑一遍,这些信号一定要提前注意。

第一个危险信号是loss spike。长CoT数据里偶尔会混进一些异常样本,比如超长且重复的思维链,这种样本会让loss突然跳高。轻度spike一般能自己恢复,但连续多次spike就说明数据清洗环节出问题了。处理方法是先定位是哪个数据桶的样本引发spike,把异常样本剔出去,而不是盲目调低学习率。

第二个信号是eval loss与生成质量的背离。有时候eval loss在下降,看起来训练很正常,但你生成几条测试样本一看,发现模型在输出一堆废话,只是废话的措辞更流畅了。这说明你在把模型往"说话更顺"的方向优化,而不是往"思考更深"的方向优化。判断关键不在loss,而在思维链的可读性和结论的正确率。

第三个信号是过度推理的出现。前面提到长CoT比例太高会导致所有问题都变成小作文,但你不一定等到训练结束才发现。在中间checkpoint上做快速测试,用一些日常问题问模型,看它是否过度展开。如果100个日常问题里有一半以上都在长篇大论,说明配比失衡了,赶紧调整,别等到全量训练结束再评估。

5.2 在recipe基础上做增量优化的三个方向

如果已经成功复现了这套recipe,接下来怎么在它的基础上做出更好的模型?我自己实验过三个方向,都有实际收益,分享出来供参考。

第一个方向是做偏好数据的二次迭代。recipe里的偏好数据是它自己构造的,你可以用训练好的模型生成一批新的对比样本,再拿人工或规则去标注,循环几轮。这种"自我对弈"式的偏好数据迭代,对数学推理类的提升尤其明显。代价是流程变复杂了,但值得。

第二个方向是多长度CoT混合训练。recipe本身对数据长度做过长度分桶,但你可以更进一步:把短CoT和长CoT分桶后交替训练,让模型学会"简单题快速答、难题深入想"。具体做法是先训几轮长CoT建立深度推理能力,再训几轮短CoT修剪过度推理的倾向,来回震荡几次。

第三个方向是领域数据的定向注入。如果你想做一个医疗、法律等领域的推理模型,不要直接把领域数据一股脑倒进通用recipe里。建议的做法是:先在通用配方上训完一轮,让模型具备基础推理能力;然后用领域数据做一次轻量SFT,学习率调到更低;最后再用领域相关的偏好对做一轮对齐。三步走下来的效果,比把领域数据混进第一轮训练好得多。我最初图省事,把领域数据直接混进SFT阶段,结果通用能力掉得厉害,后来改成两步走才稳住。

个人复现后的最大感受是:MiMo V2.6的recipe真正的价值不在某一个具体的超参数,而在于它把"后训练"从一门玄学变成了一个系统工程。数据清洗、阶段划分、配比控制、偏好构造,每个环节都环环相扣。照着跑通不算本事,理解每个设计选择背后的原因,然后根据自身场景做调整,才是这套recipe留给开源社区最有用的东西。在这个基础上,无论你是想训练通用推理模型,还是在垂直领域做深度适配,都已经有了一条清晰可走的路。

返回列表