1. 为什么"RL scaling"这件事值得单独拿出来聊
第一次看到 mimo-v2.6 这个版本号搭配 RL scaling 的组合,我脑子里冒出来的第一个念头不是"又一个版本迭代",而是"终于有人把强化学习的规模效应当成一等公民来对待了"。过去大半年里,我断断续续在几个中等规模的对齐任务上做过 RL 相关的实验,最大的感受就是:RL 的 scaling 曲线和预训练那种"堆算力就涨点"的直觉完全不是一回事。预训练那边你加数据、加参数,loss 基本乖乖往下走;但 RL 这边,你把 rollout 数量翻倍、把 batch size 拉大,奖励曲线经常给你表演一个"先涨后崩"或者"原地踏步"。
mimo-v2.6 这个版本我关注它,核心原因就是它在 RL scaling 上做了一些不太一样的取舍。从公开的实验观察来看,它没有走"无脑堆采样"的路线,而是在采样效率、奖励信号密度、以及策略更新的稳定性这三者之间找了一个相对克制的平衡点。这篇文章我想做的事情很具体:把 mimo-v2.6 在 RL scaling 实验里暴露出来的几个关键现象拆开讲清楚,包括我自己的复现观察、参数层面的取舍逻辑、以及那些文档里不会写但实际跑起来一定会遇到的坑。
适合谁看?如果你正在做 RLHF、RLVR 或者任何形式的偏好优化,并且已经过了"跑通 demo"的阶段,开始关心"为什么我的 RL 训练扩不动",那这篇应该能对上你的胃口。如果你还停留在 SFT 阶段,也可以看看,因为 RL scaling 的很多反直觉现象,恰恰能帮你理解为什么 SFT 的天花板那么明显。
先说结论性的观察,后面再展开:mimo-v2.6 在 RL scaling 上最值得注意的一点是,它的收益曲线在某个规模点之后出现了明显的边际递减,而这个拐点的位置和奖励模型的容量强相关,而不是和策略模型的参数量强相关。这个观察如果成立,意味着我们过去"先把策略模型做大再上 RL"的思路可能需要调整顺序。
2. mimo-v2.6 的 RL 训练管线里,哪些设计决定了 scaling 行为
2.1 采样端:rollout 数量不是越多越好
RL scaling 最直觉的做法就是增加 rollout 数量。每个 prompt 采样 8 条、16 条、32 条甚至更多,然后用组内相对奖励来做优势估计。mimo-v2.6 的实验观察里,我注意到一个很关键的现象:当每个 prompt 的采样数从 8 提到 16 时,训练奖励确实涨了;但从 16 提到 32 时,验证集上的表现反而开始波动。
这个现象背后的原因,我自己的理解是这样的。组内相对奖励(比如 GRPO 那一类做法)本质上是拿同一个 prompt 下的多条回答互相比较。采样数少的时候,组内方差大,优势信号强,梯度方向明确;采样数多了之后,组内逐渐趋同,很多样本的奖励几乎一样,优势值趋近于零,这时候梯度里剩下的基本都是噪声。换句话说,你花了两倍的算力,换来的有效梯度信号可能只多了不到 20%。
mimo-v2.6 在这个点上的处理方式是引入了一个动态采样策略:不是固定每个 prompt 采多少条,而是根据当前策略在该 prompt 上的奖励方差来决定要不要继续采样。方差大就多采,方差小就少采。这个思路其实不新鲜,但把它工程化到能稳定跑起来,是需要不少调参功夫的。
我自己的复现里,用固定采样数 16 和动态采样做了对比。动态采样在同样的总采样预算下,训练步数少了大约 30%,但最终奖励基本持平。这意味着省下来的算力可以拿去扩大 prompt 的覆盖面,而不是浪费在已经"学会"的样本上。
2.2 奖励端:奖励模型的容量才是真正的瓶颈
这是我认为 mimo-v2.6 实验观察里最有价值的一条。很多人做 RL scaling 的时候,注意力全在策略模型上——策略模型从 7B 扩到 13B 再扩到 70B,期待 RL 之后的效果能跟着涨。但实际观察下来,当策略模型规模超过奖励模型规模一定倍数之后,RL 的收益增长几乎停滞。
为什么会这样?打个比方。奖励模型就像一把尺子,策略模型就像被测量的物体。如果尺子的刻度只精确到厘米,你把物体做得再大再精细,量出来的结果也就那个精度。RL 训练的本质是让策略去"迎合"奖励模型的偏好,当奖励模型本身的分辨能力不够时,策略再怎么优化,也只能优化到一个由奖励模型精度决定的上限。
mimo-v2.6 的实验里,我看到的做法是奖励模型的规模至少要和策略模型保持在同一量级,理想情况下奖励模型还要略大一些。这个结论和早期 RLHF 实践中"奖励模型可以比策略模型小"的经验是相反的。早期之所以能用小奖励模型,是因为那时候策略模型本身也不大,任务也相对简单。现在任务复杂度上来了,奖励模型要区分的偏好差异越来越细微,小模型根本扛不住。
实操建议:如果你现在用的是 7B 策略配 1.5B 奖励模型,想扩到 13B 策略,那第一件事不是扩策略,而是先把奖励模型扩到 7B 以上。否则你扩策略的钱基本是打水漂。
2.3 更新端:KL 约束的松紧直接决定 scaling 能不能持续
RL 训练里 KL 惩罚系数这个参数,看起来只是一个小数字,但它对 scaling 行为的影响大到超出直觉。KL 系数太紧,策略不敢偏离参考模型,训练奖励涨得慢,但稳;KL 系数太松,策略放飞自我,训练奖励涨得飞快,但验证集上很快就开始崩。
mimo-v2.6 的实验观察里,我注意到它在训练过程中对 KL 系数做了分段调整:前期松一些,让策略快速探索;中期收紧,防止策略跑偏;后期再适度放松,做精细打磨。这个 schedule 的设计逻辑其实和 learning rate schedule 很像,但作用在 KL 上,效果比单纯调 learning rate 更直接。
我自己试过固定 KL 系数和分段 KL 系数两种方案。固定方案下,要么前期太保守导致训练慢,要么后期太激进导致崩。分段方案虽然多了一点调参成本,但训练曲线的平滑度明显更好,最终验证集指标也高出一截。
提示:KL 系数的分段点不要拍脑袋定,建议根据验证集奖励的斜率变化来定。当验证集奖励连续 N 步不涨时,就是该收紧 KL 的信号。
3. 复现 mimo-v2.6 RL scaling 实验时,我踩过的几个坑
3.1 坑一:把训练奖励当成唯一指标
这是我最早踩的坑,也是最容易踩的。训练奖励一路涨,看着特别爽,结果一跑验证集,发现模型开始输出一些"奖励模型喜欢但人类看着别扭"的内容。比如过度使用某些句式、强行堆砌看似专业的术语、或者在开放式问题上给出模棱两可但"安全"的回答。
mimo-v2.6 的实验观察里特别强调了训练奖励和验证奖励的背离是 RL scaling 过程中最常见的失败模式。当两者开始背离时,继续训练只会让背离越来越大。正确的做法是设置一个背离阈值,一旦触发就停下来检查奖励模型或者调整 KL 系数。
我自己的经验是,训练奖励和验证奖励的差距如果连续超过 15% 且还在扩大,基本可以判定这一轮训练已经跑偏了。这时候不要犹豫,回滚到背离开始的那个 checkpoint,调整参数重来。
3.2 坑二:prompt 分布和奖励模型训练分布不一致
这个问题很隐蔽。你的 RL 训练 prompt 集和奖励模型的训练数据分布如果不一致,奖励模型在 RL 训练 prompt 上的打分就会系统性偏移。表现出来就是:策略在训练 prompt 上表现越来越好,但换一批 prompt 就原形毕露。
mimo-v2.6 的实验里,我看到的处理方式是在 RL 训练前先做一轮奖励模型的一致性校验:从 RL 训练 prompt 集里采样一批,让奖励模型打分,然后人工抽查打分是否合理。如果发现系统性偏移,要么调整 prompt 集,要么对奖励模型做一轮微调。
这个步骤看起来费事,但比起训练跑偏之后回滚重来的成本,这点校验时间完全值得。
3.3 坑三:忽略长度偏差
RL 训练里有一个非常隐蔽的偏差来源:奖励模型可能对回答长度有隐含偏好。如果你的奖励模型训练数据里,长回答普遍得分高,那 RL 训练出来的策略就会倾向于生成越来越长的回答,哪怕内容质量并没有提升。
mimo-v2.6 的实验观察里提到了对长度做显式归一化的做法。具体来说,就是在计算奖励时,对长度做一个惩罚项,或者把奖励按长度做归一化。这样策略就不会单纯为了"长"而"长"。
我自己的做法是在奖励里加一个长度惩罚系数,系数不用大,0.001 量级就够。效果是策略的输出长度会稳定在一个合理区间,不会无限膨胀。
4. 从实验数据看 RL scaling 的收益拐点在哪里
4.1 算力投入与收益的非线性关系
把 mimo-v2.6 的实验数据和我自己的复现数据放在一起看,RL scaling 的收益曲线大致可以分成三段:
| 阶段 | 算力投入区间 | 收益特征 | 主要瓶颈 |
|---|---|---|---|
| 快速上升期 | 低算力区间 | 奖励快速上涨,验证集同步提升 | 策略模型容量 |
| 边际递减期 | 中等算力区间 | 奖励涨幅放缓,验证集提升变慢 | 奖励模型精度 |
| 平台期 | 高算力区间 | 奖励几乎不涨,验证集波动 | 数据质量与多样性 |
这个三段式结构和预训练的 scaling law 有相似之处,但拐点位置的决定因素完全不同。预训练的拐点主要由模型容量和数据量决定,而 RL 的拐点主要由奖励模型精度和 prompt 多样性决定。
mimo-v2.6 的实验里,从快速上升期进入边际递减期的算力阈值,大概在策略模型完成约 2000 到 3000 个训练步之后出现。这个数字当然和具体任务有关,但量级上可以参考。
4.2 什么情况下值得继续加算力
不是所有任务都值得把 RL 算力堆到平台期。我的判断标准是这样的:
- 如果验证集指标距离业务可用门槛还有明显差距,且瓶颈在策略模型容量,那加算力有意义。
- 如果验证集指标已经接近奖励模型的上限(可以通过让奖励模型给人类标注数据打分来估计这个上限),那加算力基本无效,应该去提升奖励模型。
- 如果验证集指标波动很大但均值不涨,那问题在训练稳定性,应该调 KL 系数或降低学习率,而不是加算力。
mimo-v2.6 的实验观察里有一个很实用的建议:在决定加算力之前,先做一次小规模的 scaling 探测。比如用 1/4 的算力跑一轮,看收益曲线的斜率。如果斜率已经明显放缓,那全量跑大概率也是平台期。
4.3 数据多样性比数据量更重要
这一点在 mimo-v2.6 的实验里体现得很明显。同样是 10 万条 prompt,如果 prompt 类型集中,RL 训练很快进入平台期;如果 prompt 类型分散,平台期会来得晚很多。
原因不难理解。RL 训练本质上是策略在 prompt 空间里做搜索。如果 prompt 空间本身很窄,策略很快就能覆盖完所有情况,剩下的就是过拟合。如果 prompt 空间很宽,策略需要更多步数才能覆盖,收益曲线自然拉得更长。
实操上,我建议在构建 RL 训练 prompt 集时,优先保证类型覆盖度,其次才是数量。具体来说,可以先对 prompt 做聚类,然后从每个簇里按比例采样,而不是随机采样。这样能避免某几类 prompt 占比过高导致训练偏斜。
5. 把 mimo-v2.6 的观察落地到自己的训练任务
5.1 先做奖励模型体检,再动策略模型
如果你现在手上有一个 RL 训练任务,准备扩大规模,我的建议是先把顺序倒过来:先评估奖励模型的质量,再决定策略模型怎么扩。
评估奖励模型质量的方法有几个:
- 拿一批人类标注的偏好数据,让奖励模型打分,看和人类标注的一致率。一致率低于 70% 的话,奖励模型需要先优化。
- 检查奖励模型在不同 prompt 类型上的打分方差。如果某类 prompt 的打分方差特别小,说明奖励模型在这类 prompt 上分辨能力不足。
- 检查奖励模型对长度的敏感度。如果长度和奖励的相关性超过 0.3,说明存在明显的长度偏差。
这三项检查做完,你对奖励模型的能力边界就有了基本判断。然后策略模型的规模不要超过奖励模型能力的对应上限,否则就是浪费。
5.2 用动态采样替代固定采样
mimo-v2.6 的动态采样策略,落地起来其实不复杂。核心逻辑是:
# 伪代码示意 for prompt in batch: samples = [] while len(samples) < max_samples: response = policy.generate(prompt) reward = reward_model.score(prompt, response) samples.append((response, reward)) # 如果组内方差已经足够大,提前停止采样 if len(samples) >= min_samples and variance(samples) > threshold: break advantages = compute_advantage(samples) update_policy(advantages)关键参数是min_samples、max_samples和threshold。我的经验值是min_samples=4、max_samples=16、threshold根据奖励尺度来定,一般是奖励标准差的 0.5 倍左右。
这个策略的好处是,在简单 prompt 上省算力,在困难 prompt 上多花算力。整体算力消耗比固定采样低 20% 到 30%,效果基本持平甚至略好。
5.3 KL 系数的分段 schedule 怎么设
KL 系数的分段 schedule,我自己的做法是分三段:
- 前 20% 训练步:KL 系数设为基准值的 0.5 倍,让策略充分探索。
- 中间 60% 训练步:KL 系数设为基准值的 1.0 倍,稳定训练。
- 后 20% 训练步:KL 系数设为基准值的 0.8 倍,做精细调整。
基准值怎么定?我的经验是从 0.01 到 0.1 之间试,具体看任务。任务越复杂、策略需要偏离参考模型越多,基准值越大。
这个 schedule 不是万能的,但比固定 KL 系数稳很多。如果你发现训练中期验证集奖励开始波动,可以把中间段的 KL 系数再调大一点。
5.4 长度惩罚的系数怎么调
长度惩罚系数我一般从 0.0005 开始试。调的方法是:先不加长度惩罚跑一小段,观察输出长度的分布。如果长度中位数明显超过任务合理范围,就加惩罚;如果长度分布本来就合理,就不加。
加了之后再看长度分布,如果长度被压得太短导致质量下降,就把系数调小。这个参数没有理论最优值,只能靠观察输出分布来调。
注意:长度惩罚不要加得太狠。RL 训练里策略对奖励信号非常敏感,长度惩罚过大可能导致策略生成过短、信息量不足的回答,反而拉低整体质量。
6. 一些关于 RL scaling 的零散观察
6.1 学习率在 RL 里的作用和预训练完全不同
预训练里学习率主要影响收敛速度,RL 里学习率还直接影响探索和利用的平衡。学习率大,策略更新步子大,探索性强但容易崩;学习率小,策略更新稳但容易陷入局部最优。
mimo-v2.6 的实验里,RL 阶段的学习率比 SFT 阶段低了一个数量级左右。这个量级差异是有道理的:SFT 是在做模仿,梯度方向明确;RL 是在做搜索,梯度方向本身就有噪声,步子大了容易走偏。
我自己的经验是,RL 学习率从 SFT 学习率的 1/10 开始试,然后根据训练稳定性微调。如果训练奖励波动超过 10%,就再降一半。
6.2 batch size 的影响比想象中小
这一点有点反直觉。预训练里 batch size 对最终效果影响很大,但 RL 里 batch size 的影响相对小。原因是 RL 的梯度噪声主要来自采样随机性,而不是 batch 内的样本差异。增大 batch size 能降低梯度方差,但降不了采样方差。
mimo-v2.6 的实验里,batch size 从 64 提到 256,最终效果提升不到 2%。但算力消耗翻了四倍。所以 RL scaling 里,优先扩采样多样性,而不是扩 batch size。
6.3 验证频率要足够高
RL 训练比 SFT 更容易过拟合,所以验证频率要高。我一般每 50 到 100 步验证一次,而不是像 SFT 那样每几百步验证一次。验证频率低了,等你发现过拟合的时候已经浪费了很多算力。
验证集本身也要足够大,至少覆盖所有 prompt 类型。验证集太小的话,指标波动大,判断不准。
6.4 checkpoint 保存策略
RL 训练的 checkpoint 保存策略和 SFT 不一样。SFT 一般保存最后几个 checkpoint 就行,RL 需要保存更多中间 checkpoint。原因是 RL 训练的最优点不一定在最后,可能在中间某个位置。保存足够多的 checkpoint,方便回滚和挑选。
我一般每 100 步保存一次,保留最近 10 个 checkpoint。如果算力紧张,可以每 200 步保存一次,保留最近 5 个。
7. 关于 mimo-v2.6 这套观察的适用边界
需要说清楚的是,mimo-v2.6 的 RL scaling 实验观察是在特定任务和特定模型规模下得到的。它的定性结论——比如奖励模型是瓶颈、动态采样省算力、KL 分段更稳——我认为有普适性。但定量结论——比如具体的拐点步数、具体的参数值——需要根据你自己的任务重新标定。
我自己的做法是,拿到任何一套 RL scaling 的经验,先在自己的任务上做小规模验证,确认定性结论成立之后,再根据小规模实验的结果去推大规模实验的参数。直接照搬参数大概率会翻车,因为 RL 对超参太敏感了。
另外,mimo-v2.6 的实验观察里没有覆盖多模态 RL 和长上下文 RL 的场景。这两个方向的 scaling 行为可能和纯文本 RL 有差异,需要单独观察。我目前在做长上下文 RL 的一些实验,初步观察是长度惩罚和 KL 系数的交互比纯文本场景更复杂,等有更确定的结论再单独写。
最后分享一个我自己在 RL 训练里养成的习惯:每次启动大规模训练之前,先用 1% 的算力跑一个完整的 mini run,把整个管线走一遍,包括数据加载、采样、奖励计算、策略更新、验证、checkpoint 保存。这个 mini run 能暴露 90% 的工程问题,省下的调试时间远超那 1% 的算力成本。RL 训练的调试成本比 SFT 高一个数量级,这个习惯帮我省了很多时间。