Jason / Works Embodied AIZero to One
Works
没主意?快捷入口
Guide · Part 3: 核心主线精读

Ch13: 扩散策略——Diffusion Policy / 3D-DP / π0,像擦噪声一样擦出动作


Ch13: 扩散策略——Diffusion Policy / 3D-DP / π0,像擦噪声一样擦出动作

Part 3: 核心主线精读 前置章节:Ch12: 端到端 VLA (II)——OpenVLA / VLAS / MLA,开源与扩展 后续章节:Ch14: 模仿学习——DAgger / ACT-ALOHA / UMI,你做给它看


Ch12 结尾,我们看到 MLA 的扩散动作头和 OpenVLA-OFT 的连续动作选项已经暗示了一种完全不同的动作生成范式:不是"从词表中选一个 token",而是"从随机噪声中逐步擦出一个动作"。本章就系统讲解这条路线。

从 Ch11 和 Ch12 的 RT-2/OpenVLA 路线到本章的 Diffusion Policy 路线,最核心的区别在于动作的表示方式。前者把连续动作离散化成 256 个 bin,然后当"分类题"来做;后者把动作生成当成"从噪声中恢复信号"来做——动作可以保持连续值,不需要离散化,精度不受 bin 数量限制。

本章讲三个模型:Diffusion Policy(2023,学术原型验证)、3D Diffusion Policy(2024,加入三维感知)、π₀(2024,产业级基础模型)。三者构成一条清晰的演进线:从方法验证,到感知升级,到规模化部署。

本章定位:读完本章,你应该能够:

  • 解释扩散模型如何从"生成图片"迁移到"生成动作",以及为什么这比传统行为克隆好
  • 画出 Diffusion Policy 的滑动窗口(To / Tp / Ta)机制,解释为什么不把预测全部执行
  • 说明 3D-DP 为什么用点云而非 2D 图片,以及它的轻量编码器为什么比 PointNet 更合适
  • 描述 π₀ 的 Flow Matching 如何比标准扩散快 10-100 倍,以及它的跨机体训练策略
  • 对比三个模型在感知输入、采样速度、泛化能力上的 trade-off

1. 从"直接给答案"到"慢慢擦出答案"

一句话预告:传统行为克隆像考试直接写答案——两个正确答案之间求平均就成了错误答案;扩散策略像从草稿纸上的乱涂乱画中逐渐擦出清晰答案——多个正确答案里挑一个就行。

1.1 考试类比

设想你在做一道题,正确答案有两个:A 和 C。传统行为克隆(Behavior Cloning,BC)的做法是用均方误差损失(MSE loss)训练模型,结果模型学到的"最优答案"是 A 和 C 的中间值 B——一个完全错误的选项。

这不是抽象问题。机器人绕障碍物时,左绕和右绕都是合理策略。如果训练数据里一半示教走左边、一半走右边,MSE 损失训练出来的策略会"取平均"——直接撞上障碍物。这就是行为克隆中经典的"模态平均"(mode averaging)问题。

扩散策略换了一种思路。它不是直接输出一个确定性答案,而是从纯随机噪声出发,通过多步去噪逐渐"擦出"一个合理的动作轨迹。由于噪声的随机性,每次擦出的结果可能不同——有时擦出"走左边",有时擦出"走右边"——但每一个结果都是有效的。模型学到的不是"唯一正确答案",而是"所有正确答案的分布"。

1.2 本章路线图

这三个模型回答的问题逐层递进:

模型 年份 核心问题 核心答案
Diffusion Policy 2023 如何避免模态平均? 用扩散模型生成多模态动作
3D Diffusion Policy 2024 2D 图片丢失了深度,怎么办? 用点云提供三维空间理解
π₀ 2024 如何做一个"通用机器人基础模型"? VLM + Flow Matching + 跨机体训练

从学术验证到产业落地,扩散策略这条路线在两年内完成了 BC(朴素)→ Diffusion Policy(多模态稳定)→ 3D-DP(加入深度)→ π₀(基础模型规模)的演进。本章前半部分深入拆解这三个模型的技术细节。


2. 扩散模型基础:像橡皮擦一样工作

日常类比:想象你有一张干净的铅笔画。你拿起橡皮不断擦——每擦一下,画面就更模糊一点。擦了 1000 下之后,纸上只剩下均匀的灰。现在问题来了:有没有一种方法,从这张灰纸出发,一步步"反向擦"回清晰的画?扩散模型就在学这个"反向擦除"的过程。

2.1 前向过程:加噪声

给定一条"干净"的动作轨迹 $\mathbf{a}_0$(比如机械臂在 16 个时间步的关节角度序列),前向过程在每一步 $t$ 上叠加一点高斯噪声:

$$\mathbf{a}t = \sqrt{\alpha_t} \cdot \mathbf{a}{t-1} + \sqrt{1 - \alpha_t} \cdot \boldsymbol{\epsilon}, \quad \boldsymbol{\epsilon} \sim \mathcal{N}(0, I)$$

经过 $T$ 步后(DDPM 通常 $T=1000$),$\mathbf{a}_T$ 变成几乎纯粹的高斯白噪声——完全丢失了原始动作的信息。

类比:把一杯清水里逐步滴入墨汁。每滴一滴,水就更浑浊。滴了 1000 滴之后,这杯水和纯墨水没什么区别了——你看不出原来清水的样子。

2.2 反向过程:去噪声

扩散模型学习的是反向过程。给定当前含噪样本 $\mathbf{a}_t$ 和时间步 $t$,模型预测"这一步加进去的噪声是什么",然后减去它:

$$\mathbf{a}_{t-1} = \frac{1}{\sqrt{\alpha_t}} \left( \mathbf{a}_t - \frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}t}} \cdot \boldsymbol{\epsilon}\theta(\mathbf{a}_t, t) \right) + \sigma_t \mathbf{z}$$

其中 $\boldsymbol{\epsilon}_\theta$ 是神经网络(参数 $\theta$)的预测值。从 $t=T$ 开始逐步执行这个公式,最终从纯噪声中"恢复"出一条干净的动作轨迹。

类比的后半段:你训练了一台"墨汁探测器",它能看着当前浑浊的水,精确判断"最近这一滴墨汁是什么颜色、什么位置"。然后你一滴一滴地"反向吸出"墨汁。1000 次之后,你得到了一杯清水——虽然不一定是原来那杯清水,但它同样是一杯合格的清水。

2.3 训练目标:出人意料地简单

训练损失就是标准的 MSE:

$$\mathcal{L} = \mathbb{E}_{t, \mathbf{a}0, \boldsymbol{\epsilon}} \left[ | \boldsymbol{\epsilon} - \boldsymbol{\epsilon}\theta(\mathbf{a}_t, t) |^2 \right]$$

翻译成人话:随机选一个时间步 $t$,随机采样一个噪声 $\boldsymbol{\epsilon}$ 加到真实动作上得到含噪版本 $\mathbf{a}_t$,让网络预测这个噪声,和真实噪声比较 MSE。就这么简单。

这个训练目标的优雅之处在于:你不需要显式建模动作的概率分布(不需要定义高斯混合、不需要设计 VAE 的 latent space),只需要训练一个"噪声预测器"。分布的复杂度被隐式编码在了去噪路径中。

2.4 DDPM vs DDIM:速度与质量的权衡

DDPM(Denoising Diffusion Probabilistic Models,Ho et al. 2020):

  • 前向过程 $T=1000$ 步
  • 反向过程也需要 1000 步(每步一次网络前向传播)
  • 每步有随机性($\sigma_t \mathbf{z}$ 项)→ 同一个起点可以生成不同结果
  • 图像生成质量极高,但耗时:1000 次前向传播
  • 对于机器人控制来说太慢了——如果控制频率是 10Hz,每步动作只有 0.1 秒,1000 次前向传播远远超出时限

DDIM(Denoising Diffusion Implicit Models,Song et al. 2021):

  • 核心发现:可以跳步。不需要走完全部 1000 步,只需要选一个子集(比如每隔 100 步采一次,只走 10 步)
  • 去掉了随机项 → 确定性采样(同一起点永远生成同一结果)
  • 10 步就能生成高质量样本
  • 和 DDPM 共享同一个训练好的模型——不需要重新训练

关键洞察:DDPM 和 DDIM 不是两种模型,而是同一个模型的两种采样策略。训练一次,推理时自由切换。Diffusion Policy 论文用的就是 DDIM,10 步采样,推理延迟约 0.1 秒——刚好能满足 10Hz 实时控制。

2.5 Score Function:梯度指向"合理动作"

扩散模型还有一种等价的理解方式:学习数据分布的 score function(得分函数),即 $\nabla_{\mathbf{a}} \log p(\mathbf{a})$。这个梯度告诉你"从当前位置出发,往哪个方向走一步,能到达概率更高(更合理)的动作"。

为什么这对多模态动作分布很重要?想象动作空间里有两座"山峰"——一座代表"左绕",另一座代表"右绕"。Score function 在左峰附近指向左峰顶点,在右峰附近指向右峰顶点。从噪声空间出发时,你随机落在左侧区域就被引导到左峰,落在右侧区域就被引导到右峰——永远不会被拉到两峰之间的"山谷"(那个无效的"取平均"动作)。

对比传统 BC:MSE loss 训练出的模型直接输出一个点估计,这个点被两座山峰同时拉扯,最终停在山谷——概率最低的位置。扩散模型通过 score function 的引导,保证采样结果总是落在某座山峰上。

2.6 从图片到动作:维度的变化

扩散模型最初是为图像生成设计的(Dalle 2、Stable Diffusion 都是扩散模型)。迁移到动作生成时,维度和语义都变了:

维度 图像生成 动作生成
数据形状 [H, W, 3](像素网格) [T, D](时间步 × 动作维度)
单个元素含义 像素 RGB 值 关节角度/末端位姿
典型维度 512×512×3 = 786,432 16×7 = 112
生成目标 一张好看的图片 一段可执行的轨迹
实时性要求 无(可以等几秒) 严格(10Hz = 0.1 秒内)

维度降低了四个数量级(从 786K 到 112),这意味着动作空间的扩散比图像扩散快得多——10 步 DDIM 就够了,不需要图像生成领域常见的 50-100 步。

但也有新挑战:动作轨迹有强时序依赖。第 3 步的关节角度和第 4 步的关节角度之间有物理约束(机械臂不可能瞬间跳转 90 度)。Diffusion Policy 用 1D 时序卷积来建模这种依赖,确保去噪后的轨迹在时间维度上平滑连续。


3. Diffusion Policy 深度剖析

论文:Chi et al., "Diffusion Policy: Visuomotor Policy Learning via Action Diffusion", RSS 2023 一句话总结:把行为克隆的动作预测替换成条件扩散去噪过程,在 15 个任务上平均提升 46.9%,首次解决了 Kitchen p4 等长期未解难题。

3.1 问题:为什么传统 BC 会"取平均"?

让我们把模态平均的问题说得更具体。假设你在教机器人做"Push-T"任务:把一个 T 形积木推到目标位置。示教数据里有两种策略:

  • 策略 A:先推 T 的横杠左端,旋转到位后再平移
  • 策略 B:先推 T 的竖杠底部,直接平移到位再微调角度

两种策略都能完成任务,示教数据里各占一半。传统 BC 用 MSE loss 训练,模型学到的是两种策略的"加权平均"——推一个不左不右的位置,结果既不能旋转到位,也不能平移到位。

