论文:DexPIE: Stable Dexterous Policy Improvement from Real-World Experience
作者:Ruizhe Liao, Wenrui Chen(通讯), Liangji Zeng, Haoran Lin, Fan Yang, Kailun Yang, Yaonan Wang(湖南大学)
项目主页:siiuuuuuu.github.io/DexPIE


一、介绍:模仿学习的天花板,不是数据不够,而是"只会照葫芦画瓢"

做机器人操作的研究者都躲不开一个灵魂拷问:给你一个灵巧手、一只机械臂,怎么才能让它真正学会干活?

最近几年 VLA(Vision-Language-Action)模型铺天盖地,动辄几十亿参数,但真落地到灵巧操作(dexterous manipulation)上,大家其实还是主要靠模仿学习(Imitation Learning, IL)。原因无他:灵巧手自由度极高、接触力极度丰富、视觉遮挡家常便饭,端到端训练一个策略比登天还难。

但模仿学习有两个结构性缺陷,这两个缺陷在灵巧手上会被放得更大:

  1. 复合误差(compounding errors):训练时看到的都是专家的干净轨迹,部署时只要一步走偏,后续状态全在训练分布外,策略不会修,只会一路错到底;
  2. 数据饥渴:专家演示永远不够用,尤其是灵巧操作——每次演示要戴 VR 手套、校准手指重定向,采集一条高质量轨迹的成本极高。

于是近年研究把眼光投向了部署后训练(post-training):策略先在演示数据上预热(warm-start),然后放到真实环境里自己跑、自己错、人类偶尔拉一把,把这段"犯错与纠错"的经验也用来更新策略。这本质上就是 RL 的思想:用真实世界的 rollout 数据,而不是更多专家演示,去改进策略。

这条路在平行夹爪(parallel gripper)上已经走得比较顺,但灵巧手场景有几个额外麻烦:

  • 人干预时必须同时管腕部位姿和手指姿态,接管切换要顺滑;
  • 任务通常是长时序的(开抽屉、放纸巾、开盖子、放糖果),稀疏奖励下信用分配(credit assignment)极其困难;
  • 演示数据是人在 25Hz 平滑遥操作下采集的,部署时却是 diffusion policy 的 chunk 推理,同步推理会带来动作卡顿,生成一种"演示-部署鸿沟"(demonstration-deployment gap),让后训练数据里混满噪声行为。

这篇论文提出的 DexPIE(Dexterous Policy Improvement from Experience)就是一套专为灵巧手、真实世界、长时序任务设计的后训练框架。它的核心贡献可以拆成四根支柱:

  1. human-following intervention system:操作员先对齐机器人当前的手腕位姿和手指姿态,再顺滑接管,从任意状态都能给出纠错演示;
  2. staged DAgger:不仅从初始状态采集 rollout,还从人工指定的中间阶段启动采集,制造"失败-纠错"配对数据,为价值函数学习提供中间锚点;
  3. asynchronous inference in relative action space:把训练时 action chunking 中的 action masking 机制扩展到相对动作空间,消除同步推理造成的卡顿,弥合演示-部署鸿沟;
  4. continuous optimality indicator:不用 RECAP 那种二元的"好/坏"标签,而是用基于优势值的连续 sigmoid 函数给 diffusion policy 做条件化(conditioning),保留动作质量的相对排序。

在三个真实世界灵巧操作任务上,DexPIE 只进行了一次后训练迭代,就比纯行为克隆基线提升了 37 个百分点。这个提升幅度在长时序真实机器人任务里非常罕见。

如果你熟悉视频编码,可以把 DexPIE 的底层直觉翻译成编码语言:演示数据相当于高质量 I 帧序列,但部署时网络延迟导致解码丢帧、画面撕裂;后训练就是用一个带反馈的帧缓存(staged DAgger 提供锚点)和自适应码率(continuous optimality)去修复这个传输链。而 async inference 对应的就是——别让解码器空等下一帧,而是用前向预测把动作流续上。


二、原理:四个模块如何拼成一套后训练流水线

2.1 Human-Following Intervention:先对齐,再接管

传统遥操作通常分两种模式:

  • ** leader-follower**:人主动引导,机器人跟随;但干预时人已经在自己的舒适姿态,而机器人可能在别扭姿态,接管瞬间动作跳变;
  • shared autonomy / incremental end-effector control:系统辅助,人只微调末端;不够直观,不适合复杂手指姿态。

DexPIE 的折中叫 human-as-follower:操作员在正式接管前,先把自己的手腕朝向和手指姿势对齐到机器人当前预测的位姿/姿态(Figure 2),然后按键盘命令触发接管。此时系统记录两个参考位姿:

  • 当前 VR tracker 位姿 Tt0v∈SE(3)T_{t_0}^v \in SE(3)Tt0vSE(3)
  • 当前机器人末端位姿 Tt0ee∈SE(3)T_{t_0}^{ee} \in SE(3)Tt0eeSE(3)

接管后每一时刻 t,tracker 的相对运动被施加到机器人参考位姿上:

Ttee=Tt0ee⋅ΔTtv,其中 ΔTtv=(Tt0v)−1TtvT_t^{ee} = T_{t_0}^{ee} \cdot \Delta T_t^v, \quad \text{其中} \ \Delta T_t^v = (T_{t_0}^v)^{-1} T_t^vTtee=Tt0eeΔTtv,其中 ΔTtv=(Tt0v)1Ttv

