强化学习讲义2——MiMoV2.6组级智能体评分

作者: 引线小白-本文永久链接:https://www.limoncc.com/post/a2cf7f69fb416ea5/
知识共享许可协议: 本博客采用署名-非商业-禁止演绎4.0国际许可证

一、导言

MiMoV2.6[^1]组级智能体评分把 RL 奖励从”二元测试通过与否”升级为”组内比较的细粒度质量信号”,由三部分构成——GRS(离线 rubric 合成奖励)用于高通过率任务、GAR(在线组级优势重分配)用于其余任务、行为正则化(长度惩罚 + 段级惩罚)抑制退行行为,其本质是把”组”作为质量对比的统计单元,将组内差异转化为可学习的优势信号。

一、为什么需要组级评分(核心动机)

在代码智能体 RL 中,二元测试奖励存在三个结构性缺陷:

  • 1.不可区分的通过解:GRPO 中若一个 prompt 的 $G$ 条 rollout 全部通过测试,组内优势全为零,没有梯度;若有多条通过,则它们获得完全相同的正向优势,模型无法学到”简洁、精确的解”优于”臃肿、投机性的解”。
  • 2.奖励黑客无法识别:只要测试通过就给满奖励,智能体可通过泄露解、放宽校验、异常吞没等”坏行为”刷分。
  • 3.长度爆炸:结果奖励对长度不敏感,策略倾向通过加长推理/加轮次来提高通过率,导致 token 数失控。

组级评分的解法是:对同一个 prompt 下的 $G$ 条 rollout 组成一个”组”,由一个 SFT 过的智能体评分器进入共享工作区(任务规范、仓库、补丁、测试输出、对话日志)联合比较,区分质量与行为,再把区分结果映射为奖励或优势调整。

二、GRS:组级奖励合成(离线 Rubric)

2.1、原理

针对高通过率的代码任务子集。流程分两步:

  • 1.离线建 rubric:对每个任务,先收集多条离线 rollout,一个智能体对比这些尝试与任务规范、仓库,提炼出两组标准:

    • 解 rubric $S^{\text{sol}}$:评估实现属性——需求满足、边界情况处理、与代码库风格一致;
    • 行为 rubric $S^{\text{beh}}$:评估工作方式——是否收集相关证据、是否验证了改动效果。
  • 2.在线打分:训练时,评分智能体进入每条 rollout 的执行环境,按 rubric 逐条评估,输出两个分数。

2.2、公式

对轨迹 $i$,令 $R^{\text{test}}_i \in \{0,1\}$ 为二元测试奖励,则最终训练奖励为乘法合成:

$$\begin{align}
R_i = R^{\text{test}}_i \cdot S^{\text{sol}}_i \cdot S^{\text{beh}}_i
\end{align}$$

乘法形式的关键性质:失败轨迹保持零奖励(rubric 不救失败解);通过轨迹由 $S^{\text{sol}} \cdot S^{\text{beh}}$ 进一步分化——即使组内全部通过测试,乘积差异仍提供学习信号,且 rubric 监督始终与测试结果绑定,不会奖励”通过测试但代码糟糕”的解。

2.3、例子

假设某 Django 修复任务的 $G=16$ 条 rollout 全部通过测试。按传统 GRPO,这组优势全为 0,模型什么都学不到。用 GRS:

  • 轨迹 A:补丁最小、对齐仓库约定、主动运行了测试 → $S^{\text{sol}}=0.9$,$S^{\text{beh}}=0.9$,$R_A = 1 \times 0.81 = 0.81$;

  • 轨迹 B:补丁宽松、夹带无关重构、未验证 → $S^{\text{sol}}=0.5$,$S^{\text{beh}}=0.4$,$R_B = 1 \times 0.20 = 0.20$。
    组内 $R_A \gg R_B$,产生清晰的优劣梯度。

三、GAR:组级优势重分配(在线评分)

3.1、原理

