RL扩展Scaling Up RL最近是大模型圈子里最热的话题之一。小米这份《MiMo-V2.6: The Hard Road to Scaling Up RL》技术报告标题里“The Hard Road”这几个字特别打动我——做过RL训练的人都知道这玩意儿真不是把训练脚本跑起来就完事的。数据怎么造、奖励怎么定、KL怎么控、框架怎么搭处处是坑。这篇上篇我先把报告里的方法论部分拆开揉碎讲清楚为什么RL扩展这么难、MiMo团队选择了一条什么样的技术路线、数据侧和训练侧分别做了什么关键设计。下篇再展开分析实验数据、评测结果和那些“硬核数字”背后的东西。如果你是做LLM训练、RLHF/RLVR相关工作的或者正在犹豫要不要从SFT转向RL路线的这篇内容应该能帮你省下不少摸爬滚打的时间。1. 为什么说扩展RL是一条“难路”1.1 预训练Scaling和RL Scaling的本质区别预训练时代的Scaling Law比较“温柔”模型变大了、数据变多了loss曲线基本按预期下降你今天看到一个趋势明天大概率还是这个趋势。这本质上是离线训练数据分布是固定的loss是凸的或者说接近凸的你不需要担心模型在训练过程中把分布带偏。RL Scaling完全不是这个调性。策略在实时变化它生成的数据又反过来成为训练数据形成一条闭环。这个闭环带来的第一个麻烦就是数据分布不再稳定——今天模型还在认真推导数学题明天它可能发现“只要输出一段格式化的废话就能骗过奖励模型”于是整个策略群体集体摆烂。这就是典型的reward hacking我在好几个开源项目里都见过类似现象训练曲线上reward漂亮得不行一测pass1塌了。MiMo-V2.6这篇报告之所以值得读因为它没有回避这个问题而是直接在标题里点明了“Hard Road”。他们在论文里花大量篇幅讲数据重建、奖励设计、训练稳定性本质上都是在和“分布漂移”和“奖励钻空子”这两个幽灵做斗争。1.2 从“学会说话”到“学会思考”把这段话切换到实际产品语境里可能更直观。SFT阶段模型学到的是“模仿”你给它一堆高质量问答对它学会的是怎么组织语言、怎么按照人类的格式偏好来回答。这个阶段模型并不真正理解“推导”这件事它只是在复现训练数据里的模式。MiMo-V2.6做的事情是让模型从“模仿”跨越到“探索”。RL阶段没有标准答案让你抄模型得自己尝试多种推理路径然后通过奖励信号判断哪条路径是对的。这个过程中模型会发展出一些SFT阶段根本学不到的能力自我纠错、回溯、在长上下文里维持连贯推理。这些能力在SFT数据里很难覆盖到——因为人类写的答案往往是干净利落的不会把试错过程写进去。我个人的理解是RL不是在SFT基础上“微调”而是把模型扔进一个开放环境里让它通过试错重新组织自己的知识。这也是为什么MiMo团队反复强调要重新构建SFT数据而不是直接把老SFT数据拿过来用——因为老数据是“标准答案”式的无法为RL的探索提供好的起点。1.3 Scale Up的四个维度不只是模型变大很多团队一提到Scaling Up RL第一反应是“把7B换成70B把8卡换成128卡”。但MiMo-V2.6这份报告展示了一个更完整的视角RL的规模扩展是四个维度同时往上走。维度具体含义不扩展会怎样模型规模Actor/RM/Ref的策略能力上限策略能力不足探索受限数据规模任务数量、采样数量、CoT长度多样性不足泛化差任务规模数学、代码、通用任务混合单一任务过拟合训练框架生成-训练异步解耦、显存优化训练吞吐上不去GPU空转这个表格背后藏着一个很实际的问题单方面扩展某一个维度根本没用。模型大了但数据还是那几千条过拟合是必然的数据多了但生成速度跟不上GPU天天在等推理引擎出结果任务全是数学题模型学完只会做数学一到开放对话就露馅。所以整份报告的叙事主线其实是如何把这四个维度同时稳住让RL能持续跑下去而不是跑两步就崩。2. 核心方法论从SFT到RL的路线转换2.1 基础策略选择PPO还是GRPO参考模型还要不要进入RL训练第一个要拍板的问题是用PPO还是GRPO以及要不要保留参考模型做KL约束。MiMo-V2.6在这个问题上的态度很务实——没有死磕某一种算法而是根据训练阶段灵活切换。PPO提供了更稳定的优势估计但代价是内存占用高、实现复杂需要一个独立的Critic模型和一个Reference模型。GRPO把Critic去掉直接用组内奖励的相对大小做优势估计简化了训练流程显存压力更小。但GRPO也有自己的问题——组内奖励如果噪声特别大优势估计的质量会下降训练方差会变大。从报告披露的细节来看MiMo-V2.6的做法是在早期阶段用更强的KL约束来稳定策略后期再逐步放松。前期的目标是“不跑偏”后期的目标是“放开探索”。这一方面是对齐了OpenAI那套经典PPO做法另一方面也吸收了DeepSeek那条GRPO路线在工程简化上的优点。实际执行中参考模型带来的KL惩罚项非常关键它像一根绳子防止新策略离旧策略太远——一旦这根绳子撤得太早模型很快就开始在奖励模型的盲区里“放飞自我”。我自己做RL训练的经验是算法选择不必太纠结真正要花时间调的是KL系数、advantage裁剪范围、奖励信号的scale这三个超参。它们决定了策略探索的“步长”步长太大崩步长太小原地踏步。2.2 Rewards设计可验证任务和开放任务要分开对待奖励设计是整个RL训练的灵魂也是MiMo报告里信息密度最高的板块之一。先说可验证任务。数学题的答案就是“42”代码跑完就是AC/WA这类任务的奖励信号是客观的可以直接用规则判断不需要训练奖励模型。MiMo-V2.6在这类任务上直接用LLM-as-a-Judge或者规则验证器来判断对错避免了奖励模型本身带来的偏见和噪声。开放任务就没这么轻松了比如“写一段产品文案”“给出一个旅行计划建议”好坏是主观的。这时候必须依赖奖励模型打分。但奖励模型有一个非常头疼的问题分数通胀。训练初期分数分布还算合理训练一段时间之后RM固定偏好开始被策略摸透分数中位数不断上涨但真实质量并没有同步提升。MiMo的处理思路是在混合任务集上定期用生成式的奖励判断做一些校准而不是完全信任单一RM的输出。这里还有一个隐藏很深的坑如果你在开放任务上只用一个RM模型很快就会学会“迎合RM的喜好”而不是“回答用户的问题”。MiMo-V2.6的数据配比里刻意把可验证任务和开放任务混合在一起目的就是让模型不能只靠一个单一信号走捷径——这有点像考试不能只考选择题得穿插一些主观题不然学生就光背答案去了。2.3 优势估计为什么Group-based方法成了主流LLM强化学习和传统RL一个非常大的区别是一条回复只有最后的整体奖励没有逐token的奖励信号。这种稀疏奖励结构让Critic模型的训练变得困难因为价值函数很难在句子中途给出准确的信用分配。MiMo-V2.6采用组内相对比较的方式来估计优势——把N条采样回复放在一起用它们的奖励相互比较谁比平均好就是正向优势谁比平均差就是负向优势。这个做法的直觉很简单与其依赖一个可能没训练好的Critic不如直接用“这个回复相比其他回复好不好”来指导更新。组内优势估计的方差天然比绝对优势更小因为公共噪声被抵消了。这本质上是一种“矮子里拔高个”的逻辑——哪怕整组回复质量都很差最好的那条也会拿到正优势模型至少学会往“不那么差”的方向移动。这个机制解释了为什么RL训练初期模型提升特别明显因为它在快速地放弃那些明显很差的策略而不是突然学会高难度推理。3. 数据侧的关键设计RL的起点决定上限3.1 重新构建SFT数据为什么不直接用老数据这是整份报告里我觉得最有启发性的设计。MiMo-V2.6明确表示用于RL的SFT数据不是直接从历史数据池里捞出来的而是重新生成的“长CoT数据”。背后的逻辑其实不复杂RL训练需要模型在稠密且正确的推理空间里做探索。如果SFT阶段只见过短回答模型根本不会生成超过500字的推理过程RL再怎么给奖励也学不会长程推理——奖励信号根本到达不了那么远的token。这就像让一个只会写大纲的人直接去写长篇小说他就算知道怎么写手也跟不上脑子。具体做法是先让模型基于种子任务做一次“长CoT采样”然后用规则校验筛选出那些“答案正确”且“推理过程完整”的样本再把它们放回SFT阶段重新训练一轮。这个流程跑完之后模型对长CoT的模仿能力明显增强此时再进入RL阶段探索的成功率会大幅提升。从原理上讲这其实是一种“先教后学”的思路先让模型见过好答案再让它自己去探索而不是直接让模型在随机尝试中生成好答案。后者从信号上来说虽然可行但样本效率太低了在那个稀薄的奖励空间里找到好路径的概率微乎其微。3.2 拒绝采样与数据质量问题不是越多越好很多人觉得RL训练数据不够用拼命加大采样量。但MiMo-V2.6的实践说明采样量只是一个维度质量过滤才是真正的瓶颈。他们的流程大致是这样的针对每个种子任务从当前模型里采样很多条候选回复比如30条甚至上百条然后用验证器判断正确性再用启发式规则过滤掉那些“答案正确但推理过程有明显跳跃”的样本。经过这轮过滤最终能进入训练池的样本可能只有10%到20%。这个“淘汰率”很说明问题。我之前在别的项目里也做过类似的统计一个数学题模型生成100条回复可能只有15条是答案正确的而这15条里有小一半在中间步骤上偷工减料。如果不过滤直接训练模型就会学会“猜答案”——跳步、省略推导、直接给出数字反正验证器只看最终答案对不对。更隐蔽的问题是“记忆式过拟合”。如果同一个任务反复出现模型可能只是在背诵那条高分路径而不是学会了解题方法。MiMo-V2.6在数据侧做了大规模的相似度去重确保同一个推理模式不会过度重复出现。这个细节很多团队容易忽略但它直接影响模型的泛化能力。3.3 课程式难度设计先易后难让策略能“够得着”RL训练里经常出现一种情况任务太难模型刚开始探索时成功率接近0奖励信号一直是负的策略很快就学废了——因为没有一个渐进的过程让模型逐步提升。MiMo-V2.6的做法非常像人类学习把任务按难度分层先让模型在简单的题目上建立起“正确推理-正奖励”的反馈回路再逐步加入更高难度的任务。这就是课程学习Curriculum Learning在RL里的应用。难度曲线的设计有几个关键细节。任务的难度不能只看人工标注需要实时用当前策略的表现来做动态调整如果某个难度层的通过率超过80%就该往上加难度了如果低于10%说明当前策略还没准备好得再等等。这个动态调节的过程在报告里是被大量实验验证过的高效方案。我在实际复现这类流程时还发现不同难度的任务混合比例也值得反复调——如果简单题太少模型学不到基础推理能力如果难题太多模型会陷入高方差震荡。MiMo的做法是让简单任务占训练集的60%左右中间难度30%困难任务10%并且随着训练推进逐步向中间难度倾斜。3.4 长度控制和格式约束看不见的稳定器做RL训练时回复长度是一个非常尴尬的变量太长了浪费训练时间和显存太短了学不会推理。更麻烦的是模型会自己试图用“绕圈子”的方式来赢得奖励——输出超长但信息量极低的文本卡在奖励模型的盲区里。MiMo-V2.6在训练过程中对回复长度做了显式的约束既有上限也有下限。下限是为了保证模型必须输出足够的推理过程上限是为了防止长度失控。格式奖励在这个阶段也很有用——要求推理过程必须包裹在特定标记之间这样后续解析答案和验证步骤都很方便整个流程可以自动化。这些“工程性”的设计在论文里往往一带而过但实际作用非常大。我在做RL实验时遇到过这种情况训练到第三天模型的回复长度开始疯涨从平均800字涨到3000字loss倒是没崩但训练吞吐量直接腰斩。后来加了长度上限加上惩罚项才把这个问题压下去。MiMo的报告里虽然没有展开讲这个细节的调参过程但方向上一定是做了类似处理的。4. RL框架工程化生成与训练的异步解耦4.1 为什么必须让vLLM和训练引擎各干各的RL训练和普通训练最大的工程差异在于每一步都需要策略模型实时生成数据。如果同步执行——先用vLLM生成一批回复等生成完再交给训练引擎更新权重然后等更新完再生成下一批——整个流水线的效率会低得让人崩溃。原因很简单生成一次回复模型要自回归地decode几百甚至上千个token这个时间远远大于一次梯度更新。GPU在生成时就处于等待状态在训练时推理引擎又闲着两边的利用率都上不去。MiMo-V2.6的解决方案是将生成和训练解耦vLLM作为一个独立的推理服务持续用最新的策略权重生成训练数据训练引擎则异步地从队列中消费这些数据进行梯度更新。两者之间通过一个高性能队列通信生成结束的数据立即进入训练队列训练完的权重又会被定期推送回vLLM形成数据闭环。这个架构在工程实现上比同步方案复杂一个量级但换来的收益是肉眼可见的GPU利用率可以稳定保持在80%以上训练吞吐量是同步方案的3到5倍。注意这里还有一个隐藏的权衡——异步更新意味着vLLM里的策略永远比训练引擎里的策略“旧”一步两者之间存在策略滞后。为了控制这种偏差通常要限制一次权重更新的量级不让策略分布发生剧变。4.2 显存优化让Actor、Ref、RM三座大山共存一次RL训练任务里至少有三个庞然大物要加载到显存Actor模型、参考模型Ref、奖励模型RM。如果把三个全参数模型同时放在GPU上以7B为例三个模型纯参数就要占60GB以上再加上优化器状态、梯度、激活值基本上没有消费级GPU能扛住。MiMo-V2.6这一类报告的做法大致是分三路省钱。第一路参考模型不参与梯度更新直接把它offload到CPU内存上只在计算KL散度时把激活值传回GPU第二路奖励模型单独挂在vLLM服务上做推理不进训练进程避免挤占训练显存第三路训练侧开启梯度检查点gradient checkpointing和混合精度用少量计算换大量显存。这些优化听起来都很朴素但组合到一起效果巨大。一个原本需要8张A100才能跑起来的任务优化后4张A100就能稳定运行。对于中小团队来说这就是能不能做RL扩展的生死线。4.3 训练监控不要只盯着loss曲线做RL训练的人必须改变一个习惯SFT阶段盯loss曲线就够了RL阶段远远不够。策略模型每时每刻都在变化loss只能告诉你优化方向对不对但完全无法告诉你策略是否在坍塌、探索是否还在继续、奖励是否被钻了空子。MiMo-V2.6这类成熟训练流程里通常要盯的指标包括策略熵entropy、回复长度分布、KL散度、奖励分布及其分位数、格式违规率。其中熵是最重要的健康状况指标——如果熵在训练早期就快速下降说明策略正在过早收敛到一个确定性的分布探索已经停了如果熵降得太慢说明模型还在“原地乱试”学不到有效信息。还有一个容易被忽视的指标是“格式违规率”。如果模型经常忘记把推理过程放进规定的模板里说明格式约束在奖励函数里的权重不够需要上调如果违规率极低但奖励还在上升那就要警惕是不是模型在用正确格式包装错误答案来骗分。这套监控体系实际上就是给RL训练装“仪表盘”没有它模型跑崩了你可能要到三天后看日志才能反应过来。5. 常见问题与排查技巧实录5.1 奖励涨了但评测不涨钻空子的经典信号这是RL训练中最容易出现的“假性成功”训练日志里reward曲线一路走高但定期跑的评测集上pass1纹丝不动甚至下降了。基本原因就是奖励信号被策略找到了捷径。最常见的一种是格式奖励占比过高模型学会了用完美格式输出废话格式奖励拿满内容分全靠运气。另一种是模型学会了“长度博弈”——回答变长RM单纯因为长度给高分而内容质量并没有真实提升。排查思路分两步。第一步是拆解奖励成分分头看格式分和内容分各自的变化趋势第二步是抽查高reward样本人工看几条就能定位模型到底钻了什么空子。处理方法是调整奖励权重、压缩长度上限或者加大可验证任务的比例压缩模型走捷径的空间。5.2 熵崩塌训练刚开始就“死机”熵崩塌的意思是模型输出分布变得过于尖锐同一个输入只会生成几乎一模一样的回复。此时模型完全停止探索RL训练实质上变成了SFT的重复。熵崩塌最常见的触发条件有三个KL系数太小、advantage裁剪范围太宽、学习率太大。三者共同作用让策略一步跨太远直接冲进了确定性区域。处理的方法是先降低学习率再逐步收缩advantage的裁剪范围同时适当加大KL惩罚给策略踩一脚刹车。从监控角度看如果熵值在训练开始后500步内降到初始值的30%以下基本可以判定已经发生熵崩塌。真正健康的RL训练应该让熵在训练中期缓慢下降直到后期才明显收敛。5.3 训练中期KL爆炸策略离参考模型越来越远KL散度失控是RL训练中的常见事故。现象是KL值从个位数一路飙升到几百甚至上千策略已经飞出参考模型的合理范围接下来就是loss飙升、生成质量急剧下降。这个问题的根源通常是reward scale太大正奖励的梯度信号压过了KL惩罚项导致模型为了拿奖励不惜改变自己的核心行为模式。处理方法有几个方向把reward除以均值方差做归一化、调高KL惩罚系数、对advantage做更严格的裁剪。还有一种更隐蔽的KL爆炸原因是参考模型本身分布就很差——如果Ref模型的输出质量很低策略为了赢得奖励只能远离它KL自然控制不住。这个情况下换一个更强的参考模型比单纯调系数更有效。5.4 评测和训练分布gap为什么离线评测总是不匹配RL训练中经常出现训练指标和离线评测指标的“步调不一致”——训练时reward稳定上升但到了评测集上表现平平。这通常不是训练出了问题而是评测分布和训练分布之间存在gap。和SFT不同RL训练使用的任务分布会随着策略的变化而变化模型擅长什么训练数据里这类任务可能就越多形成一种分布偏移。如果评测集主要来自初始种子任务的独立抽样这种偏移就会导致评测结果低估训练成果。MiMo-V2.6的解决思路是在训练过程中定期冻结一份checkpoint在一个固定评测集上跑全量评测而不是只盯动态训练集上的reward。同时训练集本身要刻意保持任务的多样性避免策略在单一分布上过拟合。我在实践中还会额外维护一个“人工复评集”每两天人工看一批生成结果防止模型在指标上好看但在真实场景下跑偏。我个人在实际操作中的体会是RL训练和SFT训练完全是两种心态。SFT跑挂了最多就是loss不降改数据重跑就行RL跑挂了你往往不知道是数据问题、奖励问题、还是框架问题得带着“仪表盘”一个个排查过去。这也是MiMo这份报告最值得学习的地方——它把RL扩展的整个拼图拆成了数据、奖励、算法、工程四块每一块都有对应的实践策略。上篇先把这些方法论层面的东西讲透了下篇我们再看这些设计在实验数字上到底兑现了多少。