DexPIE:让人类手把手教灵巧手“回炉重造“——真实世界后训练 RL 深度拆解
论文: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)。原因无他:灵巧手自由度极高、接触力极度丰富、视觉遮挡家常便饭,端到端训练一个策略比登天还难。
但模仿学习有两个结构性缺陷,这两个缺陷在灵巧手上会被放得更大:
- 复合误差(compounding errors):训练时看到的都是专家的干净轨迹,部署时只要一步走偏,后续状态全在训练分布外,策略不会修,只会一路错到底;
- 数据饥渴:专家演示永远不够用,尤其是灵巧操作——每次演示要戴 VR 手套、校准手指重定向,采集一条高质量轨迹的成本极高。
于是近年研究把眼光投向了部署后训练(post-training):策略先在演示数据上预热(warm-start),然后放到真实环境里自己跑、自己错、人类偶尔拉一把,把这段"犯错与纠错"的经验也用来更新策略。这本质上就是 RL 的思想:用真实世界的 rollout 数据,而不是更多专家演示,去改进策略。
这条路在平行夹爪(parallel gripper)上已经走得比较顺,但灵巧手场景有几个额外麻烦:
- 人干预时必须同时管腕部位姿和手指姿态,接管切换要顺滑;
- 任务通常是长时序的(开抽屉、放纸巾、开盖子、放糖果),稀疏奖励下信用分配(credit assignment)极其困难;
- 演示数据是人在 25Hz 平滑遥操作下采集的,部署时却是 diffusion policy 的 chunk 推理,同步推理会带来动作卡顿,生成一种"演示-部署鸿沟"(demonstration-deployment gap),让后训练数据里混满噪声行为。
这篇论文提出的 DexPIE(Dexterous Policy Improvement from Experience)就是一套专为灵巧手、真实世界、长时序任务设计的后训练框架。它的核心贡献可以拆成四根支柱:
- human-following intervention system:操作员先对齐机器人当前的手腕位姿和手指姿态,再顺滑接管,从任意状态都能给出纠错演示;
- staged DAgger:不仅从初始状态采集 rollout,还从人工指定的中间阶段启动采集,制造"失败-纠错"配对数据,为价值函数学习提供中间锚点;
- asynchronous inference in relative action space:把训练时 action chunking 中的 action masking 机制扩展到相对动作空间,消除同步推理造成的卡顿,弥合演示-部署鸿沟;
- 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)Tt0v∈SE(3);
- 当前机器人末端位姿 Tt0ee∈SE(3)T_{t_0}^{ee} \in SE(3)Tt0ee∈SE(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 假设的工程化放松:
- 一次自主 rollout 失败后,把环境重置到失败发生前的那个阶段;
- 在该阶段让 policy 继续跑,等快要再次失败时由人接管纠错;
- 同时记录失败轨迹和纠错轨迹,两者配对进入 replay buffer;
- 也可以直接人为把机器人摆到某个中间阶段作为 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+H−1],然后逐帧执行。如果采用同步推理(synchronous inference),必须等当前 chunk 执行完才推理下一个 chunk,推理期间控制器没有新动作,产生延迟导致的卡顿或暂停。这些卡顿带来两类问题:
- 机器人动作流不再像演示那样平滑,导致接触状态改变(比如手本来已经贴住物体,一停就滑脱);
- 后训练数据里混入大量"本来不该出现的停顿行为",让 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 n0≤i≤n,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π^(at∣ot)∝πref(at∣ot)⋅p(I∣ot,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(I∣ot,at)=f(Aπref(ot,at))/Z(ot),Z 是 action-independent 归一化常数。取 log 并对 action 求梯度:
∇atlogπ^(at∣ot)=∇atlogπref(at∣ot)+β∇atlogp(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π^(at∣ot)=∇atlogπref(at∣ot)+β∇atlogp(I∣ot,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π^(at∣ot)=(1−β)∇atlogπref(at∣ot)+β∇atlogπref(at∣ot,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(α⋅qhigh−qlowA−qlow)
其中 qlowq_{low}qlow 和 qhighq_{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}ot∈O,动作 at∈Aa_t \in \mathcal{A}at∈A,策略 π(at∣ot)\pi(a_t \mid o_t)π(at∣ot)。轨迹 τ=(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=0∏T−1π(at∣ot)p(ot+1∣ot,at)
折扣回报:
R(τ)=∑t=0TγtrtR(\tau) = \sum_{t=0}^{T} \gamma^t r_tR(τ)=t=0∑Tγ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=t∑Tγl−trl]
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=t∑t+N−1γl−trl+γ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}π^(at∣ot)∝πref(at∣ot)⋅p(I∣ot,at)β(1)
取 log 并关于 ata_tat 求梯度:
∇atlogπ^(at∣ot)=∇atlogπref(at∣ot)+β∇atlogp(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π^(at∣ot)=∇atlogπref(at∣ot)+β∇atlogp(I∣ot,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π^(at∣ot)=(1−β)∇atlogπref(at∣ot)+β∇atlogπref(at∣ot,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(vj−Rt(τ))2)exp(−2σ2(vb−Rt(τ))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ϕ(V∣ot) 与高斯软标签之间的交叉熵:
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ϕ(V∣ot))](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(α⋅qhigh−qlowAπref(ot,at)−qlow)(7)
其中 sig(⋅)\text{sig}(\cdot)sig(⋅) 是 sigmoid,α\alphaα 控制锐度,qlowq_{low}qlow、qhighq_{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_mpm 把 ItI_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.6、qhigh=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 H | 24 | 一次推理覆盖 24 步(约 1s 动作) |
| max async delay n | 4 | 提前 4 步开始下一次推理 |
| action prefix mask prob pmprep_m^{pre}pmpre | 0.9 | 训练时高概率随机 mask 动作前缀 |
| optimality mask prob pmp_mpm | 0.3 | CFG 训练需要的条件 dropout |
| guidance strength β\betaβ | 1.5 | 推理时 CFG 强度 |
| denoising steps | 10 | diffusion sampling 步数 |
| critic bins B | 201 | 价值分布离散粒度 |
| qlow/qhighq_{low}/q_{high}qlow/qhigh | 0.6 / 0.8 | advantage 分位数阈值 |
| α\alphaα | 5 | sigmoid 锐度 |
| reward CfailC_{fail}Cfail | max episode length | 失败惩罚 |
| γ\gammaγ | 1 | 折扣因子 |
| N-step return N | 24 | 优势估计 horizon |
| actor epochs | 300 | 训练轮数 |
| critic epochs | 250 | 训练轮数 |
| actor batch size | 256 | — |
| critic batch size | 512 | — |
| learning rate | 1e-4 | AdamW |
| Optimizer β1/β2\beta_1/\beta_2β1/β2 | 0.95 / 0.999 | — |
七、效果对比:三个任务、两次消融
7.1 主实验成功率(Figure 5,50 次评估)
| 方法 | Task A 瓶子抓取放置 | Task B 开抽屉放纸巾 | Task C 开盖放糖果 | 平均 |
|---|---|---|---|---|
| BC(纯行为克隆) | 0.64 | 0.46 | 0.40 | 0.50 |
| HG-DAgger(只用成功 rollout) | 0.90 | 0.78 | 0.58 | 0.75 |
| RECAP(二元 optimality) | 0.92 | 0.76 | 0.72 | 0.80 |
| DexPIE(连续 optimality) | 0.98 | 0.84 | 0.82 | 0.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 A | 41 | 61 | 102 |
| Task B | 30 | 37 | 67 |
| Task C | 43 | 59 | 102 |
DexPIE 的样本效率相当高:每个任务只需几十条轨迹就能实现从 50% 到 87% 的提升。这归功于两点:
- 失败数据被显式当作负样本使用,而不是丢弃;
- 连续 optimality 函数让每条轨迹里的每个 timestep 都能贡献不同权重的学习信号。
7.5 定性:对位置变化的鲁棒性
附录 B.1 展示了三个任务在不同位置扰动下的成功案例:瓶子、平台、纸巾盒、盖子、糖果的位置都变了,策略能调整抓取姿态完成。这是因为 post-training 数据中包含了 policy 因目标位置偏移而抓取失败的案例,以及人类纠偏的轨迹——critic 学会了"偏移 → 失败"和"偏移 + 调整 → 成功"的区分,policy 被引导去学调整行为。
八、总结:DexPIE 的范式意义与边界
DexPIE 最重要的贡献,不是某个单一算法点,而是提出了一套真实世界灵巧操作后训练的可复现配方:
- 干预层:human-as-follower 让纠错数据采集从"高难度杂技"变成"普通人能做的事";
- 数据层:staged DAgger 让长时序任务的中后段也能被充分探索;
- 一致性层:async inference 弥合了演示与部署之间的 temporal distribution gap;
- 学习层: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.
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)