最近做机器人操作的同行,估计都被 π_RL 刷屏了。这个来自 Physical Intelligence 的工作,目标非常直接:让基于流匹配(Flow Matching)的 VLA(视觉-语言-动作)模型,在完成预训练和 SFT 之后,还能用强化学习(RL)继续做后训练,把策略能力再往上顶一截。如果你接触过 π0 或者同架构的模型,应该知道流匹配策略和扩散策略一样,平时训练用的都是回归式的目标函数,压根没给 RL 留“概率”这个口子。所以“VLA 怎么用 RL 微调”这件事,一直是个绕不开的坑。
这篇博文不打算复述论文的每一行公式,而是想从一个工程实践者的角度,把 π_RL 到底解决了什么问题、它那三个关键设计为什么成立、以及你在自己的 VLA 项目里想复现/借鉴这套思路时,会遇到哪些坑,一并说清楚。内容适合两类人:一类是已经在跑 LIBERO 或真实机械臂数据、想给 VLA 加 RL 后训练的研究生和工程师;另一类是听说过流匹配和 RL、但还没搞清楚两者怎么结合的初学者。读完你至少能明白:为什么 SFT 之后的 VLA 还不够好,π_RL 的流程拆分、基于样本的损失、score function 这三板斧分别砍向哪个痛点,以及如何在 LIBERO 上把整套流程跑通。
1. 为什么 VLA 模型卡在“预训练完成却用不好”这一步
1.1 流匹配策略是当前 VLA 的主流派头
要理解 π_RL,先得说清楚流匹配(Flow Matching)是怎么变成 VLA 策略主力的。VLA 模型做的事情,是输入当前视觉观测、机器人本体状态和一条语言指令,输出一段连续的动作序列。早期的 VLA 多用离散动作或简单的回归头,后来大家发现,机器人动作是强连续、强多模态的分布,直接回归一个均值很容易学到“平均动作”,导致动作平滑但缺乏决断力。扩散模型和流匹配模型能刻画多模态分布,所以逐渐成为主流。
流匹配的基本思想,是在噪声分布(通常是标准高斯)和数据分布之间,人为构造一条条件概率路径。最常用的路径是线性插值:把数据点记作 x1,采样一个噪声 x0,在时刻 t 构造中间状态 x_t = (1 - t)x0 + t x1。模型的任务,是预测这条路径上每个中间状态对应的速度场 vθ(x_t, t),训练目标就是让预测速度接近真实速度 x1 - x0:
L = E_t ||vθ(x_t, t) - (x1 - x0)||²
训练完成后,推理时从噪声出发,用 ODE 数值积分逐步求解,就能得到动作。π0 这类 VLA 的动作头,用的就是这套东西。优点显而易见:训练稳定、采样速度快(只要几步 Euler 方程就行)、能表达多模态动作。缺点是——它没有显式的概率密度,或者更准确地说,它没有直接给出 log π(a|s) 这样一个可以用在策略梯度里的量。
1.2 SFT 之后,VLA 还缺什么
绝大多数 VLA 的预训练流程,是先在互联网级数据上做视觉-语言对齐,再到机器人数据上做行为克隆(SFT)。SFT 的本质是监督学习,学的是“数据中出现过”的行为分布。问题在于:示范数据集的覆盖范围永远有限,模型只会模仿,不会主动尝试超出数据集范围的动作,哪怕那些动作更优。
举个很实际的例子:在 LIBERO 的某个任务里,目标是把方块推到桌角并用另一个物体压住。示范数据里可能只有一种推法和压法,SFT 出来的策略也就只会这一种“行为轨迹”。如果执行过程中夹爪稍微滑了一下,状态偏离了示范分布,策略就不知道下一步该怎么办了,因为它没有被训练过“如何从错误状态中恢复”。强化学习后训练要解决的,正是这个问题:让模型在环境中自己探索、根据奖励信号发现新行为,或者至少学会纠错和优化轨迹。
在 LLM 领域,这个思路已经非常成熟,SFT 之后的 RLHF/GRPO 几乎成了标配。但在 VLA 领域,RL 后训练一直没有铺开,原因很现实:机器人 RL 采样成本高、仿真到真实的 gap 大,而且 VLA 的动作空间是高维连续空间,传统策略梯度算法在这么高的维度上很不稳定。
1.3 为什么 RL 做后训练长期没人碰
过去几年,做 VLA 的团队不是没试过 RL,而是基本都折在了两个问题上。
第一个问题是“没有概率怎么算梯度”。经典 RL 算法,比如 PPO,需要计算策略在当前状态和动作下的对数概率 log π(a|s),然后用重要性采样修正新旧策略差异。可流匹配策略根本没有这个量。你想对动作采样再估计概率吧,流匹配的采样过程是确定性的 ODE 积分,概率密度要通过连续归一化流公式去近似,也就是解另一个概率流 ODE,计算量大到不现实,而且数值误差很大。所以早期尝试基本是死路。
第二个问题是“在线 RL 太脆”。哪怕你强行给流匹配策略配一个概率近似,用 PPO 在仿真环境里采样训练,也会发现策略更新几步之后,分布就漂移了,采样的动作质量急剧下降。这是因为流匹配策略经过回归训练后,分布很尖锐,对参数更新非常敏感。所以 π_RL 这篇工作的贡献,不是提出一个新的 RL 算法,而是找到了一套“适合流匹配策略”的 RL 后训练机制,把上面两个障碍一个个绕过去。
2. π_RL 核心设计拆解:把 RL 搬到流匹配策略上
2.1 流程拆分:解耦采样与优化
π_RL 的第一个关键设计叫 Procedure Split,直译就是“流程拆分”。这招看起来简单,实际是整套方法能跑稳的地基。
传统的 actor-critic RL 流程是:策略 π_old 采样一批轨迹 → 用轨迹估计优势函数 → 用优势函数更新策略到 π_new → 再用 π_new 采样新轨迹,循环往复。问题在于,π_RL 里的策略是一个流匹配模型,每次采样动作都要做 ODE 积分,成本不低;更重要的是,你在 rollout 阶段用的是旧策略,优化阶段却要用新策略去算目标的梯度,新旧策略之间的分布差异怎么控制?在连续高维动作空间里,这是个大麻烦。
π_RL 的做法是:把“采样动作”和“优化动作”彻底分开。Rollout 阶段,由一个行为策略专门负责和环境交互、收集轨迹,这条轨迹里的动作被记录下来;优化阶段,则由另一个策略网络(也就是你真正想训练的 actor)基于同一个状态,重新生成动作,然后用 critic 给出的 Q 值来指导更新。两个过程互不干扰,行为策略不会因为梯度更新而中途变性,训练稳定性大幅提升。
如果你做过 RL,会意识到这其实有点像 DPG(确定性策略梯度)的思路:actor 直接输出动作,critic 给动作打分,梯度通过链式法则流过动作。但 π_RL 跟 DPG 的区别在于,它针对的是流匹配这个特殊结构,不是简单地把动作换成确定性输出,而是在流匹配的 ODE 采样过程中做梯度传播,这就引出了后面两个设计。
2.2 基于样本的损失函数替换
第二个设计是 Sample-based Loss,采样损失。这里的“采样”指的是:在优化 actor 的时候,不是让 actor 在状态空间里盲目找动作,而是在当前策略流匹配采样路径上,抽出一些中间状态和对应的速度预测,基于这些“样本”构造目标函数。
这个设计的直接好处是,它把离散的更新步骤变成了连续的优化问题。你有一个预训练好的流匹配策略,它定义了从噪声到动作的映射。在 RL 更新前,你先从这条路径上采样一批候选动作(相当于是对策略的“提议”),然后通过 critic 计算每个候选动作的 Q 值。下一步,不是简单地把 Q 值最高的动作拿来当监督信号,而是基于这些样本做置信域约束,确保更新后的策略不会离预训练策略太远。
置信域约束这个概念,PPO 和 TRPO 的老玩家肯定熟悉。PPO 用 clip 来限制新旧策略的比率,TRPO 用 KL 散度约束,π_RL 则把约束放在“采样动作的分布差异”上。具体操作上,它要求优化前后策略对同一状态采样的动作分布不能差太远。这就规避了 VLA 策略在 RL 过程中“一步登天、瞬间崩坏”的问题。毕竟 VLA 参数那么多,预训练学到的先验非常宝贵,RL 后训练只能在这个先验附近微调,不能把它冲掉。
2.3 score function 为什么是钥匙
前两个设计解决的是“稳”的问题,第三个设计解决的是“怎么优化”的问题。这就是 score function 的引入,也是 π_RL 最精彩的地方。
前面说过,流匹配模型训练的目标是预测速度场 vθ(x_t, t)。这个速度场有一个隐含的几何意义:在条件概率路径上,它指向的是从当前中间状态走向数据分布的方向。换句话理解,如果把数据分布看作一个山丘,速度场就有点像山丘的上升梯度方向——你沿着它走,就能从噪声走向真实数据。这正是 score 函数的直觉:score 是概率密度的对数梯度 ∇_x log p(x),流匹配模型学到的速度场,在训练充分的情况下,实际上就近似于数据的 score(或者说,经过一个尺度变换后等价于 score)。
π_RL 敏锐地抓住了这一点:既然策略网络输出的速度场可以当 score 用,那在对动作做优化时,就可以直接利用 vθ(xt, t) 作为“动作改进方向”的引导。具体来说,在 actor-critic 框架下,actor 的目标是生成能让 Q 值最大的动作。Q 值对动作的梯度该怎么求?通常的做法是让梯度从 critic 反向传播到 actor,这在高维连续动作空间里方差很大。π_RL 的替代方案是:利用流匹配采样过程中的条件速度信息,和 critic 的 Q 梯度相结合,形成一个更平滑的“复合梯度”,引导动作朝高 Q 值区域移动。
这套设计的精妙之处在于,它完全绕开了“计算 log π(a|s)”这个死结。你不需要知道策略的精确概率密度,只需在采样路径上做几步 ODE 积分,就能拿到一个足够好的动作改进方向。这让 RL 后训练在流匹配策略上第一次变得工程可落地。
2.4 训练稳定性设计
除了上面三块,π_RL 还做了一些工程上的配套设计,这些在论文正文里往往一笔带过,但实际操作时缺一不可。
首先是 Critic 的初始化。π_RL 不是从零开始训练 critic 的,而是用预训练策略先收集一批数据,对 critic 做 warmup,让它对当前策略的动作水平有个合理估计。否则 critic 初始误差太大,actor 会被带偏。
其次是奖励的尺度。VLA 后训练的任务往往奖励稀疏,比如“是否成功”这个 0/1 信号。π_RL 在实践中会对奖励做归一化和折扣处理,同时引入一些中间奖励。不过中间奖励的设计要非常克制,太密集的奖励会让策略走捷径,后面我会细说。
最后是计算资源的分配。流匹配策略的 rollout 本身不便宜,因为它要跑多视角图像编码和动作解码,再加上 RL 的 critic 更新,显存和算力压力都很大。π_RL 在实现上做了很多缓存复用,比如同一批状态下,行为策略采样轨迹后,中间的视觉特征会被缓存下来,优化阶段直接用缓存,不需要重新过一遍视觉编码器。这个优化在实践里能把训练时间缩短至少三分之一。
3. 实操落地:在 LIBERO 上跑通 VLA 的 RL 后训练
3.1 环境准备与工具链
LIBERO 是目前评测 VLA 用得最多的仿真基准,它基于 Robosuite 二次开发,提供多视角 RGB 图像、机器人本体的关节/末端状态和自然语言指令,任务覆盖了物体抓取、堆叠、开门、抽屉取物等日常操作。想在 LIBERO 上复现 π_RL,第一步就得把环境和模型两头都打通。
环境侧,建议直接用官方 Docker 镜像,或者按源码编译。这里有几个容易踩的坑:CUDA 版本要和 PyTorch 匹配,LIBERO 的渲染后端 mjenv 对 OpenGL 依赖较重,headless 服务器上跑需要 xvfb 或 EGL 作为渲染后端。经验是,直接用 EGL 模式,省去 xvfb 的内存开销和崩溃概率。
模型侧,如果你没有预训练好的 VLA 权重,可以先用 π0 的开源实现或者纯仿真数据训一个简化版 VLA 作为起点。注意,π_RL 复现不一定要用完整的 π0 规模模型,你可以用一个小型化 VLA:视觉编码器用 SigLIP-Small,动作头用两三层 MLP 加流匹配模块,语言指令用 T5-Small 编码,整体参数量控制在两亿以内,在单张 24G 显存的卡上就能做 RL 后训练实验。这样做的目的不是刷榜,而是验证 π_RL 的机制在你的数据集上是否有效。
3.2 奖励函数与任务设计
LIBERO 自带任务成功检测逻辑,比如“方块是否到达目标区域”“门是否打开到指定角度”,这些可以作为稀疏奖励的基础。π_RL 的实验表明,稀疏奖励本身就能支持 RL 后训练取得提升,不需要特别复杂的奖励塑形。但有两个经验值得分享。
第一,奖励维度不要过细。LIBERO 每个任务都是高维连续状态,你如果去手写“离目标越近奖励越高”“夹爪张度对不对”之类的密集奖励,策略很容易陷入局部最优——它会发现通过某个小动作就能持续获得微小正向奖励,而不是追求最终的 task success。我个人建议是:以任务成功为主奖励(1 分),可以加一个轻量的接近奖励(比如相对起点距离缩小给 0.1 分),其他一律不给。
第二,利用 goal-conditioned 的辅助信号。LIBERO 的任务描述比较简短,但环境里通常会提供目标物体的位置信息。把这个位置信息作为额外的观测维度喂给 critic,会让 Q 值估计容易很多。π_RL 在论文里也提到,critic 的输入可以比 actor 多接收一小部分 privileged 信息,这在仿真里是合理的,在真实机器人上就需要通过感知模型来补偿。
3.3 关键参数与训练流程
这里给一组我实测下来能稳定收敛的 LIBERO-10 任务参数配置。注意,不同任务套件可能需要微调,但这组参数是合理起点:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 动作预测步长(action chunk) | 16 | 每次模型推理输出 16 步动作,执行其中 8 步后重新推理 |
| 流匹配采样步数(inference steps) | 10 | roll 时用 10 步 Euler 积分,精度够用,速度合适 |
| update 批次大小 | 256 | 从 replay buffer 中采样的状态-动作对数量 |
| critic 学习率 | 3e-4 | 比 actor 略高,让 Q 值先稳下来 |
| actor 学习率 | 1e-5 | 预训练权重规模大,学习率必须压低 |
| 置信域系数 | 0.1 | 控制新旧策略动作分布距离,太大会崩,太小没效果 |
| 折扣因子 γ | 0.97 | 任务时长远,折扣不宜太小 |
| 每轮 rollout 长度 | 50 episodes | 采样成本高,一次性采够再更新 |
训练流程分成四个阶段。阶段一,用预训练 VLA 在 LIBERO 上 rollout,收集约 100 条轨迹,对 critic 做 warmup。阶段二,进入正式 RL 循环:行为策略采样、存入 replay buffer、从 buffer 中采样更新 critic 和 actor。阶段三,每隔一定轮次用当前 actor 替代行为策略,保证采集到的数据不过时。阶段四,保存模型,在所有测试任务上做完整 rollout 评测。
一个关键细节是阶段三的“替换周期”。替换太频繁,行为策略和 actor 之间的差异太小,探索不足;替换太慢,buffer 里的数据分布和 actor 差距太大,更新时会不稳定。我的经验是 10 轮更新替换一次,效果不错。
3.4 推理与评测
训练完成后,评测是另一个隐藏考场。LIBERO 的评测不是简单地跑一遍就行,它对随机种子、初始状态分布特别敏感。同一个模型,换一个任务种子的成功率浮动可能达到 10 个百分点。
规范的评测方式是这样的:每个任务套件固定 50 个 seed(LIBERO 官方提供 seed 列表),对每个 seed 重置环境、运行一轮完整 rollout,记录是否成功,最后统计平均成功率。评测时模型的推理设置要和训练时保持一致:相同的动作 chunk、相同的采样步数、相同的图像分辨率。很多复现对不齐结果,问题就出在这里,训练时采样 10 步、评测时为了“更快”改成了 5 步,成功率立刻掉几个点,然后就开始怀疑算法有问题,其实参数不一致而已。
4. 常见问题与排查技巧实录
4.1 流匹配策略在 RL 中不收敛
这可能是最高频的问题,症状是:actor 的 loss 一开始下降,然后突然剧烈震荡,最后成功率不升反降。原因通常是置信域系数设得太大,策略一下就冲出预训练分布的范围。
排查手段是盯动作分布的距离指标。rollout 阶段记录新策略和旧策略对同一状态生成动作的 L2 距离,如果这个距离在单次更新后翻了一倍以上,基本就是更新过猛。此时把置信域系数调低一个数量级,重新跑。另一个常见原因是 critic 没过拟合就在指导 actor,critic 的 loss 曲线如果一直不降,说明它对当前策略的动作质量根本没有判断力,这时候先要增加 critic warmup 的步数,而不是急着调 actor。
4.2 奖励信号稀疏怎么办
LIBERO 这类任务,稀疏奖励意味着策略可能整轮 rollout 成功率为零,所有轨迹的奖励都是 0,Q 值完全学不出东西。经验解决办法是引入“成功距离”作为辅助奖励,但定义要小心——不是欧氏距离简单相减,而是用物体当前位置到目标区域的最短路径(可以预计算 2D 地图上的距离场)。这种环境级别的先验在仿真里很容易拿到,也不会引入“钻空子”的局部最优,因为仅仅靠近目标不足以成功,还是要完成关键动作。
如果你的任务是长时间任务序列,建议先把任务拆成多个子阶段,每个子阶段有一个终止检测和一个小奖励。但注意,这种方案需要任务结构知识,在真实机器人上往往不适用。π_RL 本身的设定是无任务分拆的单一稀疏奖励,它能跑通靠的是预训练策略就已经有了不错的成功率,RL 只是在中高成功率基础上往上提升。如果你的预训练策略成功率本身不到 20%,不要指望 RL 能力挽狂澜,优先回头解决 SFT 数据质量。
4.3 评测结果与论文对不上
很多复现 π_RL 的团队都会遇到:论文里说在 LIBERO-10 上把成功率从 65% 拉到 85%,自己复现却只涨了两个点。除了前面说的模型规模差异问题,还有一个关键变量是评测任务的分布。LIBERO 有多个 suite,不同 suite 的难度差异很大,比如 spatial 任务(物体位置变化)和 long-horizon 任务(多步骤)对 RL 后训练的敏感性完全不同。π_RL 论文里报告的是特定 suite 上的结果,如果你想复现,先确认自己的实验配置和论文的 Experimental Setup 对齐了。
另外,评测时 rollout 的执行细节也很关键。比如每次动作 chunk 执行多少步就重新推理,这个参数在训练和评测之间必须一致。LIBERO 环境里,执行步数越多,单次推理延迟越低,但控制精度下降,一旦执行步数和训练不一致,成功率波动会非常明显。
4.4 与 PSO 等优化算法做对比实验时,收敛曲线怎么画
这个问题的背景是:如果你想证明 RL 后训练比进化算法(如 PSO)或最优控制(如 MILP 形式的运动规划)更有效,对比实验的公平性就很重要。收敛曲线的横轴不能只比迭代次数,因为 RL 一次 rollout 的开销和 PSO 一次个体评估的开销完全不同。
建议统一横轴为“环境交互步数”或“GPU 采样预算”,而不是迭代轮数。PSO 这类方法通常单次评估只做一些无梯度的动作搜索,不产生真实的交互成本,你要把它的“评估预算”映射到 RL 的采样预算上。实际操作中,我一般会固定总预算为 10 万个环境步,然后分别记录 RL 和 PSO 在这同一预算下的累计奖励和最终成功概率。横轴统一校准后,收敛曲线的对比才有意义。另外纵轴建议同时报告平均奖励和成功率两个指标,因为 RL 后训练优化的是奖励,成功率只是结果,PSO 往往直接优化成功率目标,两者对比时,单看成功率对 RL 不公平。
5. 从 π_RL 延伸:强化学习后训练的更多可能性
5.1 与离线 RL 的互补关系
π_RL 做的是在线 RL 后训练,也就是策略要在环境里现采样。但在很多场景,你手头只有一堆离线数据(比如历史日志、人工演示),这时候会想到 IQL、CQL 这类离线 RL 算法。它们的优点是安全,不会因为探索造成危险动作;缺点也很明显,受限于离线数据的覆盖范围,没法发现数据之外的新行为。
π_RL 的思路其实可以在离线 RL 里借用。流匹配策略的“速度场当 score 用”这个想法,和离线 RL 中的 diffusion Q-learning 有异曲同工之处:都尝试在生成模型框架内引入 Q 值引导,而不是显式算概率。所以一个非常自然的方向是:用离线 RL 做一轮策略预优化,再切到在线 RL 做精调,两阶段接力。这样既避免了从头在线探索的样本浪费,又最终能拿到在线 RL 的探索收益。
5.2 超越机器人操作:π_RL 思路的普适性
虽然 π_RL 的论文场景是机械臂操作,但它的核心方法完全可以迁移到其他连续控制领域。比如自动驾驶的轨迹规划,最近 NVIDIA 开源的 Alpamayo 就是面向辅助驾驶的 VLA 推理模型,同样面临“SFT 之后如何用 RL 优化安全策略”的问题。π_RL 的流程拆分和 score function 引导,在轨迹规划场景里可以直接套用:流匹配策略生成轨迹,critic 根据安全性(如碰撞风险、舒适度)打分,score function 引导轨迹朝更安全方向调整。
再比如无人机导航、四足机器人运动控制,凡是策略头采用的是 flow-matching 或扩散这类生成式模型,π_RL 的机制都是有效的后训练选项。它的价值在于,把“RL 不能用于无似然生成策略”这个认知彻底打破了,以后的 VLA 项目在架构选型时,不用再为了迁就 RL 而选择那些好算概率、但表达能力差的策略头。
5.3 模型规模、计算成本与工程部署
最后聊点务实的事情。很多人关心 π_RL 这种方案离工业落地还有多远。我的判断是,仿真环境的 RL 后训练在半年内会被更多团队复现,因为 LIBERO 这类基准工程化程度已经很高了,难的是真实机器人上的 RL 后训练——真实环境的采样成本、安全约束、奖励感知都是大难题。π_RL 在论文里展示的真实机器人实验,用的是几十台机器人并行采样,这种成本不是一般团队能负担的。
但也不用太悲观。一种务实的路径是:在仿真里完成大部分 RL 后训练,学到鲁棒的行为先验,然后在真实机器人上只用少量交互数据做微调适配。这和 sim-to-real 转移的思路一致,只不过把“用更多仿真数据训练”换成了“用仿真 RL 数据训练”,效果上更有针对性。未来如果 VLA 的仿真器保真度继续提升,π_RL 这类方法很可能成为 VLA 部署前必不可少的最后一公里。
放在更宏观的视角看,VLA 领域正在重走 LLM 的路线:预训练满足通用性,SFT 满足任务对齐,RL 后训练满足真正的高质量部署要求。π_RL 最大的贡献,是给了这个闭环里最关键的一环一个可行的技术方案。我自己在 LIBERO 上按这套方法跑完之后,一个很直观的体会是:SFT 之后的 VLA 就像一个成绩很好但只会照本宣科的学生,π_RL 的 RL 后训练则像是让这个学生去真实考场里多做几套模拟卷——不是死记答案,而是学会在没见过的题目上临场发挥。对任何做机器人学习的人来说,这个思路都值得在自己的项目里认真试一试。