深度⏱ ~2 min
枢纽
⭐ 为何重要

把扩散模型引入 visuomotor policy,自然刻画多模态动作分布、对噪声与复杂任务鲁棒。成为行为生成类方法的事实标杆 baseline,奠定了 diffusion 在机器人学习里的中心位置,深刻影响了后续 policy 架构(包括 π0 的 flow matching)。

机器人Franka / PushT(sim)
数据集PushT / Robomimic / MimicGen
上真机
实时
输入模态vision,proprioception

论文:Chi, Xu, Feng, Cousineau, Du, Burchfiel, Tedrake, Song. Diffusion Policy: Visuomotor Policy Learning via Action Diffusion. RSS 2023, Columbia University / Toyota Research Institute / MIT. arXiv:2303.04137. 🌐

一句话直觉

让机器人动作像画家作画:先模糊打底,再一层层修到精准。扩散模型之于机器人动作,就像画家之于画作。从一团噪点开始,一层层把动作细节修出来。

是什么·为什么

要解决的问题:教机器手臂照着人录的演示学动作。

老办法神经网络看到画面就输出一个动作。可同一个画面常有多种正确动作。比如杯子可以左手拿,也可以右手拿。模型会把它们平均,得到一个谁也不像的动作。

新办法:把动作生成当作"逐步修图"。从一团噪声出发,每步去掉一点噪声,修出一段连贯动作。一次产出未来十几步,而不是只看眼前一步。

方法核心·逐步去噪:网络学的不是"看图直接出动作"。它学的是"给我一团带噪声的动作,该抹掉哪部分噪声"。每抹一步,动作就清晰一分。每一步抹噪声都要看着当前画面决定抹多少。重复几十步,从一团噪声修出一段干净动作。关键是这段动作是"采样"出来的。同一画面、换个初始噪声,能修出不同的正确动作,所以不会被平均掉。执行时只跑前面几步就重新去噪,等于边做边看、不断修正。网络有两种骨架可选。一种把动作段当成一维信号(像音频)用卷积处理,稳、好调,是新任务首选。另一种把动作段切成一串 token 用注意力处理。它上限更高但更挑剔,小数据易过拟合。去噪要一步步迭代,所以单次出动作比"看一眼就出动作"的方法慢。这是它做高频控制时的代价。

为什么有用:因为"修图式"生成天然支持多解。同一团噪声可以修出不同动作,不会被平均掉。一次产一段还缩短了决策链,让机器人不容易"一步错步步错"。

类比:扩散之于动作生成,就像修复古画之于重画。不直接画,从模糊到清晰,一笔笔修出细节。

怎么做

核心机制·条件去噪:策略不再回归单步动作,而是学一个生成模型,对一整段动作去噪。📎 训练时把演示动作加噪声。让网络学如何把噪声还原回去。还原以摄像头画面为条件。每去一步噪都看一眼画面,决定下一笔往哪修。

两种骨架:论文给两种去噪网络。📎

  • 一维卷积版(社区主流、更稳):动作段当成"长度 16、通道=动作维度"的信号。过一维卷积 U 形网。论文建议新任务先试它。
  • Transformer(上限高、更敏感):动作段切成 token 做 self-attention。在多模态极强的任务上略好。增大层数有时反而掉点,对小数据更易过拟合。

关键设计·动作分段:一次去噪出 16 步(prediction horizon),只执行前 8 步(execution horizon)就重新去噪。📎 这叫 receding horizon(滑动预测)。16/8 是 Robomimic 一组任务(Lift/Can/Square/Transport/ToolHang)的常用配置,不是所有任务的统一默认:Block Push 用 $T_p=12/T_a=1$,真机 Push-T 用 $T_a=6$。$T_a$ 太小(1 步)会抖,太大反应慢,8 是消融出来的甜点。📎 还顺带吸收几步控制延迟。

关键设计·双输入:低维状态(关节角、夹爪)直接拼进网络,比纯视觉稳。每个动作维度做 z-score 归一化,不归一化会崩。📎 视觉编码器ResNet-18。把全局平均池化换成 spatial softmax pooling。BatchNorm 换 GroupNorm,配 EMA。