这不是假设场景。在 Diffusion Policy 论文的对比实验中,传统 BC 在 Push-T 任务上只有 59% 的成功率(机器人经常推到一半卡住),而 Diffusion Policy 达到了 95%。

前人的尝试

在 Diffusion Policy 之前,研究者尝试过多种方法应对多模态问题:

  • GMM(高斯混合模型):手动指定混合组件数量。问题:你怎么知道该用几个高斯?如果设少了,还是会模态平均;设多了,训练不稳定。
  • VAE(变分自编码器):引入 latent variable 来编码"选择哪种策略"。问题:posterior collapse(模型忽略 latent variable,退化成普通 BC)。
  • IBC(Implicit Behavioral Cloning):用能量函数(Energy-Based Model)建模,通过 Langevin 采样生成动作。理论上能处理多模态,但实际极不稳定——在 Diffusion Policy 论文的 10 个仿真任务中,IBC 有 7 个得分为 0.00。

IBC 的失败特别有教育意义。能量函数定义了一个"地形",低能量区域对应合理动作。问题是这个地形可能有很多局部极小值,Langevin 采样容易陷入局部最优或在极小值之间振荡。扩散模型的 score function 提供了更平滑的梯度场,采样过程更稳定。

Diffusion Policy 的回答:不要试图直接输出一个确定性动作,改为学习动作分布的 score function,然后从分布中采样。去噪过程的随机性天然保证了每次采样落在某一个模态上——这是数学性质,不需要额外设计。

3.2 滑动窗口:To / Tp / Ta

Diffusion Policy 不是一次预测一个时间步的动作,而是一次预测整段动作序列。这里有三个关键参数定义了"看多少、预测多少、执行多少":

To = Observation Horizon(观察窗口),典型值 2:

模型看最近 To 帧的观察(图像 + 机器人状态)。为什么是 2 而不是 1?因为两帧之间的差异提供了运动信息——类似于光流。单帧图片是静态的,无法判断物体是否在移动、机械臂是否在运动中。两帧给了最小必要的时序上下文。

Tp = Prediction Horizon(预测窗口),典型值 16:

模型一次预测未来 Tp 步的完整动作序列。为什么要预测这么远?因为动作轨迹有时间相关性——当前动作受未来目标的影响。如果只预测下一步,模型是"近视的";预测 16 步让模型能规划更连贯的运动。

Ta = Action Execution Horizon(执行窗口),典型值 8:

虽然模型预测了 16 步,但只执行前 8 步。执行完后,用新的观察重新预测下一个 16 步,再执行前 8 步。

为什么 Ta < Tp?这就是"滑动窗口控制"(Receding Horizon Control)的思想。类比开车:你看到前方 100 米的路况(Tp),但只把方向盘转到适合前 50 米的角度(Ta)。过了 50 米后,你看到新的路况,重新规划。这样做有两个好处:

  1. 容错:后半段预测(第 9-16 步)可能不太准确(越远越不确定),不执行它们就不会犯错
  2. 反馈修正:执行 8 步后获得新观察,可以根据实际情况调整计划
时间线示意(一个控制周期):

│← To=2 →│             Tp=16 步预测              │
│ obs obs │ a1 a2 a3 a4 a5 a6 a7 a8 │ a9 ... a16 │
│         │←────── Ta=8 执行 ──────→│← 丢弃缓冲 →│

下一个周期:
          │← To=2 →│             Tp=16 步预测              │
          │ obs obs │ a1 a2 ... a8 │ a9 ... a16 │

消融实验表明 Ta=8 是最佳平衡点。Ta 太小(如 1),每步都重新规划,动作不连贯、计算开销大;Ta 太大(如 16=Tp),没有重新规划的机会,误差累积无法修正。

3.3 两种架构

Diffusion Policy 论文提出了两种网络架构来实现去噪过程:

CNN 架构(1D 时序卷积)

输入:含噪动作序列 [Tp, D] + 去噪时间步 t + 视觉特征
      ↓
FiLM 条件化(视觉特征调制中间表示)
      ↓
1D 时序卷积(沿时间轴提取局部模式)
      ↓
残差连接 + GroupNorm
      ↓
输出:预测噪声 [Tp, D]

1D 卷积沿着时间维度滑动,每个卷积核看相邻几步动作之间的关系。这天然适合建模"轨迹平滑性"——相邻时间步的动作值应该相近(物理约束)。

Transformer 架构(基于 MinGPT)

输入:含噪动作 token 序列 + 去噪时间步 embedding + 视觉 token
      ↓
Causal Self-Attention(每步只关注之前的步)
      ↓
Feed-Forward + LayerNorm
      ↓
输出:预测噪声 [Tp, D]

Transformer 架构用注意力机制建模全局依赖(第 1 步的动作可以直接关注第 16 步),理论上能捕捉更长程的模式。

选哪个?

论文的实验结论:CNN 架构在连续控制任务上通常更好(Push-T、Kitchen 等),而 Transformer 架构在需要多任务泛化的场景下更有潜力。原因可能是:

  • CNN 的归纳偏置(局部相关性、平移不变性)与轨迹的物理性质天然匹配
  • Transformer 更灵活但需要更多数据来学习这些隐式规律

后续工作(包括 π₀)大多选择了 Transformer 架构,因为基础模型路线需要的正是灵活性和可扩展性。

3.4 视觉条件化

机器人需要根据看到的场景来决定动作。Diffusion Policy 的去噪过程是在"视觉条件"下进行的——模型不是无条件地从噪声中擦出动作,而是根据当前观察擦出"适合当前场景"的动作。

视觉编码器:ResNet-18

输入图像经过预训练的 ResNet-18,输出一个固定长度的特征向量。选 ResNet-18 而非更大的模型(ResNet-50、ViT),是因为 Diffusion Policy 定位在"方法验证"——用轻量编码器足以证明扩散方法本身的优越性,不需要依赖强大的视觉 backbone。

条件注入方式:FiLM

FiLM(Feature-wise Linear Modulation)在 Ch09 中出现过(BLIP-2 用 FiLM 做跨模态调制)。基本思想是:

$$\text{FiLM}(\mathbf{h}) = \gamma \cdot \mathbf{h} + \beta$$

其中 $\mathbf{h}$ 是去噪网络的中间特征,$\gamma$ 和 $\beta$ 从视觉特征中计算得来。直觉上,视觉特征"告诉"去噪网络"当前场景长什么样",去噪网络就据此调整自己的行为。

为什么用 FiLM 而不是简单的 concatenation?因为 FiLM 是乘性调制($\gamma$ 可以选择性放大或抑制特定特征通道),表达能力比加法拼接(concatenation)强。实验也表明 FiLM 条件化比 concatenation 提升了约 5-10% 的成功率。

关键理解:去噪过程本身不"看"图片。是 FiLM 层把视觉信息注入到了去噪网络的权重调制中。你可以这样理解:视觉特征决定了"今天去噪网络用哪套参数"(通过 $\gamma, \beta$ 改变网络行为),不同场景用不同的"参数配置"去噪,自然得到不同的动作。

3.5 训练与推理

训练流程

输入:示教数据集 {(观察序列, 动作轨迹)} 
对每个 batch:
  1. 取一条真实动作轨迹 a₀ [Tp, D]
  2. 随机采样时间步 t ∈ [1, T]
  3. 随机采样噪声 ε ~ N(0, I)
  4. 加噪:aₜ = sqrt(ᾱₜ) · a₀ + sqrt(1-ᾱₜ) · ε
  5. 编码当前观察得到视觉条件 c
  6. 让网络预测:ε̂ = εθ(aₜ, t, c)
  7. 损失:L = MSE(ε̂, ε)
  8. 反向传播更新 θ

整个训练过程的代码实现不到 100 行——简单性是扩散模型流行的重要原因之一。不需要对抗训练(不稳定)、不需要 posterior network(如 VAE)、不需要复杂的采样过程(如 IBC 的 Langevin dynamics)。

推理流程

输入:当前观察序列(最近 To=2 帧)
  1. 编码观察得到视觉条件 c
  2. 从标准高斯采样噪声:a_T ~ N(0, I), shape [Tp, D]
  3. for t = T, T-Δ, T-2Δ, ..., 0:   (DDIM 跳步,共 ~10 步)
       a_{t-Δ} = DDIM_step(εθ(aₜ, t, c), aₜ, t)
  4. 得到去噪后的动作轨迹 a₀ [Tp=16, D]
  5. 只执行前 Ta=8 步

推理延迟:10 步 DDIM × 每步约 10ms = 约 100ms。对于 10Hz 控制(每 100ms 出一个动作)刚好够用。这是一个工程甜点:更少步数精度下降明显,更多步数超时。

训练 vs 推理的不对称

这里有一个容易忽略的细节:训练时每个 batch 只做一步去噪预测($t$ 是随机的),但推理时需要串行走完所有 10 步。这意味着:

  • 训练可以高度并行(不同 batch 用不同的 $t$,同时训练)
  • 推理是串行的(必须先完成第 $t$ 步才能做第 $t-1$ 步)

这个不对称是扩散模型推理慢的根本原因,也是后续 Consistency Model、Flow Matching 等工作试图解决的核心问题。

3.6 关键实验结果

Diffusion Policy 在 4 个 benchmark、15 个任务上做了全面评估。以下是最重要的数字:

整体提升:相对前最佳方法平均提升 46.9%。不是某一个任务上碰巧好,而是系统性地好——15 个任务中 14 个取得了最佳成绩。

标志性任务——Kitchen p4

Kitchen 环境要求机器人依次操作 4 个厨房器具(开微波炉门、移动水壶、开关灯、开柜门)。p4 意味着必须按顺序完成全部 4 个步骤。这个任务在 Diffusion Policy 之前从未被任何方法有意义地解决过——最好的方法得分约 0.1/1.0。

Diffusion Policy 将得分提升到约 0.3(213% 相对提升)。虽然 0.3 看起来不高,但要理解这是一个需要精确长序列规划的任务——首次证明扩散策略能处理多步操作链。

Push-T(真实机器人)

Push-T 是论文最亮眼的实验。任务很简单:用末端执行器把 T 形积木推到指定位置和角度。但由于推动过程中力学交互复杂(摩擦、旋转耦合),传统方法很难做好。

  • 传统 BC:59% 成功率
  • LSTM-GMM:65% 成功率
  • IBC:0% 成功率(完全失败)
  • Diffusion Policy:95% 成功率

从 59% 跳到 95%,这不是增量改进,是质的飞跃。

消融实验核心发现

  • Ta(执行窗口):Ta=8 最佳。Ta=1 时每步重规划,动作颤抖;Ta=16 时不重规划,无法纠错
  • 去噪步数:10 步 DDIM 就达到了接近最优性能;继续增加步数边际收益递减
  • 视觉编码器:ResNet-18 vs ResNet-50 差异不大——说明瓶颈不在视觉编码,而在动作生成方法本身
  • 条件化方式:FiLM > concatenation,约 5-10% 差异

3.7 对比:为什么 IBC 失败了?

IBC(Implicit Behavioral Cloning,Florence et al. 2021)和 Diffusion Policy 解决的是同一个问题——多模态动作分布,但路径完全不同。理解 IBC 为什么失败,能加深对扩散方法优势的理解。

IBC 的思路:学一个能量函数 $E_\theta(\mathbf{o}, \mathbf{a})$,低能量 = 好动作。推理时,从随机动作出发用 Langevin 动力学(沿能量梯度下降)采样低能量动作。

