Skip to content
Published on

Diffusion Policy 与 π0 — 平滑机器人行为背后的秘密

分享
Authors

引言 — 故事从 token 的尽头讲起

在前一篇文章中提到,VLA 模型把机器人动作转换成离散 token,像语言模型一样预测下一个 token。这种方式优雅,但背负着两个负担。第一,把连续值切成区间做 token 化会产生量化误差。第二,逐个自回归地取出 token 会拖慢推理,难以实现快速控制。

机器人的手要平滑地靠近杯子并精确抓取,动作就必须平滑、一致,并且更新得足够快。于是,一种把动作生成为「连续轨迹本身」而非「下一个 token」的思路应运而生。本文将考察其中两个代表性方法:Diffusion Policy 与 π0(pi-zero)。

核心信息是这样的:如果把动作看作生成问题(是哪条连续轨迹)而非分类问题(是哪个 token),就能自然地处理多模态(多种正确的做法)和平滑性。

Diffusion Policy:通过去噪生成动作

核心直觉

Diffusion Policy 把在图像生成中大获成功的扩散(diffusion)模型思路引入动作生成。图像扩散模型从纯噪声出发,逐步去除噪声(denoising),生成看似合理的图像。Diffusion Policy 将同样的流程应用于「未来动作序列」,而不是「图像」。

┌──────────────────────────────────────────────────────────┐
│              Diffusion Policy 的动作生成流程                │
└──────────────────────────────────────────────────────────┘

  观察(图像·状态) o_t  ──┐  (条件)
   纯噪声                ▼
   A_K  ──▶  A_{K-1}  ──▶ ... ──▶  A_1  ──▶  A_0
   (随机)    去噪        去噪          干净的动作序列
             步骤        步骤
             (以 o_t 为条件的神经网络预测噪声)

  A_0 = [a_t, a_{t+1}, ..., a_{t+H-1}]   ← 未来 H 步动作(chunk)

这里有两点很关键。

  • 条件生成:去噪网络以当前观察 o_t 为条件,将噪声精炼为「适合这一情境的合理动作轨迹」。
  • 动作块(action chunk):不是生成单个步骤的动作,而是一次性生成未来 H 步的动作序列。这样能得到时间上一致、平滑的轨迹,并减轻每一步都要重新规划的负担。

为什么扩散有优势:多模态性

模仿学习中一个顽固的难题是多模态性(multimodality)。在同样的情境下,人有可能向左绕过去拿起杯子,也有可能向右绕过去拿。两种示范都是正确的。单纯的回归(输出均值)容易产生「径直穿过中间」这种错误动作,也就是两种模式的平均。

多模态情境下的输出对比

   可能正确的轨迹:      ╲           ╱
                        ╲ (向左)   ╱ (向右)
                         ╲       ╱
                          ●─────●  目标

   回归(均值)输出:        ↓ (径直穿过中间 → 碰撞/失败)

   扩散输出:    从分布中采样 → 一致地
                跟随左或右中的一种(不做模式平均)

扩散模型学习动作的概率分布并从中采样,因此能在多个模式中一致地选择其中一个。这正是 Diffusion Policy 在精确操作中能够稳定运行的核心原因。

训练目标

训练通常以噪声预测的形式进行。给干净的动作序列加上已知的噪声,然后训练网络去预测这个噪声。

# 概念性伪代码:Diffusion Policy 训练的一个步骤
# (实际实现会使用扩散调度器·U-Net/Transformer 骨干网络)

def training_step(obs, action_chunk):
    # action_chunk: [H, action_dim] 未来 H 步的干净动作
    k = sample_diffusion_step()              # 随机选择去噪步骤 k
    noise = gaussian_like(action_chunk)      # 标准正态噪声
    noisy = add_noise(action_chunk, noise, k)  # 按调度注入噪声

    # 神经网络以 obs 和步骤 k 为条件预测噪声
    pred_noise = denoiser(noisy, k, cond=obs)
    loss = mse(pred_noise, noise)            # 预测噪声与真实噪声之差
    return loss

推理时,从纯噪声出发,用上述网络多次去噪,得到一个动作块。去噪步数决定了质量与速度之间的平衡,用少量步数实现快速生成的技术(例如 DDIM 类采样器)也一并被使用。

控制回路与动作块

Diffusion Policy 通常按以下方式运行。

┌──────────────────────────────────────────────────────┐
│         基于动作块的控制回路(概略)                     │
└──────────────────────────────────────────────────────┘

  1) 收集观察 o_t
  2) 通过扩散生成未来 H 步的动作块 A_0
  3) 实际执行其中靠前的一部分(例如最初几步)
  4) 每隔一定周期重新观察,回到 (1) 重新规划

  receding horizon:长规划、短执行、频繁更新
  → 在一致性(长规划)与响应性(频繁更新)之间取得平衡

