1. 为什么SimpleVLA-RL值得关注
VLA(Vision-Language-Action)这个词在机器人圈子里这两年确实火得不行。简单说,它就是把视觉、语言和动作控制揉进一个模型里,让机器人听懂指令、看懂场景、直接输出动作。我在做完几个VLA的离线模仿学习项目后,最深的感受是:预训练出来的模型在熟悉场景里确实有模有样,但一旦换个摆放、换个光照、换个没见过的物体,成功率立刻跳水。这也是VLA落地绕不开的坎:只能模仿“见过”的行为,缺乏主动探索和适应能力。
SimpleVLA-RL这套东西的价值就在于把在线强化学习接到VLA上,走的是端到端路线——不拆模块、不做中间状态估计,让策略直接从高维视觉和语言输入映射到原始动作。这意味着模型不再只是“看一遍然后照着做”,而是要在环境里不断试错、拿到奖励信号、自己调整策略,最终学会在分布外也能稳住。对我这种被“预训练—冻结—部署”三件套坑过的人来说,这个概念上的转变非常关键。
这个项目适合谁看?一是已经在跑VLA或模仿学习、想往“让模型更鲁棒”方向走一档的人;二是做机器人强化学习、但对视觉语言模型接入还比较陌生的同学;三是纯粹想理解“端到端+在线RL”和传统分层控制到底差在哪里的人。这篇文章我会把架构拆解、训练管线、关键配置和踩坑记录都铺开讲,尽量做到拿回去就能照着调。
2. 端到端在线RL的架构到底怎么搭
2.1 整体设计:不是“VLA加个RL头”这么简单
很多人一听“VLA做在线强化学习”,第一反应是拿一个成熟的VLA模型,末尾加个策略头,然后丢进PPO里跑。我在初版实验里也这么干过,结果很惨——不是不收敛,就是收敛了但动作极其怪异。原因在于VLA本身是个多模态条件生成模型,它的设计目标是“给定指令和观测,预测一段动作序列”,而不是为RL里的价值估计和优势计算设计的。你硬把策略头加上去,前面的视觉编码器和语言模型主干对“探索”这件事没有任何配合,策略稍微偏离预训练分布,整个表征就乱了。
SimpleVLA-RL的思路是把两部分解耦再组合。主干是标准的VLA预训练模型,负责把视觉和语言信息压缩成任务相关的语义特征;策略头和高斯噪声头是后来接上去的,专门负责输出动作分布。在线RL阶段,只有策略头、噪声头和后几层LoRA适配层参与梯度更新,主干大部分参数保持冻结。这样做的好处很明显:预训练得到的视觉-语言对齐能力不会在RL早期就被破坏掉,训练稳定性好很多。
训练管线分两段走:先拿离线数据把VLA主干和策略头做行为克隆预训练,让模型首先具备“照做”的能力;之后才进入环境做在线RL。在线阶段初始策略不是随机乱试,而是从一个有基础能力的策略出发,这大大缩小了探索空间,收敛速度比从零开始训快一个数量级。
从系统角度看,端到端体现在动作输出的方式上。整个模型输入的是“当前相机图像+语言指令+过去的动作序列”,输出的是“当前时刻的动作分步参数”,比如动作均值和对数方差,通过高斯分布采样得到实际动作。中间不经过运动规划器、不经过抓取点估计、不需要人为设计状态表征,这就是端到端的核心含义——从“看到什么、听到什么”直接到“动什么”。
2.2 动作空间的表征选择:离散Token还是连续向量
动作表征是整个方案里最容易踩坑、也最影响训练效率的地方。VLA预训练通常有两种动作输出方式:一种是离散化动作Token,像把动作空间切成若干bin,走逐token预测;另一种是直接输出连续高斯分布参数。SimpleVLA-RL选的是后者,原因很实际:在线RL里,连续高斯策略和PPO系列算法(特别是带优势归一化和自适应KL惩罚的那些)配合更自然,梯度回传路径比离散token的采样-softmax要短,训练方差也小一些。
但连续动作也不是没有代价。机器人操作任务的关节角度范围差异很大,比如夹爪的开合值和关节旋转角度的量纲不同,如果直接用一个高斯头去拟合,网络很容易偷懒:优先拟合量纲大的维度,量纲小的维度几乎不学。我用的办法是每个关节维度单独做均值方差归一化——离线数据里统计各维度的均值和标准差,把动作标准化到近似零均值单位方差的空间,网络输出后再反归一化回真实尺度。这一步不起眼,但对训练稳定性的提升立竿见影。
动作头的结构也不复杂,但细节里有坑。它接收的是语言模型输出序列中最后一条指令处的隐藏状态拼接当前动作的历史embedding,然后过一层MLP映射到动作均值,同时另一条支路输出对数方差。方差头初始值需要小心设置:如果你把初始对数方差设置得太大,相当于初始策略乱试,训练前期容易崩;太小又会导致探索不够。经验值是初始方差让策略输出的动作幅度约为离线动作标准差的0.3~0.5倍,这样探索和稳定之间比较平衡。
还有一点,训练时动作头一定要加轻量正则化。我在输出均值之前接了一层LayerNorm,同时把方差头的输出做了softplus约束,限制在合理范围。最开始我图省事没加约束,跑了十几个小时后发现模型输出的方差漂到了负数区间,整个策略行为完全异常。后来加回约束,问题立刻消失。这种细节在论文里通常只写一句“we found normalization crucial”,但实际调的时候血泪一堆。
2.3 在线RL的奖励:稀疏任务奖励+密集行为指导混合
在线强化学习的奖励设计直接决定学出来的策略长什么样。稀疏奖励(比如“到达最终目标+1,否则0”)在真实机器人上几乎没法直接用——反馈太稀疏,等模型意识到哪一步错了早就发散得不成样子。简单任务还好,稍微复杂点的任务基本都不收敛。我后来切成了混合奖励结构。
第一层是目标奖励:用去重算法检测机器人是否达成关键子目标,每完成一个就给一定分数,最后主任务成功则给一个大的额外奖励。第二层是KL惩罚项:约束当前策略和预训练参考策略之间的KL散度,防止策略跑偏到预训练分布之外。第三层是可选的行为先验奖励:比如对物体移动距离、夹爪接近目标物体程度给出激励,价值不高但能显著拉升训练前期进度。核心经验:所有辅助奖励加起来不要超过总奖励的20%,否则模型会精于刷分而忽略主任务。
这里补充一个被很多人忽略的设计:在线RL阶段,语言条件到底怎么参与奖励计算?这个项目采取的做法是“条件奖励偏置”:奖励函数不是纯环境给的,而是根据当前任务的指令动态生成。比如指令是“关抽屉”,那奖励函数里就包含对抽屉开合角度的约束;指令是“抓杯子”,则包含对末端到杯口距离的约束。这种“文本条件化的奖励”是端到端VLA强化学习比较优雅的打开方式——语言指令本身驱动了任务目标,而不是预先给每个任务手工编码一个奖励模板。
3. 实操过程与关键配置
3.1 环境构建与数据准备
训练环境我建议先在仿真里跑,这几乎是所有VLA+RL项目的第一选择,原因就一个字:安全。真实机器人一小时跑不到几个回合,还在探索期完全没法接受;仿真里可以并行开几十个环境,代价只是GPU和内存。物理引擎用MuJoCo或Isaac系列都行,关键是模型操作任务的物理真实性不能太差,至少摩擦系数、物体质量、碰撞体积要大致合理,否则仿真里学到的行为迁移到真实世界时会露出原形。
另一个容易被忽视的是领域随机化。视觉模型对渲染差异特别敏感,如果仿真渲染太干净、纹理太规整,模型的视觉编码器会学会“认dataset”而不是“认物体”。我在搭建仿真环境时,对每张相机图都做了光照扰动、随机纹理叠加、颜色抖动,同时对物体质量、摩擦系数、初始位姿做了范围采样。这么做之后,在线RL学习到的策略在不同环境的迁移成功率明显高,代价只是初期训练曲线波动多一点。
数据准备上有两个方向需要并行。一是离线预训练数据,这个可以从开源操作数据集和自己录制的遥操作数据里混合构建,关键是语言标注质量必须高——很多失败项目,最后查来查去问题出在文本指令是“随手”写的,比如“move object”这种指令让模型根本不知道往哪移动。二是在线交互时奖励判断用到的参考数据,主要用来做KL正则和子目标判断,不需要很多,但覆盖面要广。离线数据的一个小建议:做滤波,把速度抖动异常、突然跳帧的数据筛掉,VLA模型学动作分布的底层逻辑就是统计,脏数据直接影响后续在线RL的初始策略质量。
3.2 模型配置与关键超参数参考
下表是我实际调试下来表现比较稳定的一组配置,可以当作起点,再根据自身任务微调。要注意的是,图片分辨率、batch size、GPU型号不同,下面的参数都要跟着调整。
| 配置项 | 参考值 | 说明 |
|---|---|---|
| 视觉编码器 | SigLIP-SO400M/14 | 常用视觉主干,选它主要看中尺寸和特征的语义对齐能力 |
| 语言模型主干 | 7B级别LLM,LoRA注入rank=32 | 在线RL阶段只微调LoRA层,全参更新太贵且易崩 |
| 最大图序列长度 | 16帧×patchify | 过长会显著拖慢RL回合吞吐,前期可以用6帧做粗训 |
| 离线BC预训练步数 | 8000步左右 | 以验证集loss不再下降为准,不要死板按步数切 |
| 在线RL算法 | PPO,clip=0.2,lr=3e-6 | 大模型做RL,学习率必须压得极低,绝对不能和BC一样给1e-5 |
| 探索噪声初始方差 | 0.3倍动作标准差 | 调大收敛慢,调小探索不足 |
| KL惩罚系数 | 0.01 | 动态调节,目标KL控制在每步0.1~0.3 nats |
| 每轮在线采样回合数 | 每个并行worker采样128步 | 配合GAE的lambda=0.95 |
| 奖励折扣因子gamma | 0.99 | 常规长程任务设置,短程可适当降到0.95 |
| 经验池滚动窗口 | 旧策略概率比控制在0.5~2.0 | 超过范围强制截断,避免策略大步跳崩 |
其实上面的数值里,我最想强调的是一条很容易被忽略的规则:PPO更新时学习率一定要比常规RL低一个量级以上。因为VLA模型的参数空间大、特征维度高,学习率高了很容易出现策略头更新太快而语言主干的表征还没跟上的情况,这时候就会出现“嘴上一套、腿上一套”的诡异行为——语言上说要做什么和实际动作完全错位。
仿真环境的并行数也值得留意。PPO的估算方差随batch size增大可以显著降低,但当batch超过阈值后收益递减,反而增加显存压力。我用的经验值是8个并行环境,每个环境采样一条轨迹,配合GAE做小批量更新,效果和32环境大批量基本持平,但是显存占用少了将近40%。这个比例不一定适合所有任务,但思路是对的:先小批量试,再逐步加大看曲线变化是否值得。
3.3 训练流程:从离线BC到在线RL的平滑过渡
训练流程分成两个阶段,中间有一个衔接技巧。第一阶段是离线行为克隆预训练,数据全部来自人类演示或已有的离线机器操作数据。这个阶段的目标不是让模型表现多完美,而是让模型形成“看到什么指令、该往哪个方向动”的基本能力,同时让策略头和语言模型完成初步适配。我自己在BC阶段会用验证loss做早停,因为BC阶段训练过久会产生过拟合,后续在线RL阶段很难“掰”回来。
衔接我试过两种方式。一种是从BC直接切换,另一种是在中间加一段行为克隆和少量在线数据的混合微调。实测下来,直接切换容易导致在线RL初期策略剧烈震荡,中间加一段混合微调平滑很多,缺点是多花两到三天训练时间。我会建议所有追求稳定性的方案都在衔接处加混合微调——可以在线RL的第一个epoch专门用旧离线数据和新采样的数据按1:1混合,相当于两者间架了一座桥。
在线RL之后也有个容易忽略的环节:收敛后冻结策略再做一个短阶段的行为克隆微调。为什么这么做?因为PPO在线RL最后阶段策略往往会向“刷奖励”方向过拟合,动作分布的多样性变差,使得模型对于环境外的场景的适应能力下降。收敛后重新混入一部分真实人类演示数据做微调,能够把策略“拉回”更平滑的分布,部署时成功率反而更高。这一步我称之为“RL后校准”,一般只跑2~3千步,效果提升显著。
4. 常见问题与排查技巧实录
4.1 训练不收敛或Loss爆炸
在线RL训练不收敛,通常是几个原因叠加的,我按排查优先级列出来了:
- 奖励尺度跨度过大。如果奖励分布从负几百到正几千,网络对于价值函数的预测会在早期阶段出现过大的估计差,导致策略更新方向混乱。解决办法是把奖励除以一个常数做粗略归一化,让奖励量级控制在个位数。我用过一个最简单的办法:在训练过程中给奖励加一个滑动平均的RunningStd归一化,效果很直接,比精心设计奖励快多了。
- 优势估计异常。GAE的lambda如果太高,优势方差比较大,策略更新会大步跳。推荐从0.95起步,如果发现策略分布波动大,降到0.9试一下。同时检查价值函数head的学习率是否比策略head低,我习惯把二者倍数差设为10倍以上,不然价值函数跟不上策略更新节奏,整个训练就是锯齿状。
- 探索噪声被策略梯度完全压制。如果在训练的某个阶段发现新采样的动作几乎和预训练动作完全一致,说明探索不够。把探索方差调回初始状态或者加一点entropy bonus,可以恢复探索能力。
4.2 训练时模型表现好,切换场景就崩
在线RL最让人崩溃的其实是“仿真神,现实狗”现象。这种问题的根源通常在仿真环境不够逼真,或者是策略学到了仿真环境的“捷径”。我做过的排查手段归纳如下:
| 现象 | 排查点 | 处理办法 |
|---|---|---|
| 换光照就失败 | 视觉编码器对光照过拟合 | 仿真里加随机光照强度、色温、阴影干扰 |
| 换物体失败 | 训练时物体种类单一 | 每个语义类别至少采样3种以上外观变体 |
| 换背景失败 | 背景干扰不足 | 加入动态背景纹理、无关物体摆放 |
| 换布局失败 | 初始位姿范围太窄 | 初始位姿采样范围扩大,尤其是旋转角度部分 |
| 夹爪动作不协调 | 未加入接触反馈 | 奖励里加入接触力惩罚或夹取成功判定 |
上面任何一类问题,如果你想等在线RL自己泛化,那基本是等不到的——“模型自己适应”只能在工作点附近的小扰动范围内生效,大范围的分布外迁移必须依赖环境多样性。
还有一个我踩过两次的坑是“视觉主干与策略头在特征空间的对齐度不足”。假设语言模型允许你输入多视角图像,后续某个视角对任务的结果影响特别大,而另外几个视角平时不怎么用,在线RL可能会降低“没用视角”的特征表达能力,导致切换场景后,需要该视角信息的任务直接崩掉。解决办法是在离线BC预训练阶段就固定视角采样,不要给主干太多视角自由度;在线RL阶段如果条件允许,维持至少多视角的输入,以保留表征鲁棒性。
4.3 资源受限时如何降低训练门槛
VLA加RL对硬件的要求确实高,很多人一看7B级别模型加PPO就觉得跑不动。实际上有几种降级方案,可以在牺牲一部分效果的情况下跑通整个流程:
第一是模型规模降级。在线RL阶段把语言模型主干换成3B或1.5B级别,策略头不变,视觉编码器用ViT-B级别。离线BC预训练还是用大模型,预训练结束后把权重蒸馏到小模型再上RL。效果会打折,但整个流程可以在一张24G显存的卡上跑通。
第二是帧率降级。在线训练时把视觉输入降到4帧,动作频率降到10Hz,离线BC预训练用全帧率。等RL收敛后再用全帧率做几步微调,这样把在线采样吞吐提升一倍以上,显存压力也能降不少。
第三是利用异步采样。采样和更新分开跑,采样进程用CPU或低配GPU跑物理仿真,更新进程用主力GPU做PPO更新,中间通过队列交换经验数据。这种异步架构前期搞起来麻烦一点,但可以最大化硬件利用效率,在线采样不会因为策略更新而阻塞。我实际跑下来,异步比同步几乎总能多出30%以上的吞吐。
4.4 在线RL的常见崩溃模式速查
关于小技巧,最简单的一条是录屏看策略行为。哪怕你已经有了所有训练曲线和奖励指标,我仍然建议每隔固定轮次把当前策略部署到仿真里录一段视频,用眼睛看它到底在干什么。很多问题——比如策略学会了原地转圈而非推进物体,或者夹爪一直开合却没接触目标——在标量指标上是隐形的,但视频里一眼就能暴露。我用这个方法至少找到过两类定义之外的问题行为。
再做一张速查表:
| 训练异常 | 可能原因 | 快速检查方法 |
|---|---|---|
| 奖励持续上升但成功率不变 | 奖励灌水,辅助奖励比例过高 | 在环境里单独跑一次奖励解析看是否奖励与任务完成强相关 |
| 价值损失和策略损失一起爆炸 | 奖励尺度太大或优势归一化缺失 | 打印当前奖励的running mean和std |
| 策略熵降至0 | 探索完全消失 | 检查初始方差是否被PPO的熵正则惩罚压得过狠 |
| KL惩罚无限上升 | 策略远离了预训练分布 | 检查是否LoRA层学习了过于激进的rank交互 |
| 训练前10轮就有大量观测超出归一化范围 | 观测归一化参数没包含充足离线数据 | 离线阶段统计时加大数据覆盖面,不要只用一个任务的数据 |
| 一个视角的预测特征逐渐失效 | 模型在丢弃低信息视角 | 固定视角采样,不提供“偷懒”机会 |
4.5 与其他路线(离线RL、分层RL)的取舍
做VLA强化学习不只有“端到端在线RL”一条路。离线RL(比如CQL、IQL那一路)的优势是不需要环境交互、用固定数据集就能训练,对于安全敏感的场景非常友好。但离线RL在VLA场景里有一个致命问题:它只能学到数据集中体现过的行为上限,当任务要求超出数据覆盖范围,它会显得保守,甚至是“安全地摆烂”。而在线RL虽然样本效率低,但策略可以在训练中主动探索新方案,这在数据获取成本高的场景中反而更值得。
分层RL又是另一个路径——高层规划器输出子目标,低层执行器负责动作。这个思路在传统强化学习里有大量验证,但套到VLA上有个问题:高层的语言条件通常已经是任务的天然抽象,再做一层抽象容易引入额外的设计偏差。端到端在线RL省掉了这层手工程序,代价是让整个模型一起背锅。SimpleVLA-RL的价值正在这里:它在端到端和可控性之间找到了一个实用平衡点,通过奖励条件化保留了任务层面的可干预性,同时让底层策略拥有完整的行为自由度。
5. 一些体会和后续可以做的扩展
跑了这一整套VLA在线RL项目之后,我最大的体会是:不要被“端到端”三个字迷惑,它描述的是感知决策架构,不代表你不需要做工程上的中间控制。你依然要处理奖励设计、数据分布、仿真保真度这些老问题。端到端省掉的是人对中间表征的显式定义,不是省掉人的参与——恰恰相反,它对系统工程能力的要求更高了。
如果再让我做一次类似的系统,我会优先补两块。第一块是更细粒度的“成功率跟语言指令的对齐评估”,也就是不止看物理任务达成,还要验证模型是“听指令”去达成还是“碰巧”达成——办法是在测试时对同一场景下发不同指令,看行为是否随指令显著变化。这个指标比最终成功率更能暴露模型是否真正对齐了语言条件。
第二块是接入更丰富的奖励来源。举例来说,如果任务操作过程带有多阶段约束(比如先拿螺丝刀再拧螺丝),那奖励里就需要阶段感知的结构。目前我是用“子目标检测器”手写的,后续可以用一个轻量级的VLM做通用的子目标判断器,这样不同任务之间的奖励模块可以复用,不至于每个新任务都重新写一堆启发式判断函数。
最后关于实验复现,想说一点实际经验:先把训练代码在2~3个任务上跑通、跑稳,再铺到多任务和大模型规模;不要一开始就上满规模。真出了问题,在小规模场景里排查要快得多,等稳定性有了保障,再上大模型和真实机器人,你会发现整个过程其实没有太大的惊喜可踩了。