5.2 策略表征与生成式策略:扩散策略与 Flow Matching 一个状态可以对应多种合理动作——「抓杯子」可以从左、从右、从上抓。传统回归策略只能输出「平均动作」(往往是无效的中间值)。扩散策略与 Flow Matching 的革命在于:它们能精确建模这种多模态动作分布。 5.2.1 动作多模态问题 先用一个例子说明问题。考虑「抓桌上杯子」这个任务: 每个合理动作都可行,但它们在动作空间是分离的簇。如果用传统回归策略(MSE 训练): $$ \min\theta \mathbb{E}[(\pi\theta(s) - a)^2] $$ 回归目标会让模型预测所有合理动作的平均值——一个在动作空间里位于「簇与簇之间」的无效动作(既不像左抓也不像右抓)。
一个状态可以对应多种合理动作——「抓杯子」可以从左、从右、从上抓。传统回归策略只能输出「平均动作」(往往是无效的中间值)。扩散策略与 Flow Matching 的革命在于:它们能精确建模这种多模态动作分布。
先用一个例子说明问题。考虑「抓桌上杯子」这个任务:
合理动作 1: 从左侧接近,斜上方抓 合理动作 2: 从右侧接近,斜上方抓 合理动作 3: 从正前方接近,正上方抓 ...
每个合理动作都可行,但它们在动作空间是分离的簇。如果用传统回归策略(MSE 训练):
回归目标会让模型预测所有合理动作的平均值——一个在动作空间里位于「簇与簇之间」的无效动作(既不像左抓也不像右抓)。这就是「模式平均」(mode collapse)问题。
| 策略类型 | 能否建模多模态 | 代表 |
|---|---|---|
| 确定性回归(MSE) | 否 | 早期 BC |
| 高斯策略(输出均值+方差) | 部分(单峰) | 标准 BC |
| 混合高斯(Mixture of Gaussians, GMM) | 是(有限模态) | Mixture Density Network |
| 扩散策略 | 是(任意分布) | Diffusion Policy |
| 流匹配 | 是(任意分布) | π0 |
扩散与 Flow 是当前最强的多模态动作建模工具。
扩散模型(Diffusion Model)的直觉:把数据逐步加噪变成纯噪声,再学习「反向去噪」从噪声还原数据。
前向加噪过程(固定):
其中 x_0 是原始数据(动作),x_t 是加噪 t 步后的版本,\bar{\alpha}_t 是噪声调度。
反向去噪过程(学习):训练一个网络 \epsilon_\theta(x_t, t, c) 预测噪声,从 x_T(纯噪声)逐步去噪到 x_0。
训练: 采样真实动作 a_0 采样时间步 t ~ Uniform(0, T) 采样噪声 ε ~ N(0, I) 计算加噪 a_t = √(α_t) a_0 + √(1-α_t) ε 训练网络预测: ε_θ(a_t, t, 观测) ≈ ε 损失: ||ε_θ(a_t, t, 观测) - ε||² 推理(生成动作): 从纯噪声 a_T ~ N(0, I) 开始 迭代 T 步去噪: a_{t-1} = denoise_step(a_t, t, 观测) 最终 a_0 是生成的动作
💡 直觉:训练时让网络学会「从带噪动作里去掉噪声」,推理时从纯噪声开始迭代去噪,最终得到一个合理的动作。由于每次采样噪声不同,生成的动作也不同——天然支持多模态。
Diffusion Policy(哥伦比亚大学 + Toyota 2023)把扩散模型引入机器人策略学习,是机器人领域的里程碑。核心创新:
不是预测单步动作,而是预测未来一段动作序列:
预测 horizon H_p 通常 8-16 步。这样:
每步去噪时,条件是当前观测序列(最近几帧图像 + 关节状态):
观测通过一个视觉编码器 + 历史编码器进入噪声预测网络。
Diffusion Policy 可用两种噪声预测网络:
| 主干 | 优势 | 适用 |
|---|---|---|
| CNN U-Net(1D 时序卷积) | 训练稳定、内存小 | 标准选择 |
| Transformer | 全局注意力、易扩展 | 大模型 |
# Diffusion Policy 训练 def train_step(policy, batch): obs, action_chunk = batch # action_chunk: (B, H, A) # 1. 采样时间步与噪声 t = torch.randint(0, T, (B,)) noise = torch.randn_like(action_chunk) # 2. 前向加噪 a_noisy = q_sample(action_chunk, t, noise) # 3. 网络预测噪声 pred_noise = policy(a_noisy, t, obs) # 4. 噪声预测损失 loss = mse(pred_noise, noise) return loss # Diffusion Policy 推理 def predict_action(policy, obs): a = torch.randn(B, H, A) # 从纯噪声开始 for t in reversed(range(T)): a = policy.denoise_step(a, t, obs) return a # 返回 H 步动作 chunk
<svg viewBox="0 0 760 260" xmlns="http://www.w3.org/2000/svg"> <!-- 噪声起点 --> <circle cx="80" cy="130" r="40" fill="#94a3b8" opacity="0.5"/> <text x="80" y="80" text-anchor="middle" font-size="11" fill="#475569">t = T</text> <text x="80" y="200" text-anchor="middle" font-size="11" fill="#475569">纯噪声</text> <!-- 中间步骤 --> <circle cx="250" cy="130" r="35" fill="#fde68a" opacity="0.6"/> <text x="250" y="80" text-anchor="middle" font-size="11" fill="#92400e">t = T/2</text> <text x="250" y="200" text-anchor="middle" font-size="11" fill="#92400e">半去噪</text> <circle cx="420" cy="130" r="30" fill="#fbbf24" opacity="0.7"/> <text x="420" y="80" text-anchor="middle" font-size="11" fill="#92400e">t = T/4</text> <text x="420" y="200" text-anchor="middle" font-size="11" fill="#92400e">轮廓可见</text> <!-- 终态:动作分布 --> <circle cx="620" cy="110" r="20" fill="#16a34a"/> <circle cx="660" cy="150" r="20" fill="#16a34a"/> <circle cx="590" cy="160" r="20" fill="#16a34a"/> <text x="620" y="80" text-anchor="middle" font-size="11" fill="#16a34a">t = 0</text> <text x="620" y="220" text-anchor="middle" font-size="11" fill="#16a34a">多模态动作</text> <!-- 箭头 --> <line x1="125" y1="130" x2="210" y2="130" stroke="#374151" stroke-width="2" marker-end="url(#ar)"/> <line x1="290" y1="130" x2="385" y2="130" stroke="#374151" stroke-width="2" marker-end="url(#ar)"/> <line x1="455" y1="130" x2="565" y2="130" stroke="#374151" stroke-width="2" marker-end="url(#ar)"/> <text x="160" y="120" font-size="10" fill="#374151">去噪</text> <text x="335" y="120" font-size="10" fill="#374151">去噪</text> <text x="500" y="120" font-size="10" fill="#374151">去噪</text> <defs> <marker id="ar" markerWidth="8" markerHeight="8" refX="6" refY="3" orient="auto"> <path d="M0,0 L6,3 L0,6 Z" fill="#374151"/> </marker> </defs> <text x="380" y="245" text-anchor="middle" font-size="10" fill="#6b7280">Diffusion Policy 迭代去噪:从噪声收敛到多模态动作分布</text> </svg>
注意终点是三个绿色簇而非一个点——这正是扩散策略能建模多模态动作分布的体现。
| 优势 | 代价 |
|---|---|
| 建模任意多模态分布 | 推理慢(多步迭代去噪) |
| 训练稳定 | 训练数据需求大 |
| 与 Transformer 兼容 | 超参数多(步数、噪声调度) |
| 已被工业验证(π0 等) | 内存占用大 |
⚠️ 推理延迟:扩散策略推理需要 T 步去噪(通常 T=10-100)。如果 T=50,每步策略推理要做 50 次网络前向,相比单步回归慢 50 倍。这是 π0 转向 Flow Matching 的核心动机。
Flow Matching(2023)是更新的生成式建模方法,被 Physical Intelligence 的 π0 模型采用。它的核心思想:用连续时间流(Continuous Normalizing Flow)建模数据分布。
定义一个「速度场」v_t(x),描述数据点 x 在时间 t 时的「流动速度」。从噪声分布 x_0 \sim \mathcal{N}(0, I) 出发,沿速度场积分到 x_1 得到数据分布:
训练目标:让神经网络 v_\theta(t, x) 拟合真实速度场:
其中 x_t = (1-t) x_0 + t x_1 是噪声到数据的线性插值。
| 维度 | Diffusion | Flow Matching |
|---|---|---|
| 建模对象 | 离散步马尔可夫链 | 连续时间 ODE |
| 路径 | 弯曲(扩散概率) | 直线(线性插值) |
| 训练目标 | 预测噪声 | 预测速度 |
| 推理步数 | 多(10-100 步) | 少(5-10 步甚至更少) |
| 数值稳定性 | 中 | 高 |
| 工程友好度 | 成熟 | 兴起中 |
💡 π0 选择 Flow Matching 的原因:(1) 推理快(少步即可生成);(2) 训练稳定;(3) 与 Transformer 主干兼容好。π0 用 Flow Matching 把推理延迟压到与离散 token 化相当的水平。
π0(Physical Intelligence 2024)是当前最强 VLA 模型之一,技术栈组合:
特点:
π0 证明了一个事实:Flow Matching 是当前 VLA 动作头的最优选择之一。
在扩散策略之前,ACT(Action Chunking Transformer, 2023) 已经提出 action chunk 思路,但用 CVAE(条件变分自编码器)建模多模态:
编码器:把 ground truth action chunk 编码为 latent z 解码器:从 latent z + 观测 生成 action chunk
训练用 ELBO(证据下界),推理时从先验采样 z 或用 encoder 推断 z。
ACT 是 action chunk 的早期代表作,但其多模态建模能力弱于扩散/Flow,故逐渐被替代。
| 实践点 | 推荐 |
|---|---|
| 动作 chunk 长度 | 8-16 步,平衡延迟与精度 |
| 去噪步数 | Diffusion 10-50;Flow 5-10 |
| 噪声调度 | 余弦或线性,根据数据调整 |
| 观测条件 | 最近 2-3 帧图像 + 关节状态 |
| 训练数据 | 至少几千条轨迹,复杂任务更多 |
| 重规划策略 | 执行 chunk 的 1-4 步后重规划(不执行完) |
⚠️ 重规划箴言:action chunk 不要全执行完才重规划——世界在变,全执行完 chunk 末段可能已不合适。常见做法是「执行 chunk 前 1/4 - 1/2 步,然后重新生成新 chunk」。这叫 recurrent horizon control。
| 动作头 | 代表 | 多模态 | 推理速度 | 训练稳定性 | 工程成熟度 |
|---|---|---|---|---|---|
| 离散 token 化 | RT-2、OpenVLA | 弱 | 中(自回归) | 高 | 高 |
| 扩散策略 | Diffusion Policy | 强 | 慢 | 中 | 高 |
| Flow Matching | π0 | 强 | 快 | 高 | 中(兴起中) |
| CVAE/ACT | ACT | 中 | 快 | 中 | 中 |
💡 当前趋势:Flow Matching 是 2025 年最热的方向,逐步替代 Diffusion 在 VLA 动作头的位置。离散 token 化在需要复用 LLM 训练管线时仍有优势。两者并存是常态。
下一节《5.3 代表性 VLA 模型谱系》将梳理 RT-1 到 π0 的代表模型,看 VLA 技术如何演进到今天。