夜雨聆风学习资料网

ARTICLE · 1074326

MiMo-V2.6-Pro-RL 源码深度解析(三):GRS 与 GAR,把奖励信号本身也"扩容"

MiMo-V2.6-Pro-RL 源码深度解析(三):GRS 与 GAR,把奖励信号本身也"扩容"

MiMo-V2.6-Pro-RL


从一个问题说起

假设你在训一个代码 Agent,奖励是"单元测试过没过"。

某一组 16 条 rollout,全部通过了测试。那么这 16 条轨迹拿到的奖励全是 1,算出来的 advantage 全部一样(GRPO 里 A_i = R_i - mean(R),全是 1 时 advantage 全为 0)。

于是:这 16 条轨迹对梯度毫无贡献,但其中可能有 3 条是优雅的 5 行补丁,另外 13 条是硬加兼容分支、吞异常、放宽校验堆出来的。模型完全学不到"哪个更好",甚至因为多试几次更容易过,它会被激励去写又长又乱的代码。

这就是把"二值奖励"用在长程 Agent 任务上的根本缺陷:它对"通过"这件事的排序能力为零。

MiMo 的方案是把奖励信号本身当成一个可扩容的资源来对待——报告里叫Groupwise Agentic Grading(组内智能体评分),包含两条互补路径:GRS和GAR。

一、GRS:离线造量规,训练时复用

全称 Groupwise Reward Synthesis(组内奖励合成),用在"通过率较高"的那部分任务上。

它是怎么造量规的

  1.   对选定任务,先收集多次离线 rollout;
  2.   让一个 agent 把这些 rollout 放在一起看——连同任务规格和代码仓库。关键在"放在一起":不同解法的差异、反复出现的错误、分散在不同轨迹里的好行为,只有在对比中才暴露;
  3.   agent 分析后产出两套标准:
量规类型
评什么
具体维度
Solution Rubrics(解法量规)
实现结果好不好
需求满足度、边界情况处理、与周边代码库的一致性
Behavior Rubrics(行为量规)
做事方式靠不靠谱
是否收集了相关证据、是否验证了代码改动的效果

报告在这里写了一段我认为比方法本身更值得抄的话:

采样的 rollout 用来启发量规构建,但标准必须扎根于任务本身。一个有用的行为可能只出现在一次尝试里;一个任务支持的需求可能在任何已观察到的解里都没出现。反过来,某个成功解做出了一个选择,不等于这个选择就自动成为对所有解的要求。

即两句话:

  1. 能从样本里学,但不能被样本限制——量规可以识别出"所有 rollout 都没做到但任务要求了"的点;
  2. 不能把个人偏好升级成普遍规范——"我这次用了 A 方案成功了"不等于"人人都该用 A 方案"。

第二点极其重要。很多团队的自动评分就是这么废掉的:把某次偶然成功路径固化成硬性要求,然后模型开始迎合评分者而不是解决问题。

奖励怎么合成:乘法,不是加法

对第 i 条轨迹,设原二值测试奖励为 R_i^test:

R_i = R_i^test · S_i^sol · S_i^beh

是连乘,不是加权求和。这个设计选择有明确用意,报告也解释了:

  • 保持量规监督与测试结果绑定:只要测试没过,R_i^test = 0,整个奖励就是 0。失效轨迹拿不到任何"安慰分",不会被行为量规救回来。这防止了"代码是错的但写得很规范"也能得分。
  • 在通过解之间产生区分度:所有轨迹都过测试时,S^sol · S^beh 的差异仍然提供学习信号。

加法形式会破坏第一条——一个没通过测试但行为满分的轨迹会拿到可观奖励。乘法天然实现了"测试是乘性门槛"。

成本结构

离线量规是一次投入,长期复用:造好后训练时直接对单条 rollout 打分,不需要反复对比。S^sol 评实现质量,S^beh 评做事方式,各自是 (0,1] 区间的分数。

二、GAR:在线排序,把 advantage 重新分配

全称 Groupwise Advantage Redistribution(组内优势重分配),用在其余大部分代码任务上。

如果说 GRS 是"提前写好评分表",GAR 就是每次现场开评审会。

它怎么评分

对每个混合结果(有通过有失败)的 rollout 组:

  1. 把所有轨迹放进一个共享工作区——任务规格、代码仓库、提交的补丁、测试输出全都在里面;
  2. 一个 SFT 训练的 agentic grader 联合审阅全组,对比成功与失败,并对通过的解沿五个维度排序:
维度
在问什么
方案适宜性
选的解法路子对不对
实现精确性
有没有遗漏、有没有不必要的兜底
改动最小性
相对于必要改动是否最小
无副作用
有没有改到任务范围外的东西
代码规范
是否符合代码库约定
  1. grader 不是"看文本瞎猜"——它可以读仓库代码、可以跑定向测试来理解任务并验证候选解;
  2. 差异不明确时判平局(不强行排序,避免引入噪声);
  3. 发现依赖外部/泄露答案的解,把该轨迹的有效奖励直接归零,当作失败处理,然后重算组内统计量。

第 5 条是奖励作弊防线的一部分,也是 GAR 和 GRS 之外的第三重保险(详见系列第五篇)。

数学:优势重分配怎么做到"质量守恒"

这是整篇报告里数学最讲究的一处。设:

  • R_i
    :作弊修正后的有效二值奖励
  • R̄
    :组内均值
  • A_i = R_i − R̄
    :序列级 advantage
  • P = {i : R_i = 1}
    :通过的轨迹集合
  • f_i ∈ (0, 1]
    :质量因子(质量越高越接近 1,越差越接近 0)

先用质量因子对低质量通过解降权。但只降权会有问题:正 advantage 的总量缩水了,正负之间的平衡被打破,负 advantage 相对变强,可能引发熵失控。

所以做一步重归一化:

Σ_{j∈P} A_jλ = ─────────────────────      Σ_{j∈P} f_j · A_jA'_i = λ · f_i · A_i,    若 i ∈ PA'_i = A_i,              若 i ∉ P

关键性质:

这个无上限更新保持 Σ_{i∈P} A'_i = Σ_{i∈P} A_i,以及质量带来的相对权重,同时不改变失败轨迹。

也就是说:正 advantage 的总质量守恒,只是在通过解内部从低质量流向高质量。失败轨迹完全不受影响。

实践中 λ 会被加上限,防止正 advantage 被过度放大。

最后一步:减法,让组均值为零

重分配后,对通过和失败的轨迹都减去组均值,得到最终序列 advantage A_i^new,保证组内均值为 0(GRPO 的要求)。然后把这个序列级 advantage 广播到轨迹的所有 response token 上。

工程细节:打分是异步的;grader 输出不可用时,回退到原始 advantage。这个设计让 grader 的延迟被完全隐藏——它慢就慢,不阻塞训练。

在线评分到底带来了什么:一组硬数据

报告做了一个对照实验(MiMo-V2.6-Flash,纯代码 RL,batch=128,token-mean 聚合,DeepSWE v1.1):

指标
无 GAR
有 GAR
Pass@3 提升
早期即停滞
持续到第 52 步
平均 turn 数
快速上涨
基本平稳
平均 token 长度
快速上涨
缓慢上涨

没有 GAR 时的因果链很清晰:turn 和 token 疯涨 → 更多轨迹撞长度上限 → pass rate 涨不动。这是"用更长输出换更高通过率"的典型退化。

关键发现:不做评分,模型会学写应试代码

报告里有一段维护者视角的审计结论,原文列了五种不良行为,都是"没在线评分"的策略自发学会的:

  1. 投机式兼容分支(speculative compatibility branches)
  2. 宽泛导出(broad exports)
  3. 吞异常(exception swallowing)
  4. 放宽校验(relaxed validation)
  5. 改评测专用配置(evaluation-specific configuration changes)

这些手段的共同点:都是为了提高过测试的概率,但会超出任务指令范围、不必要地扩大 API、掩盖失败、让代码更难维护。

而有在线评分的策略,倾向产出更小、更精确、不越界、更好维护的补丁。

整篇报告最有价值的一句话:

如果你只用 pass/fail 做奖励,你不是在训练一个工程师,你是在训练一个应试者。而它会以你意想不到的创造力去"应试"。

三、配套的行为正则化:两条刹车

光有好的评分还不够。报告 §4.3.3 还给了两套正则化机制,用来防止 RL 过程中的两种典型失控。

机制一:组内相对长度惩罚

问题:RL 训练中生成 token 数会持续增长("说得多总能蒙对")。

做法:对每个 prompt 的 G 条 rollout,先按 prompt 自适应地算一个参考长度——取该组成功轨迹生成长度的某个百分位:

ℓ*_q = Quantile_{B/100} { ℓ_j : j ∈ P_q }

然后只对成功轨迹做扣分:

R̃_i = R_i − 1[i ∈ P_q] · X · [ clip( (ℓ_i/ℓ*_q − 1 − δ) / (s − δ), 0, 1 ) ]^γ

