PLD 方法原理:让 VLA 自己发现问题、学会恢复
1. 先看结论
PLD 不是重新训练一个机器人,也不是在推理时额外挂一个 RL 控制器。它只做三件事:
- Probe:从基座 VLA 的真实行为出发,找到它容易失败的状态。
- Learn:训练一个很小的残差策略,只负责把动作修正一点点。
- Distill:把“遇到错误后怎么恢复”的完整行为,用 SFT 蒸馏回原来的 VLA。
2. 为什么需要 PLD
2.1 普通 SFT 的问题
VLA 通常靠人类遥操作数据做 SFT:
人类示范往往是:一开始就知道怎么做,所以不会故意把物体推到角落。但 VLA 部署时可能会:
正常状态 -> 动作有一点偏差 -> 物体被推歪 -> 机械臂卡住
真正缺的不是“再看一遍正常动作”,而是:
在 VLA 自己造成的错误状态里,下一步应该怎么救。
2.2 三种数据的差别
| 数据 | 优点 | 缺点 |
|---|---|---|
| 人类示范 | 质量高,动作自然 | 很少覆盖 VLA 自己的失败状态 |
| 纯 VLA 成功 rollout | 与 VLA 分布一致 | 只包含 VLA 已经会的能力 |
| 纯 RL 专家轨迹 | 成功率高,路径漂亮 | 路径很窄,可能离 VLA 的行为分布很远 |
| PLD 轨迹 | 既贴近 VLA,又包含恢复动作 | 需要额外的机器人 RL 交互 |
3. 核心对象:一个基座,一个小修正器
先把符号固定下来:
- \(\pi_b\):冻结的基座 VLA。
- \(a_b\):基座 VLA 给出的动作。
- \(\pi_\delta\):任务专用的残差策略。
- \(a_\delta\):残差策略给出的修正量。
- \(\bar a\):两者相加后的最终动作。
组合动作是:
其中 \(\xi\) 是残差尺度。它限制小专家不要一开始就把 VLA 的动作改得太狠。
一个直观比喻
把 \(\pi_b\) 想成“知道大方向的通才”,把 \(\pi_\delta\) 想成“站在旁边的纠错教练”:
关键点:残差策略不是替代 VLA,而是站在 VLA 旁边修正它。
4. PLD 的三阶段闭环
训练结束后:
- 残差策略可以丢掉。
- critic 可以丢掉。
- replay buffer 可以丢掉。
- 推理只需要改进后的 VLA。
5. 阶段 1:训练残差 RL 专家
5.1 先把基座冻结
阶段 1 不更新 VLA:
这样做有两个好处:
- RL 只需要训练一个很小的网络,成本低很多。
- 探索失败时,不会直接破坏 VLA 原来的通用能力。
5.2 用基座成功轨迹启动 RL
稀疏奖励下,随机探索很难碰到成功。因此先让基座 VLA 自己运行,收集成功轨迹:
论文仿真设置中,常用每个任务 50 条成功基座轨迹作为离线种子。它们不是最终的 PLD 数据,而是帮助 RL 知道“成功附近长什么样”。
5.3 残差策略如何探索
在每一个状态:
- VLA 给出动作 \(a_b\)。
- 残差策略根据状态和 \(a_b\) 采样 \(a_\delta\)。
- 环境真正执行 \(\bar a\)。
- 根据最终成功或失败更新 critic 和残差策略。
5.4 为什么需要两个 replay buffer
- 只用 online:早期大多失败,成功信号太少。
- 只用 offline:策略不会离开原来的成功路径。
- 两者各取一半:既保留成功锚点,又允许探索新状态。
5.5 RL 只需要理解三条损失
论文使用离策略 actor-critic / SAC 思路。直观上:
Critic:给动作打分
下一步动作仍由“基座 + 残差”构成:
critic 让当前估计靠近这个目标:
实际实现使用两个 \(Q\),取较小者,减少过高估计。
Actor:寻找高价值修正
第一项保留探索,第二项鼓励高成功概率动作。
Cal-QL:让 critic 先保守
它的作用可以用一句话理解:对数据里没见过的动作,不要盲目给高分。 这比死记一个复杂公式更重要。
5.6 阶段 1 伪代码
函数 Learn(task, base_policy):冻结 base_policy# 用基座成功经验启动offline_buffer = 收集 base_policy 的成功轨迹online_buffer = 空用 Cal-QL 初始化 critic随机初始化 residual_policy重复训练:如果还在 warmup:action = base_policy(观测)否则:base_action = base_policy(观测)delta = residual_policy(观测, base_action)action = clip(base_action + ξ * delta)next_obs, reward, done = 环境执行(action)online_buffer.加入(观测, action, reward, next_obs, done)# 每个 batch 一半来自成功离线池,一半来自在线池batch = mix_sample(offline_buffer, online_buffer, ratio=1:1)更新 critic 的 TD 损失更新 residual_policy 的 SAC 损失软更新 target critic返回 residual_policy
到这里得到的是“某一个任务的纠错专家”,不是最终部署模型。
6. 阶段 2:让专家生成真正有用的数据
6.1 纯专家为什么还不够
如果每一局都从初始状态直接让专家完成,轨迹通常非常整齐:
6.2 Base policy probing:先让基座走一段
每一局随机采样一个接管时刻 \(T_{base}\):
执行规则:
这里的“随机”不是给机器人加完全无意义的噪声,而是随机决定让基座先走多久。因此,探索集中在基座实际会到达的状态附近。
6.3 成功轨迹怎么保存
注意:阶段 2 保存的动作是最终执行动作,即:
- 前缀保存 \(a_b\)。
- 后缀保存 \(a_b+a_\delta\)。
- 不保存“只有残差”的伪动作。
6.4 为什么这批数据更适合训练 VLA
PLD 同时满足两件事:
- 状态像基座:VLA 微调后不容易偏离原来的通用分布。
- 动作比基座好:错误状态里有成功恢复标签。
6.5 一个具体例子:方块被推到角落
普通人类示范往往没有 \(C\rightarrow D\);PLD 的价值就在这里。
6.6 阶段 2 伪代码
函数 ProbeAndCollect(base_policy, residual_policy):dataset = 空重复若干回合:重置环境T_base = 随机采样 [0, α*T] 中的一个步数trajectory = 空对每个时间步 t:base_action = base_policy(观测)如果 t < T_base:action = base_action否则:delta = residual_policy(观测, base_action)action = clip(base_action + ξ * delta)trajectory.记录(观测, 任务语言, action)执行动作并得到新观测如果成功:dataset.保存(trajectory) # 保存完整轨迹结束本回合如果失败或超时:丢弃 trajectory结束本回合返回 dataset
7. 阶段 3:把恢复能力教回 VLA
7.1 数据长什么样
最终只需要普通的行为克隆样本:
7.2 不需要发明新的 SFT loss
PLD 不规定 tokenizer,也不规定动作头。它只把数据交给基座原来的训练接口:
- 连续动作头:继续用连续动作回归或流匹配损失。
- 自回归动作头:继续用动作 token 的交叉熵。
核心等式只有一句:
也就是说,PLD 创新在数据怎么来,不在 token 怎么定义。
7.3 蒸馏时学的不是残差
VLA 不会被训练成“预测 \(a_\delta\)”。它直接学习完整的最终动作。这样部署时就不需要再运行残差网络。
7.4 阶段 3 伪代码
函数 Distill(base_policy, pld_dataset):对 pld_dataset 中的每条样本:输入 = 图像 + 状态 + 语言指令标签 = 机器人当时真正执行的动作使用 base_policy 原来的 SFT 训练方式可用 LoRA 降低微调成本返回更新后的 base_policy
8. 训练完成后如何推理
推理阶段没有:
- 残差 actor;
- critic;
- replay buffer;
- 训练用奖励模型。
因此 PLD 对使用者的最终体验很简单:还是调用原来的 VLA,只是它在失败状态下更会恢复。
9. PLD 为什么有效
9.1 它解决了三个错位
9.2 和三种简单方案相比
| 方案 | 它教 VLA 什么 | 它缺什么 |
|---|---|---|
| 只用人类数据 | 正常情况下怎么做 | 错误状态的恢复 |
| 只用基座成功数据 | VLA 已经会的路径 | 新能力和纠错动作 |
| 只用纯 RL 专家 | 一条很漂亮的专家路径 | 基座真实错误分布 |
| PLD | 基座会遇到什么问题,以及如何成功恢复 | 需要机器人交互和成功检测 |
9.3 最核心的因果链
10. 论文结果:只看这几个数字
| 实验 | 基线 | 使用 PLD 后 |
|---|---|---|
| LIBERO,\(\pi_0\) 平均成功率 | 93.4% | 97.2% |
| LIBERO,OpenVLA 平均成功率 | 91.8% | 99.2% |
| SimplerEnv 平均成功率 | 71.8% | 96.6% |
| 真实方块抓取,PLD 数据 | - | 30/30 |
| 真实方块抓取,纯 RL 专家数据 | - | 16/30 |
| 真实方块抓取,人类数据 | - | 10/30 |
这些结果支持的不是“残差专家可以替代 VLA”,而是:
用残差专家生成的数据,能比单纯的人类示范或纯专家 rollout 更适合改进通用 VLA。
11. 只保留必要的实现要点
残差 RL
| 项目 | 论文常用设置 |
|---|---|
| offline / online 采样比例 | 1 : 1 |
| batch size | 256 |
| 折扣因子 \(\gamma\) | 0.99 |
| warmup episodes | 100 |
| 残差尺度 \(\xi\) | LIBERO 约 0.5;SimplerEnv 约 0.1 |
| critic | 两个 Clipped Double \(Q\) |
| critic 初始化 | Cal-QL |
数据采集
- 每个任务训练一个残差专家。
- 随机选择基座前缀长度 \(T_{base}\)。
- 成功才保存完整轨迹。
- 失败轨迹用于 RL 探索,但不作为论文主 SFT 数据。
SFT
- 多任务轨迹合并后再训练通用 VLA。
- 标签是最终执行动作,不是残差动作。
- 使用基座原来的动作头损失。
- 论文采用 LoRA rank 32、8 张 L40 GPU。
12. 这个方法不是什么
不是直接 RL 微调大 VLA
大 VLA 在阶段 1 和阶段 2 都冻结。RL 只训练小型残差策略。
不是给 VLA 加一个永久外挂
残差策略只负责采数据。SFT 完成后,部署只需要一个 VLA。
不是随机给动作加噪声
PLD 的探索是“基座动作 + 学到的残差”,残差由 critic 引导,并且受到 \(\xi\) 限制。
不是把所有失败轨迹直接拿去 SFT
论文主方案保留的是能够最终完成任务的混合轨迹。失败轨迹主要帮助 RL 学习。
不是从零开始就完全无人监督
它仍需要一个已有一定能力的基座 VLA。真实实验也先用人类数据让基座达到可工作的水平。
13. 限制和现实边界
所以 PLD 更适合这样的场景:
- 已有一个“基本会做,但不够稳”的 VLA;
- 可以自动判断成功或失败;
- 允许机器人进行一定量的在线交互;
- 希望减少新增遥操作,而不是完全取消所有人工启动数据。
14. 一页纸总结
最后再用一句话复述:
PLD 让 VLA 先犯自己会犯的错,再让小型 RL 专家把它救回来,最后把“如何自救”教回 VLA。
本文来自博客园,作者:S-X-Q,转载请注明原文链接:https://www.cnblogs.com/sxq-blog/p/22341809