1. 为什么RL scaling值得单独拿出来聊
做强化学习训练的人大概都有过这种体验:小规模实验跑得挺漂亮,reward曲线稳步上升,评估指标也好看,可一旦把模型参数、并行环境数、batch size往上翻几倍,整个训练就开始"抽风"——要么reward直接崩掉,要么收敛速度反而变慢,要么干脆卡在一个平庸的策略上再也上不去。这不是玄学,而是RL scaling本身就有它自己的规律,跟监督学习那套scaling law不完全是一回事。
mimo-v2.6这个项目里,我们把RL scaling作为一个独立的观察对象来做实验,核心目的就一个:搞清楚当训练规模(模型侧、数据侧、并行侧)按比例放大时,RL训练的动态会发生什么变化,哪些量是线性受益的,哪些量会提前饱和,哪些量甚至会反向恶化。这个观察对做实际训练的人价值很直接——它决定了你该把有限的算力预算砸在哪个维度上。
这篇文章适合两类人看:一类是正在做RL训练、准备扩规模但心里没底的同学;另一类是想理解RL训练动态、需要一份可复现实验参考的从业者。我会把实验设计思路、关键参数选择、踩过的坑、以及那些"文档里不会写但实际会要命"的细节都摊开讲。所有结论都来自mimo-v2.6这轮实验的实际观察,不是纸上谈兵。
2. 实验整体设计与思路拆解
2.1 为什么要做scaling而不是单点调优
单点调优的思路是"给定一个规模,把超参调到最好"。但这个方法有个致命问题:你在小规模上调出来的最优超参,搬到大规模上大概率不是最优,甚至可能直接失效。原因在于RL训练里很多超参之间存在规模相关的耦合——比如学习率和batch size的关系、KL惩罚系数和策略更新幅度的关系、并行环境数和advantage估计方差的关系,这些耦合在小规模下可能被噪声掩盖,规模一放大就暴露出来。
所以我们这轮实验的设计原则是:固定一套相对合理的超参配置,然后系统性地改变规模维度,观察训练动态如何随之变化。这样得到的不是"某个规模下的最优解",而是"规模变化时训练动态的响应曲线",后者对做scaling决策更有指导意义。
2.2 三个scaling维度怎么选
RL训练里可以放大的维度很多,但真正对结果影响大、且实际训练中经常需要调整的主要是三个:
- 模型规模:从base model的参数量角度,我们选了三个档位做对比,观察策略表达能力提升对RL收敛的影响。
- 并行环境数(rollout batch):这是RL特有的维度,直接决定每轮策略更新能拿到多少on-policy样本。环境数太少,advantage估计方差大;太多,单步训练时间线性增长。
- 训练步数与数据消耗:观察在固定算力预算下,是"多跑几步小batch"还是"少跑几步大batch"更划算。
这三个维度不是独立的,实际训练中它们互相牵制。我们的做法是先固定两个、扫一个,得到单维度响应曲线,再做交叉验证看耦合效应。
2.3 基线配置与对照组设置
基线配置的选择很关键,它决定了后续所有对比的参照系。我们用的基线大致是这样的:中等规模模型 + 中等并行环境数 + 标准PPO风格的目标函数 + 固定的KL系数调度。这个配置在小规模预实验里表现稳定,reward曲线没有明显震荡,评估指标能到预期水平。
对照组的设计上,我们没有简单地"改一个参数看结果",而是按scaling比例成组调整。比如模型规模翻倍时,学习率、batch size、KL系数都按经验比例同步调整,避免出现"只放大模型不调学习率"这种不公平对比。这一点很重要,很多scaling实验结论不可靠就是因为对照组设置不公平。
提示:做scaling实验时,最容易被忽略的是"同步调整"这件事。只改一个维度、其他全不动,得到的结论往往不能推广,因为其他维度已经不在合理工作区间了。
3. 核心细节解析与实操要点
3.1 模型规模放大后的收敛行为变化
模型规模从最小档到最大档,我们观察到几个比较明确的现象。第一,大模型的初始策略熵明显更低,也就是说它一开始就更"自信",探索行为更少。这个现象在小模型上不明显,但规模上去之后非常突出。带来的直接后果是:如果沿用同样的熵正则系数,大模型会过早收敛到一个次优策略,reward曲线前期涨得快、后期卡死。
第二,大模型对KL惩罚的敏感度更高。同样的KL系数,大模型策略更新幅度更小,训练更"保守"。这本身不一定是坏事,但如果你期望它快速适应新reward信号,就会觉得它"学得慢"。我们的处理方式是给大模型配更小的KL系数初值,配合更激进的熵正则,把探索和利用的平衡重新拉回来。
第三,大模型的reward方差更低。这个其实是好事,意味着advantage估计更稳定,梯度噪声更小。但代价是它对reward shaping的依赖更强——如果reward设计有偏,大模型会更快地过拟合到这个偏差上,而且更难通过后续训练纠正。
3.2 并行环境数对训练稳定性的影响
并行环境数是RL scaling里最"反直觉"的维度。直觉上环境越多、样本越多、训练越稳,但实际观察不是这样。
环境数从低档提到中档时,训练稳定性确实明显改善,reward曲线更平滑,评估指标波动更小。这个阶段收益是正的,符合预期。但从中间档继续往上提,收益开始递减,而且出现了一个新问题:策略更新频率下降导致的off-policy程度上升。环境数太多,每轮rollout耗时变长,等这一轮数据收集完,策略已经更新过好几次了,数据的新鲜度下降,on-policy假设被削弱。
我们实测下来,环境数和模型规模之间存在一个经验比例关系。模型越大,单次前向耗时越长,环境数就不宜设得太大,否则单步训练时间会被rollout主导,整体吞吐反而下降。这个比例没有理论公式,得靠实测标定,但大方向是:环境数的增长应该慢于模型规模的增长。
3.3 训练步数与数据效率的权衡
固定算力预算下,"多步小batch"和"少步大batch"哪个好?我们的观察是:取决于reward信号的稠密程度。
reward稠密、每步都有有效梯度信号的任务,少步大batch更划算,因为大batch的梯度估计更准,每步更新质量高。reward稀疏、需要大量探索才能碰到有效信号的任务,多步小batch反而更好,因为更新频率高,策略能更快地朝有效方向移动,大batch在这种情况下只是把噪声平均了一下,没有实质帮助。
这个结论对实际训练的指导是:不要盲目追求大batch,先看你的reward设计是稠密还是稀疏。mimo-v2.6里我们两种任务都跑了,差异非常明显,稠密任务上大batch的样本效率能高出30%以上,稀疏任务上反而是小batch领先。
3.4 关键参数的同步调整策略
前面提到对照组要同步调整,具体怎么调,这里给一个我们实际用的经验规则:
| 放大维度 | 同步调整项 | 调整方向 | 备注 |
|---|---|---|---|
| 模型规模x2 | 学习率 | 下调约30%-50% | 大模型梯度尺度更大 |
| 模型规模x2 | KL系数初值 | 下调约50% | 大模型对KL更敏感 |
| 模型规模x2 | 熵正则 | 上调约20%-30% | 补偿初始熵降低 |
| 环境数x2 | 学习率 | 基本不变 | 样本质量提升抵消 |
| 环境数x2 | 更新频率 | 适当降低 | 控制off-policy程度 |
| batch size x2 | 学习率 | 上调约20% | 线性缩放规则的保守版 |
这张表不是万能公式,但作为起点比"什么都不调"强得多。实际用的时候建议先按这个调,再根据前几百步的reward曲线微调。
注意:学习率的线性缩放规则(batch翻倍、lr翻倍)在RL里要慎用,因为RL的梯度噪声结构和监督学习不同,直接套用容易导致训练发散。我们用的是保守版,只上调20%左右。
4. 实操过程与核心环节实现
4.1 实验环境搭建与配置基线
环境搭建这块,核心是把训练框架的并行能力和RL的rollout机制对齐。我们用的是标准的分布式训练框架,模型侧做数据并行加张量并行,rollout侧用独立的推理进程池,避免训练和推理抢资源。
配置基线的关键参数大致如下(以中等档为例):
model: hidden_size: 2048 num_layers: 24 num_heads: 16 rl: algorithm: ppo clip_ratio: 0.2 kl_coef_init: 0.02 entropy_coef: 0.01 gamma: 0.99 gae_lambda: 0.95 rollout: num_envs: 256 rollout_steps: 128 batch_size: 1024 train: lr: 1.5e-5 warmup_steps: 100 total_steps: 20000这套配置在小规模预实验里跑了大概5000步确认稳定,然后才作为基线开始扫规模。
4.2 单维度scaling实验的执行流程
每个维度的scaling实验按这个流程走:
- 确定扫描点:每个维度选3-4个档位,档位之间保持大致等比(比如x1、x2、x4)。
- 同步调整超参:按3.4节的规则调整,记录调整前后的完整配置。
- 短跑验证:每个配置先跑500-1000步,看reward曲线是否正常启动,异常的直接排查配置问题。
- 长跑采集:验证通过的配置跑满预算,每100步记录一次reward、KL散度、熵、梯度范数、评估指标。
- 交叉验证:单维度结论出来后,挑2-3个组合做交叉实验,确认结论在耦合情况下依然成立。
这个流程看起来繁琐,但能避免"跑了几万步才发现配置有问题"的浪费。短跑验证这一步千万别省,我们早期就是省了这步,结果一个KL系数设错的配置跑了三天才发现,白烧算力。
4.3 训练动态的监控指标与记录方式
RL训练要监控的指标比监督学习多得多,我们固定记录这几类:
- reward相关:训练reward均值、评估reward、reward方差
- 策略相关:策略熵、KL散度(相对参考策略)、clip fraction
- 优化相关:梯度范数、学习率、更新幅度
- 系统相关:单步耗时、rollout耗时占比、显存占用
记录频率是每100步一次,关键阶段(比如reward突变时)加密到每10步。这些指标后面分析scaling行为时是主要依据,尤其是KL散度和熵的变化曲线,能解释很多reward异常。
4.4 一次典型的规模放大实操记录
拿模型规模从x1放大到x2这次实验举例。调整项:学习率从1.5e-5降到1.0e-5,KL系数从0.02降到0.01,熵正则从0.01提到0.013,其他不变。
前500步:reward上升速度比x1慢,但曲线更平滑,KL散度维持在低位。这个阶段符合预期,大模型更保守。
500-2000步:reward开始加速,逐渐追平x1的水平,熵缓慢下降但没有崩。这里有个细节,x1的熵在1500步左右就降到很低了,x2的熵到2500步才降到同等水平,说明大模型的探索维持得更久。
2000-8000步:x2的reward超过x1,最终评估指标高出约8%。KL散度全程稳定,没有出现x1后期那种KL突然抬升的情况。
这次实验的结论是:模型规模放大确实带来收益,但需要配套调整超参,尤其是KL和熵。不调整的话,x2的表现反而不如x1,我们试过,reward卡在x1的80%左右上不去。
5. 常见问题与排查技巧实录
5.1 reward曲线异常的分类与定位
RL训练出问题,reward曲线是最直接的信号。我们整理了几种典型异常和对应的排查方向:
| 异常表现 | 可能原因 | 排查方向 |
|---|---|---|
| reward前期就崩 | 学习率过大/KL系数过小 | 先降lr,再调KL |
| reward涨到一半卡死 | 熵过低/探索不足 | 提高熵正则,检查策略熵曲线 |
| reward震荡剧烈 | batch过小/环境数不足 | 增大batch或环境数 |
| reward缓慢下降 | 过拟合reward偏差 | 检查reward设计,加KL约束 |
| 评估指标与训练reward背离 | 过拟合训练分布 | 检查评估集分布,加正则 |
这张表是我们踩坑踩出来的,实际排查时按这个顺序走,能省不少时间。
5.2 KL散度失控的典型场景
KL散度失控是RL训练里最常见也最头疼的问题。我们遇到过的典型场景有两个。
一个是参考策略更新滞后。有些实现里参考策略不是实时更新的,如果更新周期设得太长,KL约束就形同虚设,策略会跑偏。解决办法是缩短参考策略更新周期,或者用滑动平均的方式平滑更新。
另一个是reward尺度突变。如果reward函数里有某个分量在训练中途因为环境变化而尺度突变,KL会瞬间抬升。这个在小规模下不明显,规模放大后reward信号更强,突变的影响也被放大。我们的处理是给reward做归一化,并且监控每个分量的尺度变化。
5.3 并行环境数增加后吞吐反而下降
这个问题前面提过,这里展开说排查思路。环境数增加后吞吐下降,通常是三个原因之一:
- rollout成为瓶颈:单步训练时间里rollout占比超过70%,说明推理侧跟不上,需要优化推理或减少环境数。
- 通信开销上升:环境数增加导致进程间通信量上升,尤其是在跨节点场景下。检查通信耗时占比。
- 显存压力导致batch切分:环境数增加后单次rollout数据量变大,如果显存不够被迫切分batch,反而增加开销。
排查时先看耗时分解,定位瓶颈在哪,再针对性处理。盲目加环境数是最常见的错误。
5.4 规模放大后复现性变差怎么办
规模放大后实验复现性变差是普遍现象,原因主要是随机性来源变多(环境随机、并行调度随机、梯度同步顺序随机)。我们的应对方式:
- 固定所有能固定的随机种子,包括环境侧
- 记录完整的配置和代码版本,任何改动都留痕
- 关键结论至少跑两次不同种子确认
- 接受一定范围内的波动,不追求完全一致
提示:RL实验的复现性天然比监督学习差,不要用监督学习的标准要求RL。关键是结论的方向性一致,而不是数值完全一致。
5.5 独家避坑清单
最后整理几条我们踩过、但文档里基本不会写的坑:
- 不要在训练中途改环境数。环境数变化会改变advantage的估计分布,中途改会让训练动态断裂。要改就重启训练。
- KL系数不要用固定值。用自适应调度,根据实际KL散度动态调整,比固定值稳得多。
- 评估频率不要太高。评估本身消耗算力,而且频繁评估会干扰训练节奏。我们一般每500-1000步评估一次。
- 梯度裁剪阈值要随规模调整。大模型梯度范数分布不同,沿用旧阈值要么裁太狠要么裁不动。
- 保存checkpoint时连优化器状态一起存。只存模型权重的话,恢复训练后优化器状态重置,训练动态会突变。
这些坑单独看都不大,但凑在一起能让一次实验多烧好几天算力。mimo-v2.6这轮实验下来,我个人最大的体会是:RL scaling不是简单地把东西放大,而是要重新理解每个规模维度背后的动态变化,然后针对性地调整。规模放大带来的收益是真实的,但前提是你得把配套的东西都调对。