⏱ ~24 min
枢纽
⭐ 为何重要

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

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

P-DiffusionPolicy-2023 · Diffusion Policy 单篇深度笔记

一句话定位

把 visuomotor policy 表达成「对动作序列做条件去噪扩散」的生成过程,一次去噪出一整段 action chunk——同时解决多模态动作分布(生成式天然多模态)和协变量偏移(chunking 缩短有效 horizon)。立刻成为机器人操作领域的事实基线。

动机:BC 的两道死穴

作者明确指出朴素 BC(LSTM + MSE 回归单步动作)有两个数学上无法回避的缺陷:

  1. 多模态动作分布。MSE 回归的目标是 $\arg\min_a \mathbb{E}[\|a - a_{\text{demo}}\|^2]$,对演示里两个对称 mode(如左转/右转)的解就是均值——一个无效动作。这一点是 diffusion 出场的直接理由。
  2. 协变量偏移。BC 训练在专家状态分布 $p_{\text{expert}}(o)$ 上,部署在自己的分布 $p_\pi(o)$ 上,二者错配,误差按 $O(\epsilon T^2)$ 雪球放大([Ross 2011] 的经典结论)。

方法核心

1. 把动作序列当图像去噪

策略不再回归一个动作,而是学一个条件生成模型 $\pi_\theta(a_{t:t+N}\mid o_t)$,对一段长度 $N$(论文 $N=16$)的动作 chunk 做 DDPM 式去噪。

  • 前向过程(训练):把演示动作 $a^*$ 按 $a_k = \sqrt{\bar\alpha_k}\,a^* + \sqrt{1-\bar\alpha_k}\,\epsilon$ 加噪($\epsilon\sim\mathcal{N}(0,I)$,$k$ 是离散噪声步)。
  • 反向过程(推理):从 $a_K\sim\mathcal{N}(0,I)$ 出发,迭代执行 $K$ 步去噪得到 $a_0$。训练 $K=100$;推理用 DDIM [Song 2021] 减步数(§3.4):仿真任务仍用 100 步 iDDPM(训练/推理一致),真机任务用 DDIM 减到 16 步(Tab. 7 D-Iters Train=100 / D-Iters Eval=16 for Real Push-T/Pour/Spread/MugFlip),Nvidia 3080 上单次推理 ~0.1s。
  • 训练目标:标准 DDPM 的噪声预测损失 $\mathcal{L} = \mathbb{E}_{k, \epsilon}\|\epsilon - \epsilon_\theta(a_k, k, o_t)\|^2$。
  • 视觉条件注入:视觉观测通过 ResNet-18 编码成 feature,以 FiLM(feature-wise linear modulation)方式在去噪网络每一层注入。

2. 两种 backbone 架构(这是本笔记的重点)

论文给了两种去噪网络,实测 CNN 版本更稳、是社区主流

(a) 1D Temporal CNN(U-Net 式) —— 论文主推

把 action chunk 当成「长度 $T_p$、通道 = 动作维度」的 1D 信号,用一个一维卷积版的 U-Net 做 cond U-Net(论文 §3.1,源自 Janner et al. 2022b 的 1D temporal CNN,DP 做了三处修改:只建模 $p(A_t|O_t)$、只预测 action 不预测 observation、去掉 inpainting goal conditioning 因为与 receding horizon 不兼容):

  • 下采样-上采样对称结构,skip connection 保留细节;论文附录 Tab. 7(CNN)实证配置:所有 CNN 任务 embedding dim=256;attention dropoutTransformer 一行。Tab. 8(Transformer)补充:所有任务 #Layers=8、attention dropout 0.3(仿真 Push-T 用 0.01)。注意:Kitchen 与真机 Push-T 在 Tab. 8 用更大配置(#D-Params=80M、emb dim=768),原笔记曾把这两个数值误植到仿真 Push-T,已校正。
  • 卷积核沿时间轴滑动,天然捕捉 chunk 内动作的时间相关性;但 CNN 对低频信号偏好(Tancik 2020 的 spectral bias),不适合 velocity 控制这种高频/突变 action——这是 DP 推出 Transformer 版本的直接动机。
  • FiLM 调制在每个 resblock 注入视觉特征 + diffusion step embedding $k$(sinusoidal embedding)。
  • 论文明确建议:新任务先试 CNN,跑不好再试 Transformer(CNN 调参少,Transformer 上限高但敏感、对小数据更易过拟合)。论文还实测「增大 CNN 参数量几乎总能涨点,受限于显存;而增大 Transformer 层数有时反而掉点」。
  • receptive field:8 层 1D temporal CNN(默认 kernel size 5、stride 2 下采样)的有效时间感受野足以覆盖 $T_p=16$ 的 chunk 长度;论文未单独给 receptive field 公式,但 CNN 在 Push-T($T_p=16$)和 Real 任务($T_p=16$)上稳定 work 即为间接证据。

(b) Transformer —— 备选

把 chunk 切成 token,加 positional encoding,做 self-attention;视觉特征作为额外的「cond token」concat 进序列。在某些多模态特别强的任务上略好,但总体不如 CNN。

这一架构选择是后续工作的分水岭:DP3 沿用 CNN;RDT-1B 换成 MMDiT(Transformer,因为要 scale 到 1B+ 参数,CNN 不利于 scaling);π0 走 flow matching + Transformer action expert。

3. Action Chunking + Receding Horizon(基于 PDF 正文,§2.2 + §4.3 + Tab. 7)