失败原因

  1. 能量地形陷阱:能量函数可以有任意多个局部极小值。Langevin 采样需要足够步数才能跳出局部极小,但步数太多又太慢。
  2. 采样不稳定:Langevin dynamics 对步长极其敏感。步长大 → 采样发散;步长小 → 收敛极慢。没有一个步长在所有任务上都好用。
  3. 梯度消失:在远离任何模态的区域,能量梯度可能接近零("平原"地形),采样点无法有效移动。

扩散模型为什么更好

  1. 渐进式引导:不是一步到位,而是从纯噪声逐步精化。每一步的移动幅度由噪声调度控制,不需要手动调步长。
  2. 训练目标明确:预测噪声的 MSE loss 是平滑的、处处有梯度的——不存在能量函数的"平原"问题。
  3. 数学保证:在足够步数下,DDPM 采样渐近收敛到真实分布。IBC 的 Langevin 采样没有这样强的收敛保证。

实验对比(10 个仿真任务):

方法 成功率 > 0 的任务数 平均得分
IBC 3/10 极低
Diffusion Policy 10/10

IBC 在 7 个任务上得分 0.00——不是"差一点",是"完全不工作"。这反映了能量模型在高维空间中采样的根本困难。Diffusion Policy 的稳定性优势不是百分比级别的差异,而是"能用 vs 不能用"的质变。

3.8 局限性

Diffusion Policy 是方法论的突破,但并非没有缺陷。了解这些局限性正是后续工作(3D-DP、π₀)要解决的问题:

1. 仍然需要示教数据(不是 RL)

Diffusion Policy 本质上还是行为克隆——它从人类示教中学习。这意味着:

  • 策略的上限受限于示教质量(人类做得不好,机器人也学不好)
  • 无法发现示教中没有出现的新策略
  • 需要为每个新任务收集新示教

后续有工作尝试将扩散策略和强化学习结合(DPPO、Diffusion-RL),但不在本章范围内。

2. 仅用 2D 图像——无法推理深度

ResNet-18 编码的是 RGB 图像,丢失了深度信息。这在桌面操作任务(Push-T、Kitchen)中影响不大——因为深度变化小、物体大部分在同一平面上。但在需要精确三维定位的任务中(如从架子上取不同高度的物品),2D 信息不够。

这直接导向了 3D Diffusion Policy 的工作。

3. 10 步去噪 = 10 次前向传播

虽然 DDIM 已经比 DDPM 快了 100 倍,但每次出动作仍需 10 次网络前向传播。对比 RT-2 或 OpenVLA(1 次前向传播出一个 token),计算量仍然偏大。在计算资源有限的边缘设备上部署可能有问题。

后续的 Consistency Policy 将其压缩到 1 步,π₀ 的 Flow Matching 用 1-4 步就够。

4. 未验证跨机体泛化

Diffusion Policy 的所有实验都在单一机器人硬件上完成。它能不能在 Franka 上训练、UR5 上部署?论文没有回答这个问题。π₀ 正是针对这个方向而来。

5. 推理时的随机性

由于从随机噪声出发,同一观察下两次推理可能生成不同的动作(即使用 DDIM 的确定性采样,起始噪声不同结果也不同)。在某些需要高确定性的安全关键场景中,这种随机性可能是缺点。


4. 3D Diffusion Policy 深度剖析

论文:Ze et al., "3D Diffusion Policy: Generalizable Visuomotor Policy Learning via Simple 3D Representations", RSS 2024 一句话总结:用稀疏点云(1024 个 3D 点)替代 2D 图像作为视觉输入,在 72 个任务上比原版 Diffusion Policy 平均高 24.2%,真实机器人成功率从 35% 提升到 85%,且只需 10 条示教。

4.1 核心问题:"二维看世界够吗?"

人类操作物体时从来不只靠"照片"。伸手拿杯子,你的大脑在实时计算杯子离手有多远、杯口朝哪个方向、手指需要张开多大。这些信息都是三维的。

但 Diffusion Policy 的输入是 RGB 图片——一个二维投影。二维投影有三个根本性缺陷:

深度模糊:同一张照片中,一个近处的小杯子和一个远处的大杯子可能占据完全相同的像素区域。机器人看到这张图,无法判断该伸手 30 厘米还是 60 厘米。

视角敏感:稍微换一个摄像头角度,同一个场景的 2D 投影就完全不同了。这意味着如果你在摄像头位置 A 收集了示教数据,换到位置 B 后策略可能完全失效。

遮挡不确定:2D 图片中,被遮挡的部分完全不可见。一个物体放在另一个物体后面,机器人从图片里根本"看不到"它的存在。

3D Diffusion Policy(DP3)的解决方案直截了当:用深度相机获取 3D 点云作为输入。点云中每个点都有精确的 (x, y, z) 坐标——深度信息是显式给出的,不需要模型去"猜"。

4.2 从深度图到点云

深度相机(如 Intel RealSense)输出一张"深度图":和 RGB 图像一样是矩形像素网格,但每个像素存储的不是颜色值,而是该点到相机的距离(以米为单位)。

将深度图转换为点云的过程:

深度图 [H, W](每像素一个距离值)
    ↓ 结合相机内参矩阵 K
3D 点云 [H×W, 3](每点一个 xyz 坐标)
    ↓ 裁剪工作空间(去掉桌子以外的点)
工作空间点云 [N, 3](N 可能有几万到几十万)
    ↓ 最远点采样(FPS)
稀疏点云 [1024, 3]

为什么用 FPS(Farthest Point Sampling)而不是随机采样?

FPS 的策略是:每次选离已选点集最远的那个新点。这保证了采样后的 1024 个点尽可能均匀分布在整个工作空间中,不会出现"某区域点太密、某区域点太疏"的情况。

随机采样可能会导致小物体(如螺丝刀尖端)上的点全部被丢弃——那个区域的点太少,随机采不到。FPS 保证即使是小区域也至少有一些代表性点。

为什么是 1024 个点?

太少(如 256):分辨率不够,小物体的形状细节丢失。 太多(如 4096):计算量增大,实时性下降。 1024 是实验确定的平衡点:足够描述桌面操作场景中物体的形状,同时处理速度可接受。

4.3 DP3 编码器(不是 PointNet!)

这是 DP3 最反直觉的设计决策。处理点云的"经典"方法是 PointNet(Qi et al. 2017)——一个专门为点云设计的网络,具有置换不变性(输入点的顺序不影响输出)。几乎所有处理点云的机器人学习论文都用 PointNet 或其变体。

DP3 没有用 PointNet。它用了一个普通的 3 层 MLP。

点云 [1024, 3]
    ↓ Linear(3 → 256) + ReLU
    ↓ Linear(256 → 256) + ReLU
    ↓ Linear(256 → 256) + ReLU
    ↓ Max Pooling → 全局特征 [256]
条件向量(输入给扩散网络的 FiLM 层)

结构就这么简单。没有 T-Net(PointNet 的对齐模块)、没有层级特征聚合(PointNet++)、没有注意力机制。

为什么这比 PointNet 好?

论文的对比实验中,这个简单 MLP 比 PointNet 高出 63 个百分点。作者的解释是:

  • PointNet 为分类设计:PointNet 的目标是输出一个物体类别标签("这是椅子还是桌子")。它的全局 max pooling 丢弃了空间位置信息——对分类无所谓(椅子放哪里都是椅子),但对机器人控制来说位置信息至关重要。
  • 策略条件化需要空间特征:机器人需要知道"杯子在工作空间的哪个位置",而不只是"场景里有一个杯子"。简单 MLP + max pooling 保留的空间信息比 PointNet 多。
  • 轻量级 = 更好的梯度流:PointNet 的 T-Net 等额外模块引入了更多非线性和梯度路径,可能在小数据(仅 10 条示教)下过拟合。简单 MLP 在小数据下更稳。

另一个反直觉的选择:不用颜色

点云只用了 XYZ 坐标——没有 RGB 颜色信息。直觉上颜色应该有帮助(红杯子 vs 蓝杯子?),但实验表明去掉颜色反而更好。原因推测:

  • 颜色受光照影响大(同一杯子在不同灯光下颜色不同)
  • 对于操作来说,形状和位置比外观更重要
  • 去掉颜色减少了输入维度,降低了过拟合风险(特别是在只有 10 条示教的情况下)

这给了一个重要的工程启示:更多信息不一定更好。在数据有限时,精简输入可能比丰富输入效果更好。

4.4 关键数字

DP3 的实验覆盖面非常广:72 个模拟任务 + 真实机器人实验。核心数字:

模拟环境(72 任务)

方法 平均成功率
Diffusion Policy (2D) 59.8%
Diffusion Policy + PointNet ~11%
DP3 (3D + MLP) 74.4%

DP3 比原版 DP 高 24.2 个百分点。注意 DP + PointNet 反而比纯 2D 更差——PointNet 在这个场景下不仅没帮忙,还帮了倒忙。

真实机器人

方法 成功率
Diffusion Policy (2D) 35%
DP3 85%

从 35% 到 85%,真实世界的提升比模拟环境更大。这说明 3D 表征在真实环境中的优势比在模拟中更明显——因为真实世界有更多的深度变化、光照变化、视角偏移等干扰。

数据效率

最惊人的数字是 DP3 只需要 10 条示教。对比 RT-1 需要 13 万条轨迹,这是 4 个数量级的差距。为什么?

  • 3D 表征极度信息密集:1024 个 3D 点直接编码了物体的形状和空间关系
  • 2D 图像需要模型自己"学出"深度感——这需要大量数据
  • 当表征本身已经包含了足够的空间信息,策略学习就变得简单了

这验证了机器学习中一个经典观点:好的表征 > 更多的数据。与其花钱雇人做 1000 次示教,不如投资一个深度相机。

安全性

在有碰撞约束的任务中,DP3 的约束违反率为 0%。3D 理解让机器人能精确判断自己的手臂和障碍物之间的距离,从而避免碰撞。2D 方法因为不确定深度,经常撞到东西。

4.5 泛化能力:10 个示教就够?

DP3 展示了四种泛化能力,全部用同样的 10 条示教策略实现:

视角泛化:训练时摄像头在位置 A,测试时换到位置 B。2D 方法完全失败(因为图像变了),DP3 几乎不受影响(因为 3D 空间中物体位置没变)。

外观泛化:训练时用红色杯子,测试时用蓝色杯子。由于 DP3 不用颜色信息(只用 XYZ),外观变化完全不影响它。

空间布局泛化:训练时杯子在左边,测试时杯子在右边。DP3 的点云直接编码了新的空间位置,策略能适应。

物体实例泛化:训练时用杯子 A,测试时用形状略有不同的杯子 B。只要形状上的关键特征(如杯口位置)能被点云捕捉,策略就能迁移。

这四种泛化能力揭示了一个深刻的道理:策略学到的到底是什么。2D 策略学到的是"当像素模式 X 出现时,执行动作 Y"——高度绑定于特定视角和外观。3D 策略学到的是"当工作空间中位置 P 处有物体时,运动到位置 Q"——这是空间级别的策略,天然不受视角和外观影响。

4.6 局限性

1. 需要深度相机

不是所有机器人都配备了深度相机。很多场景只有 RGB 摄像头(如手机相机、普通 webcam)。深度相机也有自身限制:对透明物体(玻璃杯)效果差、对反光表面(金属)会产生噪点、有最小工作距离限制。

2. 单相机限制

原版 DP3 只用单个深度相机。这意味着被遮挡的区域仍然没有点云信息。多视角融合(如两个相机从不同角度拍)是自然的改进方向,但原论文未涉及。