常见误区(先抛一个,完整版见末尾):很多人以为"加 diffusion 是为了精度"。其实冲着多模态去的——朴素模仿学习MSE 回归在多解任务上必然把动作平均成无效解。📎 diffusion 的真正作用是让模型敢输出"任一种正确动作"。

深度

前向/反向过程:训练时把演示动作 $a^*$ 按 $a_k=\sqrt{\bar\alpha_k}\,a^*+\sqrt{1-\bar\alpha_k}\,\epsilon$ 加噪($\epsilon\sim\mathcal{N}(0,I)$ 是高斯噪声,$k$ 是离散噪声步编号,$\bar\alpha_k$ 是噪声调度累积系数)。📎 训练目标就是标准 DDPM 的噪声预测损失

$$\mathcal{L}=\mathbb{E}_{k,\epsilon}\Big[\big\|\epsilon-\epsilon_\theta(a_k,k,o_t)\big\|^2\Big]$$

其中 $\epsilon_\theta$ 是去噪网络,$o_t$ 是观测。视觉特征由 ResNet-18 编码后,以 FiLM(feature-wise linear modulation)方式在去噪网络每个 resblock 注入;diffusion step $k$ 用 sinusoidal embedding

推理加速(DDIM):训练用 $K=100$ 步去噪;真机用 DDIM 把推理步数减到 16,性能几乎不掉。📎 仿真任务保持训练/推理一致(iDDPM 100 步)。单次推理约 0.1 秒(RTX 3080)。

Horizon 三件套(论文 §2.2 原话定义):📎

  • $T_o$ = observation horizon(输入观测序列长度),vision-based 默认 2,state-based 不敏感。
  • $T_p$ = prediction horizon(一次去噪出的 chunk 长度),几乎所有任务默认 16。
  • $T_a$ = execution horizon(执行多少步才重新去噪),默认 8。

这把有效决策 horizon 从 $T$ 压到 $T/T_a$,直接缓解协变量偏移的 $O(\epsilon T^2)$ bound(Ross et al. 2011 的经典结论)。📎

两种 backbone 的差异根源:论文推测一维 CNN 在 velocity 控制下表现差,可能因为 CNN 对低频信号有偏好(spectral bias,Tancik et al. 2020),而 velocity 是高频/突变动作。📎 这是"可能因"的猜测(论文用 likely),不是定论——position 控制下 CNN 反而更稳。Transformer 在 velocity 任务上更有优势,但论文里它更主要的动机是减少过拟合、捕捉更长 horizon。CNN 增大参数量几乎总能涨点(受限于显存);Transformer 增大层数有时反而掉点。

实验:Push-T、Robomimic(Lift/Can/Square/Transport)、真机 Franka(Push-T/Pour/Spread/MugFlip)全面碾压 LSTM+MSE BC 和 IBC 基线。📎 真机 Push-T 成功率从基线的约 20% 拉到 95%。

网络超参(Tab.7 = CNN 骨架,Tab.8 = Transformer 骨架,两表分开核):📎

  • CNN 骨架(Tab.7):1D temporal U-Net。Tab.7 的列只有 horizon($T_o/T_a/T_p$)、#D-Params、#V-Params、Lr、WDecay 等——没有"层数 / emb dim / attention dropout"字段(这些压根不是 CNN 概念)。#D-Params 多数仿真任务约 256(百万),真机 Push-T 是 67。Lr 1e-4。
  • Transformer 骨架(Tab.8):才有 #Layers / Emb Dim / Attn Drp 这几列。#Layers 所有任务统一为 8。Emb Dim 256(仿真任务)/ 768(真机 Push-T、Kitchen)。Attn Drp 0.01(仿真 Push-T)/ 0.3(Lift/Can/Square/Transport/ToolHang/真机 Push-T)/ 0.1(Kitchen)。#D-Params 9(仿真)/ 80(Kitchen、真机 Push-T)。
  • ⚠️ "80" 是参数量(百万),不是层数——把 80M 参数误读成"80 层"会建出完全不存在的网络。层数始终是 8。同样,"emb dim 256 / attn dropout 0.3"是 Transformer(Tab.8)的字段,不是 CNN(Tab.7)的。
  • batch:state-based 256、vision 64。📎