精确 horizon 符号(论文原话定义):

  • $T_o$ = observation horizon(输入观测序列长度)
  • $T_p$ = action prediction horizon(diffusion 模型一次去噪出的动作 chunk 长度)
  • $T_a$ = action execution horizon(执行多少步才重新推理一次)

论文 §2.2 原文:"at time step $t$ the policy takes the latest $T_o$ steps of observation data $O_t$ as input and predicts $T_p$ steps of actions, of which $T_a$ steps of actions are executed on the robot without re-planning."

Tab. 7 实证配置(CNN,绝大多数任务一致)

任务$T_o$$T_a$$T_p$Emb Dim
Robomimic Lift/Can/Square/Transport2816256
ToolHang2816256
Push-T(仿真)2816256
Block Push(脚本 oracle)3112256
Kitchen2816256
真机 Push-T2616256
真机 Pour/Spread/MugFlip2816256
  • Tab. 8(Transformer)补充:所有任务 #Layers=8;Kitchen $T_o=4$、emb dim=768、#D-Params=80M,真机 Push-T emb dim=768、#D-Params=80M,其余与 CNN 一致。Block Push 在两表里都用 velocity control,其余任务 position control。
  • chunk size:$T_p=16$ 是几乎所有任务的默认值。
  • 只执行前 $T_a=8$ 步(receding horizon control,Mayne & Michalska 1988)。即每执行 8 步重新去噪一次新 chunk;新 chunk 用上一个 chunk 的尾部作为 warm-start 提升平滑度。Block Push 因为是 Markovian scripted oracle 数据,$T_a=1$ 最佳。
  • $T_a=8$ 是消融出来的甜点(§5 消融,Fig. 5 left):$T_a=1$ 时反应快但预测抖动;$T_a$ 太大(接近 $T_p$)反应慢、性能掉;8 是多数任务的折衷点。
  • receding horizon 还顺带解决 latency:Diffusion Policy 用 position control + receding horizon 后,在 4 步以内的 latency(图像处理 + 推理 + 网络)下仍能维持峰值性能(Fig. 5)。velocity control 因为 compounding error,对 latency 更敏感。
  • 这把有效决策 horizon 从 $T$ 压到 $T/T_a$,直接缓解协变量偏移的 $O(\epsilon T^2)$ bound(§5 论证)。
  • $T_o$ 消融(§B.1,Fig. 14):state-based DP 对 $T_o$ 不敏感;vision-based CNN DP 偏好 $T_o=2$(>2 反而掉点,因为多余帧引入噪声)。

4. 两个工程细节(容易被忽略但很重要)

  • 状态输入而非纯视觉:低维状态(关节角、夹爪状态)直接 concat 进去噪网络,比纯视觉稳定得多。
  • 归一化:对每个动作维度做 per-dimension z-score 归一化(用训练集统计),diffusion 对输入 scale 敏感,不归一化会崩。

为什么重要

  1. 第一个把 diffusion 用在机器人 visuomotor policy 上、并系统证明它显著优于 LSTM/MSE BC 的工作。PushT / Robomimic / 真机 Franka 上全面碾压 baseline。
  2. 两个 trick(diffusion + chunking)必须一起用这个洞察,定义了后续 IL 的设计空间——ACT 不约而同走了同一条路(用 CVAE 替代 diffusion,但同样 chunking)。
  3. 事实基线。2023–2024 几乎所有操作 IL 论文都拿 Diffusion Policy 做对比;DP3 / iDP3 / Consistency Policy / RDT-1B 都是直接改它的某一维。

局限与被后续工作解决

局限解决者
2D RGB泛化DP3 [Ze 2024, arxiv:2403.03954] 换点云
推理 50–100 步太慢Consistency Policy [Prasad 2024, arxiv:2405.07503] 蒸馏到 1 步;FlowPolicy 换 flow matching
单任务,没 scaleRDT-1B [Liu 2024, arxiv:2410.07864] scale 到 1.2B
chunk 长度固定 16,长程任务不够π0 [$H=50$]、π0.5 分层
没有语言/语义理解π0 / OpenVLA 把它塞进 VLA

复现要点

  • 官方代码 real-stanford/diffusion_policy 是工业级(Hydra 配置、Lightning 训练),门槛偏高但完整。
  • 想快速上手推荐 HuggingFace LeRobot 的 diffusion_policy 实现,几十行 config 就能跑 PushT。
  • 关键超参(PDF Tab. 7/8 校核):预测 horizon $T_p=16$、执行 horizon $T_a=8$、观测 horizon $T_o=2$、emb dim=256(Kitchen/真机 Push-T 在 Transformer 版本用 768)、训练去噪步 100、真机 DDIM 推理 16 步、视觉编码器 ResNet-18(替换 global avg pooling 为 spatial softmax pooling、BatchNorm→GroupNorm 配合 EMA)。batch size state=256 / vision=64。
  • 常见坑:① 动作不归一化直接崩;② batch size 太小 diffusion 不稳,建议 ≥ 64;③ 视觉 encoder 要不要 freeze 取决于数据量,小数据 freeze 更稳。

与本线索其他工作的关系

  • 直接前驱:DDPM [Ho 2020]、Robomimic benchmark [Mandlekar 2021]。
  • 平行解:ACT / ALOHA [Zhao 2023, arxiv:2304.13705]——同月发表、解同样问题、走 CVAE 路线,详见 P-ACT-ALOHA-2023.md
  • 直接后继:DP3(3D 化)、Crossway Diffusion(自监督增强)、Consistency Policy(加速)、RDT-1B(大规模化)、π0(被 VLA 吸收)。