3. 点云处理延迟

虽然 3 层 MLP 本身很快,但整个流程(深度图 → 点云转换 → 工作空间裁剪 → FPS 采样)会增加额外延迟。论文中没有详细报告端到端推理时间,但合理估计比纯 2D 版本慢 20-50ms。

4. 静态场景假设

点云是瞬时快照——当前这一帧的 3D 结构。它不包含运动信息(物体在移动吗?往哪移?多快?)。对于动态操作场景(如接住飞来的球),需要额外的时序点云处理。


5. π₀ 深度剖析

论文:Physical Intelligence, "π₀: A Vision-Language-Action Flow Model for General Robot Control", 2024 一句话总结:VLM 骨干 + Flow Matching 动作头 + 跨机体联合训练,目标是做"机器人领域的 GPT-4"——一个基础模型适配所有机器人。

5.1 从学术方法到产业基础模型

Diffusion Policy(2023)和 DP3(2024)都是学术工作——证明一个方法在受控条件下有效。它们的实验规模相对小:Diffusion Policy 在 15 个任务上验证,DP3 在 72 个任务上验证,都是单一硬件平台。

π₀ 来自 Physical Intelligence(简称 Pi),一家 2024 年成立的公司,融资超过 4 亿美元。它的目标不是验证方法,而是建造产品——一个能在任何机器人上运行的通用基础模型。这是从"一篇论文"到"一个平台"的跨越。

类比:Diffusion Policy 像是实验室里合成了一种新材料并验证了性能;π₀ 像是建一座工厂量产这种材料并卖到全世界。所需的工程复杂度完全不在一个量级。

π₀ 的三个核心创新全部朝着"规模化"方向:

  1. VLM 骨干:复用预训练视觉语言模型的知识,不需要从零学视觉理解
  2. Flow Matching:比标准扩散快 10-100 倍,满足实时部署需求
  3. 跨机体训练:一次训练适配多种机器人,不需要为每种硬件分别训练

5.2 Flow Matching vs Diffusion

π₀ 最重要的技术选择是用 Flow Matching 替代标准扩散。两者解决同一个问题(从噪声生成动作),但路径完全不同。

标准扩散(DDPM/DDIM)的路径

从噪声到目标的路径是弯曲的(由 SDE——随机微分方程定义)。想象你在浓雾中爬山,每一步都根据当前位置的局部坡度决定方向。由于每步只能看到局部信息,你走的是一条蜿蜒的路线。需要走很多步(10-100 步)才能到达山顶。

Flow Matching 的路径

从噪声到目标的路径是直线的(由 ODE——常微分方程定义)。想象你坐缆车直达山顶——出发点和终点之间是一条直线。因为路径是直的,你只需要 1-4 步就能"走完"。

用更技术的语言说:

  • 扩散学的是 score function $\nabla_{\mathbf{a}} \log p_t(\mathbf{a})$,它定义了一个随时间变化的向量场,粒子在这个场中做曲线运动
  • Flow Matching 学的是 velocity field $v_t(\mathbf{a})$,它定义了从 $t=0$(噪声)到 $t=1$(目标)的最短路径上每个点的速度方向

数学上,两者都能收敛到正确分布。但 Flow Matching 的直线路径有一个实际优势:数值积分更精确。用 Euler 方法(最简单的 ODE 求解器)只走 1-4 步,Flow Matching 的误差就已经很小了;标准扩散需要 10-100 步才能达到同样精度。

对 π₀ 的意义

指标 标准扩散 (DDIM) Flow Matching
推理步数 10-100 1-4
单步推理时间 ~10ms ~10ms
总推理延迟 100-1000ms 10-40ms
控制频率上限 1-10 Hz 25-100 Hz

从 100ms 降到 10-40ms,意味着 π₀ 能达到 25Hz 以上的控制频率。对于需要快速反应的任务(如灵巧手操作),这个速度差距是决定性的。

还有一个被忽视的好处:Flow Matching 的训练也更稳定。标准扩散的噪声调度(如何从 $t=0$ 到 $t=T$ 分配噪声)对性能影响很大,需要仔细调参。Flow Matching 的直线插值天然消除了这个超参数敏感性。

5.3 三层架构

π₀ 的完整架构可以理解为三层叠加:

┌─────────────────────────────────────────────────┐
│ Layer 3: Flow Matching Action Head              │
│   输入:动作 token + VLM 特征                    │
│   输出:连续动作向量 [chunk_size × action_dim]   │
└───────────────────────┬─────────────────────────┘
                        │ cross-attention
┌───────────────────────┴─────────────────────────┐
│ Layer 2: Cross-Attention Bridge                 │
│   VLM 输出特征 ←→ Action Token 交互             │
└───────────────────────┬─────────────────────────┘
                        │
┌───────────────────────┴─────────────────────────┐
│ Layer 1: VLM Backbone (PaLI-X style)            │
│   输入:RGB 图像 + 文本指令                      │
│   输出:多模态特征表示                            │
└─────────────────────────────────────────────────┘

Layer 1:VLM 骨干

这是一个预训练的视觉语言模型(类似 PaLI-X 架构)。它的作用是"理解世界"——看图片知道场景中有什么物体、读指令知道要做什么任务。

关键的是,这一层的知识来自互联网规模的预训练(图文对、视觉问答等)。机器人领域的数据量有限(最大的 OXE 也就百万级轨迹),但互联网图文数据是十亿级的。通过复用预训练 VLM,π₀ 获得了远超机器人数据能提供的视觉理解能力。

对比 Diffusion Policy 用的 ResNet-18:ResNet-18 只能提取低级视觉特征(边缘、纹理、形状),不"理解"语义。π₀ 的 VLM 能理解"这是一杯咖啡"、"指令说把咖啡端给人"——语义级别的理解。

Layer 2:Cross-Attention Bridge

VLM 输出的是"视觉-语言特征",Action Head 需要的是"动作相关的条件信号"。Cross-Attention 把两者连接起来:Action Token 作为 Query,VLM 特征作为 Key 和 Value。

这意味着 Action Head 可以选择性地关注视觉-语言特征中和当前动作决策相关的部分。比如在执行"拿起红色杯子"时,Cross-Attention 会让 Action Token 重点关注 VLM 特征中红色杯子对应的区域。

Layer 3:Flow Matching Action Head

接收经过 Cross-Attention 丰富的 Action Token,通过 Flow Matching 的 ODE 求解输出连续动作值。

和 RT-2/OpenVLA 的离散 token 预测有根本区别:

  • RT-2:输出离散 token(从 256 个 bin 中选一个)→ 精度受限于 bin 宽度
  • π₀:输出连续实数 → 精度只受浮点数精度限制

对于精细操作(如拧螺丝需要精确到 0.1 度的旋转),连续动作表示的优势是决定性的。

5.4 Cross-Embodiment 训练

π₀ 最具野心的设计是跨机体训练:同一个模型在 7 种以上不同的机器人上训练。

这为什么重要?

每种机器人的动作空间不同:

  • Franka Panda:7 个关节角度 + 1 个夹爪
  • UR5:6 个关节角度 + 力矩
  • xArm:7 个关节角度 + 6D 末端位姿
  • 移动机器人:2D 速度 + 旋转

如果为每种机器人单独训练一个模型,数据效率极低——每种机器人可能只有几千条轨迹。但如果把所有机器人的数据放在一起训练,模型可以从总共数百万条轨迹中学习通用的操作知识("什么是'抓取'""如何处理软体物品"等),然后在特定硬件上微调。

Pre-train → Post-train 范式

π₀ 借鉴了 LLM 的两阶段训练:

  1. Pre-training(预训练):在 OXE(Open X-Embodiment)数据集上训练,包含 7+ 种机器人的混合数据。模型学习通用的机器人操作知识。
  2. Post-training(后训练/微调):在特定机器人的少量新数据上微调,适配该硬件的动作空间和物理特性。

这和 GPT-4 的训练方式完全类比:

  • GPT-4 pre-training:在整个互联网上学语言知识
  • GPT-4 fine-tuning/RLHF:适配特定任务(对话、代码生成等)

π₀ pre-training:在所有机器人数据上学操作知识 π₀ post-training:适配特定机器人硬件

5.5 长序列任务

现实世界的任务很少是"执行一个动作"这么简单。"做一杯咖啡"需要:打开咖啡机 → 放入咖啡胶囊 → 放杯子 → 按按钮 → 等待 → 取出杯子。这是一个长序列多步骤任务。

π₀ 处理长序列的策略有两层:

Chunk-level Autoregression(动作块自回归)

不是一次预测整个任务的所有动作(那太长了),而是:

  1. 根据当前观察和指令,预测一个动作 chunk(如 16 步)
  2. 执行这个 chunk
  3. 根据新的观察,预测下一个 chunk
  4. 重复直到任务完成

这和 Diffusion Policy 的 Receding Horizon 思想一致,但 π₀ 在 chunk 之间加入了语言指令的更新——如果高层规划器发现当前子任务完成了,会发送新的子任务指令。

Language Instruction Decomposition(语言指令分解)

将高层指令("做咖啡")分解为子指令序列("打开咖啡机门"→"放入胶囊"→…)。每个子指令驱动一段 chunk 的生成。

这里 VLM 骨干发挥了关键作用:它能理解自然语言指令,也能从视觉观察中判断当前子任务是否完成。两者结合实现了长序列任务的自主推进。

5.6 关键数字与定位

性能指标

  • 推理速度:1-4 步 Flow Matching(vs 标准扩散 10-100 步)
  • 跨机体能力:7+ 种机器人类型联合训练
  • 连续动作:无离散化精度损失

产业定位

Physical Intelligence 获得了超过 4 亿美元融资,估值约 20 亿美元。π₀ 不是一篇论文——它是一个产品战略。公司的赌注是:"机器人领域会经历和 NLP 一样的基础模型革命。谁先做出那个基础模型,谁就是下一个 OpenAI。"

这个判断是否正确还需要时间验证。但 π₀ 代表了扩散策略路线从学术验证走向产业化的最前沿。

与前两个模型的关系

  • Diffusion Policy:方法论验证("扩散用于动作生成是可行的")
  • 3D-DP:感知增强("加入 3D 信息效果更好")
  • π₀:规模化("做一个通用基础模型")

三者不是互相替代,而是层层递进。π₀ 的架构中同样可以接入点云输入(3D-DP 的贡献),也同样使用扩散/流匹配生成动作(Diffusion Policy 的贡献)。π₀ 是站在前两者肩膀上的产物。


6. 三模型对比表

维度 Diffusion Policy 3D Diffusion Policy π₀
年份 2023 2024 2024
定位 学术方法验证 感知增强 产业基础模型
采样方法 DDPM/DDIM DDPM/DDIM Flow Matching
推理步数 10 (DDIM) 10 (DDIM) 1-4
视觉输入 2D RGB 3D 点云 (1024点) 2D RGB + 文本
视觉编码 ResNet-18 3层 MLP 预训练 VLM
条件注入 FiLM FiLM Cross-Attention
语言理解 有(VLM 骨干)
跨机体 是(7+种)
训练数据规模 单任务示教 10条示教 OXE 百万轨迹
动作表示 连续(去噪输出) 连续(去噪输出) 连续(流匹配输出)
关键突破 解决模态平均 3D泛化+数据效率 规模化+速度
主要局限 2D only, 无语言 需深度相机 闭源, 未完全验证

演进脉络总结