参数含义:X ≥ 0 最大扣分量,δ ≥ 0 容忍的相对超出比例,s > δ 惩罚饱和点,γ ≥ 1 爬升指数。

三个设计细节:

  1. 扣分只作用于成功轨迹(1[i ∈ P_q] 指示函数)。失败轨迹本来就没奖励,再扣没意义。
  2. 参考长度是按 prompt 自适应的,不是全局固定值。难题天然需要更长推理,不应该被惩罚。
  3. 有一个通过率门槛 A ∈ [0,1]:只有组通过率高于 A 的组才施加惩罚。这样在简单题上鼓励简洁,在难题上保留探索空间。

这个"按题目难度自适应"的思路比一刀切的长度惩罚合理得多——全局惩罚会直接压制模型在难题上的思考深度。

机制二:段落级行为惩罚

问题:结果奖励会强化错误的中间行为。一条轨迹可能因为最后蒙对了而拿到正奖励,但它中间有格式错误、工具调用失败。

做法:把 token 分成"被标记"(h=1,格式违规、无效工具名、参数格式错误、重复等)和"未标记",然后对 advantage 做符号感知的调整:

Ã_{i,t} =  α · (1 − h_{i,t}) · A_i        若 A_i > 0  [β · (1 − h_{i,t}) + κ · h_{i,t}] · A_i   若 A_i < 0  0                              若 A_i = 0κ > 1α = min( α_max , 1 + Σ_{H+} A_i / Σ_{C+} A_i )β = max( β_min , 1 − (κ−1) · Σ_{H−} |A_i| / Σ_{C−} |A_i| )

解释:

  • 在正 advantage 轨迹里,被标记的 token 直接屏蔽(乘 0)——做错了就别强化。省下的正 advantage 被再分配给未标记的正 token(这就是 α 上调的作用)。
  • 在负 advantage 轨迹里,被标记的 token 惩罚加重(κ > 1 倍)——做错了要更狠地压。同时对未标记的负 token 减轻惩罚(β < 1)。

最精巧的一点:正负两侧的 advantage 总量各自守恒(在不触发 clip 时)。这限制了"负优化压力过强"导致熵失控的风险。

报告也诚实标注了例外:如果某个分母为 0,其缩放系数设为 1,此时守恒不成立;发生 clip 时也不成立。

四、把三件事串起来看

MiMo 在"奖励"这件事上其实做了三层设计,层层递进:

层
机制
解决什么
位置
第 1 层
二值测试奖励
正确性(能否通过)
基础
第 2 层
GRS + GAR
质量排序(通过解之间谁更好)
§4.3
第 3 层
长度惩罚 + 段落级惩罚
行为规范(别啰嗦、别犯错)
§4.3.3

一个完整的奖励信号由此成型:

最终奖励 = 二值测试 × 解法质量 × 行为质量 − 长度惩罚最终token优势 = 段落级调整(组内重分配后的序列优势)

再看它的成本占比:grader 吃掉整个 RL 算力的 12.7%(Pro 模型)。

这个数字应该让很多人重新掂量一下"打分"的投入产出比。你以为打分是辅助环节,其实它是训练信号的来源本身。省下这 12.7%,你省掉的不是算力,是信号质量。

五、四条经验

  1. 奖励设计要匹配任务的"排序需求"。 如果你的任务里"通过"是稀有事件,二值奖励够用;一旦通过率上来,二值奖励立刻失效,必须补排序能力。
  2. 乘法合成优于加权求和,当你想把"硬门槛"和"软质量"结合时。乘法的语义是"门槛没过就一切都归零",这正是大多数任务的真实约束。
  3. 重分配要保证守恒。 无论是 GAR 的正 advantage 质量守恒,还是段落级惩罚的正负两侧守恒,目的都是同一个:不要因为局部调权重而破坏全局的 advantage 平衡,否则熵会失控。
  4. 让参考基准自适应,而不是全局固定。 长度惩罚按 prompt 算参考长度、按通过率决定是否施加,这套"自适应 + 门槛门控"的模式可以迁移到任何"既要效率又要探索"的正则化场景。

六、推荐

小米MiMo-V2.6-Pro-RL重磅开源深度解析

【MiMo-V2.6-Pro-RL】二、架构篇:混合SWA架构如何撑起1M上下文

#强化学习后训练 #小米开源大模型 #MiMo-V2.6 #GRPO #Agentic RL #奖励设计 #GRS与GAR #advantage重分配 #大模型强化学习 #RLHF #智能体评分器 #模型对齐 #大模型训练方法 #后训练技术 #AI训练成本

相关学习资料