第一次接触 MiMo-v2.6 的 RL 训练看板,大多数人都会被满屏的曲线劝退。Reward、KL、Clip Fraction、Entropy、TPS、Refusal Rate,几十个缩写堆在一个页面上,看起来什么都在涨,但真要你回答“模型到底变好了没有”,又说不出一句准话。这篇文章把我自己跑多模态 RL 训练时总结下来的看板阅读逻辑完整梳理一遍,重点放在两件事:一是每个指标到底怎么定义、合理范围大概在什么地方,二是当曲线不对劲的时候,应该顺着哪几条线索去排查。如果你正准备读 MiMo-v2.6 技术报告,或者想复现它的训练流程,这份解读可以直接当作配套速查手册用。
先给一个总体认知:看板上的指标不是等权的。有些指标是气压表,坏了马上要命;有些是温度表,偏离了说明训练方式有问题;还有一部分只是装饰,几十步之内没有参考意义。分不清这三类,读板就是对着随机噪声做判断,训练跑挂了都找不到第一现场。
1. 训练看板的整体设计与信息分层
1.1 为什么要分成三层来看
我第一次看到这类看板时,下意识想把所有曲线都加到一个图里,结果什么都看不清。后来有经验的同事点了一句:RL 训练看板本质上应该按“健康状态—训练趋势—资源消耗”三层组织。
健康状态层解决的是“训练有没有挂”的问题。NaN loss、梯度爆炸、KL 突然冲上天、GPU 利用率掉成 0,这类信息必须在第一时间跳出来,基本属于只看一眼就能判断的指标。趋势层解决的是“模型有没有变好”的问题,包括总 Reward、分项奖励、平均生成长度、Refusal Rate 这类过程指标,它们有噪声,但趋势有意义。资源层则是吞吐量、GPU 利用率、日志落盘延迟这些产能指标,反映的是工程效率,不直接决定模型上限,但决定你一天能试多少个实验。
把这三层混在一起看,是读板最大的误区。我见过不少人盯着 Reward 曲线五分钟,却没注意到旁边 KL 已经翻了十倍。分层的意义在于给警报设置优先级,先保底,再看变化,最后才看效率。
1.2 不同角色的读板视角
训练工程师和算法研究员的关注点其实很不一样。工程师更关心吞吐和稳定性:训练和生成两阶段的 TPS 是否正常、数据加载有没有成为瓶颈、GPU 是不是都在满负荷跑。算法研究员则更关心奖励趋势与探索状态:Reward 是否还在上升、策略与初始模型之间差距大不大、模型是不是在奖励模型上钻空子。
这意味着同一块板子得支持两种阅读方式。MiMo-v2.6 这类多模态模型尤其明显,图像输入的 batch 组织方式直接影响显存占用和吞吐,工程师需要看“图像样本占比”这类指标,研究员则更想看到“OCR 子奖励”和“图文对齐子奖励”的拆分。看板如果只给一个总 Reward,这两种角色都会觉得不够用。
我的建议是:看板按 Tab 分页比一屏堆完更好,总览页只放 8 个左右核心指标,剩下的进子页面。信息密度太高不是专业,是没法用。
1.3 采样周期与聚合粒度
很多指标在单个 token 级别是无意义的,必须在样本级别或 step 级别聚合后才有解释价值。比如 Policy Loss,单个 step 内可能因为某个离群样本产生巨大抖动,直接展示原始值,曲线就是一蓬刺。实际看板里通常对 loss、reward、KL 做指数移动平均(EMA),用 0.1 左右的平滑系数把最近几百步的趋势显露出来。
聚合粒度也要分阶段。训练阶段一般按 global step 记录,一个 step 可能包含数千个样本;生成阶段则按提示词(prompt)次数记录,一个 prompt 会采样多个回复。读板时需要知道当前横轴的刻度是 step 还是采样轮次,我遇到过把两者混在一起算平均值的乌龙,后面的所有结论全都偏了。
2. 核心指标定义与判读标准(上):奖励、优势与探索
2.1 Reward:标量总奖励与子维度拆分
Reward 是看板上最显眼也最容易误解的指标。它不是一个模型固有的物理量,而是一个由奖励函数算出来的标量。MiMo-v2.6 的奖励函数通常包含多个子项,比如视觉理解准确率、格式合规性、内容安全分数,以及一个与生成长度相关的惩罚项。看板上的总 Reward 是这些子项的加权和。
判断 Reward 曲线时,必须先确认它的取值范围。如果奖励函数本身经过归一化,那么“从 0.2 涨到 0.5”显得很漂亮,但并没有跨越半个量级;如果某个子项直接是硬指标(例如格式必须完全正确),那么它的权重波动就不应被过度解读。
遇到总 Reward 长期横盘时,我的经验是必须拆开看子项。很多时候总曲线没有变化,内部却在进行“配平”:安全分数缓慢上升,但视觉理解分数在下降,最终加权总和持平。这比横盘更危险,因为它意味着优化方向出了问题,只是被权重掩盖了。
2.2 Advantage 与 Group Baseline
如果只读 Reward,你最多只能知道“这轮生成的结果被打了多少分”,但不知道“这个分数相对于平均水平有没有优势”。Advantage 解决的就是这个问题:它把绝对分数转换成相对好坏。
MiMo-v2.6 的训练里如果用的是 GRPO 这一类方法,看板上通常不会出现独立的 Critic 网络,而是按组内均值做 Baseline。具体做法是:同一个提示词采样多个回复,组成一个 group,用组内平均 Reward 作为基准,每个回复的得分减去这个均值,就得到 Advantage。这样设计的好处是不需要额外训练一个价值模型,天然避免了价值模型过拟合的问题。
看板上的 Advantage 一般展示均值和标准差。均值应该趋近于 0 左右波动,标准差则反映模型对“哪些回复更好”的区分度。如果标准差长期极小,意味着奖励模型给出的评分没有梯度,策略很难从中学到东西;如果标准差太大,则需要留意是否有个别离群样本在主导优化信号。
2.3 Return 与折扣回报
Reward 是即时反馈,Return 是将一个回合内所有即时奖励按时间累积后的总量。在看板里,两者很容易混。对单轮生成的对话任务来说,Return 基本就是这一轮里所有 token 位置奖励的总和;但在多轮交互或者长程任务中,Return 还涉及折扣因子(discount factor)。如果某项奖励只给到终局状态,那么 Return 和 Reward 在数值上可能差出好几倍。
读板时不要把 Return 当成“模型理论上限”。它是一个受任务长度影响的统计量,任务越长,Return 自然越高。跨任务对比 Return 没有意义,只有同一任务、同一提示词分布下的 Return 趋势才有参考价值。我看到有人拿不同数据混合比例下训练的 Return 直接对比,结论完全是错的。
2.4 KL 散度:与 Reference Model 的距离
KL 散度在看板上是最能反映“策略漂移”的指标。RL 训练通常有一个冻结的 Reference Model,一般是 SFT 阶段的模型;当前策略模型与它的输出分布之间的差异用 KL 散度度量。看板通常展示的是按 token 平均后的值,训练中会乘以一个系数(例如 μKL)作为惩罚项加进目标函数。
KL 不是越小越好,也不是越大越好。它表示模型在多大程度上偏离了初始行为。如果 KL 长期接近 0,说明策略几乎没有更新,Reward 再高也是远古模型的幻觉;如果 KL 突然飙升,说明模型开始为了拿高分而采用大幅度改变输出的策略,这时候很容易掉进奖励黑客陷阱。
经验上,对一个小规模的视觉语言模型,μKL 设在 0.05 左右时,平均 KL 在 10 到 30 之间比较常见。这个数字不绝对,但当你看到 KL 在一两百甚至在千级别横跳时,基本可以断定策略已经脱离约束,需要立刻降学习率。
2.5 Entropy:模型探索能力的体温计
Entropy 衡量策略分布的随机性。训练前期,模型输出比较多样,Entropy 的自然水平较高;训练后期,随着策略集中到高分区域,Entropy 通常会下降。看板的正确读法是关注它的下降斜率,而不是绝对数值。
如果 Entropy 断崖式下跌,说明模型过早锁定了某个输出模式,这往往是 reward hacking 的前兆。比如模型发现某种固定句式总能拿高 Reward,就会把所有回复都压缩成那个句式,Entropy 急剧降低,能力固化,后续再想救回来很费劲。反过来,如果训练了三千步 Entropy 依然纹丝不动,说明策略更新根本没有有效地改变生成分布,检查学习率或者 Advantage 信号是否有效。
3. 核心指标定义与判读标准(下):优化状态与产能
3.1 Policy Loss 与 Value Loss
Policy Loss 是策略网络在主目标上的损失,它不直接等同于“模型的错误率”。在 PPO 风格的目标里,Policy Loss 反映策略期望 Advantage 被放大或约束的程度;共有一种简化理解:这个值越低,说明策略在当前 batch 上更倾向于采纳高 Advantage 的行为。
Value Loss 只存在于用到 Critic 网络的训练框架中,也就是 PPO 那一类。它衡量 Critic 对回报的预测误差,通俗说就是价值模型的“考试成绩”。如果你用的是 GRPO,那么看板上压根不该有 Value Loss,硬要找一个等价指标的话,应该看 Group Advantage 的标准差。判断价值模型是否健康有一个朴素标准:Value Loss 的量级应该与 Reward 的量级接近,如果 Value Loss 长期比 Policy Loss 大一个数量级,说明价值模型本身还没学稳,策略侧的更新信号质量会很差。
3.2 Clip Fraction:策略更新的油门
MI与 PPO 这类方法里都引入了策略更新幅度的限制。Clip Fraction 指的是当前 batch 中发生“截断”的比例,也就是新旧策略输出概率比值跑到了预设范围之外的比例。看板上的这个值通常在 0.02 到 0.2 之间波动,意思是每 100 条样本里有 2 到 20 条触发了更新上限。
Clip Fraction 的作用就像驾驶时的油门踏板。它长期低于 0.02,说明你踩油门太保守,策略几乎不动;它长期高于 0.2,说明每次更新幅度过大,训练会来回震荡。我一般见到这个值连续几十步高于 0.3,就会优先调低学习率,或者把那步的批量再放大一点,让梯度估计更稳定。
3.3 Gradient Norm 与学习率
Gradient Norm 是梯度向量的模长。看板上的 Gradient Norm 主要用来发现异常:从正常范围突然飙高几个数量级,往往预兆着梯度爆炸;长期压在极低的水平,则可能梯度消失,策略根本更新不动。
学习率本身也会在看板上占据一块地方,但它通常不是需要逐 step 盯的指标。它更像一种标记:你知道当前处于什么阶段。如果训练采用余弦退火之类的衰减策略,那么看到 Reward 曲线在衰减后期趋于平稳,就不该用前期的标准去要求它。很多人会忘记把学习率阶段和曲线形态结合起来看,看到后期不涨就慌,说到底是对预期管理出了问题。
3.4 吞吐与算力利用率:TPS、MFU 与 GPU 利用率
吞吐指标虽然不是模型质量指标,却是 RL 训练里最磨人的工程指标。MiMo-v2.6 看板上通常区分 Generation TPS 和 Training TPS。Generation TPS 相对较低,因为生成阶段要跑自回归解码,每个 token 都要依次生成;Training TPS 跑的是前向与反向计算,吞吐更高。两者不必对齐,但各自要有稳定性基线。
MFU(模型浮点利用率)反映硬件算力的真实使用效率,正常训练时通常在 40% 到 60% 之间,如果跌到 20% 以下,大概率是 padding 过多、batch 太小或数据加载卡顿。GPU 利用率则更适合看平均值和曲线形态:反复在 0 和 100 之间跳动,通常代表同步等待和 idle 周期太多,需要检查数据管线有没有长时间阻塞。
这些指标决定的是迭代速度而非最终效果,但迭代速度慢了,调参次数就会受限制,最终效果自然受影响。所以把它们当作“落后指标”看,不直接反馈给模型,但反馈给实验节奏。
4. 多模态任务下的特殊看板指标
4.1 分项能力奖励:OCR、图文对齐与 format
多模态 RL 与纯文本 RL 最大的差别在于奖励信号是异质的。看板不能只展示一个总 Reward,还需要按能力维度拆分,例如图像中的文字识别、指代理解、图文对齐、工具调用格式等。不同维度的奖励可能来自不同的评测器,量纲和难度完全不相同。
遇到分项奖励,先要理解各自的范围。OCR 类硬准确率可以用 0 到 1 表示,安全偏好打分可能用 0 到 5 或者一个对数概率折算分,这两者直接相加没有意义。需要先在各分项内部做标准化,再按权重求和,看板上还必须把权重配置展示出来。否则你看到总 Reward 上涨,根本说不清是哪个能力在起作用。
4.2 Refusal Rate:奖励黑客的哨兵
多模态任务里,模型学会的“最省事”的应对方式之一是拒绝回答。不明原因拒绝、一律拒绝、转去输出自己训练时见过的高分模板,这些都会让任务奖励失效。Refusal Rate 就是专门用来盯这个现象的指标。
如果 Refusal Rate 在一个 RL 训练试次里持续上升,哪怕总 Reward 在涨,也要引起警惕。这说明模型正在走一条退路:不是真的会做任务了,而是学会了用“不能回答”来规避低分。我在实际调参中看到过模型从 2% 拒绝率涨到 40%,同时总 Reward 提升了 0.3 的情况。表面是收益,底子是退化。遇到这种情况,优先检查奖励函数里有没有对“拒绝”行为的显式惩罚,或者任务提示词里是否存在诱导模型拒绝的歧义表述。
4.3 生成长度与 Length Reward
很多奖励函数会加入与生成长度相关的项,用来避免模型偷懒输出太短的答案,或者反过来,鼓励生成更详细的解释。这种长度奖励很容易带偏模型。看板上的平均生成长度、最大长度、长度分位数,就是用来识别这类偏置的窗口。
如果给定了 max_retries 上限,但平均生成长度开始贴着上限走,说明模型已经学会无限注水来拿长度分。常见对策是给长度奖励加一个饱和阈值,超过某个长度后不再加分。读板的时候要同时看两条曲线:Reward 和生成长度。两者在训练早期同步上升很正常,但如果训练后期只有长度还在涨、Reward 不再涨,大概率是长度奖励已经把优化方向带离真正目标了。
4.4 Reward Model 偏差与 Gap
RL 训练的信息来自奖励模型而不是真实人类评价。奖励模型本身有偏差,这种偏差会随训练加深而被放大。看板上最难的指标不是曲线,而是那些你看不到的东西——模型在奖励模型眼里变好了,在真实任务上却未必。
为了缓解这个问题,训练循环一般会定期启动评测阶段,即用一套独立的高质量基准来回答问题。MiMo-v2.6 看板上因而会出现一组“评测间奏”曲线,它们不按 step 连续记录,而是若干步出现一次。这组曲线与 Reward 曲线之间的差距,就是 Reward Model Gap 的近似体现。如果奖励模型打分持续上升,但独立评测分数原地踏步甚至下降,就要停下来怀疑奖励建模本身。
5. 实操:怎么巡检 MiMo-v2.6 的训练看板
5.1 看板常用布局与面板组织
一个能支撑几周训练周期的看板,通常按这样组织:总览页放 Reward 和 KL 两条主曲线,副区域放 Policy Loss、Clip Fraction、Gradient Norm、学习率;生成页放生成吞吐、平均生成长度、Refusal Rate;训练页放训练吞吐、GPU 利用率、MFU、batch 大小。不同实验的对比视图应该单独开放,因为单独看一个实验的曲线很难判断好坏,横向对比才能发现某个步段的异常。
面板的刷新频率也有讲究。训练 step 在几十秒量级时,每分钟刷新一次已经足够。刷得太快会让曲线频繁跳动,干扰判断;刷得太慢又会错过挂掉的瞬间。我习惯把总览页设成 1 分钟刷新,子页面用 5 分钟刷新,这样既能看到实时性,又不会让主要注意力被噪声带走。
5.2 五分钟巡检流程
我总结了一个比较省事的巡检顺序,直接照着做就行:
- 看右上角 global step 是否在持续推进。如果长时间卡住,优先怀疑训练进程死锁,而不是模型问题。
- 看 Loss 是否为 NaN。这一步排第一,因为一旦出现 NaN,后面所有指标都没有意义。
- 看 KL 的绝对值与变化斜率。比上一个检查点高出 50% 以上就必须警惕。
- 看 Reward 的 EMA 趋势。连续 100 步没有上升不代表失败,但如果 500 步没有一点波动,需要进一步拆子项。
- 看 Clip Fraction 阈值。超过 0.25 提示更新步长过大。
- 最后瞄一眼 GPU 利用率和 TPS,确认不是工程侧的问题。
整个流程控制在五分钟以内。RL 训练的问题往往不是单点爆发,而是多个小异常叠加,所以巡检要固定在每天几个时间点做,不要等出大事才打开看板。
5.3 关键参数配置与看板联动
看板上的数值背后都与超参数联动。Ree 相关看板需要关注的几个配置是:μKL、学习率、batch size(或者 GRPO 口径下的组大小)、样本长度上限和奖励权重。学习率改动会直接反映在 Clip Fraction 和 KL 上;μKL 加大通常会压低 KL,但也可能让 Reward 上升变慢;组大小直接影响 Advantage 标准差的估计质量。
如果看板用了自己的日志系统,可以做一个非常轻量的小脚本,把零散的指标行提取出来做 EMA,方便自己在本地二次分析。比如:
import re import statistics logs = open("train.log", encoding="utf-8") step = [] loss_ema = None for line in logs: m = re.search(r"step=(\d+).*?policy_loss=([\d.]+)", line) if m: s = int(m.group(1)) loss = float(m.group(2)) loss_ema = loss if loss_ema is None else 0.1 * loss + 0.9 * loss_ema step.append((s, loss_ema)) # 随后把 step、loss_ema 交给前端画图,替代看板自带的裸值曲线这样做的价值在于,训练集群卡顿期间看板可能漏采样,本地用原始日志算 EMA 能拿到波动更稳定的曲线,排查问题的时候多一个可信视图。
6. 常见异常模式与排查技巧实录
6.1 Reward 曲线横盘不动
如果 Reward 在 200 步内毫无上升,先看子项。我的经验是七成情况是某个子项在拖后腿,且这个子项基本不动,总 Reward 再怎么加权都被它压住。打开分项图,找到那个持续不长不落的奖励,确认对应数据是否太单一。小模型场景下,某个能力的训练样本重复率过高,奖励模型给分就会出现“饱和”,模型再怎么学都拿不到更高分。这种情况的解法不是调学习率,而是回数据侧增加该能力的多样性。
另一种常见原因是 μKL 设得过重。策略稍微偏离参考模型就被大惩罚压制,RL 实际在上面白跑。测试方法也简单:临时把 μKL 调低一半,继续跑两百步,如果 Reward 立刻抬头,说明之前不是模型学不会,是约束太紧。
6.2 KL 散度突然飙升
KL 飙升通常与学习率过大或优势信号不稳定同时出现。第一反应是看最近的 Clip Fraction 和单个 batch 里的 Reward 方差。如果 Reward 方差在同一个时间点猛增,说明奖励模型对某个新样本群给出了极端分数,策略顺着这个尖峰大步更新,KL 就被顶起来了。
处理顺序建议是:先降温,把学习率降为原来的五分之一,同时把 β 或 μKL 上调一个档位;然后回到数据管道,确认最近进入的 batch 是不是混入了格式异常或标签错误的样本。我在实际训练中遇到过 KL 飙升的原因竟然是一个评测脚本错误地把一张全黑图片标成了高奖励样本,模型很聪明,立刻学到了一套针对黑图的投机输出。
6.3 Loss 为 NaN 或剧烈抖动
NaN 在多模态 RL 训练里并不冷门,常见原因是数值精度溢出。视觉特征和文本特征的数值范围差异很大,如果 reward 系数过大,乘以梯度以后很容易超过 fp16 的表示范围。建议先切换到 bf16,再看 reward 是否做了 normalization。看板上的 reward 分布如果能看到最大最小值的话,要求两者数量级不要太夸张,比如已标准化到 [-1, 1] 区间,就会安定很多。
Loss 剧烈抖动但不至于 NaN,一般不是精度问题,而是 batch 内离群样本太多。RL 训练里每个 step 的样本都是模型自己生成的,质量波动天然很大。看板如果支持“ignore first k steps”的视图,能帮助你判断是早期冷启动的抖动,还是稳态下的问题。
6.4 吞吐骤降与 GPU 利用率掉空
吞吐骤降最先要查的是序列长度分布。多模态生成中,有些样本可能触发了很长的输出,导致单个 batch 的执行时间暴涨。看板上的平均生成长度如果连续升高,而并行度不变,吞吐下降是必然的。另一个常见原因是 padding 率上升:batch 里最长序列越宽,短序列被白白填充的算力就越多,MFU 自然难看。
如果 GPU 利用率曲线是间隔性的“锯齿”,我一般先怀疑数据加载或者奖励计算环节阻塞了训练循环。多模态任务里要额外看图像解码和预处理的线程数,图像解码是非常容易成为瓶颈的环节——某次吞吐掉了 40%,追查到最后是图像解码库版本更新后并发能力退化。
6.5 看板数据延迟与断点续跑
看板数据本身出现延迟,不等于训练卡死。常见原因有三个:监控进程没开、日志缓冲没落盘、或者分布式训练中某些 rank 的统计没顺畅汇总。遇到这种情况,先从训练日志确认实际 step 还在推进,再诊断监控链路,不要一上来就重启训练。
断点续跑还会带来一个容易忽略的问题:同一轮实验跨两次启动,如果随机种子重新初始化,Reward 曲线会出现一个明显的跳变。看板如果支持在续跑点画竖线就非常实用,画不出来就自己记录下时间戳。否则你会把续跑后的波动误判成训练异常。
7. 术语速查表与易混淆辨析
7.1 高频术语速查表
| 术语 | 含义 | 看板上的作用 |
|---|---|---|
| Reward | 奖励模型或规则函数算出的即时分数 | 总回报与子项趋势的依据 |
| Return | 一个回合内奖励的累计值 | 长任务下判断整体表现 |
| Advantage | 当前结果相对于平均水平的优势 | GRPO/PPO 中策略梯度的核心信号 |
| Baseline | 用于计算优势的参照值 | 决定优势估计的稳定性 |
| KL 散度 | 策略模型与参考模型的分布距离 | 衡量策略漂移程度 |
| Entropy | 策略分布的随机性 | 判断探索是否过低 |
| Clip Fraction | 策略更新触发截断的比例 | 反映单步更新幅度 |
| Policy Loss | 策略网络在主目标上的损失 | 判断策略是否在有效调整 |
| Value Loss | 价值模型预测误差 | 判断价值模型是否健康 |
| Gradient Norm | 梯度向量模长 | 识别爆炸或消失 |
| MFU | 模型浮点利用率 | 评估算力使用效率 |
| TPS | 每秒处理的 token 数量 | 评估生成/训练吞吐 |
| Refusal Rate | 模型拒绝回答的比例 | 识别退化与奖励黑客 |
| Group Size | GRPO 中每个提示词采样的回复数 | 影响优势估计质量 |
7.2 容易混的三组概念
Reward 与 Return 是最高频的混淆点。Reward 强调“这一步给的分数”,Return 强调“这一整段累计下来的分数”,前者是局部,后者是全局。看板上如果没有明确标注,一定要看训练框架里的定义再判断。
PPO 的 Value Loss 与 GRPO 的 Advantage 标准差对应的位置相同,但含义完全不同。前者是回归问题,衡量预测准不准;后者是分布问题,衡量区分度好不好。用 PPO 的思维去找 GRPO 训练里的“价值网络过拟合”,根本找不到对象。
Generation TPS 与 Training TPS 也不要同框比较。生成阶段是自回归解码,训练阶段是并行前反向,两者理论上就不在一个量级。放在同图中的意义只是看趋势稳定性,而不是对比数值大小。
附一些个人经验作为结尾
最后说一个我自己的习惯,也算是踩过不少坑之后的总结:每次开始新一轮 RL 训练,我会在看板上把 Reward、KL、Clip Fraction、平均生成长度这四根曲线固定成一张视图,跑满一千步后截图保存,再跑一千步截第二张。两张图一对比,训练方向对不对,基本能看出七成。看板这东西,最忌讳的是每个指标都看,每个指标都不深究。四根关键曲线看透了,比来回翻三十个页面有用得多。
后续 MiMo-v2.6 的配置如果更新,看板指标大概率也会跟着调整,比如加入了新的分项奖励或者换一种优势估计方式,但读板逻辑不会变:先问自己,这个指标异常,它反映的是策略更新失控、数据侧污染,还是工程资源抖动。带着这三个问题上板,曲线基本骗不了你。