前言
本文一开始是属于此文《UMI——斯坦福刷盘机器人:从手持夹持器到动作预测Diffusion Policy(含代码解读)》的第三部分,考虑后Diffusion Policy的重要性很高,加之后续还有一系列基于其的改进工作
故独立成本文,且写的过程中
- 发现Diffusion Policy的实现代码值得好好剖析下,故直接在本文的第二部分 分析Diffusion Policy的代码实现
代码分析会侧重尽可能一目了然、一看就懂,如此,结合原理和对应的代码实现,会理解更深刻 - 把原属于另一篇文章的「Diff-Control、ControlNet详解」已归纳至本文,作为第三部分
第一部分 Diffusion Policy:基于扩散模型的机器人动作生成策略
1.1 什么是Diffusion Policy及其优势
1.1.1 什么是扩散策略
23年3月份,来自哥伦比亚大学Columbia University、Toyota Research Institute、MIT的研究者们提出了扩散策略
其将机器人的视觉运动策略表示为条件去噪扩散过程,从而来生成机器人行为(或者,说白了,Diffusion Policy就是应用Diffusion方法生成机器人动作的一种Policy,或者说的更直白点,扩散模型在图像生成领域已经应用广泛了,而扩散策略则探索的是扩散模型在机器人领域的动作生成)
- 其作者团队为:Cheng Chi1, Siyuan Feng2, Yilun Du3, Zhenjia Xu1, Eric Cousineau2, Benjamin Burchfiel2, Shuran Song1 (带下划线的表示同时也是UMI的作者)
直白讲,Diffusion Policy这个工作是哥伦比亚大学宋舒然团队和MIT教授Russ Tedrake带领的丰田机器人研究院共同创作
论文的一作迟宬目前是哥伦比亚大学的计算机科学博士生,在宋舒然的指导下做机器人操纵和感知相关的研究 - 其对应的论文为:Diffusion Policy: Visuomotor Policy Learning via Action Diffusion
- 其对应的网站为:diffusion-policy.cs.columbia.edu
- 其对应的GitHub仓库为:real-stanford/diffusion_policy
进一步而言,如下图所示
- a)具有不同类型动作表示的显式策略(Explicit policy with different types of action representations)
- b)隐式策略学习以动作和观察为条件的能量函数,并优化能够最小化能量景观的动作
Implicit policy learns an energy function conditioned on both action and observation and optimizes for actions that minimize the energy landscape - c)通过“条件去噪扩散过程在机器人行动空间上生成行为”,即该扩散策略不是直接输出动作,而是根据视觉观察推断且经过K次去噪迭代的动作得分梯度
instead of directly outputting an action, the policy infers the action-score gradient, conditioned on visual observations, for K denoising iterations
1.1.2 扩散策略的优势:表达多模态动作分布、高维输出空间、稳定训练
扩散策略有以下几个关键特性
- 可以表达多模态动作分布
通过学习动作评分函数的梯度(Song和Ermon,2019),并在此梯度场上执行随机朗之万动力学采样,扩散策略可以表达任意可归一化的分布(Neal等,2011),其中包括多模态动作分布
By learning the gradient of the action score function Song and Ermon (2019) and performing Stochastic Langevin Dynamics sampling on this gradient field,Diffusion policy can express arbitrary normalizabledistributions Neal et al. (2011), which includes mul-timodal action distribution - 高维输出空间
正如其令人印象深刻的图像生成结果所示,扩散模型在高维输出空间中表现出了极好的可扩展性。这一特性使得策略能够联合推断一系列未来动作,而不是单步动作,这对于鼓励时间上的动作一致性和避免比较短浅的规划至关重要 - 稳定训练
训练基于能量的策略通常需要负采样来估计难以处理的归一化常数,这已知会导致训练不稳定(Du et al., 2020;Florence et al., 2021)
扩散策略通过学习能量函数的梯度绕过了这一要求,从而在保持分布表达能力的同时实现了稳定训练
进一步,为了充分释放扩散模型在物理机器人上进行视觉运动策略学习的潜力,作者团队提出了一套关键的技术贡献,包括将闭环动作序列、视觉条件化和时间序列扩散transformer结合起来
- 闭环动作序列
结合策略预测高维动作序列的能力与递推视界控制来实现稳健执行(We combine the policy’s capability to predict high-dimensional action sequences with receding-horizon control to achieve robust execution)
这种设计允许策略以闭环方式持续重新规划其动作,同时保持时间上的动作一致性,从而在长视距规划和响应性之间实现平衡 - 视觉条件化
引入了一种视觉条件化扩散策略,其中视觉观测被视为条件而不是联合数据分布的一部分。在这种公式化中,策略只需提取一次视觉表示,而无需考虑去噪迭代,从而大大减少了计算量,并实现了实时动作推理
where the visual observations are treated as conditioning instead of apart of the joint data distribution. In this formulation,the policy extracts the visual representation onceregardless of the denoising iterations,which drastically reduces the computation and enable sreal-time action inference - 时间序列扩散transformer
提出了一种基于transformer的新型扩散网络,该网络最小化了典型CNN模型的过度平滑效应,并在需要高频动作变化和速度控制的任务中实现了最先进的性能
1.2 Diffusion for Visuomotor Policy Learning
1.2.1 扩散策略背后的扩散过程回顾
- 众所周知,从高斯噪声中采样的
开始,DDPM「如果此前不了解什么是DDPM的,请详见此文《图像生成发展起源:从VAE、VQ-VAE、扩散模型DDPM、DETR到ViT、Swin transformer》的第二部分」执行
次去噪迭代,以生成一系列噪声逐渐减少的中间动作:
,直到形成所需的无噪声输出
(说白了,就是去噪)
该过程遵循下述所示的公式1
论文中 这个表述可能不太自然,我把部分上标换成下标,你可能会更习惯
总之,不管哪种表达,其中
是第
步的状态(带有噪声的样本),通过去噪过程得到
是去噪步长的缩放系数,影响每次迭代的收敛速度
是学习率,控制每次更新的幅度
,或
,为通过学习优化参数的噪声估计网络
为每次迭代时加入的高斯噪声
该公式的实现在「Diffusion Policy」GitHub仓库中的diffusion_policy/models.py文件里,apply_denoising_step函数实现了这个去噪步骤:
可以看到,在代码中,apply_denoising_step函数实现了公式1的逐步去噪过程。函数中,epsilon_theta为噪声预测网络,np.random.normal添加了随机高斯噪声,模拟扩散过程中的扰动def apply_denoising_step(x_k, k, alpha, gamma, epsilon_theta, sigma): noise_pred = epsilon_theta(x_k, k) # 计算噪声预测 x_k_minus_1 = alpha * (x_k - gamma * noise_pred) + np.random.normal(0, sigma) return x_k_minus_1
- 且上面的公式1也可以理解为一个单一的噪声梯度下降步长,定义为如下公式2
此公式2表示一个简单的梯度下降步骤,用于调整样本的位置,以降低能量
「该公式2源于基于能量的模型EBM框架,目标是找到样本的低能量区域,这样生成的样本更加合理」
其中,噪声估计网络有效地预测了梯度场
——相当于能量函数的
的梯度,
为学习速率,决定每步移动的大小
此外,公式1中的、
和
作为与迭代步长
相关的函数选择被称为噪声调度,可以理解为梯度下降过程中学习速率的调整策略。经证明,将
设定略小于1能够改善稳定性
在代码实现中,公式2被实现为梯度更新的一部分。代码片段在diffusion_policy/models.py中的gradient_descent_step函数:
在此函数中,energy_grad是能量的梯度,gamma是学习率参数,实现了逐步降能的思想def gradient_descent_step(x, gamma, energy_grad): x_prime = x - gamma * energy_grad return x_prime
- 再之后,训练过程首先从数据集中随机抽取未修改的样本
开始
对于每个样本,随机选择一个去噪迭代,然后为迭代
采样一个具有适当方差的随机噪声
然后要求噪声估计网络从添加噪声的数据样本中预测噪声,如下公式3
此公式3定义了去噪模型的均方误差(MSE)损失函数,用于训练噪声预测网络
其中,是真实噪声样本,
相当于是噪声估计网络的预测输出
总之,最小化公式3所示的损失函数,也同时最小化了数据分布和从DDPM
中提取的样本分布之间KL-散度的变分下界「minimizing the loss functionin Eq 3 also minimizes the variational lower bound of the KL-divergence between the data distribution p(x0) and the distribution of samples drawn from the DDPM q(x0) usingEq 1」
代码实现此损失函数的地方在diffusion_policy/losses.py中的denoising_loss函数def denoising_loss(pred_noise, true_noise): loss = np.mean((pred_noise - true_noise) ** 2) return loss
denoising_loss函数实现了均方误差 (MSE) 损失,用于在训练中衡量预测噪声与真实噪声之间的误差
1.2.2 改造DDPM 使其表达机器人视觉运动策略:闭环动作序列预测、视觉观察条件化
虽然DDPM通常用于图像生成,但该团队使用DDPM来学习机器人的视觉运动策略。这需要针对DPPM的公式进行两大修改
- 之前输出的是图像,现在需要输出:为机器人的动作(changing the output x to represent robot actions)
- 去噪时所依据的去噪条件为输入观测
(making the denoising processes conditioned on input observation Ot)
为了达到以上这两个修改的目的,需要做以下措施
- 一、闭环动作序列预测(Closed-loop action-sequence prediction)
一个有效的动作制定应该鼓励在长期规划中的时间一致性和平滑性,同时允许对意外观察做出迅速反应
为了实现这一目标,应该在重新规划之前,采用扩散模型生成的固定持续时间的行动序列预测
即如论文原文所说:“An effective action formulation should encourage temporal consistencyand smoothness in long-horizon planning while allowingprompt reactions to unexpected observations. To accomplishthis goal, we commit to the action-sequence prediction produced by a diffusion model for a fixed duration beforere planning”
具体来说,在时间步骤,策略将最新的
个观察数据
作为输入,并预测
个动作,其中
个动作在不重新规划的情况下在机器人上执行
(在此定义中,表示观测范围,
表示动作预测范围,而
则代表了动作执行范围)
这样做既促进了时间动作的一致性,又保持了响应速度
如下图所示
- a) 一般情况下,该策略在时间步长
时,将最新的
步观测数据
作为输入,并输出
步动作
General formulation. At time step t, the policy takes the latest To steps of observation data Ot as input and outputs Ta steps of actions At- b) 在基于CNN的扩散策略中,对观测特征
应用FiLM(Feature-wise Linear Modulation ,关于什么是FiLM,详见此文《YAY Robot——斯坦福和UC伯克利开源的:人类直接口头喊话从而实时纠正机器人行为(含FiLM详解)》的第二部分 EfficientNet与FiLM )来调节每个卷积层通道
In the CNN-based Diffusion Policy, FiLM (Feature-wise Linear Modulation) [Film: Visual reasoning with a general conditioning layer] conditioning of the observation feature Ot is applied to every convolution layer, channel-wise.
然后从高斯噪声中提取的减去噪声估计网络
的输出,并重复
次,得到去噪动作序列
「这个过程是扩散模型去噪的本质,如不了解DDPM,请详看此文:《图像生成发展起源:从VAE、扩散模型DDPM、DETR到ViT、Swin transformer》」
Starting from AtK drawn from Gaussian noise, the outputof noise-prediction network εθ is subtracted, repeating K times to get At0, the denoised action sequence.- c) 在基于Transformer的扩散策略中,观测
的嵌入被传递到每个Transformer解码器块的多头交叉注意力层
每个动作嵌入使用所示注意力掩码进行约束,使其仅关注自身和之前的动作嵌入(因果注意力,类似GPT的解码策略)
In the Transformer-based [52]Diffusion Policy, the embedding of observation Ot is passed into a multi-head cross-attention layer of each transformer decoder block.
Each action embedding is constrained to only attend to itself and previous action embeddings (causal attention) using the attention mask illustrated.
- 二、视觉观察条件化(Visual observation conditioning)
总之,他们使用DDPM来近似:条件分布——而不是Janner等人[20]用于规划的联合分布
「We use a DDPM toapproximate the conditional distribution p(At|Ot) instead of the joint distribution p(At,Ot) used in Janner et al. (2022a)for planning. 」
相当于通过DDPM去生成特定观察下的动作图像
这种形式使得模型能够在不推断未来状态的情况下预测基于观察的动作(This formulation allows the model to predict actionsconditioned on observations without the cost of inferringfuture states),加快了扩散过程并提高生成动作的准确性
首先,为了获取条件分布,将下述公式1
修改为如下公式4
此公式4是一个条件去噪公式,用于在输入当前观察
的条件下生成行动
其代码实现在diffusion_policy/conditional_models.py中的apply_conditional_denoising_step函数:
该函数实现了条件去噪过程,在观察条件下的噪声预测网络def apply_conditional_denoising_step(A_k, O_t, k, alpha, gamma, epsilon_theta, sigma): noise_pred = epsilon_theta(O_t, A_k, k) A_k_minus_1 = alpha * (A_k - gamma * noise_pred) + np.random.normal(0, sigma) return A_k_minus_1
——epsilon_theta考虑了观察
的条件,确保模型能够根据环境动态调整
其次,将训练损失由下述公式3
修改为如下的公式5
该公式5一个条件去噪损失函数,用于衡量噪声预测网络在给定观察条件下的预测误差
其中,是真实噪声,
是条件噪声预测网络的输出
代码实现在diffusion_policy/losses.py文件中定义为conditional_denoising_loss函数def conditional_denoising_loss(pred_noise, true_noise): loss = np.mean((pred_noise - true_noise) ** 2) return loss
1.3 几个关键设计:涉及模型选型等
第一个设计决策是选择的神经网络架构,对此,作者研究了两种常见的网络架构类型,即CNN和Transformer
1.3.1 噪声估计网络架构的选型:基于CNN还是基于transformer
1.3.1.1 CNN-based Diffusion Policy
基于CNN的扩散策略中,采用Janner等人[21]的1D temporal CNN,并做了一些修改,如下图所示
- 首先,仅通过特征线性调制(FiLM)将动作生成过程条件化在观察特征
上, 并进行去噪迭代
,来建模条件分布
we only model the conditional distribution p(At|Ot)by conditioning the action generation process on observation features Ot with Feature-wise Linear Modulation (FiLM) - 其次,仅预测动作轨迹,而非连接的观察动作轨迹
we only predict the action trajectory instead of the concatenated observation action trajectory - 第三,利用receding prediction horizon,删除了基于修复的目标状态条件反射。然而,目标条件反射仍然是可能的,与观测所用的FiLM条件反射方法相同
we removed inpainting-based goal state conditioning due to incompatibility with our framework utilizing a receding prediction horizon.However, goal conditioning is still possible with the same FiLM conditioning method used for observations
在实践中发现,基于CNN的骨干网络在大多数任务上表现良好且无需过多超参数调优。然而,当期望的动作序列随着时间快速而急剧变化时(如velocity命令动作空间),它的表现很差,可能是由于时间卷积的归纳偏差[temporal convolutions to prefer lowfrequency signals],以更倾向低频信号所致
1.1.1.2 Time-series diffusion transformer
此外,为减少CNN模型中过度平滑效应[49],他们还提出了一种基于Transformer架构、借鉴minGPT[42]思想的DDPM来进行动作预测,如下图所示
- 行动和噪声
作为transformer解码器块的输入tokens传入,扩散迭代
的正弦嵌入作为第一个token(Actions with noise At k are passed in as input tokens for the transformer decoder blocks, with the sinusoidal embedding for diffusion iteration k prepended as the first token)
观测通过共享的MLP转换为观测嵌入序列,然后作为输入特征传递到transformer解码器堆栈中(The observation Ot is transformed into observation embedding sequence by a shared MLP, which is then passed into the transformer decoder stack as input features)
“梯度”由解码器堆栈的每个对应输出token进行预测(The "gradient" εθ (Ot ,At k , k) is predicted by each corresponding output token of the decoder stack)
- 在基于状态的实验中,大多数性能最佳的策略都是通过Transformer骨干实现的,特别是当任务复杂度和动作变化率较高时。然而,他们发现Transformer对超参数更敏感
当然了,Transformer训练的困难[25]并不是Diffusion Policy所独有的,未来可以通过改进Transformer训练技术或增加数据规模来解决
However, we found the transformer to be more sensitive to hyperparameters. The difficulty of transformer training [25] is not unique to Diffusion Policy and could potentially be resolved in the future with improved transformer training techniques or increased data scale
故,一般来说
- 建议从基于CNN的扩散策略实施开始,作为新任务的第一次尝试
In general, we recommend starting with the CNN-based diffusion policy implementation as the first attempt at a new task - 但如果由于任务复杂性或高速率动作变化导致性能低下,那么可以使用时间序列扩散Transformer来潜在地提高性能,但代价是额外的调优
If performance is low due to task complexity or high-rate action changes, then the Time-series Diffusion Transformer formulation can be used to potentially improve performance at the cost of additional tuning
1.3.2 视觉编码器:把图像潜在嵌入化并通过扩散策略做端到端的训练
视觉编码器将原始图像序列映射为潜在嵌入,并使用扩散策略进行端到端的训练(The visual encoder maps the raw image sequence into a latent embedding Ot and is trained end-to-end with the diffusion policy)
不同的相机视图使用不同的编码器,以对每个时间步内的图像独立编码,然后连接形成,且使用标准的ResNet-18(未进行预训练)作为编码器,并进行以下修改:
- 使用空间softmax池化替代掉全局平均池化,以维护空间信息
1) Replace the global average pooling with a spatial softmax pooling to maintain spatial information[29] - 采用GroupNorm代替BatchNorm来实现稳定训练,这个修改对于把归一化层与指数移动平均一起使用时(通常应用于DDPM)很有必要
2) Replace BatchNorm with GroupNorm [57] for stabletraining. This is important when the normalization layer isused in conjunction with Exponential Moving Average [17](commonly used in DDPMs)
1.4 扩散策略的稳定性与好处
1.4.1 动作序列预测的好处(Benefits of Action-Sequence Prediction)
由于高维输出空间采样困难,在大多数策略学习方法中一般不做序列预测。例如,IBC将难以有效地采样具有非光滑能量景观的高维动作空间。类似地,BC-RNN和BET难以确定动作分布中存在的模式数量(需要GMM或k-means步骤)
相比之下,DDPM在不降低模型表现力的前提下,在输出维度增加时仍然保持良好扩展性,在许多图像生成应用中已得到证明。利用这种能力,扩散策略以高维动作序列的形式表示动作
如此文所说,关于Action Space Scalabiltiy或者sequential correlation问题,简单理解就是机器人对未来动作的预测不应该只局限于眼前的一步两步动作,而应该更有前瞻性,可以往前预测数十步动作
具体而言,在Robot Learning领域,机器人动作执行主要有三种方法:包括直接回归、分类预测和生成式模型
- 第一类回归,即将神经网络视为一个函数,输入是图片,输出是一个动作。这是最常见的方法,绝大多数强化学习都采用这种方式。然而,这种方法存在一些问题,正如之前提到的
相当于直接输出一个数值- 第二类分类预测,这种方法通过预测分类来生成动作
相当于将可能的数值分成几个区间,进行离散预测。在预测Multi-Modal Action的时候,人们倾向于采用离散预测,将连续值问题转化为分类问题,但这样做涉及的算力成本很高,尤其在处理高维空间时- 第三类生成模型,理论上所有的生成模型都可以预测连续的多模态分布,但很多生成模型的问题是训练不稳定
对于针对机器人控制问题,如果采用分类方法,每一步都需要预测下一步要执行的动作,而实际需求是希望一次性预测多步动作,这就涉及到了连续控制中的动作一致性问题。解决这个问题的挑战在于平衡成本和对高维连续控制的需求
总之,最终diffusion policy最终自然地解决了以下问题:
- 时间动作一致性,如下图所示,为了将T块从底部推入目标,策略可以从左或右绕T块走
相当于引入了概率分布,使得神经网络不再是一个输入一个输出的函数,而是一个输入可以有多个输出的函数
举个例子,就像人从两腿并拢然后往前迈步一样,有的人会先迈左脚,有的会先迈右脚,如果你让本质上是一个函数的前馈神经网络(即对于给定输入,只有一种输出),去预测人迈脚的动作则会冲突重重,而如果强行让神经网络处理这种情况——通常是通过预测一个中间值,试图最小化与数据之间的距离。但这可能导致不符合预期的行为,例如忽迈左、忽迈右,最终摔倒
然而,如果序列中的每个动作被预测为独立的多模态分布(如在BC-RNN和BET中所做的那样)。连续动作可能会从不同模式中提取出来,并导致两个有效轨迹之间交替出现抖动动作
However, suppose each action in the sequence is predicted as independent multimodal distributions (as done in BCRNN and BET). In that case, consecutive actions could be drawn from different modes, resulting in jittery actions that alternate between the two valid trajectories. - 对于空闲动作的鲁棒性:当演示暂停并导致相同位置或接近零速度的连续动作序列时,则会发生空闲行为。这在远程操作等任务中很常见
然而,单步策略容易过度适应这种暂停行为。例如,在实际世界实验中使用BC-RNN和IBC时经常会卡住,未删除训练数据集中包含的空闲行为(BC-RNN andIBC often get stuck in real-world experiments when the idleactions are not explicitly removed from training)
// 待更
1.4.2 扩散模型在训练中的稳定:识别动作的好坏
首先,隐式策略使用基于能量的模型(EBM)表示动作分布(An implicit policy represents the action distribution using an Energy-Based Model (EBM)),如下公式6所示:
该公式6表达的是基于能量的模型EBM)中给定观察条件 下的行动
的概率分布「用来判断在某种观察条件
下,一个动作
是否是“好”的动作」
- 其中
作为能量函数「用来衡量这个动作的“好”与“坏”,能量越低,代表这个动作越适合当前的观察条件
」,控制在给定观察条件下特定行动的概率
- 而
是一个难以计算的归一化常数(相对于a)「是一个用来“标准化”所有可能动作的常数,让所有动作的总和为1(就像是概率总和为1一样)」
总之,通过设定能量函数,模型会倾向于选择那些能量低的动作,表示这些动作更合理,在代码里,并没有明确写出公式6,因为我们不直接计算那个难算的 。而是通过训练一个网络,让它去预测能量(或者噪声),并让低能量的动作更可能被选中
其次,为了训练用于隐式策略的EBM,使用了infonce风格的损失函数「用于估计规范化常数,以此来训练基于能量的模型 (EBM)」,即下述公式7相当于公式6的负对数似然
其中的表示的是负样本的数量,在实践中,负采样的不准确性会导致EBMs的训练不稳定[11,48]
- 该infoNCE 损失相当于是一种“打分”机制,用来帮助模型识别哪个动作是“好的”。在这个公式中,
是我们想要模型认为是“好的”动作,而
是一些“坏”的动作(也叫“负样本”)
- 通过计算“好”动作和“坏”动作的能量差,我们教模型学会区分哪些是“好的”动作——也就是说,在给定的观察条件
下,模型会更倾向于选择能量更低的动作
总之,InfoNCE 损失帮助模型在“好”动作和“坏”动作之间建立对比,让模型更准确地识别“好的”动作
而在代码实现里,通过info_nce_loss函数实现这种对比损失。这个函数会把“好”动作的能量和多个“坏”动作的能量一起计算,最终得到一个分数,让模型逐渐倾向于选择那些能量较低的“好”动作
最后,扩散策略和DDPM通过建模公式6中相同动作分布的得分函数[46],回避了的估计问题:
该公式8表达了噪声预测网络在不考虑规范化常数情况下的梯度匹配
因此,扩散策略的推理过程(公式4)和训练过程(公式5)都不涉及对的评估,从而使扩散策略的训练更加稳定
总之,该公式8表示如何通过“得分匹配”来找到好动作。简单来说,就是利用能量的梯度(变化趋势)来找到最佳动作
- 上面在公式6中提到过,计算
很困难。但幸运的是,公式8告诉我们可以忽略这个
的影响,只需要关心
的梯度(即能量随动作的变化情况)——让我们在不计算复杂的
的情况下,也能找到更低能量(更好)的动作
- 通过计算这个梯度,模型会朝着降低能量的方向去调整动作,从而逐渐找到最合适的动作
在代码里,gradient_descent_step函数实现了这种通过梯度来调整动作的操作。函数会计算能量梯度,然后更新动作,让它逐步朝着能量更低的方向移动,以找到更好的动作
1.5 总结:扩散策略的详细算法过程
最后借用此文所述的,来总结下整个的算法过程
- 训练阶段:学习“去噪”过程
在训练阶段,算法的目标是让模型学会从随机的初始动作(带有噪声的动作)逐步调整到合适的动作,这一过程称为“去噪扩散”
关键公式 1:去噪扩散过程
在这里,模型会从一个随机初始化的噪声动作开始,通过一系列迭代步骤,逐步去除噪声,让动作变得更合理
具体过程如下:
初始化:从高斯噪声中生成初始动作
去噪迭代:在每一步迭代中,模型根据当前噪声和观察条件预测噪声,通过网络
,并逐步去除噪声
最终,经过多次迭代去噪,模型生成出符合当前观察条件的“干净”动作
作用:去噪过程让模型在不确定性中找到合理的动作序列 - 得分匹配:优化动作的能量
模型不仅依赖去噪扩散过程,还会通过得分匹配来优化动作的能量。得分匹配帮助模型找到在当前观察条件下具有最低能量的动作,使得这些动作更符合环境要求
关键公式 8:得分匹配
在去噪的每一步,模型计算当前动作的能量梯度,并沿着降低能量的方向调整动作。这样一来,模型会逐渐选择更合理的动作
作用:通过能量优化找到更“合理”的动作,帮助模型生成高质量的动作序列 - InfoNCE 损失:区分“好”动作与“坏”动作
在训练过程中,模型不仅仅需要学会去噪,还需要学会区分“好”的动作(即符合演示的动作)和“坏”的动作(即不符合演示的动作)。InfoNCE损失用于帮助模型增强这种区分能力
关键公式 7:InfoNCE 损失
InfoNCE损失通过将“好”动作和多个“坏”动作进行比较,使得模型更倾向于选择符合演示的动作
作用:帮助模型更准确地区分“好”动作和“坏”动作,增强模型的学习效果 - 推理阶段:实时生成动作序列
在实际使用中,算法在给定观察条件后,执行去噪扩散生成过程以输出合理的动作。由于每次迭代都涉及去噪操作,算法使用了一些加速技巧(如减少迭代次数和硬件加速)来确保模型可以实时运行
加速推理的技巧:通过减少去噪迭代次数(例如,使用DDIM方法减少训练迭代数)来加速推理。这些加速技巧确保算法能够在复杂环境下保持实时性。
第二部分 DP的编码实现:解读DexCap库中的diffusion_policy.py
扩散策略(Diffusion Policy),包括网络的创建、数据处理、训练、推理和模型的序列化与反序列(且注意,本部分分析的代码来自DexCap库中的STEP3_train_policy/robomimic/algo/diffusion_policy.py,至于原装的扩散策略GitHub代码仓库则见:real-stanford/diffusion_policy)
后续,把本部分转移到了此文《LeRobot DP——LeRobot对动作策略Diffusion Policy的封装与解读(含DexCap库中对diffusion_policy的封装与实现)》的第二部分中