【论文精读】Diffusion Policy: Visuomotor Policy Learning via Action Diffusion

1 背景

在具身智能领域,从专家示范中进行视觉运动策略学习(visuomotor policy learning,visual -> motor)较难。

  1. 多模态特性 multimodal distribution。执行一个任务有多种方式,执行多个任务有多种顺序,这些都是多模态。
  2. 序列关联性 sequential correlation。具身智能的动作是一条序列,前后互相关联,不能突变。
  3. 精度要求高 high precision 。否则多种行为无法完成,比如抓夹。

扩散模型的优势:

  1. 在理论情况下,可以通过增加网络容量和去噪步数,逼近任意复杂的分布,其中包括多模态的分布。
  2. 在高维空间具备可扩展性(scalability to high-dimension output spaces)。
  3. 同为基于能量的策略(energy-based policies),其他方法需要用负采样计算归一化系数(require negative sampling to estimate an intractable normalization constant),但是扩散模型直接学习能量函数的梯度,不需要用负采样,避免了训练不稳定。

2 实现

2.1 输入

  1. 视觉。其他方法会把视觉观测信息作为预测的输出之一(a part of the joint data distribution),但是该论文只做输入,因此称为visual conditioning。具体来看,包括多个视角(front camera x 1,writst camera x 2)的相机信息

该论文使用历史视觉信息2帧。

2.2 输出

2.2.1 输出空间

该论文探讨了2种输出空间,一种是位置空间,另一种是速度空间。

  1. 速度控制 velocity control。输出目标线速度和角速度。我理解是线性单元和旋转单元的速度,响应速度快,但是由于累计误差 compounding error 的影响,控制精度不高。但是目前大部分论文都使用速度控制。
  2. 位置控制 position control。输出目标线位置和角位置。控制精度高,响应速度慢。该论文实验表明,位置控制效果更优。

2.2.2 滚动时域控制

该论文使用滚动时域控制receding-horizon control,本质和MPC类似,预测较长的一段时域,但是只执行较短时域内的动作,然后进行重规划。

预测时域为16步,动作时域为8步。

经过消融实验,动作时域多于或者少于8步,都会导致性能下滑。

2.3 网络结构

2.3.1 视觉编码 visual encoder

输入多个视角多个时间戳的图片,其编码结果进行拼接concat,输出观测结果Ot。

模型选择:Resnet-18。
模型改动

  1. 全局平均池化 改成 空间softmax池化。全局平均池化(nn.AvgPool2d / nn.AdaptiveAvgPool2d)将一个通道的所有值算平均,丢失了细节信息;如果用空间softmax函数,会(1)对一个通道的所有值算softmax,(2)根据在特征图中的位置,进行位置加权求和。以[128,128,32]的特征图为例,全局平均池化的结果是[1,1,32],空间softmax的结果是[2,32]。
  2. BatchNorm换成GroupNorm,训练更稳定。因为Batchnorm依赖Batch大小,但是GroupNorm本质上是一种特殊的LayerNorm,在特征维度分组进行归一化,不依赖batch大小,更稳定。

该论文做了消融实验,对比了:

  1. 模型:ResNet18,ResNet34,ViT-base
  2. 训练方式:加载预训练模型,从头训,微调。

发现

### 如何复现论文 'Diffusion Policy: Visuomotor Policy Learning via Action Diffusion' #### 方法概述 该方法的核心在于通过动作扩散模型(Action Diffusion Model)学习视觉运动策略。具体来说,它结合了显式策略(Explicit Policy)和隐式策略(Implicit Policy),并通过扩散过程优化动作序列的学习效果[^1]。 #### 数据准备 为了复现此方法,需准备好高质量的动作数据集以及对应的环境模拟器。这些数据通常来源于专家演示或真实世界的机器人交互记录。Wang等人提到的数据预处理步骤对于提升模型性能至关重要[^3]。 #### 模型架构设计 模型主要由两部分组成:一是基于扩散机制的动作生成模块;二是用于评估生成动作质量的价值网络或者奖励函数。其中,动作生成模块可以采用条件变分自编码器或其他适合的时间序列建模技术实现[^2]。 以下是简化版的Python伪代码示例: ```python import torch from diffusers import UNet2DModel class DiffusionPolicy(torch.nn.Module): def __init__(self, input_dim, output_dim, hidden_size=128): super(DiffusionPolicy, self).__init__() # 定义UNet结构作为核心组件 self.unet = UNet2DModel( sample_size=input_dim, in_channels=hidden_size, out_channels=output_dim, layers_per_block=2, block_out_channels=(hidden_size, hidden_size*2), down_block_types=("DownBlock2D", "AttnDownBlock2D"), up_block_types=("AttnUpBlock2D", "UpBlock2D") ) def forward(self, x, timesteps=None): return self.unet(x, timesteps).sample def train_model(model, dataloader, optimizer, loss_fn, epochs=10): model.train() for epoch in range(epochs): total_loss = 0 for batch_data in dataloader: inputs, targets = batch_data noise = torch.randn_like(inputs) noisy_inputs = add_noise_to_signal(inputs, noise, timestep_schedule()) predicted_noise = model(noisy_inputs, timesteps=timestep_schedule()) loss = loss_fn(predicted_noise, noise) optimizer.zero_grad() loss.backward() optimizer.step() total_loss += loss.item() avg_loss = total_loss / len(dataloader) print(f"Epoch {epoch+1}/{epochs}, Loss: {avg_loss:.4f}") ``` 上述代码片段展示了如何构建一个简单的扩散政策框架,并提供了训练循环的基础逻辑。 #### 实验设置与超参数调整 实验过程中需要注意的关键点包括但不限于时间步数的选择、噪声水平控制以及批量大小等因素的影响分析。此外,在实际应用中可能还需要针对特定任务微调一些高级配置选项。 #### 结果验证与改进方向探索 完成初步复现之后,可以通过对比不同条件下得到的结果来进一步完善算法表现。例如尝试引入更多的先验知识指导扩散过程,或是研究更高效的采样方案降低计算成本等。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值