手指关节则直接用 Manus 手套数据重定向到 Inspire 手。切换时加平滑滤波,避免抖动。

这套机制有几个工程意义:

  • 操作员始终从机器人当前状态出发纠错,而不是从自己的习惯姿态出发;
  • 生成的干预数据与 policy 输出在动作空间中自然连续,降低分布偏移;
  • 失败状态和成功修正轨迹天然配对,是 critic 学习最需要的正负样本。

2.2 Staged DAgger:不要只从起点练,中间阶段也要重启

标准 DAgger 要求 rollout 从任务初始状态开始,一直跑到底。长时序灵巧任务的麻烦是:初始阶段 policy 还能凑合,到了中后期开始出错,但你很难从初始状态"恰好"采集到足够多的中后期失败样本。

DexPIE 的 staged DAgger 是 exploring-starts 假设的工程化放松:

  1. 一次自主 rollout 失败后,把环境重置到失败发生前的那个阶段
  2. 在该阶段让 policy 继续跑,等快要再次失败时由人接管纠错;
  3. 同时记录失败轨迹纠错轨迹,两者配对进入 replay buffer;
  4. 也可以直接人为把机器人摆到某个中间阶段作为 rollout 起点,覆盖中后期状态。

这带来的收益是双重的:

  • 探索覆盖:中后期罕见状态被显式覆盖;
  • critic 锚点:长时序价值估计被切成了若干短阶段子问题,价值函数更容易学到"进度感",而不是只依赖最后的稀疏成功/失败信号。

论文强调,失败轨迹不是垃圾,而是宝藏——没有它们,critic 会高估那些其实容易失败的 states/actions,导致 policy improvement 时选错样本。但失败样本必须和对应的纠正样本配对,才能告诉策略"这里错了,应该怎么改"。

2.3 Asynchronous Inference:消除动作 chunk 的"掉帧"

这是 DexPIE 里最容易被低估、但也最贴近部署实际的模块。

现在的机器人策略普遍用 action chunking:policy 一次预测未来 H 步的动作块 At=[at,at+1,…,at+H−1]A_t = [a_t, a_{t+1}, \ldots, a_{t+H-1}]At=[at,at+1,,at+H1],然后逐帧执行。如果采用同步推理(synchronous inference),必须等当前 chunk 执行完才推理下一个 chunk,推理期间控制器没有新动作,产生延迟导致的卡顿或暂停。这些卡顿带来两类问题:

  1. 机器人动作流不再像演示那样平滑,导致接触状态改变(比如手本来已经贴住物体,一停就滑脱);
  2. 后训练数据里混入大量"本来不该出现的停顿行为",让 critic 学到一个由 heterogeneous behaviors 诱导的混乱价值函数。

DexPIE 的做法是异步推理:在当前 chunk 还剩 mmm 步没执行完时,就用当前观测 ot+mo_{t+m}ot+m 提前开始推理下一个 chunk At+1A_{t+1}At+1。关键点是:前一个 chunk 的后半截动作是相对于旧观测 oto_tot 预测的相对动作,现在要把它们改写成相对于新观测 ot+mo_{t+m}ot+m 的相对动作,作为 At+1A_{t+1}At+1前缀(prefix)。这样 At+1A_{t+1}At+1 一开始继续执行旧 chunk 的剩余动作,等旧 chunk 执行完再把前缀去掉,后续动作无缝衔接。

训练时为了适应这种"动作前缀长度可变"的情况,DexPIE 对 action chunk 做随机 masking:以概率 pmprep_m^{pre}pmpre 随机把前 iii 步动作 mask 掉(0≤i≤n0 \leq i \leq n0in,n 为最大延迟),让 policy 学会在各种剩余前缀长度下都能继续生成合理动作。这与 classifier-free guidance 训练时的条件 dropout 思路如出一辙。

这个设计对视频编码背景的读者尤其亲切:异步推理 = 解码器端的前向帧预测/插帧,prefix 变换 = GOP 边界处的参考帧切换,随机 masking = 训练网络适应不同程度的丢包/丢帧。

2.4 Continuous Optimality Indicator:用优势值给 diffusion policy 做"软标签"

后训练数据 heterogeneous:有专家演示、有成功 rollout、有失败 rollout、有人类干预段。简单地把所有"成功轨迹"当正例、失败当负例会损失大量信息——同一次 rollout 里,前面 90% 可能做得不错,只有最后一步错。

DexPIE 采用 product-policy view(来自 cfgRL),在参考策略 πref\pi_{ref}πref 附近构造一个改进目标策略:

π^(at∣ot)∝πref(at∣ot)⋅p(I∣ot,at)β\hat{\pi}(a_t \mid o_t) \propto \pi_{ref}(a_t \mid o_t) \cdot p(I \mid o_t, a_t)^\betaπ^(atot)πref(atot)p(Iot,at)β

其中 p(I∣ot,at)=f(Aπref(ot,at))/Z(ot)p(I \mid o_t, a_t) = f(A^{\pi_{ref}}(o_t, a_t))/Z(o_t)p(Iot,at)=f(Aπref(ot,at))/Z(ot),Z 是 action-independent 归一化常数。取 log 并对 action 求梯度:

∇atlog⁡π^(at∣ot)=∇atlog⁡πref(at∣ot)+β∇atlog⁡p(I∣ot,at)\nabla_{a_t} \log \hat{\pi}(a_t \mid o_t) = \nabla_{a_t} \log \pi_{ref}(a_t \mid o_t) + \beta \nabla_{a_t} \log p(I \mid o_t, a_t)atlogπ^(atot)=atlogπref(atot)+βatlogp(Iot,at)

再通过 Bayes 规则改写:

∇atlog⁡π^(at∣ot)=(1−β)∇atlog⁡πref(at∣ot)+β∇atlog⁡πref(at∣ot,I)\nabla_{a_t} \log \hat{\pi}(a_t \mid o_t) = (1-\beta) \nabla_{a_t} \log \pi_{ref}(a_t \mid o_t) + \beta \nabla_{a_t} \log \pi_{ref}(a_t \mid o_t, I)atlogπ^(atot)=(1β)atlogπref(atot)+βatlogπref(atot,I)

这和 Classifier-Free Guidance(CFG)的形式一模一样。因此工程上只要训练一个支持条件 dropout 的 diffusion policy,条件就是连续 optimality 值 ItI_tIt,推理时就可以用 guidance strength β\betaβ 做 CFG。

核心改进在于 fff 的构造。RECAP 用二值:

fbin(A)=1{A>qlow}f_{bin}(A) = \mathbb{1}\{A > q_{low}\}fbin(A)=1{A>qlow}

DexPIE 改用连续 sigmoid:

f(A)=sig(α⋅A−qlowqhigh−qlow)f(A) = \text{sig}\left( \alpha \cdot \frac{A - q_{low}}{q_{high} - q_{low}} \right)f(A)=sig(αqhighqlowAqlow)

其中 qlowq_{low}qlowqhighq_{high}qhigh 是整个数据集中 advantage 估计的分位数。sigmoid 的优势:

  • 有界、光滑,不像指数函数会把信号集中在极少数高优势样本上;
  • 保留动作质量的相对排序——A=63% 和 A=78% 不再是同一个"好"标签;
  • 配合 CFG 可以在推理时通过 β\betaβ 控制" conservativeness "。

这个设计的编码器类比:不是简单分 I/P/B 帧,而是给每帧一个"信息重要度"连续评分,码率分配按评分精细加权。


三、公式:从产品策略到扩散训练损失

DexPIE 的数学部分不算多,但每一步都踩在 RL + Diffusion Policy 的交汇点上,值得逐个写清楚。

3.1 标准 RL 定义

MDP:观测 ot∈Oo_t \in \mathcal{O}otO,动作 at∈Aa_t \in \mathcal{A}atA,策略 π(at∣ot)\pi(a_t \mid o_t)π(atot)。轨迹 τ=(o0,a0,…,oT)\tau = (o_0, a_0, \ldots, o_T)τ=(o0,a0,,oT),其诱导分布:

ρπ(τ)=p(o0)∏t=0T−1π(at∣ot)p(ot+1∣ot,at)\rho^\pi(\tau) = p(o_0) \prod_{t=0}^{T-1} \pi(a_t \mid o_t) p(o_{t+1} \mid o_t, a_t)ρπ(τ)=p(o0)t=0T1π(atot)p(ot+1ot,at)

折扣回报:

R(τ)=∑t=0TγtrtR(\tau) = \sum_{t=0}^{T} \gamma^t r_tR(τ)=t=0Tγtrt

价值函数:

Vπ(ot)=Eτt:T[∑l=tTγl−trl]V^\pi(o_t) = \mathbb{E}_{\tau_{t:T}} \left[ \sum_{l=t}^{T} \gamma^{l-t} r_l \right]Vπ(ot)=Eτt:T[l=tTγltrl]

N-step 优势估计:

Aπ(ot,at)=E[∑l=tt+N−1γl−trl+γNVπ(ot+N)]−Vπ(ot)A^\pi(o_t, a_t) = \mathbb{E}\left[ \sum_{l=t}^{t+N-1} \gamma^{l-t} r_l + \gamma^N V^\pi(o_{t+N}) \right] - V^\pi(o_t)Aπ(ot,at)=E[l=tt+N1γltrl+γNVπ(ot+N)]Vπ(ot)

3.2 产品策略与引导分数(式 1-3)

目标策略:

π^(at∣ot)∝πref(at∣ot)⋅p(I∣ot,at)β(1)\hat{\pi}(a_t \mid o_t) \propto \pi_{ref}(a_t \mid o_t) \cdot p(I \mid o_t, a_t)^\beta \tag{1}π^(atot)πref(atot)p(Iot,at)β(1)

取 log 并关于 ata_tat 求梯度:

∇atlog⁡π^(at∣ot)=∇atlog⁡πref(at∣ot)+β∇atlog⁡p(I∣ot,at)(2)\nabla_{a_t} \log \hat{\pi}(a_t \mid o_t) = \nabla_{a_t} \log \pi_{ref}(a_t \mid o_t) + \beta \nabla_{a_t} \log p(I \mid o_t, a_t) \tag{2}atlogπ^(atot)=atlogπref(atot)+βatlogp(Iot,at)(2)

通过 Bayes 规则把条件概率拆成"无条件 score 与条件 score 的凸组合":