动作块越长越平滑,但对环境变化越迟钝;越短、更新越频繁则响应性越好,但规划的一致性会降低。这种权衡需要根据任务性质来调整。

π0:用 flow-matching 实现高频连续动作

背景与定位

π0(Physical Intelligence)是一个试图将 VLA 的泛化能力与连续动作生成的平滑性结合起来的模型。从大局上看,它的结构是把在网络数据上预训练的视觉-语言骨干网络(语义理解)与能快速生成连续动作的「动作专家(action expert)」结合起来。其目标是将动作生成为连续值,而且是高频的连续值,而不是离散 token。

┌────────────────────────────────────────────────────────────┐
│                    π0 结构(概略理解)                        │
└────────────────────────────────────────────────────────────┘

   图像·语言指令
  ┌───────────────────┐
  │  VLM 骨干网络      │  ← 网络预训练的语义理解
  │ (视觉-语言表示)    │
  └─────────┬─────────┘
            │  条件(上下文)表示
  ┌───────────────────┐
  │  动作专家          │  ← 用 flow-matching 生成连续动作
  │ (action expert)    │     输出高频连续动作块
  └─────────┬─────────┘
  连续动作块 a_{t..t+H}  ──▶  以高频控制执行

什么是 flow-matching

flow-matching 是一种与扩散有亲缘关系的生成技术。直观地说,它学习一个从简单分布(例如高斯噪声)「流向」目标分布(正确的动作轨迹)的连续向量场(velocity field)。在推理时,将噪声样本沿这个向量场积分,把它移动为目标分布的样本。

flow-matching 的直觉

  噪声 x_0  ──── 沿学习到的速度场 v(x, τ) 积分 ────▶  x_1
  (简单分布)        τ: 0 → 1                    (动作分布)

  v(x, τ):告诉在时间 τ 时,点 x 应该流向何处(速度)
  ODE 积分:求解 dx/dτ = v(x, τ) 从 τ=0 到 1,即可得到样本

如果说扩散是逐步去除噪声的马尔可夫链,那么 flow-matching 则是用连续时间的 ODE 流来完成同样的工作。设计得当的话,即使积分步数很少,也能快速生成平滑的连续输出,因而有利于高频控制。

高频控制与动作专家

π0 强调的重点是「高频连续动作」。对于精确而快速的操作(例如叠衣服、把物体平滑地嵌入),每秒数十次量级的平滑动作更新会有帮助。用逐个自回归取出离散 token 的方式,很难达到这样的频率。基于 flow-matching 的动作专家一次性生成连续动作块,因此能在保持 VLM 骨干网络语义理解的同时,运行快速的控制回路。

控制频率直觉(概念性)

  离散 token 自回归:  token → token → token ...  (逐维,慢)
                       难以快速响应

  连续动作块生成:      [a_t, a_{t+1}, ..., a_{t+H}] 一次性生成
                       可实现平滑、快速的更新

  ※ 准确的控制频率会因硬件、实现和任务而异。

离散 token 与连续动作对比

项目离散动作 token (RT-2, OpenVLA)连续动作生成 (Diffusion Policy, π0)
动作表示量化整数 token连续值轨迹/动作块
生成方式自回归下一 token 预测去噪 / flow-matching
多模态用 token 概率表示分布直接从分布采样
平滑性可能存在量化误差有利于平滑的连续输出
控制频率因 token 顺序生成而可能变慢因批量生成动作块而有利于高频
语言模型复用整合进词表直接复用需设计单独的动作头/专家
代表性优势简单、语义泛化精确、平滑、响应性

表格中的细节可能因实现和版本而异。这两种方法并非互斥的,在 VLM 的语义理解之上叠加连续动作生成的折中方案(π0 的方向)正在被积极探索。

深入探讨:噪声调度与采样

什么是噪声调度

在扩散模型中,「去噪步骤」不是一个模糊的阶段,而是由一个调度(schedule)精确定义的——这个调度规定了每一步要加入和去除多少噪声。调度决定了每个步骤 k 处信号与噪声的比例。早期步骤(k 较大)几乎是纯噪声,末期步骤(k 接近 0)则几乎是干净的动作。

噪声调度的直觉

  k:   K(噪声多) ───────────────▶ 0(无噪声)
       │                                │
  信号比例:  低 ──────────────────▶ 高
  噪声比例:  高 ──────────────────▶ 低

  在每个去噪步骤,神经网络预测「这一步的噪声」并将其去除
  → 经过多个步骤,纯噪声收敛为干净的动作