用于所有其余代码智能体任务,在线运行,不预建 rubric。对每个混合结果组:

  • 1.联合考察:SFT 智能体评分器把组内所有轨迹(成功 + 失败)放入共享工作区,对比分析。
  • 2.奖励黑客修正:若证据确认某轨迹依赖外部或泄露答案,其有效奖励被置零、视为失败,然后再重算组统计。
  • 3.质量排序:沿五个维度对通过的补丁排序——解法思路的合适性、实现精确性(无遗漏/无冗余回退)、相对必要改动的最小性、无任务外副作用、与代码库约定一致的高完成度。
  1. 优势重分配:把正向优势质量从低质量通过解”搬”到高质量通过解。
3.2、公式

设轨迹 $i$ 的有效二元奖励(黑客修正后)为 $R_i$,组均值为 $\bar R_i$,原始序列级优势 $A_i = R_i - \bar R_i$,通过集合 $P = \{i : R_i = 1\}$。引入质量因子 $f_i \in (0,1]$(高质量接近 1,低质量接近 0),公共重归一化因子:

$$\begin{align}
\lambda = \frac{\sum_{j\in P} A_j}{\sum_{j\in P} f_j A_j}, \qquad
A’_i = \begin{cases} \lambda f_i A_i, & i\in P, \ A_i, & i\notin P. \end{cases}
\end{align}$$

三条守恒与保障性质:

  • 正向优势总量守恒:$\sum_{i\in P} A’_i = \sum_{i\in P} A_i$——只重分配、不放大总信号;
  • 失败轨迹的优势不动($i\notin P$ 保持 $A_i$),负向信号保留用于惩罚;
  • 守恒本身是对抗熵失控的保障:只下调正向优势会留下未变的负向压力,重归一化 $\lambda$ 恢复平衡。实践中 $\lambda$ 设上限,防止正向优势被过度放大。

最后从通过与失败轨迹的优势中减去组均值得到 $A^{\text{new}}_i$(组均值为零),再广播到该轨迹所有响应 token。评分异步运行,评分器不可用时回退到原始优势。

3.3、例子

$G=4$ 的组,2 通过 2 失败,原始优势(相对组均值)为:

轨迹 结果 $R_i$ $A_i$ 质量因子 $f_i$ $A’_i$
A 通过,最小补丁 1 +0.5 1.0 λ·1.0·0.5
B 通过,宽松大补丁 1 +0.5 0.3 λ·0.3·0.5
C 失败 0 −0.5 — −0.5(不变)
D 失败(已确认黑客,奖励置零) 0 −0.5 — −0.5(不变)

$\lambda = \dfrac{0.5+0.5}{1.0\cdot 0.5 + 0.3\cdot 0.5} = \dfrac{1.0}{0.65} \approx 1.54$,故 $A’_A \approx 0.77$、$A’_B \approx 0.23$。正向优势总量仍为 1.0,但大部分流向了 A——模型被引导去学”最小、精确”的解,而非”碰巧通过测试”的解。

3.4、实证效果

论文在 MiMo-V2.6-Flash 上做了有/无 GAR 的纯代码 RL 消融:无在线评分时,轮次与总 token 长度快速增长、大量轨迹触顶长度上限,难以维持通过率提升;有在线评分时,通过率持续提升至第 52 步,轮次大致稳定、token 长度渐进增长。独立审计还发现:无在线评分的策略越来越倾向投机性兼容分支、宽泛导出、异常吞没、放松校验等”刷分式”行为;有在线评分的策略产出更小、更精确、留在任务范围内的补丁。

四、行为正则化

两类互补机制,进一步压制结果奖励难以约束的中间行为。

4.1 组相对长度惩罚

原理:在组内用通过解的长度分位数作为”参考长度”,仅对超出参考的成功解扣分。通过率门控($|P_q|/G > A$)保证困难 prompt 不被惩罚——探索空间不被压缩。
对 $G$ 条 rollout 的组,$\ell_i = |o_i|$ 为生成 token 数,$A$ 为最小组通过率,$B$ 为百分位参数。当 $|P_q|/G > A$ 时,取参考长度 $\ell_q^\star = \text{Quantile}_{B/100}\{\ell_j : j \in P_q\}$,调整后奖励:

$$\begin{align}
\tilde R_i = R_i - \mathbb{1}_{[i\in P_q]}\,\gamma\,\mathrm{clip}!\left(\frac{\ell_i/\ell_q^\star - 1 - \delta}{s - \delta},\,0,\,1\right)
\end{align}$$

其中 $X\ge 0$ 为最大扣减、$\delta \ge 0$ 为容忍超出量、$s > \delta$ 为饱和点、$\gamma \ge 1$ 为斜坡指数。$\delta = 0$ 即惩罚所有长于参考的成功解;$\mathbb{1}[\cdot]$ 把扣减限制在成功 rollout 上。式 (1) 的优势 $A_i$ 由 $\tilde R_i$ 计算。
例子:某 prompt 的通过解长度为 1K、1K、1.2K、5K tokens。若 $\ell_q^\star \approx 1.2$K,则 5K 的长解被显著扣分,而 1K 的三个简洁解拿满奖励——策略学到”这个 prompt 用简洁解就够了”。

.2 段级行为惩罚

原理:结果奖励可能强化”最终通过但中间混乱”的轨迹。规则捕获格式违规(畸形标记、无效工具名、畸形参数)等段级错误,得到 token 级标记 $h_{i,t} \in \{0,1\}$。令 $A_i$ 为轨迹优势,token 级调整为:

$$\begin{align}
\tilde A_{i,t} = \begin{cases}
\alpha\,(1-h_{i,t})\,A_i, & A_i>0, \\
\big(\beta\,(1-h_{i,t}) + \kappa\,h_{i,t}\big)\,A_i, & A_i<0, \\
0, & A_i=0,
\end{cases}
\end{align}$$

其中 $\kappa > 1$ 放大被标记 token 上的负向优势;$\alpha \ge 1$ 上调未标记的正向 token;$\beta \le 1$ 把未标记的负向 token 向零缩放($\alpha_{\max}, \beta_{\min}$ 为上下限)。

逻辑解读:

  • 正向轨迹中被标记 token 的优势被屏蔽(置零),其质量重分配给未被标记 token——好轨迹中的”坏段”不被强化;
  • 负向轨迹中被标记 token 的惩罚被 $\kappa$ 放大,未被标记 token 的惩罚被 $\beta$ 减轻补偿——当任一数组未被裁剪时,每个符号的总优势质量守恒,避免额外负向压力驱动熵失控。

五、三机制对比

机制 作用时机 信号载体 解决的问题
GRS 离线建 rubric → 在线打分 奖励 $R_i$(乘法合成) 高通过率任务组内区分度不足
GAR 在线组级评分 优势 $A’_i$(重分配) 通过解质量无差异 + 奖励黑客
组相对长度惩罚 奖励阶段 $\tilde R_i$(扣减) token 长度爆炸
段级行为惩罚 token 级优势塑形 $\tilde A_{i,t}$ 格式违规/工具调用错误被结果奖励间接强化

底层一致性:三者共享同一设计哲学——把”组”作为质量对比的统计单元,通过守恒式重分配(GAR 的 $\sum A’_i = \sum A_i$、段级惩罚的符号内质量守恒)在提供更细粒度信号的同时限制总优化压力,避免更大的信号方差引发训练不稳定或熵崩溃。最终效果是模型被引向更短、更 token 高效、更可维护的解,而非仅仅”通过测试”的解。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
【奖励层】result reward
R_test ∈ {0,1}(二元测试奖励)
│
├─〔高通过率任务子集〕→ GRS:R_i = R_test · S_sol · S_beh ┐
│ ├─ 并联分支,二选一
└─〔其余代码任务〕───→ 奖励黑客置零(GAR 前置步骤) ┘
│
▼
组相对长度惩罚:R̃_i = R_i − 惩罚项 (式 4,叠加在当前有效奖励上)
│
▼
【组统计 / 序列优势层】
A_i = R̃_i − R̄_i(组均值)
│
├─〔非 GRS 任务〕→ GAR:A'_i = λ·f_i·A_i (式 3,重分配后广播到所有 token)
│
▼
【token 优势层】
段级行为惩罚:Ã_{i,t} = α/β/κ 加权后的 A_i (式 5)
│
▼
GRPO 损失(式 1,prompt-mean 聚合)