∇atlog⁡π^(at∣ot)=(1−β)∇atlog⁡πref(at∣ot)+β∇atlog⁡πref(at∣ot,I)(3)\nabla_{a_t} \log \hat{\pi}(a_t \mid o_t) = (1-\beta) \nabla_{a_t} \log \pi_{ref}(a_t \mid o_t) + \beta \nabla_{a_t} \log \pi_{ref}(a_t \mid o_t, I) \tag{3}atlogπ^(atot)=(1β)atlogπref(atot)+βatlogπref(atot,I)(3)

式 3 说明:只要训练时把 optimality indicator I 作为条件 dropout,推理时就可以像 CFG 一样用 β\betaβ 调节引导强度。这是 DexPIE 把 RL 优势信号注入 Diffusion Policy 的数学接口。

3.3 分布式价值函数:把回报变成高斯软标签(式 4-6)

由于数据来自多种行为源(演示、成功 rollout、失败 rollout、干预段),价值分布是连续且多峰的,不能用单点值估计。DexPIE 把经验回报 Rt(τ)=∑t′=tTrt′R_t(\tau) = \sum_{t'=t}^{T} r_{t'}Rt(τ)=t=tTrt 建模为高斯,并在 B 个离散 bin 上生成软标签:

qb(τ,t)=exp⁡(−(vb−Rt(τ))22σ2)∑j=1Bexp⁡(−(vj−Rt(τ))22σ2),b=1,…,B(4)q_b(\tau, t) = \frac{\exp\left( -\frac{(v_b - R_t(\tau))^2}{2\sigma^2} \right)}{\sum_{j=1}^{B} \exp\left( -\frac{(v_j - R_t(\tau))^2}{2\sigma^2} \right)}, \quad b=1,\ldots,B \tag{4}qb(τ,t)=j=1Bexp(2σ2(vjRt(τ))2)exp(2σ2(vbRt(τ))2),b=1,,B(4)

目标向量:

q(τ,t)=[q1(τ,t),q2(τ,t),…,qB(τ,t)](5)q(\tau, t) = [q_1(\tau, t), q_2(\tau, t), \ldots, q_B(\tau, t)] \tag{5}q(τ,t)=[q1(τ,t),q2(τ,t),,qB(τ,t)](5)

critic 最小化预测分布 pϕ(V∣ot)p_\phi(V \mid o_t)pϕ(Vot) 与高斯软标签之间的交叉熵:

Lcritic(ϕ)=E(τ,t)∼D[H(q(τ,t),pϕ(V∣ot))](6)\mathcal{L}_{critic}(\phi) = \mathbb{E}_{(\tau,t)\sim \mathcal{D}} \left[ H\left(q(\tau, t), p_\phi(V \mid o_t)\right) \right] \tag{6}Lcritic(ϕ)=E(τ,t)D[H(q(τ,t),pϕ(Vot))](6)

3.4 连续最优性函数与演员损失(式 7-8)

连续最优性函数:

f(Aπref(ot,at))=sig(α⋅Aπref(ot,at)−qlowqhigh−qlow)(7)f(A^{\pi_{ref}}(o_t, a_t)) = \text{sig}\left( \alpha \cdot \frac{A^{\pi_{ref}}(o_t, a_t) - q_{low}}{q_{high} - q_{low}} \right) \tag{7}f(Aπref(ot,at))=sig(αqhighqlowAπref(ot,at)qlow)(7)

其中 sig(⋅)\text{sig}(\cdot)sig() 是 sigmoid,α\alphaα 控制锐度,qlowq_{low}qlowqhighq_{high}qhigh 分别是数据级 advantage 分位数。It=f(Aπref(ot,at))I_t = f(A^{\pi_{ref}}(o_t, a_t))It=f(Aπref(ot,at))

Diffusion Policy 的演员损失(DDPM 前向加噪):

Lactor=ED,η[∥ϵ−ϵθ(a~t:t+h,ot,It,η)∥22](8)\mathcal{L}_{actor} = \mathbb{E}_{\mathcal{D}, \eta} \left[ \left\| \epsilon - \epsilon_\theta(\tilde{a}_{t:t+h}, o_t, I_t, \eta) \right\|_2^2 \right] \tag{8}Lactor=ED,η[ϵϵθ(a~t:t+h,ot,It,η)22](8)

训练时以概率 pmp_mpmItI_tIt mask 成 null condition,支持推理时 CFG。损失里的 η∼U{1,…,T}\eta \sim \mathcal{U}\{1,\ldots,T\}ηU{1,,T} 是扩散时间步,ϵ∼N(0,I)\epsilon \sim \mathcal{N}(0,I)ϵN(0,I) 是噪声。

3.5 奖励函数(式 9)

采用稀疏终端奖励 + 每步惩罚:

rt={0,t=T and success−Cfail,t=T and failure−1,otherwise(9)r_t = \begin{cases} 0, & t=T \ \text{and success} \\ -C_{fail}, & t=T \ \text{and failure} \\ -1, & \text{otherwise} \end{cases} \tag{9}rt=0,Cfail,1,t=T and successt=T and failureotherwise(9)

CfailC_{fail}Cfail 设为任务最大长度,折扣因子 γ=1\gamma=1γ=1。回报归一化到 [−1,0][-1,0][1,0]。这个设计很朴素,但正因为奖励稀疏,才需要 staged DAgger 和分布式 critic 来熬过信用分配难关。

3.6 行为克隆基线损失(式 10)

LBC=EDdemo,η[∥ϵ−ϵθ(a~t:t+h,ot,η)∥22](10)\mathcal{L}_{BC} = \mathbb{E}_{\mathcal{D}_{demo}, \eta} \left[ \left\| \epsilon - \epsilon_\theta(\tilde{a}_{t:t+h}, o_t, \eta) \right\|_2^2 \right] \tag{10}LBC=EDdemo,η[ϵϵθ(a~t:t+h,ot,η)22](10)

与 DexPIE 式 8 的唯一区别:没有 ItI_tIt 条件。所有 post-training 方法共享同一套 actor 架构,保证公平比较。


四、图示:DexPIE 流水线一张图

                         ┌─────────────────────────────────────────────────────────┐
                         │                    Human Teleoperation                   │
                         │  (Vive tracker + Manus glove, human-as-follower takeover)│
                         └───────────────────────┬─────────────────────────────────┘
                                                 │
                                                 ▼
┌──────────────────────────────────────────────────────────────────────────────────────────┐
│                                Real-World Deployment Loop                                │
│  ┌──────────┐    success/failure    ┌──────────────────────────────────────────────────┐  │
│  │   Env    │◄───────────────────────┤ policy rollout  (async inference, chunk size 24) │  │
│  │ (UR5 +   │                        └──────────────┬─────────────────────────────────┘  │
│  │  Inspire │                                       │                                    │
│  │  hand)   │◄──────── intervention ────────────────┘                                    │
│  └────┬─────┘                                                                           │
└───────┼───────────────────────────────────────────────────────────────────────────────────┘
        │ recorded trajectories (autonomous + human-corrected + failed)
        ▼
┌──────────────────────────────────────────────────────────────┐
│                      Offline Dataset                          │
│  Demo Buffer  +  Replay Buffer (success/failure/intervention) │
└───────┬──────────────────────────────┬───────────────────────┘
        │                              │
        ▼                              ▼
┌───────────────┐              ┌──────────────────────┐
│  Critic       │              │  Actor               │
│  (Distributional│              │  (Diffusion Policy + │
│   Value Net)   │              │   U-Net)             │
│  - R3M frozen  │              │  - R3M encoder       │
│  - MLP → B bins│              │  - optimality cond.  │
│  - soft CE (6) │              │  - DDPM loss (8)     │
│  - 250 epochs  │              │  - 300 epochs        │
└───────┬───────┘              └──────────┬───────────┘
        │                                 │
        ▼                                 ▼
┌───────────────┐              ┌──────────────────────┐
│ advantage est.│              │ improved policy π'   │
│ + quantiles   │─────────────►│ (replaces π_ref for  │
│               │   I_t = f(A) │  next loop)          │
└───────────────┘              └──────────────────────┘

异步推理的"前缀变换"细节(对应 Figure 3):

时间轴:  t        t+1      ...     t+m       ...      t+H-1      t+H       ...
同步:    A_t ──────────────────────────────────────────►| 停等推理 | A_{t+1} ►
                 ^^^^^^^^^^^^^^^^^^^^^^^卡顿^^^^^^^^^^^^^^^

异步:    A_t ───────────────► 剩余 H-m 步被转成相对 o_{t+m} 的 prefix
                              │
                              └───► 同时用 o_{t+m} 推理 A_{t+1} = [prefix | new]
                              当 A_t 执行完,去掉 prefix,继续执行 new

staged DAgger 的数据采集

标准 DAgger:  s0 ──► s1 ──► s2(fail)    很难覆盖中后期状态
                                ↑ reset

Staged DAgger:
  (1) s0 ──► s1 ──► s2(fail) ──record
       ↓ reset to s1 or s2-just-before-fail
  (2) s1 ──► s2 ──► s3(fail) ──human intervention ──record corrected
       ↓ reset to s3
  (3) s3 ──► success

Result: 失败段 + 修正段 配对进入 replay buffer

五、踩坑点:DexPIE 没说的坑,和论文里老实承认的坑

坑 1:稀疏奖励下的 credit assignment 根本没解决,只是"绕过"

DexPIE 的奖励只有三种取值(0、-C_fail、-1),Credit assignment 靠 staged DAgger 提供中间阶段的经验回报,靠分布式价值网络拟合多峰分布。但附录 B.3 展示了一个真实的 credit assignment 失败案例:机器人因为抓取位置太低反复撞桌子, rollout 被碰撞检测终止。策略成功图像里看不到撞桌子,于是价值函数错误地给"接近纸巾盒去抓取"的 state 打了低分,反而让策略在部署时害怕接近目标,造成反复抓取失败。

这说明:失败数据不是越多越好,critic 必须能正确归因失败原因。视觉 critic 在状态-失败因果链不透明时(比如碰撞检测触发在 proprioception 里但不在图像里),会把失败错误归因到视觉特征。论文的对策是过滤这类"原因不可见"的失败轨迹,但这本质上是把难题丢给数据清洗。

坑 2:演示-部署鸿沟被填了一次,但换了 inference 策略又会再开

异步推理是为了弥合同步推理的 gap。但反过来说,如果 DexPIE 的策略被拿去一个同步推理的硬件平台(比如算力更差、chunk size 更大的场景),训练出来的价值函数可能又会被 heterogeneous behaviors 带偏。论文的消融显示,用同步数据收集策略只有 70%,异步数据收集能到 84%。这说明后训练数据对推理方式是耦合的——未来如果换 inference 机制,可能需要重新采集后训练数据。

坑 3:中间阶段是人工指定的

Staged DAgger 要求操作者"选择中间阶段"。对于开抽屉放纸巾、开盖放糖果这类任务,阶段划分还算明显。但如果任务阶段划分模糊或状态不可恢复,这个机制就不太好用。论文结论也承认"more diverse exploration strategies remain an important direction"——言下之意:现在还是人类在扛着探索。

坑 4:只验证了单臂

Limitations 第一句就写明:评估限于单臂操作。灵巧操作的双臂协同、更高自由度手、分钟级长时序任务都是未解问题。单臂实验的成功不能直接推广到双手协调——因为两只手会互相遮挡,human-following 干预的参考姿态也要从 SE(3)SE(3)SE(3) 变成两条臂的 SE(3)×SE(3)SE(3) \times SE(3)SE(3)×SE(3),接管复杂度显著上升。

坑 5:高自由度手的重定向不够对齐

论文用的是 6-DoF Inspire 手(RH56DFX)。如果换到 Shadow Hand 或 Allegro 这种 16+ DoF 的手,Manus 手套的重定向会引入更大失真,human-as-follower 的"对齐"假设更难成立。论文建议未来需要更 human-hand-aligned 的重定向算法,必要时加入触觉反馈来修正 coarse hand gestures。

坑 6:qlow/qhighq_{low}/q_{high}qlow/qhighα\alphaα 是硬超参数

连续 optimality 函数依赖数据集级 advantage 分位数。每次新增数据、每次任务变化,分位数分布都会变。论文把 qlow=0.6q_{low}=0.6qlow=0.6qhigh=0.8q_{high}=0.8qhigh=0.8α=5\alpha=5α=5 设为固定值,这三个数直接决定多少样本被当作"高优"、多少被当作"低优"。如果任务难度变化导致 advantage 分布整体漂移,固定分位数可能失效。实践中需要在线重新估计分位数,或采用自适应标准化。

坑 7:价值函数的可解释性有限

Figure 7 展示了价值曲线:绿色是成功推进,黄色是过渡调整,红色是失败相关段。看上去很美好,但和坑 1 一样,价值函数的错误归因可能导致策略越学越不敢做事。分布式 critic 缓解了单点估计的 variance,却不能解决因果结构缺失的问题。


六、源码拆解:从架构到训练超参

论文没有放出官方完整代码,但 Appendix A.1-A.4 给出了实现细节。我把它们整理成"伪源码级"拆解,便于复现或对号到 PyTorch 代码。

6.1 整体模型架构(对应 Figure 1(a))

# Actor: Optimality-Conditioned Diffusion Policy
class DexPIEActor(nn.Module):
    def __init__(self):
        self.visual_encoder = load_pretrained_R3M(frozen=False)  # R3M encoder
        self.optimality_embed = SinusoidalEmbedding(dim=cond_dim)
        self.proprio_proj = Linear(proprio_dim, cond_dim)
        self.noise_pred_net = UNet1D(          # Diffusion Policy 的 U-Net
            input_dim=action_dim,
            cond_dim=cond_dim*3,              # visual + proprio + optimality
            diffusion_step_embed_dim=cond_dim
        )

    def forward(self, noisy_action, obs, proprio, I_t, eta):
        visual_feat = self.visual_encoder(obs)       # R3M features
        opt_emb = self.optimality_embed(I_t)
        p_emb = self.proprio_proj(proprio)
        cond = concat([visual_feat, p_emb, opt_emb], dim=-1)
        return self.noise_pred_net(noisy_action, cond, eta)

# Critic: Distributional Value Network
class DexPIECritic(nn.Module):
    def __init__(self, B=201):
        self.visual_encoder = load_pretrained_R3M(frozen=True)
        self.value_head = MLP([visual_dim + proprio_dim, 512, 512, 512, B])

    def forward(self, obs, proprio):
        v = self.visual_encoder(obs)
        logits = self.value_head(concat([v, proprio]))  # (B,)
        return F.softmax(logits, dim=-1)               # value distribution

6.2 动作空间与相对动作变换

# 动作 = 相对末端执行器动作 + 绝对灵巧手关节动作
action = concatenate([
    relative_eef_action,        # UMI 风格,相对于当前观测 o_t 的 6/7 DoF
    absolute_hand_joint_action  # Inspire hand 关节绝对位置
], dim=-1)

# 前缀变换:把旧 chunk 剩余动作从 o_t 的相对参考系转到 o_{t+m}
def transform_action_prefix(old_chunk_tail, obs_t, obs_t_plus_m):
    # old_chunk_tail 是相对于 o_t 预测的相对动作
    # 用 o_t 和 o_{t+m} 的位姿差异把动作重新参数化
    new_prefix = relative_to_obs_frame(old_chunk_tail, obs_t, obs_t_plus_m)
    return new_prefix

论文的动作空间选择是刻意为之:手臂用相对动作(便于不同位姿下泛化),手指用绝对关节位置(因为灵巧手关节空间小范围运动对接触控制更敏感)。

6.3 训练时 action masking(async inference 的训练配套)

# 每个 trajectory 取 action chunk A_t = [a_t, ..., a_{t+H-1}]
# 以 p_pre_m = 0.9 的概率触发 masking;若触发,随机选 i ~ Uniform(0, n)
# 把前 i 步动作设为 mask token,训练网络从部分前缀生成后续动作
if random() < p_pre_m:
    i = random.randint(0, n)
    A_t[:i] = MASK_TOKEN

这里 ppre=0.9p_{pre}=0.9ppre=0.9 非常高,意味着 90% 的训练样本都会带 mask,让 policy 对异步推理的 prefix 长度鲁棒。注意 n=4n=4n=4 是最大推理延迟,chunk size H=24H=24H=24

6.4 数据收集与回放(对应 A.2)

# 初始 demo 数据
D_demo = collect_human_demonstrations(task, n_demos)

# 后训练循环(只跑 1 轮)
for episode in range(n_post_episodes):
    # 1) 随机选择起始阶段:初始状态 or 人工指定的中间阶段
    start_stage = sample_initial_stage(staged_candidates)
    reset_env_to_stage(start_stage)

    # 2) policy 自主 rollout
    traj_auto, outcome = rollout_with_async_inference(policy)
    D_replay.add(traj_auto)

    if outcome == 'failure' or exploration_bottleneck:
        # 记录失败段
        D_replay.add(traj_auto, label='failure')
        # 重置到失败前状态
        reset_env_to_just_before_failure(traj_auto)
        # human-following intervention 接管并纠错
        traj_corrected, outcome = human_intervention_rollout()
        D_replay.add(traj_corrected, label='success/intervention')

# 合并成 offline dataset
D_offline = D_demo + D_replay

关键观察:失败轨迹和纠错轨迹配对加入 critic 训练,但 actor 训练用整个 offline dataset(包括失败段)并按 ItI_tIt 加权。这意味着即使失败 rollouts 里某些段可能做得很好,连续 optimality 函数也能把它们识别为中等质量数据,而不是直接丢掉。

6.5 Critic 训练流程

# 对每个 (tau, t) 计算经验回报
R_t = sum(r[t:]) / max_episode_length   # gamma=1, 归一化到 [-1,0]

# 构造高斯软标签 q(tau, t) over B bins (B=201)
q = gaussian_soft_label(R_t, bins=v_bins, sigma=sigma)

# 前向
p_dist = critic(o_t, proprio_t)

# 交叉熵损失
loss_critic = cross_entropy(q, p_dist)

# 期望价值用于 advantage
V = expectation(p_dist)   # sum(v_b * p_b)

6.6 Actor 训练流程

# 采样 (o_t, a_{t:t+h})
a0 = A[t:t+h]
eta = random.randint(1, T_diffusion)
a_noisy = sqrt(alpha_bar[eta])*a0 + sqrt(1-alpha_bar[eta])*eps

# 计算连续 optimality
A = n_step_return(t, tau, V) - V[o_t]
I_t = sigmoid(alpha * (A - q_low) / (q_high - q_low))

# 以 p_m=0.3 的概率 mask 条件
if random() < p_m:
    I_t = NULL_CONDITION

# 预测噪声
pred_eps = actor(a_noisy, o_t, proprio_t, I_t, eta)
loss_actor = MSE(pred_eps, eps)

6.7 推理:带 CFG 的异步控制

# 初始化当前 chunk A_t
A_t = policy.sample(obs_t, I_t=1.0, beta=1.5)   # CFG guidance

while not done:
    # 当 chunk 剩余 m 步时开始异步推理
    if steps_remaining_in_chunk <= max_delay_n:
        obs_next = current_obs()
        prefix = transform_action_prefix(A_t[-steps_remaining_in_chunk:], obs_t, obs_next)

        # 异步采样下一个 chunk
        A_next = policy.sample(
            obs_next,
            I_t=1.0,
            beta=1.5,
            action_prefix=prefix
        )

    # 执行当前动作
    execute(A_t[0])
    A_t = A_t[1:]

    if len(A_t) == 0:
        # chunk 执行完,去掉 prefix 继续
        A_t = A_next[len(prefix):]

注意推理时 ItI_tIt 强制设为 1.0("最优"条件),并通过 β=1.5\beta=1.5β=1.5 的 CFG 增强最优行为。如果想更保守,可以降低 β\betaβ

6.8 关键超参数表(A.3)

超参数取值作用
action chunk size H24一次推理覆盖 24 步(约 1s 动作)
max async delay n4提前 4 步开始下一次推理
action prefix mask prob pmprep_m^{pre}pmpre0.9训练时高概率随机 mask 动作前缀
optimality mask prob pmp_mpm0.3CFG 训练需要的条件 dropout
guidance strength β\betaβ1.5推理时 CFG 强度
denoising steps10diffusion sampling 步数
critic bins B201价值分布离散粒度
qlow/qhighq_{low}/q_{high}qlow/qhigh0.6 / 0.8advantage 分位数阈值
α\alphaα5sigmoid 锐度
reward CfailC_{fail}Cfailmax episode length失败惩罚
γ\gammaγ1折扣因子
N-step return N24优势估计 horizon
actor epochs300训练轮数
critic epochs250训练轮数
actor batch size256
critic batch size512
learning rate1e-4AdamW
Optimizer β1/β2\beta_1/\beta_2β1/β20.95 / 0.999

七、效果对比:三个任务、两次消融

7.1 主实验成功率(Figure 5,50 次评估)

方法Task A 瓶子抓取放置Task B 开抽屉放纸巾Task C 开盖放糖果平均
BC(纯行为克隆)0.640.460.400.50
HG-DAgger(只用成功 rollout)0.900.780.580.75
RECAP(二元 optimality)0.920.760.720.80
DexPIE(连续 optimality)0.980.840.820.87

解读:

  • BC 基线平均 50%,在长时序灵巧任务里已经算不错,但离可用差很远;
  • HG-DAgger 提升到 75%,说明 human-following intervention 本身非常有效,失败数据+纠错数据显著缓解 covariate shift;
  • RECAP 提升到 80%,说明把优势信号注入 diffusion policy 这条路是对的,但二元标签损失了动作质量的相对排序;
  • DexPIE 87%,在三个任务上都稳定最高,尤其 Task C 比 RECAP 高出 10 个百分点——这正是连续 optimality 发挥作用的地方:任务 C 涉及"开盖-放盖-抓糖-放糖"多个细长阶段,动作质量差异大,二值标签容易把"中等好"和"极好"混为一谈。

7.2 异步推理消融(Task B,Figure 6)

数据收集方式成功率
同步推理采集数据 + 异步推理评估0.70
异步推理采集数据 + 异步推理评估0.84

差距 14%(绝对值),论文把原因归结为:同步推理引入 temporal noise,导致 rollout 数据里混入和演示行为不一致的"卡顿"样本;critic 被迫拟合 heterogeneous behaviors,价值估计变糟。这个消融非常有力地说明:inference 方式本身会改变数据分布,进而影响后训练效果

7.3 Staged DAgger 消融(Task C,Figure 8)

数据收集策略成功率
标准 DAgger(只从初始状态开始)0.74
Staged DAgger(从中间阶段重启)0.82

提升 8%,验证了中间阶段锚点对 critic 学习的价值。Task C 是三个阶段的长时序任务,如果没有 staged DAgger,价值函数对中后期失败模式的覆盖不足,policy improvement 时会错误模仿那些没见过的 failure mode。

7.4 训练数据量

任务初始演示数后训练 rollout 数总计
Task A4161102
Task B303767
Task C4359102

DexPIE 的样本效率相当高:每个任务只需几十条轨迹就能实现从 50% 到 87% 的提升。这归功于两点:

  • 失败数据被显式当作负样本使用,而不是丢弃;
  • 连续 optimality 函数让每条轨迹里的每个 timestep 都能贡献不同权重的学习信号。

7.5 定性:对位置变化的鲁棒性

附录 B.1 展示了三个任务在不同位置扰动下的成功案例:瓶子、平台、纸巾盒、盖子、糖果的位置都变了,策略能调整抓取姿态完成。这是因为 post-training 数据中包含了 policy 因目标位置偏移而抓取失败的案例,以及人类纠偏的轨迹——critic 学会了"偏移 → 失败"和"偏移 + 调整 → 成功"的区分,policy 被引导去学调整行为。


八、总结:DexPIE 的范式意义与边界

DexPIE 最重要的贡献,不是某个单一算法点,而是提出了一套真实世界灵巧操作后训练的可复现配方

  1. 干预层:human-as-follower 让纠错数据采集从"高难度杂技"变成"普通人能做的事";
  2. 数据层:staged DAgger 让长时序任务的中后段也能被充分探索;
  3. 一致性层:async inference 弥合了演示与部署之间的 temporal distribution gap;
  4. 学习层:continuous optimality indicator 把 RL 的优势信号以 diffusion policy 熟悉的方式(CFG-style conditioning)注入策略。

这套组合在三个真实世界长时序灵巧任务上把成功率从 50% 拉到 87%,且只需要一轮后训练迭代。这个数字本身就很说明问题:在真实机器人上,部署经验的价值可能远大于继续堆专家演示

但它也清晰划出了能力边界:

  • 探索仍依赖人类:没有自动探索策略,阶段需要人工指定;
  • 归因仍是难题:critic 可能把失败归因错,需要数据清洗;
  • 单臂、短时序:双臂协同、分钟级任务尚未验证;
  • 超参数敏感qlow/qhighq_{low}/q_{high}qlow/qhighα\alphaαβ\betaβ 都需要针对任务调;
  • 硬件绑定:相对动作空间、async inference 的超参数与 UR5 + Inspire + 25Hz 控制频率强耦合。

如果把 DexPIE 和前面那篇 ReKep 放在一起看,会发现机器人学习领域正在分化出两条互补路线:

  • ReKep 路线:用基础模型直接生成任务表示(关键点约束)和优化求解,零训练零示教,但受限于刚性假设、跟踪和阶段骨架;
  • DexPIE 路线:先在演示数据上行为克隆,再用真实 rollout + 人类纠错做 RL 后训练,数据效率高,但需要平台支持和人类参与。

两条路线没有谁碾压谁,而是分别适合不同场景:ReKep 更适合"快速部署一个全新任务",DexPIE 更适合"把已有任务的执行成功率从能用拉到稳定可用"。

对视频编码领域的你来说,DexPIE 最有趣的地方在于它把很多编码器里的经典思想搬到了机器人控制:稀疏奖励下的 credit assignment 像码率控制里的 bit allocation;async inference 像帧缓存和前向预测;continuous optimality 像基于重要度的质量加权;staged DAgger 像 GOP 里故意插入的 I 帧锚点。技术领域不同,但优化、反馈、时序一致性这些底层问题总是相通的。


参考:Liao et al., “DexPIE: Stable Dexterous Policy Improvement from Real-World Experience”, arXiv:2606.09615v1, 2026.

Logo

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

更多推荐