调度的形状(线性、余弦等)会影响训练稳定性和样本质量。在动作生成中,维度较小(大约 7 维)、序列较短,因此往往比图像生成用更少的步数就足够了。

推理步数与速度-质量的权衡

在推理时,去噪步数是区分速度与质量的关键旋钮。

按步数划分的权衡(概念)

  步数多 (例如:几十~几百)
    + 动作分布更精确
    - 推理慢 → 控制频率降低

  步数少 (例如:个位数)
    + 推理快 → 可实现高频控制
    - 分布近似可能变粗糙

  DDIM 类确定性采样器或蒸馏(distillation)等
  在少步数下仍能保持质量的技术正被积极研究

在机器人控制中,快速更新至关重要,因此选择能以少量步数生成良好动作的采样器决定了实用性。这一点正是 flow-matching 受到强调的原因所在。设计得当的 flow-matching 能以少量积分步数产生平滑的连续输出,有利于高频控制。

扩散与 flow-matching 的关系

扩散与 flow-matching 在深层次上是相通的。二者都学习从简单分布到复杂目标分布的变换。扩散以离散的去噪链逼近同一个目标,flow-matching 则以连续时间 ODE 的速度场来达成。

两种生成范式的对应关系(概念)

  扩散(DDPM):       离散马尔可夫链,逐步去除噪声
  确定性采样(DDIM):  把扩散视为 ODE 的确定性积分
  flow-matching:    从一开始就直接学习 ODE 速度场

  共同点:学习从噪声到目标分布的「流动」
  差异:  链长度·确定性·训练目标的形式

在实务中,选择标准是「哪种方式能以少量步数快速产生平滑、准确的动作」。Diffusion Policy 以在精确操作中得到验证的稳定性见长,π0 系列则以高频连续控制及与 VLM 的结合作为优势。

实务视角:何时用什么

按任务性质选择

决策指南(概念,非绝对规则)

  ┌─ 精确·多模态操作,数据充足
  │     → Diffusion Policy 系列较稳定
  ├─ 需要高频连续控制(手部动作快、平滑)
  │     → 基于 flow-matching(π0 方向)
  ├─ 强语义泛化·应对新指令是首要目标
  │     → 基于 VLM 骨干网络的 VLA(离散 token 或连续结合)
  └─ 简单·重复任务,快速原型开发
        → 从轻量策略起步,需要时再扩展

这份指南不是绝对规则,而是一个出发点。实际决策需要综合考虑数据量、硬件限制、控制频率需求和安全要求。

训练中常见的错误

  • 数据多样性不足:只使用有限的示范会让模型对特定布局、光照过拟合。需要包含多样的初始条件和干扰因素。
  • 动作块长度设置不当:太长会对环境变化迟钝,太短则一致性不足。需要根据任务特性来调整。
  • 观察同步错误:如果观察与动作的时间戳发生偏差,因果关系就会被破坏,训练也会崩溃。
  • 采样器未调优:如果不调整推理步数和采样器,动作会变得迟缓或粗糙。
训练-推理检查清单(概念)

  [ ] 示范数据的初始条件·物体·背景是否足够多样
  [ ] 观察 ↔ 动作的时间戳对齐是否准确
  [ ] 动作块长度是否与任务周期匹配
  [ ] 推理步数·采样器是否满足速度-质量平衡
  [ ] 安全限制(速度·扭矩·工作空间)是否位于底层

这些检查对实际成功率的影响,不亚于模型架构的选择。连续动作生成的优势,只有在数据和流水线足够扎实时才能真正发挥出来。

优势与局限

Diffusion Policy

  • 优势:能自然地处理多模态行为,在精确操作中表现稳定。通过动作块确保时间上的一致性。
  • 局限:去噪步数较多时推理可能变慢(可通过选择采样器来缓解),性能很大程度上取决于示范数据的质量与多样性。

π0 / flow-matching 系列

  • 优势:试图结合 VLM 的泛化能力与连续动作的平滑性、高频特性。是适合需要快速控制的精确任务的方向。
  • 局限:系统复杂,训练与调优难度较高。性能和具体规格会因实现、数据和硬件而异,因此论文报告的数值在不同环境下可能会有不同的复现结果。

共同的注意事项

  • 真实机器人评估难以复现,且对环境敏感。
  • 安全性(分布外情况、碰撞规避)仍是核心课题。
  • 数据采集成本是所有方法共同的瓶颈。

以一次任务的生命周期来看

为了把抽象的讨论具体化,我们来跟随「拿起桌上的杯子放到旁边的盘子上」这一任务在连续动作生成策略中是如何展开的。

