RLT(RL Token)解决的是一个很具体的问题:通用 VLA 已经会做任务,但到了插孔、拧螺丝、穿扎带这类最后一毫米的接触阶段,动作往往不够快,也不够稳。直接用在线强化学习更新数十亿参数的 VLA,真实机器人数据和算力都承受不起;完全绕开 VLA 训练一个小策略,又会丢掉大模型已经学到的视觉和操作知识。RLT 的做法是在两者之间加一个紧凑接口:先把 VLA 内部表征压缩成一个 RL token,再冻结 VLA,用小型 actor-critic 在真实机器人上做在线强化学习。

核心结论可以先概括为四点:

  1. RL token 不是动作 token。它是从 VLA 最后一层内部 embedding 中提取的状态表征,供后续 actor 和 critic 使用。
  2. 在线 RL 不更新整套 VLA。VLA 提供当前状态表征和参考动作,真正在线更新的是轻量 actor-critic。
  3. actor 不是简单输出残差。它以 VLA 动作块为条件,直接输出一个高斯动作块分布,再用行为克隆正则把新动作约束在参考动作附近。
  4. 方法重点优化关键阶段。论文在四个真机精细操作任务上报告最高约 3 倍提速,实际机器人数据从约 15 分钟到 5 小时不等;部分任务的最终策略比人类遥操作演示更快。

相关资料:

1、RLT 把 VLA 变成在线 RL 的老师和特征提取器

VLA 的优势是见过大量视觉、语言和机器人数据,能够理解任务并给出大致正确的动作;它的弱点是参数量大,而且示范数据很难覆盖接触阶段的微小误差。小型 off-policy actor-critic 恰好相反:它可以反复利用 replay buffer 中的数据,在线更新很快,但如果只看普通视觉特征,就很难在少量真机数据中重新学会任务语义和操作结构。

RLT 没有在这两者之间二选一,而是做了明确分工。

