1. 一句话结论
Diffusion Policy 的核心想法是:别再用「一维自回归 + 高斯混合」去预测机器人下一步动作,而是把动作序列本身当成一张「图像」,用和 Stable Diffusion 一模一样的扩散去噪范式去「想象」并生成一段动作轨迹。 结果是在 15 个操作基准里拿下 14 个 SOTA,且特别擅长处理「一个观察对应多种合理动作」的复杂场景。
它和本博客「VLA 解码手记(二)动作生成的发动机」是同一主题的不同解法——那里讲 Diffusion Policy 在动作生成里的位置,这里回到论文本身。
2. 动作生成以前怎么做?痛点是什么
机器人策略 π(aₜ | oₜ) 要由观测 oₜ(图像/状态)给出动作 aₜ。主流做法是:
- 自回归(GPT 式):把动作当 token 一个一个生成。问题:误差会累积、生成慢、难表达多模态。
- 高斯混合模型(GMM):一个观察给出几个高斯分布的加权。问题:自由度有限,高维 6-DoF 动作(位置+姿态)很难拟合,且容易「取平均」出一个谁都不像的模糊动作。
更麻烦的是多模态:看到桌上有个杯子,机器人可以「从左抓」也可以「从右抓」,两种都合理。GMM 容易把两条路平均成一条奇怪的中间动作。
3. Diffusion Policy 怎么想
它借用条件扩散模型(DDPM 一类):
- 把「未来一段动作序列」
A = [aₜ, aₜ₊₁, …, aₜ+H]当成一个高维向量(类比一张图)。 - 训练时:从真实动作
A₀逐步加噪得到Aₖ(k步后变成纯噪声),让网络学会「给定观测oₜ,从Aₖ预测加的那份噪声ε」。 - 推理时:从一团纯随机噪声
A_K出发,迭代去噪K步,最后得到一条干净的动作轨迹,立即执行(通常取前几步,再重新观测、重新扩散,即 receding-horizon / action chunking)。
网络结构多用 CNN(1D/2D U-Net)或 DiT(Diffusion Transformer),条件 oₜ 通过 FiLM / Cross-Attention 注入每一步去噪。
4. 为什么扩散范式特别适合动作
| 维度 | GMM / 自回归 | Diffusion Policy |
|---|---|---|
| 多模态 | 只能用有限个峰近似 | 隐空间天然表达复杂多峰分布 |
| 高维动作 | 6-DoF 难拟合、易模糊 | 把整段轨迹当图去噪,细节保真 |
| 训练稳定性 | 易模式崩塌/取均值 | 去噪目标简单(预测噪声),稳定 |
| 不确定性 | 隐式 | 显式:多次采样可得不同合理动作 |
直观类比:GMM 像「用几个钟形曲线硬凑出一只猫」;扩散像「先画一团噪点,再一点点擦出一只猫」——后者对复杂形状友好得多。
5. 关键设计点(论文里的巧思)
- Action Chunking(动作分块):一次生成未来
H步(如 8–16 步)而非单步,既平滑又抗抖动,还能隐藏执行延迟。 - 观测条件注入:视觉观测经encoder后,用
Fixture/Cross-Attention 注入 U-Net 各层,保证「看得到才动得了」。 - 时间维度处理:动作序列按时间轴排列后送 1D 卷积 U-Net,去噪在网络里是「沿时间轴」的。
- 少步采样:后续工作(含 DDPO、consistency 等)把
K从几十步压到几步,满足实时控制。
6. 结果为何亮眼
论文在 4 类 15 个任务(模拟+真实、刚体/布料/液体操控)上对比:
- 相对之前 SOTA(含 GPT-style、Diffusion 但不同条件方式),15 项里 14 项领先,平均成功率提升明显。
- 尤其在「多模态演示」「高维姿态」「需要时间协调」的任务上优势最大——正是 GMM/自回归的软肋。
7. 它和 Transformer / VLA 的关系
- Diffusion Policy 解决的是「动作头」怎么生成;前面的「看」和「理解」仍可由 ViT/LLM(即 VLA 里的 V+L)负责。
- 因此它常作为 VLA(如 RT-2、π0、HiF-VLA)的动作生成引擎,和自回归动作头并列两条路线。
- 而「去噪」这一套,和 Transformer 的「注意力」是当代生成式 AI 的两大底座之一——一个管「关系的并行计算」,一个管「从噪声里雕出结构」。
8. 小结
Diffusion Policy = 把动作序列当「图」+ 条件扩散去噪 + Action Chunking。它用生成模型的多模态/高维表达能力,补上了传统策略头在「复杂、多解、高维动作」上的短板,成为机器人学习里继行为克隆之后最实用的动作生成范式之一。
延伸:想看工程实现与「扩散 vs 自回归」在动作生成上的取舍,回到「VLA 解码手记(二)动作生成的发动机」。
💬 留言
NaphJohn/LLM-blog尚未启用 Discussions:请在 GitHub 仓库 Settings → General → Features 勾选 Discussions 后刷新本页,评论区即自动显示。