采样范式:   DDPM(慢) → DDIM(快) → Flow Matching(极快) → Consistency(单步)
感知输入:   2D RGB → 3D点云 → 多模态(图+文+3D)
模型规模:   单任务 → 多任务 → 跨机体基础模型
数据范式:   每任务独立训练 → 数据高效(10条) → 预训练+微调

这条演进线清晰地展示了技术从"证明可行"到"工程可用"再到"产业可扩展"的路径。每一步都在保留前一步优势的同时解决其核心局限。


7. 检查点

以下问题覆盖本章前半部分的核心概念。能回答这些问题说明你理解了技术要点:

扩散基础

  1. 传统 BC 为什么会产生"模态平均"问题?用绕障碍物的例子解释为什么这会导致碰撞。
  2. DDPM 训练了 1000 步,但 DDIM 只用 10 步就能推理。为什么可以跳步?它们共享什么?
  3. Score function 如何保证采样结果落在"山峰"而非"山谷"?

Diffusion Policy

  1. To=2, Tp=16, Ta=8 各是什么含义?为什么 Ta < Tp?如果 Ta=Tp 会怎样?
  2. CNN 架构和 Transformer 架构各适合什么场景?论文推荐在什么条件下用哪个?
  3. IBC 和 Diffusion Policy 都声称能处理多模态分布,为什么 IBC 在 7/10 任务上得分 0?
  4. 训练 loss 是什么?用一句话描述训练循环的核心步骤。

3D Diffusion Policy

  1. DP3 只用 10 条示教就达到 85% 成功率,而 RT-1 需要 13 万条。差距的根本原因是什么?
  2. 为什么 3 层 MLP 比 PointNet 更适合做策略条件化的点云编码器?
  3. DP3 不用颜色信息(只用 XYZ)。这在什么场景下是优势?什么场景下是劣势?

π₀

  1. Flow Matching 和标准扩散的路径有什么几何区别?这个区别为什么导致推理步数差 10 倍以上?
  2. π₀ 的三层架构中,VLM 骨干的知识来自哪里?为什么这比从零训练一个视觉编码器好?
  3. "Pre-train → Post-train"在 π₀ 中具体对应什么?和 GPT-4 的训练范式有什么类比?

8. 过渡:从原理到实践

本章前半部分完成了三个模型的深度技术剖析:Diffusion Policy 证明了扩散方法对机器人动作生成的优越性,3D-DP 证明了三维感知能以极少数据达到极高性能,π₀ 展示了将这套范式推向产业规模的路径。

但几个实践性问题还悬而未解:

  • 扩散策略的推理代码长什么样?一个 DDIM 循环的最小实现需要几行?
  • 社区还有哪些重要的后续工作?Consistency Policy(1步推理)、FlowPolicy(流匹配+一致性)是怎么回事?
  • 扩散策略和 VLA(Ch11/Ch12)是竞争还是互补?有没有把两者融合的工作?
  • 在什么场景下应该选扩散路线,什么场景下选 VLA 路线?

本章后半部分将回答这些问题:给出最小可运行代码、梳理技术生态全景、提供选型建议,并以一张完整的 timeline 收束整个扩散策略叙事线。


9. 扩散家族技术树

一句话预告:Diffusion Policy 不是一个孤立的方法——它在两年内长成了一棵枝繁叶茂的技术树,每个分支解决一个核心痛点。

9.1 从一篇论文到一个家族

2023 年中,Diffusion Policy 论文发表时,扩散策略还只是行为克隆的一个新选项。到 2025 年初,围绕它已经生长出至少七个重要变体,覆盖速度优化、三维感知、强化学习微调、基础模型化等多个方向。这棵技术树的生长速度,本身就说明了扩散框架作为动作生成范式的生命力。

下面是这棵技术树的时间线:

2023.06  Diffusion Policy (RSS 2023)
           │  "扩散可以生成机器人动作"
           │
           ├── 2024.03  3D Diffusion Policy (DP3, RSS 2024)
           │     "加入 3D 点云感知"
           │
           ├── 2024.05  Consistency Policy (RSS 2024)
           │     "蒸馏到 1 步推理"
           │
           ├── 2024.06  DPPO (CoRL 2024)
           │     "用 RL 在线微调扩散策略"
           │
           ├── 2024.09  iDP3
           │     "自我中心坐标系 → 人形机器人"
           │
           ├── 2024.10  π₀ (Physical Intelligence)
           │     "VLM + Flow Matching → 基础模型"
           │
           ├── 2024.11  FlowPolicy
           │     "Consistency Flow Matching → 1 步推理"
           │
           ├── 2025.01  π₀-FAST
           │     "DCT + BPE → 自回归动作 token"
           │
           └── 2025.02  π₀.₅
                 "开放世界 + 子任务分解"

9.2 三个演化方向

这些变体可以按解决的核心问题分成三组:

第一组:速度优化——"10 步太慢,能不能 1 步出结果?"

Diffusion Policy 用 DDIM 需要约 10 步去噪,耗时 0.1 秒。对于 10Hz 控制频率的任务来说这已经足够,但对于更高频率的灵巧操作(100Hz 以上)就捉襟见肘了。Consistency Policy 和 FlowPolicy 从不同路径解决这个问题。

Consistency Policy 的思路是蒸馏:先训练一个标准的扩散策略模型,然后用一致性蒸馏(consistency distillation)把它压缩成一步就能出结果的模型。核心想法来自 Song et al. 的一致性模型——在 ODE 轨迹上,任意两个点映射到同一个终点,因此可以训练一个网络直接从任意噪声水平一步跳到终点。类比:普通扩散像从山顶沿着弯弯曲曲的小路走到山脚,一致性模型像学会了从山上任何位置直接"空降"到山脚。

FlowPolicy 的思路不同——它不是蒸馏已有模型,而是换用 Consistency Flow Matching 从头训练。Flow Matching 本身就比扩散的路径更"直"(后面第 10 节详述),Consistency Flow Matching 在此基础上进一步保证单步推理质量。FlowPolicy 同时结合了 DP3 的 3D 点云输入,在保持空间感知能力的同时把推理速度提升了约 10 倍。

第二组:能力扩展——"从桌面机械臂到更多场景"

iDP3 把 DP3 的 3D 扩散策略从固定视角的桌面场景扩展到了人形机器人。关键创新是使用自我中心(egocentric)坐标系:不再以某个固定摄像头为参考系,而是以机器人自身的头部/胸部为原点构建点云。这样当机器人走到不同房间、面对不同方向时,输入的点云表示保持一致,策略可以跨场景泛化。

π₀.₅ 则把 π₀ 从"接受简单语言指令"推向了"开放世界任务"。它的两个关键设计是:第一,用 VLM 生成语义子任务文本(比如把"收拾厨房"分解为"拿起盘子""放到洗碗机""关门"),然后用子任务文本条件化动作头;第二,引入多机器人遥操作数据和 Web VQA 联合训练,让模型既懂物理操作又懂常识推理。

第三组:范式替代——"不用去噪循环,还有什么路?"

DPPO(Diffusion Policy Policy Optimization)解决的是扩散策略作为行为克隆方法的固有缺陷——只能模仿专家,不能通过试错改进。DPPO 把 K 步去噪过程视为一个"内部 MDP":每一步去噪都是一个动作,噪声逐步减少是状态转移,最终生成的动作在环境中执行后获得奖励。这样就可以用 PPO 算法对每一步去噪进行强化学习微调。类比:行为克隆像学生只抄老师的解题步骤,DPPO 像学生先抄老师的步骤,然后自己做练习题,根据对错反馈调整自己的解题方式。

π₀-FAST 则走了一条完全不同的路:它放弃了扩散/flow matching 的连续去噪框架,转而用 DCT(离散余弦变换)把动作序列压缩到频域,再用 BPE(字节对编码)把频域系数量化为紧凑的离散 token。这样动作生成就变成了和 VLA 一样的自回归 token 预测问题——VLM 直接输出动作 token,不需要额外的扩散/flow 头。这是一种"殊途同归"的方案:π₀ 用 flow matching 头生成连续动作,π₀-FAST 用自回归头生成离散动作 token,两者都建立在同一个 VLM 骨干上。

9.3 一个被忽视的分支:Flow Matching for Manipulation

值得单独提一下 Flow Matching for Manipulation 这个工作。它不是直接从 Diffusion Policy 演化而来,而是从 affordance(可供性)方向切入:先用视觉模型预测"物体哪里可以被抓取"(affordance heatmap),再用 flow matching 生成到达该抓取点的动作轨迹。这种"先确定目标、再规划路径"的思路和 Ch10 中 SayCan 的"先规划、后执行"有异曲同工之妙——只是 SayCan 用语言做规划,这里用 affordance 做规划。

这个分支提示我们:扩散/flow 框架不仅可以作为"端到端策略"使用,还可以作为模块化系统中的"执行模块"——接收高层目标(affordance 点),生成低层动作。

9.4 技术树的启示

回顾整棵技术树,有一个清晰的演化逻辑:

BC(行为克隆)
  → Diffusion Policy(扩散解决多模态)
    → 3D-DP(加 3D 感知)
      → iDP3(自我中心坐标系 → 人形)
    → Consistency Policy(蒸馏加速)
    → FlowPolicy(Flow Matching 加速 + 3D)
    → DPPO(RL 微调)
    → π₀(基础模型化)
      → π₀-FAST(DCT 自回归替代)
      → π₀.₅(开放世界扩展)

每一步演化都不是推翻前一步,而是在前一步的基础上解决一个具体瓶颈。Diffusion Policy 解决了 BC 的多模态问题,但推理太慢——Consistency Policy 和 FlowPolicy 解决了速度。DP 只看 2D——3D-DP 加了深度。DP 只能模仿——DPPO 加了在线学习。DP 只是一个策略——π₀ 把它升级为基础模型。π₀ 用 flow matching 头——π₀-FAST 证明自回归也行。

这种"接力式创新"在深度学习领域非常典型。理解这棵技术树,比理解任何单个方法都更有价值——因为它告诉你研究是如何演进的,下一个分支可能长在哪里。

如果要猜测下一个分支方向:更长程的任务(从单步操作到多阶段家务),更少的数据需求(从 10 条示教到零示教),以及和世界模型的深度融合(扩散不仅生成动作,还预测未来状态)。π₀.₅ 的子任务分解已经指向第一个方向,3D-DP 的 10 条示教已经指向第二个方向。第三个方向——扩散世界模型——将在 Ch15 中详细讨论。


10. Flow Matching vs 扩散:直道与弯道

一句话预告:扩散模型走弯路但很稳健,Flow Matching 抄近道但同样到达终点——π₀ 选择了后者。

10.1 两条从噪声到动作的路

扩散模型和 Flow Matching 解决的是同一个问题:怎样从一团随机噪声出发,一步一步生成一个有意义的动作序列。区别在于"走什么路"。

用一个导航类比:你在一座陌生城市,需要从火车站(随机噪声)到达酒店(目标动作)。

扩散模型像是用一个老式 GPS——它不知道直达路线,只知道"当前位置大概偏了多少",每走一小段就重新计算偏差,然后修正方向。走的路弯弯曲曲,但只要步数够多,最终能到。DDPM 用 1000 步,DDIM 优化到 10 步——相当于把 GPS 的刷新频率从每秒一次调到每十秒一次,路线更粗糙但大方向没问题。