┌──────────────────────────────────────────────────────────┐
│        移动杯子任务的控制回路(概念性时间线)               │
└──────────────────────────────────────────────────────────┘

  t0  观察: 通过摄像头确认杯子·盘子·手的位置
  t0  生成: 未来 H 步的动作块 A_0 = [a_t .. a_{t+H-1}]
        │     (通过去噪或 flow-matching 得到的连续轨迹)
  t0~  执行: 将动作块前部(几步)发送给机器人
        │     手朝杯子平滑靠近
  t1  重新观察: 检测到杯子稍微滑动
  t1  重新生成: 用新观察更新动作块 → 修正路径
  ...  重复: 抓取 → 抬起 → 移动 → 放下
  结束: 打开夹爪,判定任务完成

这里就体现出连续动作生成的优势。即使发生杯子滑动这种意料之外的变化,策略也会在下一次观察时重新生成动作块,平滑地进行修正。相比逐个取出离散 token 的方式,更新更快、轨迹也更平滑。

作为实时系统的机器人策略

延迟预算

机器人控制是一个实时系统。从观察到动作执行的全部延迟(latency)决定了任务的稳定性。按项目拆分延迟如下。

延迟预算的分解(概念)

  传感器采集    ──▶  预处理(图像缩放等)
       │                  │
       ▼                  ▼
  模型推理(生成)  ──▶  后处理(逆变换·安全过滤)
       │                  │
       ▼                  ▼
  发送至控制器  ──▶  关节驱动

  总延迟 = 以上各阶段之和
  → 任一阶段变慢,整体控制频率都会下降

一次性生成连续动作块,意味着不必每一步都重新推理,而是可以在消耗当前动作块的同时准备下一个动作块,从而分散延迟负担。这是使高频控制成为可能的实用诀窍之一。

异步推理与动作块消耗

异步流水线(概念)

  生成线程:  [生成动作块 A]      [生成动作块 B]
                  │                  │
                  ▼                  ▼
  执行线程:  ▮▮▮▮▮▮▮▮ (消耗 A) ▮▮▮▮▮▮▮▮ (消耗 B)

  → 在执行 A 的同时预先生成 B → 实现无缝控制
  ※ 准确的时序会因硬件、实现而异。

这种异步结构有助于在使用较重的生成模型时仍保持控制回路的平滑。不过,如果生成速度太慢,执行端消耗完动作块后还要等待下一个动作块,就会产生卡顿,因此生成速度与动作块长度之间的平衡很重要。

样本效率与数据多样性

连续动作生成模型表达能力强,但也正因如此,需要有足够的示范才能真正学到分布。提升样本效率的实务方法有很多种。

提升样本效率的策略(概念)

  ┌─ 利用预训练:复用 VLM 骨干网络的语义表示
  ├─ 数据增强:通过颜色·裁剪·视角变化扩展示范
  ├─ 多任务学习:多个任务一起训练以诱导迁移
  └─ 高效微调:用 LoRA 等方法以较少资源完成适配

  → 用于弥补昂贵的真实示范数据之局限的方向

特别是复用 VLM 骨干网络预训练的表示,即使只有少量机器人数据,也能在保持语义泛化的同时学习动作。这与前一篇文章中提到的联合微调(co-fine-tuning)的直觉是相通的。归根结底,连续动作生成的成功,不仅取决于优秀的生成技术,也取决于多样且对齐良好的数据与高效适配策略的结合。

结语

离散动作 token 化是把语言模型的强大能力直接带给机器人的优雅方法,但要付出量化误差和控制频率方面的代价。Diffusion Policy 通过去噪生成动作,解决了多模态和平滑性问题;π0 则用 flow-matching 快速生成连续动作,并试图将其与 VLM 的语义理解结合起来。

大的趋势是「把动作当作生成、而非分类来处理」。现实世界的任务越需要精确、平滑、快速的手部动作,连续动作生成的优势就越明显。下一步是把这类动作生成器扩展到更大的骨干网络、更多样的数据,以及更复杂的机型(人形机器人)上。

参考资料

  • Diffusion Policy: Visuomotor Policy Learning via Action Diffusion, arXiv: 2303.04137
  • π0: A Vision-Language-Action Flow Model for General Robot Control, arXiv: 2410.24164
  • Flow Matching for Generative Modeling, arXiv: 2210.02747
  • Denoising Diffusion Probabilistic Models (DDPM), arXiv: 2006.11239
  • Denoising Diffusion Implicit Models (DDIM), arXiv: 2010.02502
  • OpenVLA: An Open-Source Vision-Language-Action Model, arXiv: 2406.09246
  • RT-2: Vision-Language-Action Models, arXiv: 2307.15818
  • Physical Intelligence 博客: physicalintelligence.company