局限

  1. 2D RGB泛化:纯视觉对视角/光照敏感;后续 DP3 换点云解决。🌐
  2. 推理慢:50–100 步去噪难以高频率控制。Consistency Policy 蒸馏到 1 步,FlowPolicy 换 flow matching🌐
  3. 单任务,没 scale:一个 policy 一个任务。RDT-1B 把它 scale 到 1.2B 参数多任务。🌐
  4. chunk 固定 16,长程不够:π0 把 horizon 推到 $H=50$ 并分层。[未确认]
  5. 没有语言理解:π0、OpenVLA 把它塞进 VLA 才有语义。[未确认]

研究者视角

图谱定位:Diffusion Policy 是 T05 线索的核心起点——把模仿学习从"单步回归"升级到"多模态动作分布 + action chunking"。📎 这一框架定义了后续所有操作模仿学习论文的设计空间。

与同期 ACT/ALOHA 的平行收敛:两个独立团队前后脚给出"双重创新"——多模态生成 + chunking。DP arXiv 首发 2023-03,ACT 首发 2023-04,前后约 7 周;二者都被 RSS 2023 收录,是真正意义上的同期独立工作。🌐 一个走 diffusion,一个走 CVAE,证明这是当时唯一正确的方向。后续 IL 工作几乎都基于这两条路。

后续演进

  • DP3(2024):CNN 输入换点云,泛化提升。🌐
  • Consistency Policy(2024):把 100 步蒸馏到 1 步,实时控制。🌐
  • RDT-1B(2024):换成 MMDiT,scale 到 1.2B 参数。🌐
  • π0(2024):被 VLA 吸收,走 flow matching + Transformer action expert。[未确认]

每个后继都改 DP 的某一维:3D / 加速 / scale / 被吸收。

Open problems

  1. 长程任务:固定 chunk 长度难以处理需要长视野规划的任务(做菜、装配)。分层 diffusion 是开放方向。[未确认]
  2. 跨本体迁移:DP 单本体训练;跨机械臂/手/腿的统一动作空间尚未解决。[未确认]
  3. 实时控制:50–100 步去噪对 100+ Hz 控制仍太慢;1 步蒸馏会损失表达力。[未确认]

常见误区

"Diffusion Policy 是为了精度" —— 错。朴素 BC 用 MSE 在多解任务上必然把动作平均成无效解,diffusion 是冲着多模态去的。📎

让模型敢输出"任一种正确动作",而不是追求更准的单一动作。

"diffusion 步数越多越好" —— 错。论文真机用 DDIM 把推理减到 16 步,性能几乎不掉而延迟大幅下降。📎

训练用 100 步保证表达力,推理减步靠 DDIM 加速。

"执行 horizon 越小越敏捷" —— 错。$T_a=1$ 反应快但预测抖动;$T_a$ 接近 $T_p$ 反应慢、性能掉。📎

$T_a=8$ 是消融出来的甜点,不是越激进越好。

"chunk 越长越稳" —— 错。chunk 太长失去 closed-loop 修正能力,等价于开环执行。📎

chunk + receding horizon 的组合才是关键,不是单方面追求长 chunk。

"Transformer 版一定比 CNN 版强" —— 错。论文实测 CNN 更稳,是新任务首选;Transformer 上限高但敏感、对小数据更易过拟合。📎

数据规模和多模态强度决定选哪个。

检查点

Q1

朴素模仿学习用 MSE 回归,在"杯子可左手也可右手拿"的任务上为什么会失败?用"修图"类比说 diffusion 是怎么解决的。