Flow Matching 像是出发前就规划好了一条高速公路——从火车站到酒店画一条尽量直的路线,然后沿着这条路匀速开过去。路线是出发前就算好的,不需要中途频繁修正。数学上,这条"高速公路"是一个从噪声分布到数据分布的 ODE(常微分方程),而 Flow Matching 训练网络直接预测这条 ODE 的速度场——在任意一点,网络告诉你"往哪个方向走、走多快"。

10.2 几何直觉:曲线 vs 直线

如果把从噪声到动作的过程画在一张图上:

扩散模型的路径是一条弯曲的曲线。因为每一步的"方向修正"基于对噪声的估计,而估计本身有误差,所以实际走出来的路径会来回摆动。步数越少,摆动越大,生成质量越差。这就是为什么 DDPM 需要 1000 步才能保证质量,DDIM 在 10 步时已经是精度和速度的折中点。

Flow Matching 的路径尽量是一条直线——从噪声样本直达对应的数据样本。训练时的监督信号就是"这个噪声样本应该沿着这个方向、以这个速度移动",而这个方向就是噪声点和数据点之间的连线。因为路径本身就是直的,所以即使只走 1-4 步,也能到达合理的终点。

这就是 π₀ 选择 Flow Matching 的根本原因:作为一个需要同时控制 7 种以上机器人的基础模型,π₀ 负担不起每次推理都走 10 步去噪。Flow Matching 让它用 1-4 步就能生成高质量动作,推理延迟降到毫秒级。

10.3 训练的区别

训练过程也有显著差异。

扩散模型的训练是:取一个真实动作样本,按照预定义的噪声调度表(noise schedule)加入噪声,然后让网络预测"加了多少噪声"。这个噪声调度表的设计很关键——加噪太快模型学不到有用信号,加噪太慢训练效率低。不同的调度表(线性、余弦、sigmoid)会影响最终性能,需要仔细调参。

Flow Matching 的训练更简单:取一个噪声样本 x₀ 和一个数据样本 x₁,在它们之间的连线上随机选一个时间点 t,让网络预测该点的速度方向(从 x₀ 指向 x₁ 的方向)。没有噪声调度表要调,没有复杂的前向过程要设计——监督信号就是两点之间的位移除以时间。训练更稳定,超参数更少。

10.4 两者的关系

一个常见误解是"Flow Matching 取代了扩散模型"。实际上两者有深层数学联系:扩散模型的得分函数(score function)和 Flow Matching 的速度场(velocity field)可以互相转化。Flow Matching 可以被理解为扩散模型的一种特殊参数化——选择了最优传输(optimal transport)路径的扩散。

更准确地说:扩散模型是一个更大的框架,Flow Matching 是在这个框架内选择了"最直"路径的特例。这就像微积分是一个大框架,而牛顿-莱布尼兹公式是在这个框架内找到了计算定积分的最简路径。

对于实践者来说,关键 trade-off 是:扩散模型更成熟、工具链更完善、已有大量预训练模型可用;Flow Matching 训练更简单、推理更快、但生态还在建设中。π₀ 选择 Flow Matching 是因为推理速度对实时控制至关重要;Diffusion Policy 选择 DDPM/DDIM 是因为 2023 年时 Flow Matching 还没有在机器人领域验证过。技术选型不是"谁更先进"的问题,而是"在当时的条件下,哪个路径风险更低"的问题。

10.5 Consistency Flow Matching:两全其美

FlowPolicy 使用的 Consistency Flow Matching 可以看作是对上述两种加速思路的综合。Consistency Policy 先训练扩散模型再蒸馏到一步——需要两阶段训练,且蒸馏过程可能丢失精度。普通 Flow Matching 路径虽直,但 1 步推理的精度仍不如 4 步。Consistency Flow Matching 在 Flow Matching 的直线路径上额外施加一致性约束:路径上任意一点都应该映射到同一个终点。这让模型在训练阶段就学会了"一步到位"的能力,不需要后续蒸馏,单步推理质量接近多步结果。

从工程落地的角度看,这意味着:如果你的机器人需要 100Hz 的控制频率,每步推理只有 10 毫秒预算,那么 Consistency Flow Matching 是目前最实际的选择——一步出结果,质量不打折。


11. 代码实战:最小扩散策略

一句话预告:用不到 100 行代码搭一个能跑的扩散策略,理解从"加噪"到"去噪"的完整循环。

11.1 核心网络:噪声预测器

import torch
import torch.nn as nn

class SimpleDiffusionPolicy(nn.Module):
    """
    最小扩散策略:给定带噪动作 + 观测 + 时间步,预测噪声。
    真实 Diffusion Policy 用 ResNet-18 + FiLM,这里简化为 MLP。
    """
    def __init__(self, action_dim=7, obs_dim=64, hidden=256):
        super().__init__()
        # +1 是因为要把时间步 t 也拼进输入
        self.noise_pred = nn.Sequential(
            nn.Linear(action_dim + obs_dim + 1, hidden),
            nn.ReLU(),
            nn.Linear(hidden, hidden),
            nn.ReLU(),
            nn.Linear(hidden, action_dim),  # 输出和动作同维度
        )

    def forward(self, noisy_action, obs, timestep):
        """
        noisy_action: (B, action_dim) — 被加了噪声的动作
        obs:          (B, obs_dim)    — 当前观测的编码
        timestep:     (B,)            — 当前去噪步骤 [0, 1]
        返回:         (B, action_dim) — 预测的噪声
        """
        t_emb = timestep.unsqueeze(-1)  # (B, 1)
        x = torch.cat([noisy_action, obs, t_emb], dim=-1)
        return self.noise_pred(x)

这个网络做的事情非常简单:接收"被污染的动作 + 观测 + 当前时刻",输出"这个动作上沾了多少噪声"。把预测的噪声减掉,动作就变干净一点。重复这个过程,动作从纯噪声逐步变成合理的控制信号。

真实的 Diffusion Policy 使用 ResNet-18 作为观测编码器、FiLM 层做时间步条件化,但核心逻辑是一样的。

11.2 训练循环:学会"加了多少噪声"

def train_step(model, optimizer, actions, obs):
    """
    actions: (B, action_dim) — 专家示教的真实动作
    obs:     (B, obs_dim)    — 对应的观测编码
    """
    B = actions.shape[0]

    # 1. 随机选一个时间步 t ∈ [0, 1]
    t = torch.rand(B, device=actions.device)

    # 2. 生成随机噪声 ε ~ N(0, I)
    noise = torch.randn_like(actions)

    # 3. 按时间步 t 给真实动作加噪:x_t = √(ᾱ_t) * x_0 + √(1-ᾱ_t) * ε
    #    这里简化为线性插值:x_t = (1-t) * x_0 + t * ε
    noisy_action = (1 - t.unsqueeze(-1)) * actions + t.unsqueeze(-1) * noise

    # 4. 让网络预测噪声
    pred_noise = model(noisy_action, obs, t)

    # 5. MSE loss:预测噪声 vs 真实噪声
    loss = nn.functional.mse_loss(pred_noise, noise)

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    return loss.item()

训练过程的直觉:每次训练都是在问模型一个问题——"我给这个真实动作加了这么多噪声,你能猜出来我加了多少吗?"模型猜对了,就说明它理解了"干净动作长什么样",推理时就能把噪声擦掉。

注意这里用了线性插值简化。真实 DDPM 的加噪公式更复杂(涉及 α 调度表),但直觉是一样的:t 越大,噪声越多,真实动作的信号越弱。

11.3 推理循环:从噪声到动作(DDIM)

@torch.no_grad()
def inference(model, obs, action_dim=7, n_steps=10):
    """
    从纯噪声出发,用 DDIM 迭代去噪,生成动作。
    """
    B = obs.shape[0]

    # 从纯噪声开始
    action = torch.randn(B, action_dim, device=obs.device)

    # DDIM 的时间步:从 1.0 到 0.0 等间隔
    timesteps = torch.linspace(1.0, 0.0, n_steps + 1, device=obs.device)

    for i in range(n_steps):
        t_now = timesteps[i]
        t_next = timesteps[i + 1]
        t_batch = t_now.expand(B)

        # 预测当前噪声
        pred_noise = model(action, obs, t_batch)

        # DDIM 更新(简化版):沿预测方向走一步
        # 把预测噪声去掉一部分,相当于"擦掉一层灰"
        action = action - (t_now - t_next) * pred_noise

    return action  # 最终输出的干净动作

推理过程和训练过程是镜像关系:训练时往真实动作上加噪声,推理时从噪声中去掉噪声。10 步 DDIM 的每一步都在问模型:"现在这个动作上还剩多少噪声?"然后减掉一部分。

DDIM 和 DDPM 的区别在于:DDPM 每一步的去噪都要加回一些随机噪声(保持随机性),DDIM 是确定性的(每次推理相同输入给出相同输出)。DDIM 的确定性使得它可以跳步——从 1000 步压缩到 10 步,因为中间的随机性被去掉了。

11.4 动作分块:预测 16 步,执行 8 步

class ChunkedDiffusionPolicy(SimpleDiffusionPolicy):
    """
    动作分块版本:一次预测 Tp=16 步动作,只执行前 Ta=8 步。
    """
    def __init__(self, action_dim=7, obs_dim=64, chunk_size=16):
        # 输出维度变为 action_dim * chunk_size
        super().__init__(
            action_dim=action_dim * chunk_size,
            obs_dim=obs_dim,
        )
        self.chunk_size = chunk_size
        self.execute_steps = 8  # Ta = 8

    def predict_chunk(self, obs):
        """预测一个完整的动作块"""
        # 用 DDIM 推理得到 (B, action_dim * chunk_size) 的扁平向量
        flat_action = inference(self, obs, self.chunk_size * 7)
        # 重塑为 (B, chunk_size, action_dim)
        return flat_action.view(-1, self.chunk_size, 7)

    def get_executable_actions(self, obs):
        """只返回前 Ta=8 步用于实际执行"""
        chunk = self.predict_chunk(obs)     # (B, 16, 7)
        return chunk[:, :self.execute_steps] # (B, 8, 7)

为什么预测 16 步但只执行 8 步?两个原因。第一,预测更长的窗口迫使网络对未来有更远的"视野",生成的前几步动作更连贯。第二,后 8 步(第 9-16 步)的预测精度随时间衰减,不执行它们可以避免累积误差。每执行完 8 步后,用新的观测重新预测下一个 16 步的动作块,后半段的误差永远不会传播到执行层。

11.5 与 RT-2 的对比

RT-2 用离散 token 分类生成动作——把每个动作维度量化到 256 个 bin 中的一个,然后用自回归 Transformer 逐维预测。Diffusion Policy 用连续去噪生成动作——从高斯噪声出发,通过迭代预测和去除噪声得到连续值。

核心区别在于如何处理多模态分布。RT-2 的 softmax 输出本质上是一个单峰分布——在 256 个 bin 上虽然有概率分布,但训练目标(交叉熵)鼓励模型把概率集中在一个 bin 上。当同一个场景可能有多个合理动作时(比如一个杯子可以从左边拿也可以从右边拿),RT-2 倾向于预测一个折中的"平均"动作,这个平均动作可能两边都不对。

Diffusion Policy 没有这个问题。去噪过程的随机性天然支持多模态:同一个观测输入,不同的初始噪声会引导去噪过程走向不同的模态。每次推理都可能生成不同但都合理的动作,而不是被迫取平均。