组件 输入 输出 是否在在线 RL 阶段更新 实际作用
VLA(论文使用 π 0.6 \pi_{0.6} π0.6 当前多相机图像、语言指令、本体状态 内部 token embeddings、参考动作块 提供通用视觉理解和可执行动作先验
RL token encoder VLA 最后一层 embeddings 紧凑表征 z r l z_{rl} zrl 否,进入在线 RL 前已训练完成 把大模型知识压缩成小型 RL 网络可用的状态
RL token decoder z r l z_{rl} zrl 及已重建 embeddings 重建的 VLA embeddings 在线阶段不使用 只在表征训练时制造信息瓶颈
actor π θ \pi_\theta πθ z r l z_{rl} zrl、本体状态、VLA 参考动作块 连续高斯动作块 在 VLA 建议附近寻找更快、更稳的动作
critic Q ψ Q_\psi Qψ z r l z_{rl} zrl、本体状态、候选动作块 动作价值 Q ( s , a ) Q(s,a) Q(s,a) 用稀疏成功奖励判断动作块质量

在这里插入图片描述

图 1 的重点不是给 VLA 多加一个输出头这么简单,而是把训练拆成两个时间尺度:先离线适配 VLA 并得到稳定的 RL token;再冻结大模型,只让小网络在机器人运行过程中学习。这样每次新采集到一个 episode,都可以在 replay buffer 上做多次梯度更新,而不需要反复训练数十亿参数。

2、RL token 通过重建任务学成信息瓶颈

2.1、为什么不直接把 VLA 全部 embedding 交给 critic

VLA 最后一层包含大量 token,每个 token 又是高维向量。直接把整段表示送给 actor-critic,一方面会让小网络迅速膨胀,另一方面也会把在线 RL 变成高维表征再学习,失去样本效率优势。

RLT 在 VLA 后面加一个轻量 encoder-decoder。encoder 读取最终层 token embeddings,并在序列末尾附加一个可学习的 <rl> embedding;encoder 在这个特殊位置的输出就是 z r l z_{rl} zrl。decoder 必须只依靠 z r l z_{rl} zrl 逐步重建原始 embeddings,因此这个单一 token 被迫保留与任务有关的信息。

在这里插入图片描述

论文实验中的 RL token 形状为 1 × 2048 1\times 2048 1×2048。需要注意,图中 decoder 只负责训练表征,在线 RL 和最终推理并不需要继续做 embedding 重建。

RL token 的提取公式为:

z r l = g ϕ ( [ z 1 : M , e r l ] ) M + 1 z_{rl}=g_\phi\left([z_{1:M},e_{rl}]\right)_{M+1} zrl=gϕ([z1:M,erl])M+1

其中:

符号 含义 作用或来源
z 1 : M z_{1:M} z1:M VLA 最后一层的 M M M 个输入 token embeddings 来自当前观测和语言指令经过 VLA 后的内部表示
e r l = e ϕ ( <rl> ) e_{rl}=e_\phi(\texttt{<rl>}) erl=eϕ(<rl>) 可学习的特殊 token embedding 为压缩表征预留读出位置
g ϕ g_\phi gϕ 轻量 encoder transformer 汇聚整段 VLA 表征
下标 M + 1 M+1 M+1 encoder 序列的最后一个位置 取该位置输出作为 z r l z_{rl} zrl
ϕ \phi ϕ RL token encoder-decoder 的参数 在任务演示数据上训练

decoder 的重建损失为:

L r o = E D [ ∑ i = 1 M ∥ h ϕ ( d ϕ ( [ z r l , z ˉ 1 : i − 1 ] ) ) i − z ˉ i ∥ 2 2 ] \mathcal{L}_{ro}=\mathbb{E}_{\mathcal{D}}\left[\sum_{i=1}^{M}\left\|h_\phi\left(d_\phi([z_{rl},\bar z_{1:i-1}])\right)_i-\bar z_i\right\|_2^2\right] Lro=ED[i=1M hϕ(dϕ([zrl,zˉ1:i1]))izˉi 22]

这里的 D \mathcal{D} D 是任务特定演示数据, d ϕ d_\phi dϕ 是 decoder transformer, h ϕ h_\phi hϕ 是线性输出投影。 z ˉ i = s g ( z i ) \bar z_i=\mathrm{sg}(z_i) zˉi=sg(zi) 中的 s g \mathrm{sg} sg 表示 stop-gradient:重建损失不会反向修改 VLA embeddings。帽子并未出现在这个公式里;横线 z ˉ \bar z zˉ 专门表示停止梯度后的重建目标。

这一步可以和 VLA 的监督微调同时进行,论文算法写成 L r o + α L v l a \mathcal{L}_{ro}+\alpha\mathcal{L}_{vla} Lro+αLvla。但无论是否联合微调, L r o \mathcal{L}_{ro} Lro 都不应通过目标 embedding 反向更新 VLA。完成适配后,VLA 参数和 ϕ \phi ϕ 都被冻结。

2.2、训练流和推理流不是一条链

RLT 一共有两个训练阶段,容易混淆的是 decoder、奖励和人工干预分别只在特定阶段出现。

阶段一:任务适配与 RL token 训练

  1. 输入任务演示中的当前图像、语言指令和本体状态。
  2. VLA 产生最终层 embeddings,并可选地用演示动作继续做 SFT。
  3. encoder 将 embeddings 压缩成 z r l z_{rl} zrl
  4. decoder 重建原始 embeddings,用 L r o \mathcal{L}_{ro} Lro 训练 encoder-decoder。
  5. 训练结束后冻结 VLA 和 RL token 模块。

阶段二:真机在线强化学习

  1. 当前观测进入冻结的 VLA,得到参考动作块 a ~ \tilde a a~;同一观测产生 z r l z_{rl} zrl
  2. actor 根据 z r l z_{rl} zrl、本体状态和 a ~ \tilde a a~ 生成新的动作块。
  3. 机器人执行该动作块,操作者在 episode 结束时给出成功或失败的稀疏奖励,必要时进行遥操作接管。
  4. transition 写入 replay buffer,critic 用 TD 目标更新,actor 在提高 Q Q Q 值的同时保持接近参考动作。
  5. rollout 与学习异步执行,论文中每个 actor update 对应两个 critic updates,update-to-data ratio 为 5。

最终推理

最终推理只需要当前多相机图像、任务指令和本体状态,不需要未来图像、深度图、decoder 重建目标或训练期奖励。VLA 仍然要在线生成参考动作和内部表示,actor 再生成要执行的连续动作块。论文还提到,可在训练最后让 VLA 学习何时切换到 RL policy,否则关键阶段的切换仍需要人工触发。

3、在线 RL 本质上是在 VLA 动作附近做局部搜索

3.1、为什么使用动作块

论文的 π 0.6 \pi_{0.6} π0.6 一次预测 H = 50 H=50 H=50 个动作,对应 50 Hz 控制下约 1 秒。RLT 不执行完整的 50 步,而是让 RL actor 输出长度 C = 10 C=10 C=10 的动作块,并满足 C < H C<H C<H。短一些的执行块能更快重新观察环境;相对于单步控制,它又把一个数千步任务压缩成更短的决策序列,使稀疏终局奖励更容易向前传播。

论文真机实验每步动作维度为 14,因此 actor 输出的是 10 × 14 = 140 10\times14=140 10×14=140 维连续动作块。这里有两种不同的时间: C C C H H H 是机器人真实控制步数,不是 diffusion 或 flow matching 内部的去噪时间。

critic 的 chunk-level TD 损失为:

L Q = E ( x , a 1 : C , x ′ ) ∼ B [ ( Q ^ − Q ψ ( x , a 1 : C ) ) 2 ] \mathcal{L}_{Q}=\mathbb{E}_{(x,a_{1:C},x')\sim\mathcal{B}}\left[\left(\hat Q-Q_\psi(x,a_{1:C})\right)^2\right] LQ=E(x,a1:C,x)B[(Q^Qψ(x,a1:C))2]

Q ^ = ∑ t ′ = 1 C γ t ′ − 1 r t ′ + γ C E a ′ ∼ π θ [ Q ψ ′ ( x ′ , a ′ ) ] \hat Q=\sum_{t'=1}^{C}\gamma^{t'-1}r_{t'}+\gamma^C\mathbb{E}_{a'\sim\pi_\theta}\left[Q_{\psi'}(x',a')\right] Q^=t=1Cγt1rt+γCEaπθ[Qψ(x,a)]

其中, x = ( z r l , s p ) x=(z_{rl},s^p) x=(zrl,sp) s p s^p sp 是本体状态; B \mathcal{B} B 是 replay buffer; γ \gamma γ 是折扣因子; ψ ′ \psi' ψ 表示 target critic 参数; r t ′ r_{t'} rt 是动作块内部第 t ′ t' t 步的奖励。论文实际只有 episode 成功时的稀疏 + 1 +1 +1 奖励,其余为 0。实现采用 TD3 风格目标网络,附录进一步说明使用两个 Q Q Q 网络并取较小值。

3.2、actor 是条件动作生成,不是显式残差相加

actor 的分布写成:

π θ ( a 1 : C ∣ x , a ~ 1 : C ) = N ( μ θ ( x , a ~ 1 : C ) , σ 2 I ) \pi_\theta(a_{1:C}\mid x,\tilde a_{1:C})=\mathcal{N}\left(\mu_\theta(x,\tilde a_{1:C}),\sigma^2I\right) πθ(a1:Cx,a~1:C)=N(μθ(x,a~1:C),σ2I)

a ~ 1 : C \tilde a_{1:C} a~1:C 是 VLA 采样出的参考动作块, μ θ \mu_\theta μθ 是 actor 预测的均值, σ \sigma σ 是固定标准差, I I I 是单位阵。actor 直接输出完整动作块分布,并没有定义 VLA 动作加 residual 这一显式结构。所谓 refinement,来自参考动作条件输入和下面的正则项。

L π ( θ ) = E s ∼ B a 1 : C ∼ π θ [ − Q ψ ( x , a 1 : C ) + β ∥ a 1 : C − a ~ 1 : C ∥ 2 2 ] \mathcal{L}_{\pi}(\theta)=\mathbb{E}_{\substack{s\sim\mathcal{B}\\a_{1:C}\sim\pi_\theta}}\left[-Q_\psi(x,a_{1:C})+\beta\left\|a_{1:C}-\tilde a_{1:C}\right\|_2^2\right] Lπ(θ)=EsBa1:Cπθ[Qψ(x,a1:C)+βa1:Ca~1:C22]

第一项鼓励 actor 选择 critic 认为价值高的动作,第二项把动作约束在 VLA 建议附近。 β \beta β 控制约束强度;论文没有在正文或附录中给出统一的具体取值。消融中令 β = 0 \beta=0 β=0 会造成最大单项性能下降,说明少量真机数据不足以支持 actor 在整个高维动作空间中盲目探索。

还有一个容易忽略的细节:如果 actor 始终看到 a ~ \tilde a a~,训练早期可能只学会复制。因此论文对一个 batch 中的随机样本把整段参考动作置零,即 reference-action dropout;附录给出的概率为 50%。推理时则始终提供参考动作。

3.3、以网线插入为例看完整闭环

机器人已经拿住网线并接近端口时,基础 VLA 往往会试探性靠近、回撤、重新对准。RLT 的执行过程可以具体化为:

  1. 三路当前相机图像和本体状态进入 π 0.6 \pi_{0.6} π0.6,VLA 给出未来 50 步参考动作。
  2. VLA 最后一层图像 embeddings 被压缩为 1 × 2048 1\times2048 1×2048 z r l z_{rl} zrl
  3. actor 读取 z r l z_{rl} zrl、本体状态和参考动作前 10 步,输出 10 × 14 10\times14 10×14 的新动作块。
  4. 机器人执行这 10 步;到下一个 chunk 边界重新观测和规划。
  5. 插入成功时 episode 得到 + 1 +1 +1,失败则为 0;新数据进入 replay buffer 后继续更新 actor-critic。

论文观察到,最终策略会更直接地插入;第一次没对准时,还会施压并轻微晃动连接器,利用机构顺应性完成插入。这种策略不在遥操作演示中,而是在线探索得到的。

4、完整系统把学习集中在关键阶段

在这里插入图片描述

四个任务分别是螺丝安装、扎带穿扣、网线插入和电源插头插入。完整任务持续 30~120 秒,即 50 Hz 下约 1500~6000 个控制步;真正需要 RL 的关键阶段通常只有 5~20 秒。RLT 因此让基础 VLA 负责抓取、搬运和粗对准,只在插入、穿扣或旋紧阶段切换给 RL policy。

完整训练循环包含四个工程环节:

  1. Warmup:先用基础 VLA rollout 填充 replay buffer,让 critic 不是从空数据开始学习。
  2. 异步 rollout 与 update:机器人继续采集数据,学习线程反复利用旧 transition 更新网络。
  3. 人工干预:操作者可以用遥操作动作覆盖 actor 输出;写入 replay 时,人工动作同时替换 VLA reference,让 actor 学习纠正动作。
  4. 中间步重采样:虽然一次执行长度为 C C C 的 chunk,系统仍保存中间观测。论文以 stride 2 构造重叠动作块,每秒数据约可形成 25 个 RL 样本。

这种设计提高了样本利用率,但也限定了适用场景:RLT 更像给已经会做的技能打磨关键接触段,不是用几分钟在线数据教会 VLA 一个从未掌握的长时程任务。

5、源码解析:以 RLinf 的两阶段 RLT 实现为参照

Physical Intelligence 没有把 RLT 合入官方 openpi,但 RLinf 已在自己的官方仓库中实现完整的 Stage 1 表征训练和 Stage 2 在线 actor-critic,并提供 Franka 真机插销与 ManiSkill PegInsertionSideWideClearance-v1 两套配置。RLinf 使用自研的 PyTorch π 0.5 \pi_{0.5} π0.5 路线 openpi_rlinf,官方文档说明其数值行为与 JAX OpenPI 参考实现对齐。

这里的 RLinf 官方实现是指 RLinf 项目正式维护的代码,并不表示它是 RLT 论文作者源码。后面的类、函数和配置都对应检查 commit 9ad44393d15b0e93461d7415591110678ae17ef6

5.1、目录和两条训练路线

RLinf/
├── examples/
│   ├── sft/config/
│   │   ├── realworld_rlt_stage1_sft_openpi_pi05.yaml
│   │   └── maniskill_rlt_stage1_sft_openpi_pi05.yaml
│   └── embodiment/config/
│       ├── realworld_rlt_stage2_ac_mlp.yaml
│       ├── maniskill_rlt_stage2_ac_mlp.yaml
│       └── maniskill_rlt_stage2_td3_mlp.yaml
└── rlinf/
    ├── models/embodiment/
    │   ├── modules/rlt_token_transformer.py
    │   ├── openpi_rlinf/sft_action_model.py
    │   ├── openpi_rlinf/eval_action_model.py
    │   └── mlp_policy/
    │       ├── rlt_mlp_policy.py
    │       └── rlt_td3_mlp_policy.py
    ├── algorithms/rlt/
    │   ├── rollout.py
    │   ├── route.py
    │   └── transition.py
    └── workers/actor/
        ├── fsdp_rlt_ac_policy_worker.py
        └── fsdp_rlt_td3_policy_worker.py

RLinf 当前提供两种 Stage 2 head:

路线 配置 主要特征 当前环境
rlt_ac *_rlt_stage2_ac_mlp.yaml 固定标准差高斯 actor、twin-Q、chunk TD target、-Q+BC Franka 真机与 ManiSkill
rlt_td3 maniskill_rlt_stage2_td3_mlp.yaml 独立 direct actor、TwinQ critic、target actor、动作噪声 当前只配置 ManiSkill

论文正文说采用 TD3,RLinf 的 rlt_ac 已包含论文所需的 twin-Q、target network 和无熵正则 actor,但框架接口沿用了 SAC worker。新增 rlt_td3 则把 head 和 worker 明确拆成 TD3 形式,更适合做算法级对照。

5.2、Stage 1:RL Token 的自回归重建确实落到了代码中

论文概念 RLinf 文件/类/函数 代码作用
VLA prefix hidden states sft_action_model.py::_sft_forward_with_rlt_prefix() 同一次 π 0.5 \pi_{0.5} π0.5 forward 计算 flow-matching loss 并保留 prefix 输出
在序列末尾附加 RL token RLTTokenEncoder.forward() 将 prefix 与可学习 token 拼接,经两层 self-attention,取最后位置
自回归 decoder RLTTokenDecoder.forward() 使用右移 teacher embeddings 和 causal mask 逐位置重建
stop-gradient RLTTokenTransformer.reconstruct() 对 prefix embeddings 调用 detach()
mask 后 MSE RLTTokenTransformer.loss() 只在有效 prefix token 上计算重建误差
联合 VLA SFT OpenPiPytorchSFTActionModel.sft_forward() 返回 rlt_loss + rlt_alpha * vla_loss

encoder 的核心数据流与论文公式(1)一致:

prefix_tokens = prefix_embs + prefix_pos
rl_tokens = self.rl_token_embed + self.rl_token_pos_enc
x = torch.cat([prefix_tokens, rl_tokens], dim=1)
for layer in self.layers:
    x = layer(x, mask=mask)
return x[:, -1:]

这里的输入形状是 [B, M, 2048],输出是 [B, 1, 2048]。Stage 2 前再通过 encode_flat() 展平为 [B, 2048]z_rl

decoder 并不是普通并行 autoencoder,而是严格使用 teacher forcing 和因果掩码:

frozen_targets = target_embeddings.detach()
shifted_targets = frozen_targets[:, :-1]
decoder_inputs = torch.cat([rl_tokens, shifted_targets], dim=1)
causal_mask = torch.triu(torch.ones(M, M, dtype=torch.bool), diagonal=1)

第一个位置只看到 z r l z_{rl} zrl,第 i i i 个位置还能看到前面真实 embedding 的右移输入,对应论文的 d ϕ ( [ z r l , z ˉ 1 : i − 1 ] ) d_\phi([z_{rl},\bar z_{1:i-1}]) dϕ([zrl,zˉ1:i1])。这一点比只用 position query 并行重建更贴近论文原式。

Stage 1 的总损失在 sft_action_model.py 中写成:

vla_loss = per_timestep_loss.mean()
rlt_loss, _ = self._rlt_forward(prefix_output, prefix_mask)
loss = rlt_loss + self.rlt_cfg.rlt_alpha * vla_loss

RLinf 的 Franka 与 ManiSkill 示例都设置 rlt_alpha: 1.0,即联合更新 VLA action objective 和 RL token 模块。论文允许只训练 token 模块或与 VLA SFT 联合训练,因此这是论文允许的一种具体选择,不是唯一配置。

5.3、Stage 2:冻结特征模型,只把紧凑 transition 送进 replay

推理侧的 eval_action_model.py::extract_rlt_obs() 一次完成三件事:

  1. 用冻结的 Stage 1 π 0.5 \pi_{0.5} π0.5 构建 prefix KV cache,并从 prefix hidden states 编码 z_rl
  2. 从同一个 prefix cache 运行 flow-matching Euler 采样,得到 VLA ref_chunk
  3. 从环境状态中选择 proprio,组成下面的观察字典。
return {
    "z_rl": z_rl,
    "proprio": proprio.float(),
    "ref_chunk": ref_chunk.float(),
}

Stage 2 replay 不保存原始 RGB 图像,而是保存:

curr_obs = {z_rl, proprio, ref_chunk}
action   = 实际发送给环境的动作块
next_obs = {next_z_rl, next_proprio, next_ref_chunk}

RLTMLPPolicy 中,actor 输入是 ref_chunk + z_rl + proprio,critic 输入是 z_rl + proprio + candidate action。actor 产生固定标准差 Normal 分布的样本,然后通过 tanh 限制到归一化动作范围。reference-action dropout 以样本为单位把整段参考动作置零,默认概率为 0.5。

critic worker 对 chunk 内奖励先折扣求和,再用下一状态的 twin-Q 最小值 bootstrap:

reward_target = discounted_chunk_rewards(rewards)
q_next = torch.minimum(q1_target, q2_target)
target_q = reward_target + not_done * gamma**chunk_horizon * q_next

actor loss 对应论文公式(5),但 RLinf 把两个权重显式拆开:

actor_loss = -q_weight * qf_pi.mean() + bc_weight * bc_loss

普通样本的 BC target 是 VLA ref_chunk;如果 transition 带有人工或仿真 expert intervention 标记,对应时间步的 BC target 改成实际 expert action。ManiSkill 配置还支持从 warmup 权重逐步过渡到在线权重,避免训练早期 Q 值不可靠时 actor 过早偏离 VLA。

5.4、关键阶段切换、人工接管和数据路由

RLinf 把当前到底执行谁的动作单独放在 algorithms/rlt/route.py

  • Franka 真机由 keyboard_rlt_policy_switch_wrapper.py 提供 rlt_switch_flags,操作者按 b 后从 VLA reference 切换到 Stage 2 actor。
  • ManiSkill 根据是否抓住插销、与孔位距离等任务信息自动识别关键阶段;warmup 完成前仍执行 VLA reference。
  • 可选 expert takeover 会在 actor 连续多个 chunk 没有插入进展时触发。训练 replay 记录 expert action,评估时关闭 expert,只测基础 VLA 加学习后的 actor。

这里有一个当前 commit 的代码与文档差异:文档写道真机切换前的 VLA 步骤也会进入同一 replay buffer,但 RealworldRLTRoute 实际把 record_transition 直接设为 rlt_switch_flags,replay ingest 又会跳过 record_transition=False 的行。因此按当前代码,真机切换前 transition 不会写入 Stage 2 replay。复现时应以代码行为为准,或等待项目后续修订。

5.5、论文设定与 RLinf 示例配置的差异

项目 论文方法/实验 RLinf 示例 影响
VLA 基座 π 0.6 \pi_{0.6} π0.6 PyTorch openpi_rlinf π 0.5 \pi_{0.5} π0.5 checkpoint、基座能力和动作采样配置不同
RL token decoder 自回归 teacher forcing 右移 target + causal mask 核心结构与论文一致
token 输入 固定指令任务中去掉语言 embeddings 示例 rlt_image_only: False,保留语言 token Stage 1 prefix 语义和长度不同
论文真机动作 14 维/步, H = 50 H=50 H=50 C = 10 C=10 C=10,50 Hz Franka 为 7 维、reference 20 步、actor 10 步;ManiSkill 为 8 维、10 步、10 Hz 动作块维度和真实时长不能照搬
Stage 1 权重 可选联合 VLA SFT 示例固定 rlt_alpha=1.0 RLinf 会同时优化 flow-matching action loss
Stage 2 actor 2~3 层轻量 MLP rlt_ac 复用通用 MLPPolicy;rlt_td3 显式 2×256 MLP 结构接口不同但仍是小型 head
在线切换 人工选择关键阶段,可再训练自动切换 Franka 按键切换;ManiSkill 用任务状态自动 gate 仿真 gate 使用了环境特权信息,不等于纯视觉自动切换
结果口径 四个 π 0.6 \pi_{0.6} π0.6 真机任务 RLinf 文档给出自己的 peg insertion 结果 两者不能合并为同一实验表

5.6、最小运行入口与复现注意事项

RLinf 给出的 Stage 1 和 Stage 2 入口分别为:

git clone https://github.com/RLinf/RLinf.git
cd RLinf

# Stage 1:π0.5 SFT + RL token reconstruction
bash examples/sft/run_vla_sft.sh realworld_rlt_stage1_sft_openpi_pi05

# Stage 2:冻结 Stage 1,真机异步 actor-critic
bash examples/embodiment/run_realworld_async.sh realworld_rlt_stage2_ac_mlp

ManiSkill 对应 maniskill_rlt_stage1_sft_openpi_pi05maniskill_rlt_stage2_ac_mlp;显式 TD3 head 使用 maniskill_rlt_stage2_td3_mlp

复现时最容易出错的不是网络本身,而是 Stage 1 和 Stage 2 的数据语义:repo_idconfig_namenorm_stats.jsonaction_dimproprio_dimz_dim 和 reference chunk 长度必须一致。特别是 Stage 2 的 rollout.rlt_feature_model.model_path 必须指向 Stage 1 FSDP checkpoint 的 actor 目录;actor.model 描述的是从头训练的小型 Stage 2 head,不能误填成 Stage 1 checkpoint。

6、实验结果:成功率和速度需要放在同一口径下看

论文使用四个真机任务,基础 VLA 均先用每个任务 1~10 小时遥操作演示进行适配。在线 RL 根据难度运行 400~1000 个 episodes;扣除 reset 和其他开销后,每个实验产生约 15 分钟到 5 小时真实机器人数据。关键阶段评估每个任务运行 50 个 episodes;完整任务评估只覆盖更难的螺丝和扎带任务。

指标有两个:

  • 成功率:人工给出的二值任务成功比例。
  • 吞吐量:每 10 分钟成功完成次数,同时反映成功率和执行速度。

在这里插入图片描述

主要结论如下:

  1. 在基础策略已经较可靠的网线和电源插入上,RLT 主要提升速度,关键阶段约快 3 倍,同时维持高成功率。
  2. 在螺丝和扎带这两个更难任务上,成功率提升更明显。完整任务图中约提升 40 和 60 个百分点;论文正文表述为提高 40% 和 60%。
  3. 完整任务的绝对成功率低于受控关键阶段,因为前序抓取和搬运误差会累积。RLT 没有消除这些上游失败。

在这里插入图片描述

基线比较只在 Ethernet 任务上进行。单步 HIL-SERL 和 PLD 很难把稀疏奖励传过数百个控制步;DAgger 与 DSRL 能达到较高成功率,但吞吐量低于 RLT。论文报告 RLT 将相对基础策略的平均完成步数约缩短 2 倍。这里不能推导出 RLT 在所有任务上都优于所有在线 RL 方法,因为对比任务只有一个,且各方法都沿用论文自己的硬件、控制频率和奖励设置。

在这里插入图片描述

消融结果说明四个设计都在起作用:

  • 用 ImageNet 预训练 ResNet-10 替代 RL token,吞吐量下降约 50%。
  • C = 10 C=10 C=10 改成单步动作后,策略无法稳定达到基础 VLA 的表现。
  • 去掉 BC regularizer,即 β = 0 \beta=0 β=0,造成最大单项性能下降。
  • 去掉 reference-action pass-through 最终仍可能追上,但学习更慢,早期失败更多。

完整 RLT 在关键阶段只消耗约 5 分钟机器人数据时就超过对照策略;对应墙钟实验时间约 40 分钟,说明机器人数据分钟数不等于端到端训练用时。

在这里插入图片描述

Ethernet 关键阶段的 episode 长度中位数分别为 RLT 66 步、遥操作 146 步、基础策略 228 步。论文还指出,一半 RLT episodes 比所有遥操作演示都快。这是 RL 超过演示上限的直接证据,但它针对的是固定任务的关键插入阶段,不代表完整长时程任务整体超过人类。

7、方法价值、局限和工程判断

RLT 最有价值的地方,不是提出了一个更大的 VLA,而是给出了“大模型先验 + 小模型在线适配”的清晰接口。RL token 让 actor-critic 不必重新处理原始图像,也不用更新大模型;动作块、参考动作条件和 BC 正则又把探索限制在一个更安全、更有希望的局部区域。这套思路适合已有 SFT 基础、但最后接触精度和节拍仍不稳定的工业或实验室任务。

它的限制同样明确:

  1. 仍需要每个任务 1~10 小时的演示做初始适配,并不是零样本在线学习。
  2. 在线训练依赖终局成功标签、人工接管和关键阶段切换;论文没有完成全自动闭环。
  3. RL token 是任务特定演示上训练的紧凑表示,跨任务复用能力没有被系统验证。
  4. 在线阶段虽然不更新 VLA,但每个 chunk 边界仍要运行 VLA 并产生参考动作,部署算力并没有降到只有 MLP。
  5. 论文作者未公开 RLT 源码、checkpoint、统一超参数和完整延迟分解。RLinf 虽然给出了可运行实现,但外部复现仍需按自己的机器人补齐接口与安全机制。
  6. 实验集中在四个固定真机精细任务,没有覆盖域外场景、组合泛化或不同本体,因此不能把结果外推为通用 VLA 在线 RL benchmark。

从工程落地看,可以优先选择基础 VLA 成功率已有一定水平、失败集中在可识别关键阶段、episode 可快速 reset、奖励可明确判定的任务。若基础策略连抓取和粗定位都不稳定,应该先补数据和 SFT;若关键阶段具有高风险或不可逆失败,还需要动作限幅、碰撞检测和人工接管,不能只依赖 β \beta β 正则保证安全。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