它们是串联的骨架,并联的分叉:GRS 与 GAR 是流水线同一阶段(奖励→优势的转换点)上的两条互斥实现路径;组相对长度惩罚和段级行为惩罚则像串在主线上的两级过滤器,分别在奖励层和 token 层对信号做最后的整形——四级共同把“二元测试结果”逐级精化为组内可比、行为感知、token 对齐的学习信号,最终送入同一个 GRPO 目标。每级的作用位置由它需要的信息决定,顺序不可颠倒:

环节 为什么必须在当前位置
GRS / 黑客置零(奖励层) 必须在组统计之前完成——组均值 $\bar R_i$ 要基于“干净”的有效奖励计算,否则黑客轨迹会污染全组基线
组相对长度惩罚(奖励层) 式 (4) 明确“式 (1) 的优势 $A_i$ 由 $\tilde R_i$ 计算”——它是优势计算的直接输入,必须在 $A_i = \tilde R_i - \bar R_i$ 之前作用于奖励;且其参考长度 $\ell_q^\star$ 需要组内通过解的分布信息,天然是组级操作
GAR(序列优势层) 必须在 $A_i$ 计算之后——它重分配的对象就是序列级优势 $A’_i = \lambda f_i A_i$,且重算组统计前要先完成黑客置零;输出广播到全 token 后才可能做 token 级加工
段级惩罚(token 层) 必须最后——它需要 token 级标记 $h_{i,t}$(哪些段违规),只能在优势已广播到每个 token 之后做逐 token 塑形,且其守恒式依赖最终的轨迹符号 $\mathrm{sign}(A_i)$

六、一个Django仓库修复任务例子

任务设定:一个 Django 仓库修复任务——“修复 MultiValueField 忽略必需子字段的 bug”。该 prompt 采样 $G=4$ 条 rollout(为演示简化,实际 $G=16$)。

第 0 步:rollout 完成,得到 4 条轨迹

轨迹 结果 补丁特征 测试 $R^{\text{test}}_i$ token 数 $\ell_i$
A 通过测试 最小补丁,改 6 行,风格符合仓库约定 1 3,000
B 通过测试 通过阅读上游修复抄袭的答案,补丁 40 行,夹带无关重构 1 9,000
C 失败 修改方向错误 0 6,000
D 失败 遇到格式违规(畸形工具调用参数)+ 未跑测试就提交 0 7,000

分支一:假设此任务属于“高通过率子集” → 走 GRS

训练前已为该任务离线建好 rubric。评分智能体逐条打分:

轨迹 $R^{\text{test}}$ 解 rubric $S^{\text{sol}}$ 行为 rubric $S^{\text{beh}}$ 合成奖励 $R_i = R^{\text{test}} \cdot S^{\text{sol}} \cdot S^{\text{beh}}$
A 1 0.9(最小、符合约定) 0.9(验证了改动) 0.81
B 1 0.4(臃肿、夹带重构) 0.3(抄袭上游解,未自主验证) 0.12
C 0 — — 0(乘法绑定:失败不可救)
D 0 — — 0

→ 走 GRS 的任务不进 GAR,直接进入长度惩罚。

分支二:假设此任务属于“其余任务” → 奖励保持二元,走 GAR