还有一个容易忽视的差异:动作的时间相关性。RT-2 逐维度、逐时间步地自回归生成动作,每个维度独立预测一个 bin——7 个关节的动作之间没有显式的联合建模。Diffusion Policy 的去噪过程同时作用于整个动作序列(所有维度、所有时间步),每一步去噪都在考虑动作的全局结构。这让生成的动作轨迹更平滑、关节间的协调性更好。


12. 代码实战:3D 点云处理

一句话预告:从一张深度图到 1024 个采样点,3D-DP 的输入管线只需三步。

12.1 深度图转点云

import numpy as np

def depth_to_pointcloud(depth_image, fx, fy, cx, cy):
    """
    将深度图转换为 3D 点云。
    depth_image: (H, W) 深度值(米)
    fx, fy, cx, cy: 相机内参(焦距和主点)
    返回: (N, 3) 点云,N = H * W 中深度有效的点数
    """
    H, W = depth_image.shape
    # 生成像素坐标网格
    u, v = np.meshgrid(np.arange(W), np.arange(H))

    # 反投影:像素坐标 + 深度 → 3D 坐标
    z = depth_image
    x = (u - cx) * z / fx   # X = (u - cx) * Z / fx
    y = (v - cy) * z / fy   # Y = (v - cy) * Z / fy

    # 过滤无效深度(太近或太远)
    valid = (z > 0.01) & (z < 2.0)
    points = np.stack([x[valid], y[valid], z[valid]], axis=-1)

    return points  # (N, 3)

这段代码做的事情在几何上很直观:深度相机告诉你"这个像素对应的物体离相机多远",结合相机的焦距参数,就能算出这个像素对应的 3D 空间坐标。把所有像素都转换一遍,就得到一团 3D 点。

12.2 最远点采样(FPS)

def farthest_point_sampling(points, n_samples=1024):
    """
    最远点采样:从 N 个点中选出 n_samples 个,使它们尽量分散。
    points: (N, 3)
    返回: (n_samples, 3)
    """
    N = points.shape[0]
    selected = np.zeros(n_samples, dtype=int)
    # 从随机一个点开始
    selected[0] = np.random.randint(N)

    # 记录每个点到"已选集合"的最短距离
    min_distances = np.full(N, np.inf)

    for i in range(1, n_samples):
        # 更新:计算所有点到最新选中点的距离
        last = points[selected[i - 1]]
        dists = np.sum((points - last) ** 2, axis=-1)
        min_distances = np.minimum(min_distances, dists)
        # 选距离已选集合最远的点
        selected[i] = np.argmax(min_distances)

    return points[selected]  # (1024, 3)

为什么用 FPS 而不是随机采样?随机采样有一个致命问题:物体表面的点密度不均匀——平坦区域点多,边缘和角落点少。随机采样会倾向于选中平坦区域的点(因为它们数量多),忽略几何特征丰富的边缘。FPS 的贪心策略保证每个新选的点都尽可能远离已有点,从而在空间上均匀覆盖整个形状。

类比:在一张照片上随机撒 10 个图钉,它们可能扎堆在中间空白区域。但如果每次选"离所有已有图钉最远的位置"来放新图钉,最终 10 个图钉会均匀分布在照片各处。

12.3 完整管线

def prepare_3d_input(depth_image, camera_intrinsics):
    """
    完整的 3D-DP 输入准备管线:
    深度图 → 点云 → FPS 采样 → 策略输入
    """
    # Step 1: 深度图 → 全量点云
    fx, fy, cx, cy = camera_intrinsics
    full_cloud = depth_to_pointcloud(depth_image, fx, fy, cx, cy)
    # full_cloud: 可能有 300,000+ 个点

    # Step 2: FPS 采样到 1024 个点
    sampled = farthest_point_sampling(full_cloud, n_samples=1024)
    # sampled: (1024, 3) — 只有 XYZ,没有颜色

    # Step 3: 归一化到单位球(可选但推荐)
    center = sampled.mean(axis=0)
    sampled = sampled - center
    scale = np.max(np.linalg.norm(sampled, axis=-1))
    sampled = sampled / scale

    return sampled  # (1024, 3) — 可直接送入 DP3 编码器

注意最后的输出只有 XYZ 坐标,没有 RGB 颜色。3D-DP 论文的实验表明,纯几何信息已经足够做精确操作——颜色在光照变化、物体材质变化时反而会引入干扰。这与人类闭眼也能摸到桌上杯子的直觉一致:空间位置比外观更重要。


13. 自测题

不看上文,试着回答以下问题。每题附简要提示,完整答案需要综合理解。

Q1: 传统 BC 用 MSE loss 为什么会"取平均"?Diffusion Policy 如何避免?

提示方向:MSE loss 对同一输入的多个目标值做什么?扩散模型的随机采样如何打破这个限制?

答案要点:MSE loss 最小化的是预测值与所有目标值的平方距离之和。当同一个观测对应多个合理动作时(比如杯子可以从左边拿或右边拿),MSE 的最优解是这些动作的均值——一个"从中间拿"的折中动作,这个动作可能在任何模态中都不合理。Diffusion Policy 的去噪过程从随机噪声开始,不同的初始噪声会把去噪路径引向不同的模态。每次推理都在某一个模态内生成完整合理的动作,而不是跨模态取平均。

Q2: DDPM 需要 1000 步,DDIM 只需 10 步,但用同一个训练好的模型——为什么?

提示方向:DDPM 和 DDIM 的区别在于推理过程,不在训练过程。

答案要点:两者的训练完全一样——都是训练一个噪声预测网络。区别在推理策略。DDPM 每一步去噪时会重新注入少量随机噪声(维持随机性),所以必须走小步,否则注入的噪声会让结果偏离。DDIM 移除了随机噪声注入,去噪过程变成确定性的 ODE 求解。确定性 ODE 可以用大步长求解(就像数值积分可以用粗网格),因此 10 步就够。同一个网络,切换了推理的"行驶规则"。

Q3: Tp=16 但 Ta=8,为什么不执行全部 16 步预测?

提示方向:预测精度和预测时间步的关系是什么?

答案要点:预测精度随时间步递增而递减。第 1-8 步的预测基于较新的观测,准确度高;第 9-16 步是对更远未来的预测,误差累积更大。如果执行全部 16 步,后半段的低精度预测会导致实际执行偏离。执行 8 步后重新观测、重新预测,等于用"滚动窗口"的方式保证每一段执行都基于最新的信息。同时,预测 16 步的"视野"迫使网络理解更长的时间上下文,即使只执行前 8 步,这些前 8 步的质量也比只预测 8 步更高。

Q4: 3D-DP 的 MLP 编码器打败了 PointNet(+63%),这说明什么?

提示方向:PointNet 的设计目标是什么?机器人操作任务的点云有什么特殊性?

答案要点:PointNet 设计用于分类和分割大规模点云场景(室内外数百万点),它的置换不变性和分层特征提取对大规模识别任务很重要。但机器人操作任务的点云特点不同:只有 1024 个经过 FPS 采样的点,关注的是局部几何形状而非全局分类。一个简单的 3 层 MLP 足以处理这种规模和复杂度的输入,而 PointNet 的复杂结构在小数据、小点云场景下反而过拟合或引入不必要的归纳偏置。这说明了一个通用原则:模型复杂度应匹配任务复杂度,而非越复杂越好。

Q5: 点云不用颜色(只有 XYZ),为什么还能工作?

提示方向:颜色在什么条件下是有用的?什么条件下反而是干扰?

答案要点:颜色(RGB)对于识别物体类别和语义很有用("红色杯子"vs"蓝色杯子"),但操作任务更关心的是物体的空间位置和几何形状("杯子在哪里""杯口朝哪个方向")。纯 XYZ 点云已经包含了完整的几何信息。而颜色在不同光照条件、不同物体表面材质下会剧烈变化——同一个杯子在日光和台灯下颜色截然不同。去掉颜色反而让模型更鲁棒,因为它只依赖不随光照变化的几何特征。这也是 3D-DP 在真实环境中成功率高达 85% 的重要原因。

Q6: Flow Matching 用直线路径,Diffusion 用曲线路径——哪个更容易优化?

提示方向:梯度信号和路径长度/复杂度有什么关系?

答案要点:直线路径更容易优化。弯曲路径意味着在不同时间步 t,梯度信号的方向变化大——模型在 t=0.1 时学到的方向和在 t=0.9 时学到的方向可能差异很大,训练过程需要在这些不同的方向之间找到折中。直线路径的方向在所有时间步都是一致的(从噪声指向数据的方向不变),梯度信号更稳定,训练更容易收敛。这也是为什么 Flow Matching 通常不需要复杂的噪声调度表——路径本身就是最优的。

Q7: π₀ 的 cross-embodiment 训练面临的最大挑战是什么?

提示方向:不同机器人的动作空间有什么区别?

答案要点:最大挑战是动作空间的异构性。一个双臂机械臂有 14 个关节加 2 个夹爪,一个移动底盘有 2 个轮速,一个人形机器人有几十个自由度——动作维度、范围、物理含义完全不同。π₀ 需要一个统一的动作表示来覆盖所有这些形态。它的解决方案是用 flow matching 头为每种机器人分别生成对应维度的动作向量,但共享同一个 VLM 骨干——相当于让同一个"大脑"控制不同的"身体"。预训练阶段在 OXE 数据集上学习跨形态的通用视觉-语言-动作知识,后训练阶段针对特定机器人微调。

Q8: DPPO 把去噪步骤当作"内部 MDP"——这和传统 RL 有什么不同?

提示方向:传统 RL 的动作是什么?DPPO 的"动作"是什么?

答案要点:传统 RL 的每一步是"观测环境 → 选一个动作 → 执行 → 得到奖励"。DPPO 有两层循环:外层和传统 RL 一样(观测 → 生成动作 → 执行 → 奖励),但"生成动作"这一步内部是 K 步去噪过程,每一步去噪都被建模为一个"内部动作"。外层奖励只在最终执行后才能得到,DPPO 用 PPO 把这个奖励分配到 K 步去噪中的每一步——哪一步去噪对最终成功贡献大,哪一步就获得更多的策略梯度更新。这让扩散策略不仅能模仿专家,还能通过环境反馈自我改进。


14. 关键数字速查表

项目 Diffusion Policy 3D Diffusion Policy (DP3) π₀
发表时间 RSS 2023 (2023.06) RSS 2024 (2024.03) 2024.10
团队 Columbia / MIT PKU / Stanford Physical Intelligence
核心架构 CNN (ResNet-18) 或 Transformer MLP 点云编码器 + 扩散头 VLM (PaliGemma 2B) + Flow Matching 头
观测输入 RGB 图像 3D 点云 (1024 点 FPS) RGB 图像 + 语言指令
动作输出 连续动作序列 连续动作序列 连续动作序列
推理步数 DDIM 10 步 (~0.1s) DDIM 10 步 1-4 步 (Flow Matching)
核心改进 比 BC baseline +46.9% 平均 比 DP +24.2% (72 任务平均) 跨 7+ 机器人形态统一策略
最大亮点 Kitchen 环境 +213% 10 条示教即可学会;真实 85% vs baseline 35% VLM 骨干 + 1-4 步推理 + 基础模型化
预测窗口 Tp=16, 执行 Ta=8 类似 DP 任务依赖
数据需求 中等(任务级示教) 极少(10 条示教) 大规模(OXE 预训练 + 特定任务后训练)
多模态能力 天然支持(扩散采样) 天然支持 天然支持
开源 完全开源 完全开源 不开源($400M+ 公司)

扩展家族速查