💡 参考答案

  • 失败原因:MSE 回归把多种正确解(左手解 + 右手解)平均,得到一个谁也不像的无效动作(动作被'平均掉')。
  • 修图类比:diffusion 从一团噪声出发,一步步把动作细节修出来(从模糊到清晰),像修复古画而不是重画。
  • 怎么解决多解:同一画面、不同的初始噪声能修出不同的正确动作;动作是'采样'出来的不是回归出来的,所以不会被平均。
Q2

Diffusion Policy 一次产出一段十几步的动作,但执行时只跑前面一部分就重新去噪。为什么不一口气执行完整段?只跑一部分再重去噪的好处是什么?

💡 参考答案

  • 不一口气执行完:一口气执行完整段等于开环,越往后偏差越大、无法及时修正。
  • 只跑一部分再重去噪的好处:每个时刻都用最新观测重新去噪,等于边做边看、不断修正(closed-loop),缓解'一步错步步错'的协变量偏移。
  • 额外:执行 horizon 还顺带吸收几步控制延迟。
Q3

去噪网络学的不是"看图直接出动作"。它学的是什么?为什么"从噪声采样"能让它输出多种不同动作、而不被平均掉?

💡 参考答案

  • 学的是什么:网络学的是'给我一团带噪声的动作,该抹掉哪部分噪声'——预测噪声本身,而不是直接回归动作。每抹一步动作清晰一分,重复几十步修出干净动作。
  • 为什么不被平均:动作是'采样'出来的。同一画面配不同的初始噪声,能修出不同的正确动作;网络学的是条件分布而不是单一回归值,所以多解不会被平均。
  • 每一步抹噪声都看着当前画面决定抹多少(以画面为条件)。
Q4

论文给卷积和注意力两种骨架。用大白话说:它们分别把"动作段"当成什么来处理?哪种更稳、哪种上限更高但更挑剔?

💡 参考答案

  • 卷积骨架:把动作段当成一维信号(像音频)用卷积处理;稳、好调,是新任务首选。
  • 注意力骨架:把动作段切成一串 token 用注意力(self/cross-attention)处理;上限更高但更挑剔、小数据易过拟合。
  • 选哪个由数据规模和多模态强度决定——不是注意力一定更强。
Q5

去噪要一步步迭代才能修出干净动作。这让 Diffusion Policy 在"要很快做决定"的高频控制任务(比如打乒乓球)上会遇到什么麻烦?

💡 参考答案

  • 麻烦:去噪是迭代过程(要跑十几到几十步),单次出动作比'看一眼就出动作'的一次性方法慢,达不到 100Hz 这种高频控制的延迟要求。
  • 为什么慢:每一步去噪都要跑一次网络前向,步数乘以前向时间 = 单次决策延迟;高频控制来不及。
  • (开放,入门层 只给方向)改造思路可由读者推断:减少去噪步数 / 蒸馏成更少步——具体方案在 方法层/深度层。

FAQ

Q1:Diffusion Policy 能在真机上实时跑吗?

能,但需要加速。真机任务用 DDIM 把推理步数从 100 减到 16,单次推理约 0.1 秒(RTX 3080)。📎 100+ Hz 高频控制仍需进一步蒸馏(如 Consistency Policy)。

Q2:为什么官方代码用 Hydra + Lightning,这么重?

官方 real-stanford/diffusion_policy 是工业级,为可复现的真机实验设计。[未确认] 想快速上手推荐 HuggingFace LeRobot 的实现,几十行 config 就能跑 PushT。

Q3:动作一定要归一化吗?

必须。每个动作维度做 per-dimension z-score 归一化。diffusion 对输入 scale 敏感,不归一化会崩。📎

Q4:视觉 encoder 要不要 freeze?

取决于数据量。小数据 freeze 更稳,大数据解冻一起训能涨点。📎 论文用 ResNet-18 + spatial softmax pooling + GroupNorm + EMA。

Q5:DP 和 ACT 我该选哪个?

精细双臂、自由度高、数据中等首选 ACT(更快、更稳)。多模态极强、推理频率要求不高选 DP。[未确认] 经验上 LeRobot 默认推荐 ACT 上手。