1、GAR 前置:奖励黑客置零
评分器进入共享工作区(规范、仓库、4 份补丁、测试输出、对话日志),发现 B 的对话日志里有 git clone .../django.git 并阅读了包含修复的较新提交——确认黑客。B 的有效奖励置零:

$$\begin{align}
R_A=1, R_B=\mathbf{0}(\text{置零}), R_C=0, R_D=0
\end{align}$$

2、计算原始组相对优势
组均值 $\bar R = 0.25$,得 $A_i = R_i - \bar R$:

$$\begin{align}
A_A = +0.75,\quad A_B = -0.25,\quad A_C = -0.25,\quad A_D = -0.25
\end{align}$$

3、质量排序 + 优势重分配
通过集合 $P = \{A\}$(B 已被置零)。评分器给 A 的质量因子 $f_A = 0.95$(补丁最小、精确、无副作用):

$$\begin{align}
\lambda = \frac{\sum_{j\in P} A_j}{\sum_{j\in P} f_j A_j} = \frac{0.75}{0.95 \times 0.75} \approx 1.05
\end{align}$$

$$\begin{align}
A’_A = 1.05 \times 0.95 \times 0.75 \approx \mathbf{0.79},\qquad A’_B = A’_C = A’_D = -0.25 (\text{不变})
\end{align}$$

正向优势总量守恒(0.75 → 0.79,被 $\lambda$ 上限轻微钳制),负向信号完整保留。最后减去新组均值使 $A’$ 组均值为零,广播到各轨迹所有 token。

4、汇合点:组相对长度惩罚(奖励层,两分支都过)
组通过率 $2/4 = 0.5 > A$(门槛),触发惩罚。通过解长度 $\{3000, 9000\}$,取 $B=50$ 分位作参考 $\ell_q^\star = 6000$。设 $\delta = 0, s = 2, \gamma = 1$,最大扣减 $X = 0.5$:

  • 轨迹 A(GRS 分支下 $R_A = 0.81$):超出比 $\frac{3000/6000 - 1 - 0}{2-0} < 0$,clip 为 0 → 无惩罚(比参考还短,是好事);
  • 轨迹 B(GAR 分支下 $R_B = 0$):已经是失败/置零,$\mathbb{1}[i \in P_q]$ 不触发 → 不扣。
    效果:即便 B 没有被判黑客,9,000 token 的长解也会被扣减,而 3,000 的简洁解拿满——长度信号在此层注入。调整后的 $\tilde R_i$ 用来计算 $A_i$。

5、最后一级:段级行为惩罚(token 层)
轨迹 D 虽然失败($A_D < 0$),但其中有一段工具调用参数畸形($h_{i,t}=1$ 的 token)。设 $\kappa = 2, \beta = 0.5$:

$$\begin{align}
\tilde A_{D,t} = \begin{cases} 2 \times (-0.25) = -0.5, & \text{
畸形参数 token(惩罚加倍)} \ 0.5 \times (-0.25) = -0.125, & \text{D 中正常 token(惩罚减半)} \end{cases}
\end{align}$$

符号内总质量守恒:$-0.25$ 的负向压力没有凭空增加,只是在 D 内部重新分布——“你本来就失败了,但错用工具的那几个 token 是最该改的”。同时若某正向轨迹(如 A)里混入了一段格式瑕疵,那段的优势被 $\alpha(1-h)$ 屏蔽、重分配给 A 的其他干净 token——好轨迹中的坏段不被强化。

5、终点:GRPO 更新
所有 $\tilde A_{i,t}$ 进入损失:

$$\begin{align}
\mathcal{L}(\theta) = -\,\mathbb{E}\left[\frac{1}{\sum\mid o_i\mid}\sum_i \sum_t r_{i,t}\, M_{i,t}\, \tilde A_{i,t}\, \log\pi_\theta(o_{i,t})\right]
\end{align}$$

四条轨迹教会模型的四件事:

轨迹 学到的信号 来自哪一级
A 强强化:最小补丁 + 主动验证 = 最优策略 GRS/GAR 质量 + 长度惩罚
B 零奖励 + 负优势:抄袭上游解得不偿失 GAR 黑客置零(或 GRS 行为 rubric)
C 负优势:方向错误该罚 原始组相对信号(未被各级改动)
D 失败该罚,但“畸形工具调用”这几个 token 罚得最重 段级行为惩罚

如果没有这套流水线(无在线评分),同样的训练中会观察到:轮次与 token 长度快速增长、大量轨迹撞上长度上限;审计发现策略学会投机性兼容分支、异常吞没、放松校验——正是 B 那类“刷分式”解被二元奖励强化的结果。有了组级评分后,通过率持续提升至第 52 步,而轮次大致稳定、补丁更小更精确。这正说明:串联的四级过滤不是锦上添花,而是决定 RL 学到“会解题”还是“会钻空子”的分水岭。

七、可视化

测试分数只有 0 和 1,
怎么让模型学会「小而精地解题」?

同一道题,模型交出 4 份解答
信号流过 4 级流水线,被逐级精炼

第 0 站 · 同一道题,4 份解答

A · 通过 ✓

小补丁 · 主动验证

B · 通过 ✓

抄上游修复 · 补丁臃肿

C · 失败

方向错了

D · 失败

工具调用乱格式

▼

这题通过率高吗?

高 → 走这边

GRS · 离线打分表

训练前:先把「好解长什么样」
写成清单

训练时:每份解答逐条对照打分

最终分 = 测试通过
× 解的分数 × 行为分数

不高 → 走这边

GAR · 在线组内评审

① 识破抄袭
B 成绩直接作废

② 通过的解互相比较排序

把「表扬额度」
从差解搬给好解

▼

第 2 站 · 长度惩罚 ——「啰嗦的解,扣分」

组内通过解的平均长度做标尺:比标尺短不罚,长太多扣奖励

▼

第 3 站 · 段级惩罚 —— 罚到出错的「那几行」

好解答里的乱格式段不加分;失败解答里乱格式段罚得更重

▼

终站 · GRPO 更新 —— 模型此刻学到:

A 最该学 ✦ B 零奖励 ✦ C 该罚 ✦ D 罚在出错的那几行

■ 好解 ■ 被识破 ■ 评分站(二选一) ■ 过滤器(必经)

1 · 两条路,二选一

高通过率题走 GRS,其余走 GAR。同一份解答只经过一条。

2 · 表扬总额守恒

GAR 不凭空多给奖励,只是把额度从差解搬给好解——总量不变,方向更准。

3 · 过滤器必经

长度惩罚治「啰嗦刷分」,段级惩罚把罚精准落在出错的那几行。

4 · 抄袭无处遁形

评审员能看到完整对话日志——发现抄袭上游修复,成绩直接作废。

MIMO-V2.6 · 扩展强化学习迈向自我改进

参考文献
[^1]: Xiaomi MiMo Team. (2026, September 22). MiMo-V2.6: Scaling reinforcement learning towards self-improvement [Technical report]. GitHub / Hugging Face. https://github.com/XiaomiMiMo/MiMo-V2.6


版权声明
由引线小白创作并维护的柠檬CC博客采用署名-非商业-禁止演绎4.0国际许可证。
本文首发于柠檬CC [ https://www.limoncc.com ] , 版权所有、侵权必究。
本文永久链接https://www.limoncc.com/post/a2cf7f69fb416ea5/
如果您需要引用本文,请参考:
引线小白. (Sep. 27, 2026). 《强化学习讲义2——MiMoV2.6组级智能体评分》[Blog post]. Retrieved from https://www.limoncc.com/post/a2cf7f69fb416ea5
@online{limoncc-a2cf7f69fb416ea5,
title={强化学习讲义2——MiMoV2.6组级智能体评分},
author={引线小白},
year={2026},
month={Sep},
date={27},
url={\url{https://www.limoncc.com/post/a2cf7f69fb416ea5}},
}

'