方法 时间 核心创新 关键指标
Consistency Policy RSS 2024 一致性蒸馏 → 1 步推理 ~10x 推理加速
FlowPolicy 2024.11 Consistency Flow Matching + 3D 点云 1 步推理 + 3D 感知
DPPO CoRL 2024 去噪步骤作为内部 MDP + PPO 扩散策略可在线微调
iDP3 2024.09 自我中心坐标系 人形机器人跨场景泛化
π₀-FAST 2025.01 DCT 频域压缩 + BPE → 自回归 token 替代 flow matching 头
π₀.₅ 2025.02 子任务分解 + 多机器人 + Web VQA 开放世界泛化

推理速度对比

方法 推理步数 每步耗时(估算) 适用控制频率
DDPM 1000 步 ~10s 不适合实时控制
DDIM (Diffusion Policy) 10 步 ~0.1s 10Hz
Flow Matching (π₀) 1-4 步 ~10-40ms 25-100Hz
Consistency Policy 1 步 ~10ms 100Hz
Consistency Flow Matching (FlowPolicy) 1 步 ~10ms 100Hz

15. 常见误区与澄清

误区 1:"扩散模型 = 生成图片的工具"

事实:扩散是一种通用的生成框架,核心能力是"从噪声中生成满足特定分布的样本"。这个"样本"可以是图片(Stable Diffusion),可以是音频(AudioLDM),可以是蛋白质结构(RFdiffusion),也可以是机器人动作序列(Diffusion Policy)。

动作序列和图像在数学形式上没有本质区别——都是高维连续向量。一个 7 自由度机械臂预测 16 步动作是一个 112 维向量(7 x 16),和一张 112 像素的灰度图在数学上是同构的。扩散模型不关心这个向量"代表什么",它只关心如何从噪声中恢复它。

误区 2:"去噪步骤越多越好"

事实:DDIM 10 步在绝大多数机器人操作任务上已经足够。增加到 50 步或 100 步带来的性能提升微乎其微,但推理时间线性增长。

直觉上,10 步已经足够"擦干净"动作上的噪声。再多的步数就像已经擦干净的桌子继续擦——桌子不会更干净,只是浪费时间。而且 Flow Matching 进一步证明,如果路径选得好(直线而非曲线),1-4 步就够了。

实际选择推理步数时,需要平衡精度和控制频率。10Hz 控制(每 0.1 秒一个动作)可以承受 10 步 DDIM 的延迟;100Hz 控制则需要 1-2 步的快速推理。

误区 3:"3D 一定比 2D 好"

事实:3D 感知在需要深度判断的任务中优势明显(如精确对齐、空间推理),但在纯平面任务中优势不大,甚至可能因为额外的处理开销而变慢。

3D-DP 的 +24.2% 改进主要来自需要精确 3D 定位的任务(如把物体放进指定容器)。对于只需要 2D 信息的任务(如在桌面上推物体到指定位置),标准 Diffusion Policy 的 RGB 输入已经足够。

选择 2D 还是 3D 的判断标准是:任务是否涉及高度差、遮挡、或精确的空间对齐?如果是,用 3D;如果不是,2D 更简单、更快、更容易调试。

误区 4:"Flow Matching 取代了 Diffusion"

事实:Flow Matching 和 Diffusion 在数学上有深层联系——Flow Matching 可以被视为选择了最优传输路径的特殊扩散过程。两者不是替代关系,而是同一个框架的不同参数化。

在实践中,Flow Matching 的优势是训练更简单(不需要设计噪声调度表)、推理更快(路径更直)。但扩散模型的优势是生态成熟——大量预训练模型、训练技巧、加速技术(DDIM、DPM-Solver 等)已经过广泛验证。选择哪个取决于具体场景和团队积累。

误区 5:"π₀ 开源了"

事实:π₀ 是 Physical Intelligence 公司的产品,不开源。这家公司在 2024 年获得了超过 4 亿美元融资,其核心模型是商业资产。

社区中确实有受 π₀ 架构启发的开源实现(如 OpenVLA 的扩散动作头变体),但这些是独立的社区项目,不是 π₀ 本身。读论文时能学到方法论,但无法直接获取模型权重或训练代码。

误区 6:"扩散策略只能用于机械臂"

事实:虽然 Diffusion Policy 和 3D-DP 最初的实验都在桌面机械臂上进行,但扩散策略框架本身对机器人形态没有限制。iDP3 已经在人形机器人上验证了效果,π₀ 覆盖了 7 种以上不同形态的机器人(单臂、双臂、移动底盘等)。

扩散策略关心的是"动作序列的分布",不关心这个动作是控制 7 个关节还是 2 个轮子。只要能把任务表示为"从观测到动作序列的映射",扩散框架就适用。局限不在框架本身,而在数据采集——不同形态的机器人需要不同的遥操作设备来收集示教数据,这才是真正的瓶颈。


16. 本章与导读全局的连接

向上连接:从哪里来

本章(Ch13)直接承接 Ch11 和 Ch12 的 VLA 主线。Ch11/Ch12 的核心范式是"把动作变成离散 token,用 Transformer 自回归预测"——这是一条从自然语言处理借来的路。本章讲的是另一条路:"把动作视为连续信号,用扩散/flow 从噪声中生成"——这是一条从图像生成借来的路。

两条路各有优势。离散 token 方案可以直接复用 LLM 的预训练权重和推理基础设施,但牺牲了动作精度(256 bins 的量化误差)和多模态能力(softmax 倾向单峰)。扩散方案天然支持连续值和多模态分布,但需要额外的去噪循环,增加了推理延迟。

Ch12 的 MLA 已经展示了两条路的融合:VLM 骨干处理视觉和语言,扩散动作头生成连续动作。现在回头看 MLA 的 4 步 DDIM 去噪,你应该完全理解它在做什么——从第 11 节的代码实战到 MLA 的实际部署,核心逻辑是一模一样的。

向下连接:到哪里去

Ch14(模仿学习)将讨论 Diffusion Policy 所属的更大框架:行为克隆(Behavioral Cloning)。Diffusion Policy 本质上是一种高级 BC 方法——从专家示教数据中学习策略,不需要奖励函数、不需要环境交互。Ch14 会讲 BC 的理论局限(分布偏移问题)和解决方案(DAgger),以及另一个同属 BC 家族的方法 ACT-ALOHA——它用 CVAE(条件变分自编码器)而非扩散来处理多模态问题。

Ch15(世界模型)将从另一个角度关联本章内容。π₀.₅ 的 VLM 骨干隐式地学习了"世界如何运行"的知识(物体会掉落、液体会流动),这与世界模型的目标——显式预测未来状态——有哲学上的呼应。扩散模型本身也在世界模型领域被广泛使用(如 Genie 2 用扩散生成未来帧),Ch15 会展开这个方向。

横向连接:并行的思路

Ch08(CLIP)和 Ch09(LLaVA)提供了 π₀ 的 VLM 骨干的知识来源。π₀ 使用的 PaliGemma 2B 属于 CLIP+LLM 的视觉-语言模型家族。如果你理解了 Ch08 中"对比学习如何对齐图像和文本"以及 Ch09 中"如何把视觉 token 接入 LLM",那 π₀ 的 VLM 部分就不神秘了——它只是在这个视觉-语言骨干上接了一个 flow matching 动作头。

Ch10(规划)提供了另一个对照视角。SayCan 用语言模型做高层规划("先拿杯子,再倒水"),执行层用简单的低层策略。π₀.₅ 的子任务分解做了类似的事情,但全部在一个端到端模型内完成——VLM 部分生成子任务文本描述,action head 部分根据子任务生成具体动作。这是"模块化思想在端到端框架内的复活",和 Ch10 的思路殊途同归。


17. 章节总结与导航

核心叙事

本章讲了一个关于"如何生成动作"的范式故事。

传统行为克隆把动作生成当作回归问题——给一个观测,预测一个动作。这种方式在动作分布是单峰的时候没问题,但遇到多模态分布(同一场景多种合理动作)就会崩溃:MSE loss 迫使模型取平均,平均动作往往什么都不是。

Diffusion Policy 把动作生成重新定义为"从噪声中去噪"。和 Stable Diffusion 生成图片的原理一样,它从随机噪声出发,通过迭代预测和去除噪声,逐步"擦出"一个动作序列。这个过程天然支持多模态——不同的初始噪声引导向不同的合理动作。RSS 2023 的论文证明了这种范式在 11 个基准任务上平均提升了 46.9%,在 Kitchen 环境中甚至提升了 213%。

3D Diffusion Policy 在此基础上加入了深度感知。用深度相机获取点云,用最远点采样压缩到 1024 个点,用简单的 3 层 MLP 编码。这个看似简单的改动带来了 +24.2% 的提升,在真实环境中把成功率从 35% 拉到 85%,而且只需要 10 条示教数据就能学会新任务。

π₀ 把扩散策略升级为基础模型。它用 VLM 骨干处理视觉和语言,用 Flow Matching 替代 DDPM/DDIM 实现 1-4 步快速推理,在 7 种以上机器人形态上训练统一策略。从一个策略方法到一个基础模型,这一步跨越的不只是规模,更是思维方式的转变——从"为每个任务训练一个策略"到"用一个模型覆盖所有任务和所有机器人"。

三个核心收获

第一,多模态动作分布是机器人控制的核心挑战之一,扩散/flow 框架是目前最优雅的解决方案。理解这一点,就理解了为什么扩散策略在两年内从一篇论文长成了一棵技术树。

第二,3D 感知和扩散策略的结合(3D-DP)展示了"正确的感知表示 + 简单的模型"往往胜过"粗糙的感知 + 复杂的模型"。一个 3 层 MLP 编码器打败了 PointNet,因为 1024 个 FPS 采样点已经足够好地表示了任务相关的几何信息。

第三,扩散策略的演化路径(BC → DP → 3D-DP → π₀)展示了研究领域的典型接力模式:每一步解决前一步的瓶颈,整棵技术树在短短两年内覆盖了速度优化、感知升级、在线学习、基础模型化等多个方向。理解这棵树的结构,比理解任何单个叶子节点都更有价值。

通往下一章的桥梁

本章所有方法——Diffusion Policy、3D-DP、π₀——都有一个共同前提:它们从人类示教数据中学习。专家"做给机器人看"(遥操作或动力学示教),收集(观测,动作)对,然后训练模型模仿。

但这个"做给它看"的过程本身就是一门学问。示教数据怎么收集最高效?收集多少条才够?如果机器人执行时偏离了示教轨迹怎么办?行为克隆(BC)天然存在分布偏移问题——训练时只见过专家轨迹,但执行时一旦偏离就进入了从未见过的状态空间,后续动作全部失效。

下一章(Ch14:模仿学习)将系统讲解这些问题。DAgger 用"专家在线纠正"解决分布偏移;ACT-ALOHA 用 CVAE 的方式处理多模态(和扩散不同的思路);UMI 用便携式数据收集硬件把示教成本降到最低。这些方法和 Diffusion Policy 不是竞争关系,而是互补——它们解决的是"怎么学"和"学什么"这两个不同层面的问题。


前置章节:Ch12: 端到端 VLA (II)——OpenVLA / VLAS / MLA,开源与扩展 后续章节:Ch14: 模仿学习——DAgger / ACT-ALOHA / UMI,你做给它看 返回目录

本章涉及论文 15 篇

点击查看论文笔记全文,标有 的为已读。

№ 47 Diffusion Policy · 前沿

π₀

№ 46 Diffusion Policy · 前沿

FAST