扩散模型(Diffusion Models)近年来在生成式AI领域取得了突破性进展,从图像生成到机器人控制,展现出了强大的建模能力。本章将系统介绍扩散模型的理论基础,重点探讨其在机器人动作生成和轨迹规划中的创新应用。我们将深入分析扩散策略(Diffusion Policy)如何解决传统方法在处理多模态分布、长序列依赖和高维动作空间时的局限性。
扩散模型的核心思想是通过逐步添加高斯噪声将数据分布转化为标准高斯分布,然后学习反向过程来生成数据。对于机器人动作序列 $\mathbf{a}_0 \in \mathbb{R}^{H \times D}$(其中$H$是时间horizon,$D$是动作维度),前向扩散过程定义为:
\[q(\mathbf{a}_t | \mathbf{a}_{t-1}) = \mathcal{N}(\mathbf{a}_t; \sqrt{1-\beta_t}\mathbf{a}_{t-1}, \beta_t\mathbf{I})\]其中 $\beta_t$ 是预定义的噪声调度(noise schedule),通常采用线性或余弦调度:
\[\beta_t = \beta_{\text{min}} + \frac{t}{T}(\beta_{\text{max}} - \beta_{\text{min}})\]通过重参数化,我们可以直接从 $\mathbf{a}_0$ 采样 $\mathbf{a}_t$:
\[\mathbf{a}_t = \sqrt{\bar{\alpha}_t}\mathbf{a}_0 + \sqrt{1-\bar{\alpha}_t}\boldsymbol{\epsilon}\]其中 $\alpha_t = 1 - \beta_t$,$\bar{\alpha}t = \prod{s=1}^t \alpha_s$,$\boldsymbol{\epsilon} \sim \mathcal{N}(0, \mathbf{I})$。
反向过程通过神经网络 $\epsilon_\theta$ 学习预测添加的噪声:
\[p_\theta(\mathbf{a}_{t-1} | \mathbf{a}_t) = \mathcal{N}(\mathbf{a}_{t-1}; \boldsymbol{\mu}_\theta(\mathbf{a}_t, t), \boldsymbol{\Sigma}_\theta(\mathbf{a}_t, t))\]其中均值通过预测的噪声计算:
\[\boldsymbol{\mu}_\theta(\mathbf{a}_t, t) = \frac{1}{\sqrt{\alpha_t}}\left(\mathbf{a}_t - \frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}}\epsilon_\theta(\mathbf{a}_t, t)\right)\]训练目标是最小化简化的变分下界:
\[\mathcal{L}_{\text{simple}} = \mathbb{E}_{t,\mathbf{a}_0,\boldsymbol{\epsilon}}\left[\|\boldsymbol{\epsilon} - \epsilon_\theta(\mathbf{a}_t, t)\|^2\right]\]DDPM采样是随机过程:
\[\mathbf{a}_{t-1} = \boldsymbol{\mu}_\theta(\mathbf{a}_t, t) + \sigma_t \mathbf{z}, \quad \mathbf{z} \sim \mathcal{N}(0, \mathbf{I})\]DDIM通过引入确定性采样加速推理:
\[\mathbf{a}_{t-1} = \sqrt{\bar{\alpha}_{t-1}}\left(\frac{\mathbf{a}_t - \sqrt{1-\bar{\alpha}_t}\epsilon_\theta(\mathbf{a}_t, t)}{\sqrt{\bar{\alpha}_t}}\right) + \sqrt{1-\bar{\alpha}_{t-1}-\sigma_t^2}\epsilon_\theta(\mathbf{a}_t, t)\]当 $\sigma_t = 0$ 时,过程完全确定,可以使用更少的去噪步骤。
信噪比(SNR)定义为:
\[\text{SNR}(t) = \frac{\bar{\alpha}_t}{1-\bar{\alpha}_t}\]余弦调度通过保持更均匀的SNR衰减改善了生成质量:
\[\bar{\alpha}_t = \frac{f(t)}{f(0)}, \quad f(t) = \cos\left(\frac{t/T + s}{1 + s} \cdot \frac{\pi}{2}\right)^2\]其中 $s$ 是小的偏移量(通常为0.008)以避免 $t=T$ 时的奇异性。
在机器人控制中,我们需要根据观察 $\mathbf{o}$(如图像、点云)生成动作。条件扩散模型通过修改噪声预测网络实现:
\[\epsilon_\theta(\mathbf{a}_t, t, \mathbf{o})\]网络架构通常采用U-Net或Transformer,通过交叉注意力机制融合条件信息:
观察编码器: \mathbf{h}_o = \text{Encoder}(\mathbf{o})
噪声动作编码: \mathbf{h}_a = \text{PosEmbed}(\mathbf{a}_t) + \text{TimeEmbed}(t)
交叉注意力: \mathbf{h} = \text{CrossAttention}(\mathbf{h}_a, \mathbf{h}_o)
噪声预测: \epsilon = \text{Decoder}(\mathbf{h})
| 分类器引导通过外部分类器 $p_\phi(\mathbf{o} | \mathbf{a})$ 的梯度调整采样方向: |
这需要训练额外的分类器,在机器人应用中可以是任务成功预测器。
无分类器引导通过混合条件和无条件预测避免额外模型:
\[\tilde{\epsilon}_\theta(\mathbf{a}_t, t, \mathbf{o}) = (1+w)\epsilon_\theta(\mathbf{a}_t, t, \mathbf{o}) - w\epsilon_\theta(\mathbf{a}_t, t, \emptyset)\]其中 $w$ 是引导权重,训练时以概率 $p_{\text{uncond}}$(通常10-20%)随机丢弃条件。
引导强度 $w$ 控制条件遵循与多样性的权衡:
机器人动作通常包含不同量纲的信号(位置、速度、力矩),需要careful归一化:
\[\mathbf{a}_{\text{norm}} = \frac{\mathbf{a} - \boldsymbol{\mu}_a}{\boldsymbol{\sigma}_a}\]其中 $\boldsymbol{\mu}_a, \boldsymbol{\sigma}_a$ 从训练数据统计得出。对于关节限位,可使用tanh缩放:
\[\mathbf{a}_{\text{bounded}} = \mathbf{a}_{\text{min}} + \frac{1}{2}(\mathbf{a}_{\text{max}} - \mathbf{a}_{\text{min}})(1 + \tanh(\mathbf{a}_{\text{norm}}))\]动作序列 $\mathbf{A} \in \mathbb{R}^{H \times D}$ 的扩散建模有两种主要方式:
1. 序列级扩散(Sequence-level Diffusion) 将整个序列作为单个样本: \(\mathbf{A}_t = \sqrt{\bar{\alpha}_t}\mathbf{A}_0 + \sqrt{1-\bar{\alpha}_t}\boldsymbol{\epsilon}\)
优点:保持时间相关性,生成连贯轨迹 缺点:内存需求大,难以处理变长序列
2. 帧级扩散(Frame-level Diffusion) 独立处理每个时间步: \(\mathbf{a}^{(i)}_t = \sqrt{\bar{\alpha}_t}\mathbf{a}^{(i)}_0 + \sqrt{1-\bar{\alpha}_t}\boldsymbol{\epsilon}^{(i)}\)
需要额外的时序模块(如RNN/Transformer)保持连贯性。
实践中通常采用滑动窗口策略:
观察历史长度: T_obs = 2-4步
动作预测长度: T_act = 8-16步
执行长度: T_exec = 1-4步
每个控制周期:
这种设计平衡了时序建模能力和计算效率。
不同控制模式的统一表示:
\[\mathbf{a} = [\mathbf{p}, \mathbf{v}, \boldsymbol{\tau}, \mathbf{g}]^T\]其中:
通过掩码机制 $\mathbf{m}$ 选择性激活不同分量:
\[\mathbf{a}_{\text{final}} = \mathbf{m} \odot \mathbf{a}_{\text{generated}}\]机器人任务常存在多个可行解(如绕障碍物左侧或右侧)。传统方法(如行为克隆)倾向于平均多个模式,导致不可行轨迹。扩散模型通过其生成特性自然处理多模态分布。
模式覆盖度量: \(\mathcal{C}(\mathcal{D}, \mathcal{G}) = \frac{1}{|\mathcal{M}|}\sum_{m \in \mathcal{M}} \mathbb{1}\left[\min_{\mathbf{a} \in \mathcal{G}} d(\mathbf{a}, m) < \epsilon\right]\)
其中 $\mathcal{M}$ 是数据集中的模式集合,$\mathcal{G}$ 是生成的轨迹集合。
混合高斯初始化: 为了更好的模式覆盖,可以从混合分布初始化: \(\mathbf{a}_T \sim \sum_{k=1}^K \pi_k \mathcal{N}(\boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)\)
其中 $\pi_k$ 通过聚类训练数据得到。
视觉观察(RGB图像、深度图、点云)的编码策略:
1. CNN特征提取:
ResNet backbone → FPN → RoI pooling → 特征向量
2. Vision Transformer编码:
图像patches → ViT → [CLS] token作为全局特征
3. 3D感知编码(点云):
PointNet++ → 全局特征 + 局部特征
时空融合: 对于视频输入,使用3D卷积或时序Transformer: \(\mathbf{h}_{\text{visual}} = \text{TimeSformer}([\mathbf{I}_1, \mathbf{I}_2, ..., \mathbf{I}_T])\)
语言条件 $\mathbf{l}$ 的集成方式:
1. FiLM调制(Feature-wise Linear Modulation): \(\mathbf{h} = \gamma(\mathbf{l}) \odot \mathbf{h}_{\text{visual}} + \beta(\mathbf{l})\)
2. 交叉注意力融合: \(\text{Attention}(\mathbf{Q}_a, \mathbf{K}_l, \mathbf{V}_l) = \text{softmax}\left(\frac{\mathbf{Q}_a\mathbf{K}_l^T}{\sqrt{d}}\right)\mathbf{V}_l\)
3. 层级条件编码:
多样性采样策略:
温度调节: \(\mathbf{a}_{t-1} = \boldsymbol{\mu}_\theta(\mathbf{a}_t, t) + \tau \cdot \sigma_t \mathbf{z}\) 其中 $\tau$ 控制探索程度。
多重采样与筛选: 生成 $N$ 条轨迹,通过评分函数选择: \(\mathbf{a}^* = \arg\max_{\mathbf{a}^{(i)}} S(\mathbf{a}^{(i)}) = \arg\max_{\mathbf{a}^{(i)}} [R(\mathbf{a}^{(i)}) - \lambda C(\mathbf{a}^{(i)})]\) 其中 $R$ 是任务奖励,$C$ 是约束违反代价。
硬约束集成:
投影方法: 每步去噪后投影到可行域: \(\mathbf{a}_{t-1} = \text{Proj}_{\mathcal{C}}(\tilde{\mathbf{a}}_{t-1})\)
拉格朗日松弛: 将约束作为额外条件: \(\epsilon_\theta(\mathbf{a}_t, t, \mathbf{o}, \mathbf{c})\) 其中 $\mathbf{c}$ 编码约束信息。
通过子序列采样减少去噪步骤:
原始序列:${T, T-1, …, 1, 0}$ 子序列:${\tau_1, \tau_2, …, \tau_S}$,其中 $S \ll T$
加速采样公式: \(\mathbf{a}_{\tau_{i-1}} = \sqrt{\bar{\alpha}_{\tau_{i-1}}}\hat{\mathbf{a}}_0 + \sqrt{1-\bar{\alpha}_{\tau_{i-1}}}\epsilon_\theta(\mathbf{a}_{\tau_i}, \tau_i)\)
其中: \(\hat{\mathbf{a}}_0 = \frac{\mathbf{a}_{\tau_i} - \sqrt{1-\bar{\alpha}_{\tau_i}}\epsilon_\theta(\mathbf{a}_{\tau_i}, \tau_i)}{\sqrt{\bar{\alpha}_{\tau_i}}}\)
典型配置:$T=100$ 训练,$S=10$ 推理,实现10倍加速。
渐进式蒸馏(Progressive Distillation): 训练学生模型 $\epsilon_{\text{student}}$ 用一步预测教师模型两步的结果:
\[\mathcal{L}_{\text{distill}} = \|\epsilon_{\text{student}}(\mathbf{a}_{2t}, 2t) - \epsilon_{\text{teacher}}(\tilde{\mathbf{a}}_t, t)\|^2\]其中 $\tilde{\mathbf{a}}t$ 是教师模型从 $\mathbf{a}{2t}$ 去噪一步的结果。
一致性模型(Consistency Models): 直接学习映射 $f_\theta: (\mathbf{a}_t, t) \rightarrow \mathbf{a}_0$:
\[\mathcal{L}_{\text{consistency}} = d(f_\theta(\mathbf{a}_t, t), f_{\theta^-}(\mathbf{a}_{t'}, t'))\]其中 $(t, t’)$ 是相邻时间步,$\theta^-$ 是目标网络参数(EMA更新)。
模型量化:
并行化策略:
推理优化:
# TensorRT优化示例
import tensorrt as trt
# 构建引擎
builder = trt.Builder(logger)
config = builder.create_builder_config()
config.set_flag(trt.BuilderFlag.FP16)
config.set_flag(trt.BuilderFlag.STRICT_TYPES)
# 动态批大小
profile = builder.create_optimization_profile()
profile.set_shape("input", min=(1,H,D), opt=(4,H,D), max=(8,H,D))
实时控制需要平衡生成质量与延迟:
分层控制架构:
延迟隐藏技术:
自适应去噪: 根据任务紧急度动态调整步数: \(S = \begin{cases} S_{\text{min}} & \text{if } \|\mathbf{v}\| > v_{\text{threshold}} \\ S_{\text{max}} & \text{if stationary} \\ S_{\text{min}} + (S_{\text{max}}-S_{\text{min}})e^{-\lambda t} & \text{otherwise} \end{cases}\)
策略梯度方法(PPO/SAC):
| 策略表示:$\pi_\theta(\mathbf{a} | \mathbf{s}) = \mathcal{N}(\mu_\theta(\mathbf{s}), \Sigma_\theta(\mathbf{s}))$ |
| 更新规则:$\nabla_\theta J = \mathbb{E}[\nabla_\theta \log \pi_\theta(\mathbf{a} | \mathbf{s}) A(\mathbf{s}, \mathbf{a})]$ |
扩散策略:
| 策略表示:$\pi_\theta(\mathbf{a} | \mathbf{s}) = \int p_\theta(\mathbf{a}_0 | \mathbf{s}) \prod_{t=1}^T p_\theta(\mathbf{a}_{t-1} | \mathbf{a}t, \mathbf{s}) d\mathbf{a}{1:T}$ |
关键区别:
样本效率对比(典型机械臂任务):
| 方法 | 成功率@1k样本 | 成功率@10k样本 | 训练时间 |
|---|---|---|---|
| PPO | 15% | 65% | 48小时 |
| SAC | 25% | 75% | 36小时 |
| BC | 45% | 70% | 2小时 |
| Diffusion Policy | 60% | 85% | 8小时 |
训练稳定性指标:
梯度方差: \(\text{Var}[\nabla_\theta] = \begin{cases} \mathcal{O}(H^2) & \text{策略梯度} \\ \mathcal{O}(1) & \text{扩散策略} \end{cases}\)
性能崩溃频率:
传统探索策略:
扩散模型的隐式探索:
模式寻找vs模式覆盖:
混合架构1:扩散策略+Q函数引导: \(\tilde{\epsilon}_\theta(\mathbf{a}_t, t, \mathbf{s}) = \epsilon_\theta(\mathbf{a}_t, t, \mathbf{s}) - \sqrt{1-\bar{\alpha}_t} \nabla_{\mathbf{a}_t} Q(\mathbf{s}, \mathbf{a}_t)\)
混合架构2:分层决策:
实践选择准则:
| 场景 | 推荐方法 | 原因 |
|---|---|---|
| 大量专家演示数据 | 扩散策略 | 直接模仿学习,无需奖励设计 |
| 稀疏奖励环境 | 策略梯度+课程学习 | 需要探索发现奖励 |
| 多模态任务 | 扩散策略 | 自然处理多解问题 |
| 安全关键应用 | 扩散策略+约束 | 更可预测的行为 |
| 在线适应需求 | 策略梯度 | 持续学习能力更强 |
| 计算资源受限 | 简单BC或小型策略网络 | 推理效率更高 |
丰田研究院(TRI)在2023年发布的Diffusion Policy是扩散模型在机器人控制领域的里程碑工作。该系统在多个基准任务上大幅超越了传统方法,特别是在需要精确操作和多模态决策的场景。
核心组件:
输入: 4个RGB相机 (640x480) + 腕部相机
↓
ResNet-18 backbone (预训练ImageNet)
↓
空间特征池化 → 2048维特征/相机
↓
特征融合 → 8192维观察表示
时间嵌入: SinusoidalPosEmb(t) → 128维
动作序列: (16步 × 7DoF) → Conv1D编码
条件融合: FiLM层调制
去噪网络: 1D U-Net (4层下采样/上采样)
预测16步动作序列
执行前8步
3步重叠进行平滑过渡
基准任务性能:
| 任务 | BC | IBC | BeT | Diffusion Policy |
|---|---|---|---|---|
| 方块堆叠 | 14% | 58% | 61% | 92% |
| 工具使用 | 22% | 41% | 53% | 84% |
| 线缆操作 | 8% | 31% | 38% | 76% |
| 精密装配 | 5% | 18% | 25% | 68% |
泛化能力测试:
Flow Matching是扩散模型的推广,通过学习连续时间的向量场来生成数据:
基本框架: \(\frac{d\mathbf{a}_t}{dt} = v_\theta(\mathbf{a}_t, t)\)
其中 $v_\theta$ 是学习的速度场,将噪声分布传输到数据分布。
与扩散模型的关系: 扩散模型可视为特定参数化的Flow Matching: \(v_\theta(\mathbf{a}_t, t) = \frac{1}{2}\left(\mathbf{a}_t - (1+e^{-2t})\nabla \log p_t(\mathbf{a}_t)\right)\)
优势:
条件Flow Matching (CFM): \(\mathcal{L}_{\text{CFM}} = \mathbb{E}_{t,\mathbf{a}_0,\mathbf{a}_1}\left[\|v_\theta(\mathbf{a}_t, t) - (\mathbf{a}_1 - \mathbf{a}_0)\|^2\right]\)
其中 $\mathbf{a}_t = (1-t)\mathbf{a}_0 + t\mathbf{a}_1$ 是线性插值路径。
一致性模型通过学习沿着PF-ODE轨迹的一致性映射实现单步生成:
一致性条件: \(f(\mathbf{a}_t, t) = f(\mathbf{a}_{t'}, t'), \quad \forall (t, t') \text{ on same trajectory}\)
训练目标: \(\mathcal{L}_{\text{CT}} = \mathbb{E}_{t}\left[d(f_\theta(\mathbf{a}_{t+\Delta t}, t+\Delta t), f_{\theta^-}(\mathbf{a}_t, t))\right]\)
一致性蒸馏vs一致性训练:
1. 超低延迟控制:
2. 在线适应:
3. 多模态融合的新方法:
视觉流: v_visual(a_t, t)
语言流: v_language(a_t, t)
融合流: v_total = α·v_visual + β·v_language
4. 可解释性提升:
1. Rectified Flow (2023):
2. Flow Matching for RL (2024):
3. Consistency Trajectory Models (2024):
本章系统介绍了扩散模型在机器人控制中的应用,从理论基础到实践部署的完整技术链路。
核心要点回顾:
| 前向过程:$q(\mathbf{a}_t | \mathbf{a}{t-1}) = \mathcal{N}(\mathbf{a}_t; \sqrt{1-\beta_t}\mathbf{a}{t-1}, \beta_t\mathbf{I})$ |
| 反向去噪:$p_\theta(\mathbf{a}_{t-1} | \mathbf{a}t) = \mathcal{N}(\mathbf{a}{t-1}; \boldsymbol{\mu}\theta(\mathbf{a}_t, t), \boldsymbol{\Sigma}\theta)$ |
关键设计决策:
未来展望: 扩散模型正在改变机器人学习范式,从”设计奖励函数”转向”收集高质量演示”。随着计算效率的提升和与基础模型的融合,扩散策略有望成为通用机器人控制的标准方法。
练习16.1:推导DDPM的边际分布 给定前向过程 $q(\mathbf{a}t | \mathbf{a}{t-1}) = \mathcal{N}(\sqrt{1-\beta_t}\mathbf{a}_{t-1}, \beta_t\mathbf{I})$,证明: \(q(\mathbf{a}_t | \mathbf{a}_0) = \mathcal{N}(\sqrt{\bar{\alpha}_t}\mathbf{a}_0, (1-\bar{\alpha}_t)\mathbf{I})\)
Hint:使用递归关系和高斯分布的性质。
练习16.2:DDIM采样步数分析 假设训练时使用$T=1000$步,推理时使用$S=50$步的DDIM。如果每步去噪需要20ms,计算: a) 总推理时间 b) 若要达到100Hz控制频率,最多可以使用多少步? c) 使用一致性模型(单步生成)可以达到什么控制频率?
Hint:考虑控制周期的时间约束。
练习16.3:无分类器引导的实现 编写伪代码实现无分类器引导的训练和推理过程。假设条件是图像观察$\mathbf{o}$。
Hint:训练时随机丢弃条件,推理时组合两个预测。
练习16.4:动作归一化设计 给定机械臂的关节限位:
设计合适的归一化和反归一化函数。
Hint:考虑使用tanh进行有界映射。
练习16.5:多模态轨迹的模式覆盖分析 考虑一个2D导航任务,机器人需要从起点(0,0)到终点(10,10),中间有障碍物在(5,5)。存在两条可行路径:左绕和右绕。
a) 解释为什么标准行为克隆会失败 b) 设计评估扩散策略模式覆盖的指标 c) 如何调整训练过程以确保两种模式都被学习?
Hint:考虑数据分布和生成样本的多样性。
练习16.6:实时性与质量的帕累托前沿 设计实验分析DDIM步数对控制性能的影响。给定:
找出最优的步数选择并解释权衡。
Hint:构建帕累托前沿图。
练习16.7:扩散策略的失败模式分析 分析以下场景中扩散策略可能的失败模式,并提出改进方案: a) 长期任务(>100步动作序列) b) 需要精确力控的接触任务 c) 动态环境with移动障碍物
Hint:考虑模型架构限制和训练数据分布。
练习16.8:设计混合扩散-RL系统 设计一个结合扩散策略和强化学习优势的混合系统,用于机械臂操作任务。要求:
Hint:考虑分层架构或残差学习。
问题:训练不稳定,损失发散
问题:模式坍塌,只生成单一轨迹
问题:条件信息被忽略
问题:推理速度无法满足实时要求
问题:生成动作不平滑或震荡
问题:超出关节限位或碰撞
问题:sim2real差距大
问题:长尾事件处理差
问题:动作维度增加导致性能急剧下降
问题:多模态融合效果差
问题:内存占用过大
问题:不同硬件平台性能差异大
# 可视化工具
class DiffusionDebugger:
def visualize_denoising_process(self, model, input):
"""可视化完整去噪过程"""
trajectories = []
for t in range(T, 0, -1):
x_t = model.denoise_step(x_t, t)
trajectories.append(x_t.clone())
return animate_trajectories(trajectories)
def analyze_mode_coverage(self, generated_samples):
"""分析模式覆盖情况"""
clusters = KMeans(n_clusters=5).fit(generated_samples)
return plot_cluster_distribution(clusters)
def check_temporal_consistency(self, trajectory):
"""检查时序一致性"""
velocities = np.diff(trajectory, axis=0)
accelerations = np.diff(velocities, axis=0)
return {
'max_velocity': np.max(np.abs(velocities)),
'max_acceleration': np.max(np.abs(accelerations)),
'jerk': np.diff(accelerations, axis=0)
}
# 关键性能指标(KPI)
metrics = {
"task_success_rate": ">85%",
"inference_latency": "<50ms",
"control_frequency": ">20Hz",
"mode_coverage": ">80%",
"smoothness": "jerk<10m/s³",
"safety_violations": "<0.1%",
"memory_usage": "<4GB",
"training_time": "<24h",
"data_efficiency": "<1000 demos",
"sim2real_gap": "<15% drop"
}
记住:扩散策略的成功部署需要跨学科协作,从理论到工程的每个环节都需要精心设计和验证。