文章概括

引用:

@article{rostel2026denoising,
  title={Denoising Particle Filters: Learning State Estimation with Single-Step Objectives},
  author={R{\"o}stel, Lennart and B{\"a}uml, Berthold},
  journal={arXiv preprint arXiv:2602.19651},
  year={2026}
}
Röstel, L. and Bäuml, B., 2026. Denoising Particle Filters: Learning State Estimation with Single-Step Objectives. arXiv preprint arXiv:2602.19651.

主页:
原文:
代码、数据和视频:

系列文章:
请在 《 《 文章 》 》 专栏中查找



宇宙声明!


引用解析部分属于自我理解补充,如有错误可以评论讨论然后改正!



ABSTRACT

基于学习的方法通常将机器人中的状态估计视为一个序列建模问题。 尽管这种范式在最大化端到端性能方面可能是有效的,但模型通常难以解释,并且训练成本较高,因为训练过程需要沿时间展开一系列预测。 作为端到端训练状态估计方法的一种替代方案,我们提出了一种新的粒子滤波算法,其中模型基于单个状态转移进行训练,从而充分利用机器人系统中的马尔可夫性质。 在这一框架中,测量模型通过最小化去噪分数匹配目标来进行隐式学习。 在推理阶段,学习得到的去噪器与一个(学习得到的)动力学模型共同使用,在每一个时间步近似求解贝叶斯滤波方程,从而有效地将预测状态引导到由测量信息所约束的数据流形附近。 我们在仿真中的具有挑战性的机器人状态估计任务上评估了所提出的方法,结果表明,与经过精心调参的端到端训练基线方法相比,该方法具有有竞争力的性能。 重要的是,我们的方法具备经典滤波算法所具有的良好可组合性,因此能够在无需重新训练的情况下融合先验信息和外部传感器模型。


在这里插入图片描述图1. 使用去噪粒子滤波器(DnPF)进行一步时间推理。 DnPF将后验分布 p ( x t ∣ y 1 : t , u 1 : t ) p(x_t|y_{1:t},u_{1:t}) p(xty1:t,u1:t)近似表示为一组粒子 { x t i } i = 1 N \{x_t^i\}_{i=1}^N {xti}i=1N,并在score空间中递归地求解贝叶斯滤波方程。 在每个时间步 t t t,每个粒子都会经历一系列积分步骤 s = 0 → 1 s=0\to1 s=01,并根据以下几个score项的和来移动:动力学项 ∇ log ⁡ p s ( x t ∣ x t − 1 , u t ) \nabla\log p_s(x_t|x_{t-1},u_t) logps(xtxt1,ut)、数据似然score项 ∇ log ⁡ p s ( x t ∣ y t ) \nabla\log p_s(x_t|y_t) logps(xtyt),以及(可选的)已知外部传感器模型项 ∇ log ⁡ p s ( y ^ t ∣ x t ) \nabla\log p_s(\hat{y}_t|x_t) logps(y^txt)。 粒子在每个时间步并不是从纯噪声开始,而是采用(学习得到的)动力学模型给出的带噪预测作为热启动初值(见上部)。 数据似然score ∇ log ⁡ p s ( x t ∣ y t ) \nabla\log p_s(x_t|y_t) logps(xtyt)由一个score网络 D ( x t , y t , s ) D(x_t,y_t,s) D(xt,yt,s)来预测,而这个网络可以通过去噪分数匹配高效地进行训练。



I. INTRODUCTION

状态估计是机器人学中一个普遍存在的问题,其应用范围从机器人手内操作[in-hand manipulation] [1, 2]到开放环境中的定位[localization] [3, 4]。 传统上,这一问题通常采用贝叶斯滤波技术 [5, 6] 来处理;该技术通过递归地整合当前可获得的测量 y t y_t yt 和控制输入 u t u_t ut ,在每个时间步 t t t 上计算关于(不可观测)状态 x t x_t xt 的后验分布 p ( x t ∣ y 1 : t , u 1 : t ) p(x_t|y_{1:t},u_{1:t}) p(xty1:t,u1:t) 的估计。 由于动力学模型和传感器模型往往计算代价高昂,甚至有时是未知的,因此这一问题越来越多地通过基于学习的方法来解决 [7, 3, 8, 2]。 于是,状态估计通常被视为一个序列建模问题,其目标是学习一个从测量历史到状态分布的映射关系。 因此,在给定包含真实状态标注的训练数据集的情况下,状态估计问题可以通过针对序列数据的监督学习方法来解决,例如循环神经网络(RNN)[9, 10]或Transformer [11, 1]。 尽管这类方法便于部署,而且通常表现良好,但它们缺乏贝叶斯滤波器所具有的模块化特性和可解释性。 例如,RNN和Transformer并没有提供一种可直接将模型初始化为任意先验 p ( x 0 ) p(x_0) p(x0) 的方法,因为它们的隐藏状态并不容易解释。

可微贝叶斯滤波器[Differentiable Bayesian Filters] [7, 3, 8, 12](DFs)旨在通过将贝叶斯滤波器的算法结构与学习得到的模型相结合,重新引入这些性质。 为了达到期望的性能,DF需要通过端到端方式进行训练:即沿时间顺序展开整个滤波算法,并通过时间反向传播(BPTT)来优化模型参数。 然而,这种端到端训练过程代价高昂且难以扩展,尤其对于可微粒子滤波器[Differentiable Particle Filters](DPFs)[3]来说更是如此,因为它需要对每一个粒子都执行BPTT。 此外,一旦更换传感器模型或加入额外信息,就需要重新训练。

端到端训练范式在DF、RNN和Transformer中的另一个后果,是模型容易对训练序列中特定的时序结构发生过拟合。 一种补救办法是利用动力系统中的马尔可夫性质,不再基于完整序列进行训练,而是针对单个状态转移采用单步目标进行训练。 然而,在实际中递归地使用这种基于单步目标训练得到的模型通常会失败,因为中间预测结果最终会偏离数据流形[data manifold] [13](也就是训练期间见过的状态所构成的流形)。

在本文中,我们提出了一种新的学习框架来应对这些挑战。 我们的方法使用单步目标分别训练动力学模型和测量模型,并通过一种基于扩散的粒子滤波过程将它们结合起来。 后验采样通过对扩散模型采样所对应的底层常微分方程(ODE)进行积分来近似实现,其中去噪(测量)模型在每一步都会将预测修正回数据流形方向。 不同于端到端训练,我们的方法得到的是模块化模型,因此可以在无需重新训练的情况下灵活地融合先验信息或外部传感器模型。


在这里插入图片描述


我们的贡献如下:

  • 我们提出了一种用于状态估计的模块化学习框架,该框架只使用单步目标,从而避免了在序列上进行端到端训练。

  • 我们提出了一种新的基于扩散的粒子滤波推理方案,用于近似贝叶斯滤波中的后验采样,并减轻分布漂移问题。 我们还提出了一种受似然约束的扩散过程,以确保粒子始终接近由测量所诱导的数据流形(似然流形)。

  • 在具有部分可观测性、非线性动力学以及高维状态空间的状态估计任务中,我们证明了我们的方法在精度上能够达到与端到端方法相当甚至更优的水平,同时还能够实现高效且可扩展的训练。

  • 我们表明,我们的模型可以在无需重新训练的情况下,与已知的传感器模型进行灵活而有效的组合。

以前做状态估计,要么用传统贝叶斯滤波,但模型难做;要么用RNN/Transformer这类深度学习,但虽然好用,却不够可解释、也不够灵活。于是作者提出了一种新方法:把“贝叶斯滤波的结构”保留下来,但不做昂贵的端到端序列训练,而是分别训练动力学模型和测量模型,再用“扩散式粒子滤波”把它们组合起来。这样既能学得好,又更模块化,还能更容易融合新传感器和先验。


II. RELATED WORK

状态估计是机器人学中一个被广泛研究的问题,人们已经采用多种方法对其进行了处理,这些方法既包括基于学习的方法,也包括非学习方法。 在非学习方法这一范畴中,粒子滤波器在机器人中的非线性贝叶斯滤波任务中已被广泛使用 [5]。 为了解决由粒子匮乏和权重退化所带来的挑战,人们提出了大量粒子滤波(PF)的变体 [6, 14],尤其是在触觉感知的背景下 [15, 16]。 已有多项工作研究了基于Stein Score [17, 18, 4] 的粒子滤波方法,并通过Stein变分梯度下降(SVGD)[19] 来实现。 我们认为,将SVGD与通过去噪分数匹配[Denoising Score Matching]学习传感器模型相结合,是一个值得未来进一步研究的有趣方向。

在基于学习的方法这一范畴中,我们的方法与可微粒子滤波器[Differentiable Particle Filters](DPF)[8, 3, 2]相关,因为我们同样将粒子滤波算法与学习得到的模型结合起来。 然而,DPF是沿时间顺序展开粒子滤波算法,并通过BPTT来优化动力学模型和测量模型;而我们则通过单步目标来学习模型,并在推理阶段通过一种去噪方案将它们结合起来。

扩散模型已经被成功应用于多种任务中,包括图像生成 [20, 21, 22]、模仿学习 [23]以及基于模型的控制 [24]。 Rozet和Louppe [25] 利用扩散模型来学习状态轨迹上的先验,并在一个引导式扩散过程中将其用于数据同化[data assimilation]。 据我们所知,将通过分数匹配[score matching]学习得到的模型整合进粒子滤波器中,以近似求解贝叶斯滤波方程,这一思路此前尚未被研究过。


III. BACKGROUND

A. 贝叶斯状态估计

对于一个动力系统,假设其在时间步 t t t 的状态可由 x t ∈ X x_t\in X xtX 完整描述,同时已知控制输入 u t ∈ U u_t\in U utU 和测量 y t ∈ Y y_t\in Y ytY,那么滤波的目标就是在给定截至时间 t t t的测量和控制输入的条件下,求得关于状态的后验分布 p ( x t ∣ y 1 : t , u 1 : t ) p(x_t|y_{1:t},u_{1:t}) p(xty1:t,u1:t)。 假设该系统满足马尔可夫性质,并具有动力学模型 p ( x t ∣ x t − 1 , u t ) p(x_t|x_{t-1},u_t) p(xtxt1,ut) 以及测量模型 p ( y t ∣ x t ) p(y_t|x_t) p(ytxt),则该后验分布可以递归地计算为

p ( x t ∣ y 1 : t , u 1 : t ) = p ( y t ∣ x t ) ∫ p ( x t ∣ x t − 1 , u t ) ⋅ p ( x t − 1 ∣ y 1 : t − 1 , u 1 : t − 1 ) , d x t − 1 (1) p(x_t|y_{1:t},u_{1:t})=p(y_t|x_t)\int p(x_t|x_{t-1},u_t)\cdot p(x_{t-1}|y_{1:t-1},u_{1:t-1}),dx_{t-1}\tag{1} p(xty1:t,u1:t)=p(ytxt)p(xtxt1,ut)p(xt1y1:t1,u1:t1),dxt1(1)

其中,我们默认存在一个先验分布 x 0 ∼ p ( x 0 ) x_0\sim p(x_0) x0p(x0),以及一个策略 u t ∼ p ( u t ∣ y 1 : t ) u_t\sim p(u_t|y_{1:t}) utp(uty1:t)。 对于动力学模型和测量模型均为线性且高斯的情况,后验分布可以使用卡尔曼滤波器[26]以闭式形式求得。 然而,在大多数其他情况下,式(1)是不可直接求解的,因此需要采用近似方法。 在模型为非线性和/或后验分布高度非高斯的情况下,一种常见的非参数方法是粒子滤波(PF)[6]。它用一组有限个带权样本(粒子)来表示后验分布,这些粒子的状态为 x t i x_t^i xti,权重为 w t i w_t^i wti,其中 i = 1 , … , N i=1,\ldots,N i=1,,N,并满足 ∑ i = 1 N w t i = 1 \sum_{i=1}^Nw_t^i=1 i=1Nwti=1。 于是,后验分布在形式上可近似表示为 p ( x t ∣ y 1 : t , u 1 : t ) ≈ ∑ i = 1 N w t i δ ( x t − x t i ) p(x_t|y_{1:t},u_{1:t})\approx\sum_{i=1}^Nw_t^i\delta(x_t-x_t^i) p(xty1:t,u1:t)i=1Nwtiδ(xtxti),其中 δ \delta δ 表示狄拉克delta函数。

B. 扩散模型

扩散模型[27, 20, 21]或流模型[28]是一类生成模型,它们通过对来自已知初始分布 p init ( x ) p_{\text{init}}(x) pinit(x) 的样本进行迭代去噪,从目标分布 p ( x ) p(x) p(x) 中进行采样。 为此,需要定义一个在 0 ≤ s ≤ 1 0\leq s\leq1 0s1 范围内的插值分布序列 p s ( x ) p_s(x) ps(x),使得 p 0 ( x ) = p init ( x ) p_0(x)=p_{\text{init}}(x) p0(x)=pinit(x),并且 p 1 ( x ) = p ( x ) p_1(x)=p(x) p1(x)=p(x)。 于是,从目标分布中采样时,首先要进行采样:

(仅在本节中,噪声尺度 s s s 下的扰动变量记作 x s x_s xs;这与本文其余部分中按物理时间 t t t 索引的 x t x_t xt 不同。)

先从 x 0 ∼ p 0 x_0\sim p_0 x0p0中采样,然后对如下常微分方程(ODE)进行数值积分:

d d s x s = v ( x s , s ) (2) \frac{\text{d}}{\text{d}s}x_s=v(x_s,s)\tag{2} dsdxs=v(xs,s)(2)

d d s x s \frac{\text{d}}{\text{d}s}x_s dsdxs:当噪声尺度 s s s 变化时,样本 x s x_s xs 怎么变化。 你可以把它理解成“速度”。
v ( x s , s ) v(x_s,s) v(xs,s):一个向量场,也就是: 在当前点 x s x_s xs、当前阶段 s s s时,模型告诉你应该往哪个方向走。

所以整个式子就是: 样本在每一时刻该怎么移动,由 v ( x s , s ) v(x_s,s) v(xs,s)决定。

其中,向量场 v : R n × [ 0 , 1 ] → R n v:\mathbb{R}^n\times[0,1]\to\mathbb{R}^n v:Rn×[0,1]Rn 被构造为使得对于任意 s s s,都有 x s ∼ p s x_s\sim p_s xsps

作者希望设计一个运动规律 v v v,让样本在每个阶段 s s s时,整体分布恰好是 p s p_s ps

如果选择高斯扰动核 p s ( x s ∣ x 1 ) = N ( x s ; α s x 1 , β s 2 I ) p_s(x_s|x_1)=\mathcal{N}(x_s;\alpha_sx_1,\beta_s^2\text{I}) ps(xsx1)=N(xs;αsx1,βs2I),并令单调噪声尺度序列 α s , β s ∈ [ 0 , 1 ] \alpha_s,\beta_s\in[0,1] αs,βs[0,1] 满足 α 0 = β 1 = 0 \alpha_0=\beta_1=0 α0=β1=0 α 1 = β 0 = 1 \alpha_1=\beta_0=1 α1=β0=1 ,那么就可以在 v v v 与(边缘)扰动分布的score,即 ∇ x s log ⁡ p s ( x s ) \nabla_{x_s}\log p_s(x_s) xslogps(xs) 之间建立闭式转换关系,如[29]所示:

v ( x s , s ) = ( β s 2 α ˙ s α s − β ˙ s β s ) ∇ x s log ⁡ p s ( x s ) + α ˙ s α s x s . (3) v(x_s,s)=\left(\beta_s^2\frac{\dot{\alpha}_s}{\alpha_s}-\dot{\beta}_s\beta_s\right)\nabla_{x_s}\log p_s(x_s)+\frac{\dot{\alpha}_s}{\alpha_s}x_s.\tag{3} v(xs,s)=(βs2αsα˙sβ˙sβs)xslogps(xs)+αsα˙sxs.(3)

扩散模型文献中的一个关键发现是:已经存在可处理且高效的目标函数,可用于学习向量场 v ( x s , s ) v(x_s,s) v(xs,s) 或score ∇ x s log ⁡ p s ( x s ) \nabla_{x_s}\log p_s(x_s) xslogps(xs)的近似。

p s ( x s ∣ x 1 ) = N ( x s ; α s x 1 , β s 2 I ) p_s(x_s|x_1)=\mathcal{N}(x_s;\alpha_sx_1,\beta_s^2\text{I}) ps(xsx1)=N(xs;αsx1,βs2I)
如果最终干净数据是 x 1 x_1 x1,那在噪声尺度 s s s时,我们得到的中间样本 x s x_s xs是怎么被扰动出来的。它表示: 给定真实数据 x 1 x_1 x1,我们通过加高斯噪声得到一个更脏的版本 x s x_s xs这个式子翻译成人话 x s ∼ N ( α s x 1 , β s 2 I ) x_s\sim \mathcal{N}(\alpha_sx_1,\beta_s^2\text{I}) xsN(αsx1,βs2I)。意思是: x s x_s xs围绕 α s x 1 \alpha_s x_1 αsx1附近波动,噪声大小由 β s \beta_s βs控制。 这其实等价于常见写法: x s = α s x 1 + β s ϵ , ϵ ∼ N ( 0 , I ) x_s = \alpha_sx_1+\beta_sϵ,ϵ\sim\mathcal{N}(0, \text{I}) xs=αsx1+βsϵϵN(0,I)
∇ x s log ⁡ p s ( x s ) \nabla_{x_s}\log p_s(x_s) xslogps(xs)
对当前分布 p s ( x ) p_s(x) ps(x)的对数密度,在 x s x_s xs处求梯度。score告诉你:在当前位置,往哪个方向走,概率密度会变大得最快。说得更口语一点: 它像一个“上山方向箭头”,指向更像真实数据、更高概率的地方。 比如你现在落在一个不太合理的位置, score会告诉你: 往左一点更合理,往某个方向移动,样本会更像数据分布中的典型点。所以score本质上是一种: “局部修正方向”。


公式(3)
先要理解:ODE的速度场 v v v 可以用score来表示。 也就是: 只要我知道每个位置的score,我就知道样本应该往哪里走。 这才是关键。
公式第一部分 ( ⋅ ⋅ ⋅ ) ∇ x s log ⁡ p s ( x s ) \left(\cdot\cdot\cdot\right)\nabla_{x_s}\log p_s(x_s) ()xslogps(xs)
这部分负责告诉样本: 往高概率区域靠近。
公式第二部分 α ˙ s α s x s \frac{\dot{\alpha}_s}{\alpha_s}x_s αsα˙sxs
这部分更像是由噪声日程 α s , β s \alpha_s,\beta_s αs,βs决定的“整体漂移项”。

你真正要记住: 扩散采样过程可以转化为一个由score控制的连续运动过程。 这就是为什么后面很多扩散模型研究,其实都在研究: 如何学score。因为score学到了, v v v 也就能得到了。

虽然 v v v 和score看起来很高级、很抽象, 但幸运的是,我们不需要直接监督“正确的score是多少”。 我们可以构造一个简单、可训练的损失函数, 让神经网络间接学会这件事。 这就是扩散模型真正能落地的原因。

特别地,Ho等人[20]提出学习一个噪声模型 D ( x s , s ) D(x_s,s) D(xs,s),该模型通过最小化去噪分数匹配(Denoising Score Matching)目标,来预测扰动样本 x s = α s x + β s ϵ x_s=\alpha_sx+\beta_s\epsilon xs=αsx+βsϵ 中的噪声 ϵ ∼ N ( 0 , I ) \epsilon\sim\mathcal{N}(0,\text{I}) ϵN(0,I)

E x , s ∼ [ 0 , 1 ] , ϵ ∼ N ( 0 , I ) [ ∥ ϵ − D ( x s , s ) ∥ 2 ] . (4) \mathbb{E}_{x,s\sim[0,1],\epsilon\sim\mathcal{N}(0,\text{I})}\left[\left\|\epsilon-D(x_s,s)\right\|^2\right].\tag{4} Ex,s[0,1],ϵN(0,I)[ϵD(xs,s)2].(4)

“让模型预测的噪声,尽量接近真实加进去的噪声”。具体说:

  • ϵ \epsilon ϵ:真实噪声
  • D ( x s , s ) D(x_s,s) D(xs,s):模型预测噪声
  • ∣ ϵ − D ( x s , s ) ∣ 2 |\epsilon-D(x_s,s)|^2 ϵD(xs,s)2:两者差多大
  • 期望 E \mathbb E E:对所有训练样本、所有噪声尺度、所有随机噪声取平均

所以整个训练目标就是: 平均来说,让模型尽量猜准噪声。

其中,该期望是对数据集中采样得到的样本 x ∼ p ( x ) x\sim p(x) xp(x) 来计算的。 正如Song等人[21]所表明的那样,使用目标函数(4)训练得到的最优噪声模型 D ∗ D^* D 的输出与score之间满足如下关系:

∇ x s log ⁡ p s ( x s ) = − D ∗ ( x s , s ) β s . (5) \nabla_{x_s}\log p_s(x_s)=-\frac{D^*(x_s,s)}{\beta_s}.\tag{5} xslogps(xs)=βsD(xs,s).(5)

在本文其余部分中,为了避免在状态 x t , s x_{t,s} xt,s 中同时标记物理时间 t t t 和噪声尺度 s s s 所带来的符号冗杂,只要语义明确,我们就省略变量上的噪声尺度下标,并将扰动数据上的分布记作 p s ( x t ) p_s(x_t) ps(xt)

D ∗ D^* D是什么? D ∗ D^* D表示训练到最优时的噪声模型。 也就是: 最会猜噪声的那个模型。
公式的意思:最优噪声预测模型的输出,和score只差一个简单比例因子 − 1 β s -\frac{1}{\beta_s} βs1
这意味着:只要你能预测噪声,你其实就等于学到了score。
前面我们已经说过:学到score,就能构造 v v v。有了 v v v,就能解ODE做采样。所以整个逻辑链是:训练时:学噪声预测模型 D D D。理论上: D ∗ D^* D ↔ score。采样时:score → 向量场 v v v → ODE积分 → 生成样本。这就是整段内容的真正结构。


IV. STATE ESTIMATION WITH DENOISING PARTICLE FILTERS

作者想直接从“当前时刻的后验分布”里采样粒子,而不是像传统粒子滤波那样先从别的分布采样、再靠权重去修正。


为了做到这一点,作者打算用前面讲过的扩散模型思路: 从一个简单分布出发,通过解一个ODE,一步一步把样本推到目标分布。而这里的目标分布不再是普通的数据分布 p ( x ) p(x) p(x),而是: p ( x t ∣ y 1 : t , u 1 : t ) p(x_t|y_{1:t},u_{1:t}) p(xty1:t,u1:t)。也就是: 当前时刻的后验分布。所以这段的核心目标就是:把“后验分布采样”改写成“对后验分布做扩散采样”。


现在这一段干什么:既然扩散采样要知道目标分布的score,而这里目标分布就是后验分布,那我们就来推导“后验分布的score”怎么写。这就是公式(6)的来源。

作者把“当前后验分布”当成扩散模型里的“目标分布”。也就是说:普通扩散模型:从噪声生成“像真实数据的样本”。这里的方法:从噪声生成“符合当前后验分布的状态样本”。换句话说,这里的扩散过程不是在生成图片,而是在:生成当前时刻“合理的状态粒子”。


因为扩散采样不是一步完成的,而是一个连续去噪过程。在这个过程中,样本会经历很多个不同的噪声尺度 s s s

  • 很脏的时候一个score

  • 中间状态一个score

  • 快变干净时又一个score

所以不是只要最终干净分布的score,而是要: 对每个噪声尺度 s s s,都知道后验分布在这个尺度下的score。这就是: ∇ x t log ⁡ p s ( x t ∣ y 1 : t , u 1 : t ) \nabla_{x_t}\log p_s(x_t|y_{1:t},u_{1:t}) xtlogps(xty1:t,u1:t)。可以把它理解成:在每个去噪阶段,我都要知道“当前样本应该往哪个方向修正,才会更像当前后验分布中的样本”。


score是什么? score就是: ∇ x t log ⁡ p s ( x t ∣ y 1 : t , u 1 : t ) \nabla_{x_t}\log p_s(x_t|y_{1:t},u_{1:t}) xtlogps(xty1:t,u1:t)。它的直观含义不是一个概率值,而是一个方向向量。它表示:如果当前样本 x t x_t xt在当前位置,那么朝哪个方向移动,会让它更像“后验分布的高概率区域”中的样本。也就是说:如果当前粒子在一个不太合理的位置,score会告诉你该往哪里推,让它更符合当前观测、更符合动力学、更符合历史信息。所以这里的score本质上就是:“把粒子往当前后验分布里拉回去的方向”。

从本质上讲,我们的方法是通过求解ODE(2)来从后验分布 p ( x t ∣ y 1 : t , u 1 : t ) p(x_t|y_{1:t},u_{1:t}) p(xty1:t,u1:t) 中进行采样,而这要求在多个噪声尺度 s s s 下计算其score,即 ∇ x t log ⁡ p s ( x t ∣ y 1 : t , u 1 : t ) \nabla_{x_t}\log p_s(x_t|y_{1:t},u_{1:t}) xtlogps(xty1:t,u1:t)。 对递归滤波方程(1)取对数后,再关于 x t x_t xt 求梯度,并用一组表示前一时间步后验分布的粒子 { x t − 1 i } \{x_{t-1}^i\} {xt1i} 来近似其中的积分,我们得到

∇ x t log ⁡ p s ( x t ∣ y 1 : t , u 1 : t ) = ∇ x t log ⁡ p s ( y t ∣ x t ) + ∇ x t log ⁡ ∑ i p s ( x t ∣ x t − 1 i , u t ) . (6) \nabla_{x_t}\log p_s(x_t|y_{1:t},u_{1:t})=\nabla_{x_t}\log p_s(y_t|x_t)+\nabla_{x_t}\log \sum_i p_s(x_t|x_{t-1}^i,u_t). \tag{6} xtlogps(xty1:t,u1:t)=xtlogps(ytxt)+xtlogips(xtxt1i,ut).(6)

在能够计算score项 ∇ x t log ⁡ p s ( y t ∣ x t ) \nabla_{x_t}\log p_s(y_t|x_t) xtlogps(ytxt) ∇ x t log ⁡ ∑ i p s ( x t ∣ x t − 1 i , u t ) \nabla_{x_t}\log\sum_i p_s(x_t|x_{t-1}^i,u_t) xtlogips(xtxt1i,ut) 的前提下,式(6)使得针对任意目标分布从滤波方程中进行采样变得可处理。由于样本是直接从后验分布中抽取的,因此所得的粒子滤波器不需要重要性采样。从扩散模型的角度来看,我们推导出一种引导式扩散过程,使其目标分布近似于 p ( x t ∣ y 1 : t , u 1 : t ) p(x_t|y_{1:t},u_{1:t}) p(xty1:t,u1:t)。在本节剩余部分中,我们首先讨论这些score项的学习目标。然后,我们将说明在推理阶段如何在粒子滤波器中组合这些(学习得到的)模型。

公式(6)到底怎么来的?
第一步:从后验结构出发。 后验可以看成:

p s ( x t ∣ y 1 : t , u 1 : t ) ∝ p s ( y t ∣ x t ) ⋅ ∑ i p s ( x t ∣ x t − 1 i , u t ) p_s(x_t|y_{1:t},u_{1:t})\propto p_s(y_t|x_t)\cdot \sum_i p_s(x_t|x_{t-1}^i,u_t) ps(xty1:t,u1:t)ps(ytxt)ips(xtxt1i,ut)

这里已经把积分用粒子和求和近似了。

第二步:取对数。对乘积取log,就变成加法:

log ⁡ p s ( x t ∣ y 1 : t , u 1 : t ) = log ⁡ p s ( y t ∣ x t ) + log ⁡ ∑ i p s ( x t ∣ x t − 1 i , u t ) + 常数 \log p_s(x_t|y_{1:t},u_{1:t})=\log p_s(y_t|x_t)+\log \sum_i p_s(x_t|x_{t-1}^i,u_t)+\text{常数} logps(xty1:t,u1:t)=logps(ytxt)+logips(xtxt1i,ut)+常数

第三步:对 x t x_t xt求梯度。 对log求梯度,就得到:

∇ x t log ⁡ p s ( x t ∣ y 1 : t , u 1 : t ) = ∇ x t log ⁡ p s ( y t ∣ x t ) + ∇ x t log ⁡ ∑ i p s ( x t ∣ x t − 1 i , u t ) \nabla_{x_t}\log p_s(x_t|y_{1:t},u_{1:t})=\nabla_{x_t}\log p_s(y_t|x_t)+\nabla_{x_t}\log \sum_i p_s(x_t|x_{t-1}^i,u_t) xtlogps(xty1:t,u1:t)=xtlogps(ytxt)+xtlogips(xtxt1i,ut)

这就是公式(6)。

当前后验的score = 观测项的score + 动力学预测项的score


第一项: ∇ x t log ⁡ p s ( y t ∣ x t ) \nabla_{x_t}\log p_s(y_t|x_t) xtlogps(ytxt)。测量score,它表示:

当前观测 y t y_t yt会把状态 x t x_t xt往哪里拉。

直觉上很好懂:

  • 如果某个状态和当前观测很匹配,那测量score会把粒子往那边拉
  • 如果某个状态和当前观测明显不一致,测量score会把粒子推开

所以这一项的作用就是: 用当前观测纠偏。你可以把它理解成: “相机/传感器告诉你,当前粒子应该往哪个方向改,才更像真实情况。”
第二项: ∇ x t log ⁡ ∑ i p s ( x t ∣ x t − 1 i , u t ) \nabla_{x_t}\log \sum_i p_s(x_t|x_{t-1}^i,u_t) xtlogips(xtxt1i,ut)。这是 动力学预测score先验score

根据上一时刻所有粒子以及当前动作 u t u_t ut,当前状态 x t x_t xt应该更可能出现在什么地方。

这里的求和是因为多个粒子有多个可能性,这些可能性要合起来。

A. Training Objectives

对于测量似然的score,根据贝叶斯公式可得: ∇ x t log ⁡ p ( y t ∣ x t ) = ∇ x t log ⁡ p ( x t ∣ y t ) − ∇ x t log ⁡ p ( x t ) \nabla_{x_t}\log p(y_t|x_t)=\nabla_{x_t}\log p(x_t|y_t)-\nabla_{x_t}\log p(x_t) xtlogp(ytxt)=xtlogp(xtyt)xtlogp(xt)。由于相比学习 p ( y t ∣ x t ) p(y_t|x_t) p(ytxt),学习 p ( x t ∣ y t ) p(x_t|y_t) p(xtyt)的生成模型通常更容易(例如,当 Y Y Y是图像空间时就是如此),因此我们提出通过去噪分数匹配来学习一个模型,以近似 ∇ log ⁡ p s ( x t ∣ y t ) \nabla\log p_s(x_t|y_t) logps(xtyt) ∇ log ⁡ p s ( x t ) \nabla\log p_s(x_t) logps(xt)

贝叶斯公式是: p ( x t ∣ y t ) = p ( y t ∣ x t ) p ( x t ) p ( y t ) p(x_t|y_t)=\frac{p(y_t|x_t)p(x_t)}{p(y_t)} p(xtyt)=p(yt)p(ytxt)p(xt)。两边取对数: log ⁡ p ( x t ∣ y t ) = log ⁡ p ( y t ∣ x t ) + log ⁡ p ( x t ) − log ⁡ p ( y t ) \log p(x_t|y_t)=\log p(y_t|x_t)+\log p(x_t)-\log p(y_t) logp(xtyt)=logp(ytxt)+logp(xt)logp(yt)。移项得到: log ⁡ p ( y t ∣ x t ) = log ⁡ p ( x t ∣ y t ) − log ⁡ p ( x t ) + log ⁡ p ( y t ) \log p(y_t|x_t)=\log p(x_t|y_t)-\log p(x_t)+\log p(y_t) logp(ytxt)=logp(xtyt)logp(xt)+logp(yt)。然后对 x t x_t xt求梯度: ∇ x t log ⁡ p ( y t ∣ x t ) = ∇ x t log ⁡ p ( x t ∣ y t ) − ∇ x t log ⁡ p ( x t ) \nabla_{x_t}\log p(y_t|x_t)=\nabla_{x_t}\log p(x_t|y_t)-\nabla_{x_t}\log p(x_t) xtlogp(ytxt)=xtlogp(xtyt)xtlogp(xt)。因为 log ⁡ p ( y t ) \log p(y_t) logp(yt) x t x_t xt无关,所以对 x t x_t xt求梯度后它消失了。

测量似然的score,不一定要直接学;你也可以通过“后验score减先验score”来得到它。

也就是:

  • ∇ log ⁡ p ( x t ∣ y t ) \nabla\log p(x_t|y_t) logp(xtyt):看了观测之后,状态应该往哪里去
  • ∇ log ⁡ p ( x t ) \nabla\log p(x_t) logp(xt):不看观测时,状态本身通常长什么样

两者一减,就得到: 纯粹由观测带来的修正方向,这就是测量似然score。

具体来说,我们通过最小化如下目标函数来学习一个以观测为条件的去噪模型 D ( x t , y t , s ) D(x_t,y_t,s) D(xt,yt,s)

L lh = E ( x t , y t ) , s , ϵ ∼ N ( 0 , 1 ) [ ∥ ϵ − D ( x t , s , y t , s ) ∥ 2 ] . (7) \mathcal{L}_\text{lh}=\mathbb{E}_{(x_t,y_t),s,\epsilon\sim\mathcal{N}(0,1)}\left[\left\|\epsilon-D(x_{t,s},y_t,s)\right\|^2\right]. \tag{7} Llh=E(xt,yt),s,ϵN(0,1)[ϵD(xt,s,yt,s)2].(7)

并像式(5)那样恢复出对应的score。在实际中,通过在训练过程中偶尔丢弃条件信息[22],同一个模型也可以用来预测先验的score,即 ∇ log ⁡ p s ( x t ) \nabla\log p_s(x_t) logps(xt)

公式(7)中模型 D D D 输入有三个东西:
第一 x t , s x_{t,s} xt,s:这是状态 x t x_t xt在噪声尺度 s s s下的带噪版本。
也就是:

  • 原来干净状态是 x t x_t xt
  • 给它按扩散模型那套方式加噪
  • 变成 x t , s x_{t,s} xt,s

所以输入给网络的不是干净状态,而是:带噪状态。

第二 y t y_t yt: 当前观测,比如图像、传感器读数等。

这个是条件信息。 意思就是: 网络在看带噪状态的同时,还知道当前观测是什么。

第三 s s s:当前噪声尺度。

因为不同噪声程度下,网络要做的修正不同,所以必须告诉网络现在是第几阶段的去噪。
模型 D D D 输出是什么?
输出是: D ( x t , s , y t , s ) D(x_{t,s},y_t,s) D(xt,s,yt,s) 它要预测的是加入到状态里的噪声 ϵ \epsilon ϵ。 也就是说,这个网络不是直接输出score,而是:先输出“噪声长什么样”,然后再像前面公式(5)( ∇ x s log ⁡ p s ( x s ) = − D ∗ ( x s , s ) β s \nabla_{x_s}\log p_s(x_s)=-\frac{D^*(x_s,s)}{\beta_s} xslogps(xs)=βsD(xs,s))那样,把噪声预测转换成score。

损失函数: ∥ ϵ − D ( x t , s , y t , s ) ∥ 2 \left\|\epsilon-D(x_{t,s},y_t,s)\right\|^2 ϵD(xt,s,yt,s)2。就是普通均方误差。

意思是:

  • 真正加进去的噪声是 ϵ \epsilon ϵ
  • 网络预测的噪声是 D ( ⋅ ) D(\cdot) D()
  • 希望两者尽量接近

什么叫“丢弃条件信息”?

本来网络输入是: ( x t , s , y t , s ) (x_{t,s},y_t,s) (xt,s,yt,s)。但作者在训练时,有时候故意不给它 y t y_t yt,或者把 y t y_t yt设为空。这时候网络就只能根据:

  • 带噪状态 x t , s x_{t,s} xt,s
  • 噪声尺度 s s s

去猜噪声。也就是说,这时它学的是:不依赖观测的去噪。那对应的就是: ∇ log ⁡ p s ( x t ) \nabla\log p_s(x_t) logps(xt),也就是先验score。
为什么这一招有效?
因为一个网络如果有时带条件训练,有时不带条件训练,它就会同时学会两种模式:

  • 有条件时:学习 p s ( x t ∣ y t ) p_s(x_t|y_t) ps(xtyt)
  • 无条件时:学习 p s ( x t ) p_s(x_t) ps(xt)

这和扩散模型里的classifier-free guidance是同样的套路。

类似于classifier-free guidance[22],我们随后按照下式执行去噪步骤:

ϵ lh = − β s [ ( 1 + η ) ∇ x log ⁡ p s ( x t ∣ y t ) − η ∇ log ⁡ p s ( x t ) ] , (8) \epsilon_\text{lh}=-\beta_s\left[(1+\eta)\nabla_{x}\log p_s(x_t|y_t)-\eta\nabla\log p_s(x_t)\right], \tag{8} ϵlh=βs[(1+η)xlogps(xtyt)ηlogps(xt)],(8)

其中,引导强度为 η ≥ 0 \eta\geq0 η0

作者构造出来的“测量引导去噪方向”

( 1 + η ) ∇ log ⁡ p s ( x t ∣ y t ) − η ∇ log ⁡ p s ( x t ) (1+\eta)\nabla\log p_s(x_t|y_t)-\eta\nabla\log p_s(x_t) (1+η)logps(xtyt)ηlogps(xt) 可以理解成

  • 把条件score放大一点
  • 再减去一部分无条件score

这和classifier-free guidance非常像。 它的作用是:

让去噪过程更强烈地朝“符合当前观测”的方向走。

如果只用条件score,那已经是在往符合观测的方向推。 现在再用这种线性组合,相当于:把条件信息的影响增强,这就是“引导强度” η \eta η的作用。
η \eta η是什么? η ≥ 0 \eta\ge0 η0是引导强度。

  • η = 0 \eta=0 η=0时,不额外增强,就是普通条件去噪
  • η \eta η越大,对观测条件的强调越强

所以 η \eta η就是一个“观测拉力放大器”。
为什么前面还有一个 − β s -\beta_s βs 这是因为前面扩散模型里,噪声预测和score之间本来就差一个比例变换。 作者这里写成 ϵ lh \epsilon_\text{lh} ϵlh,是为了方便在去噪步骤里直接使用。不必纠结这个比例因子本身,更重要的是理解: 这里本质上是在构造一个测量引导的score / 去噪方向。

将这一近似代入原始滤波方程后可以发现,这种近似会在每一个时间步引入一个 p ( y t ∣ x t ) η p ( x t ) p(y_t|x_t)^\eta p(x_t) p(ytxt)ηp(xt) 形式的偏置。 尽管这种偏置可以通过重要性采样来修正,但在实际中我们并没有这样做。 在使用学习模型进行递归预测的背景下,我们发现这种施加在 p ( x t ) p(x_t) p(xt) 上的偏置实际上是有益的,因为它能够减轻推理过程中的分布漂移(见第V-F节)。

为什么这种引导会带来偏置?

因为原本真正想要的测量项score是: ∇ log ⁡ p ( y t ∣ x t ) \nabla\log p(y_t|x_t) logp(ytxt)。但作者并没有精确地只用这一项,而是用了一个“引导增强版”的近似:
( 1 + η ) ∇ log ⁡ p ( x t ∣ y t ) − η ∇ log ⁡ p ( x t ) (1+\eta)\nabla\log p(x_t|y_t)-\eta\nabla\log p(x_t) (1+η)logp(xtyt)ηlogp(xt)

这等于对原本目标分布做了一个重新加权。所以最终采样出来的分布,不再是完完全全原始理论里的后验,而是:带有额外偏好的版本,这个额外偏好就是原文说的偏置。

这个偏置会让系统:

  • 更看重与当前观测一致的状态
  • 同时也更偏向落在训练数据常见的状态区域里

也就是说,它不只是“匹配当前观测”,还会:更偏好那些看起来像正常数据流形上的状态。所以它本质上给系统加了一个“别跑太偏”的倾向。这也就是论文后面说它有助于减轻分布漂移的原因。


p ( y t ∣ x t ) η p ( x t ) p(y_t|x_t)^\eta p(x_t) p(ytxt)ηp(xt) 推导


1. 先写出“真正想要的”测量score

为简洁起见,我先把 t , s t,s t,s下标暂时省掉,写成 x , y x,y x,y。 真正的测量似然score是

g lh ( x ) = ∇ x log ⁡ p ( y ∣ x ) . g_{\text{lh}}(x)=\nabla_x\log p(y|x). glh(x)=xlogp(yx).

根据贝叶斯公式,

p ( x ∣ y ) = p ( y ∣ x ) p ( x ) p ( y ) . p(x|y)=\frac{p(y|x)p(x)}{p(y)}. p(xy)=p(y)p(yx)p(x).

两边取 log ⁡ \log log再对 x x x求梯度:

∇ x log ⁡ p ( x ∣ y ) = ∇ x log ⁡ p ( y ∣ x ) + ∇ x log ⁡ p ( x ) , \nabla_x\log p(x|y)=\nabla_x\log p(y|x)+\nabla_x\log p(x), xlogp(xy)=xlogp(yx)+xlogp(x),

因为 p ( y ) p(y) p(y) x x x无关,所以它的梯度为0。

于是

∇ x log ⁡ p ( y ∣ x ) = ∇ x log ⁡ p ( x ∣ y ) − ∇ x log ⁡ p ( x ) . \nabla_x\log p(y|x)=\nabla_x\log p(x|y)-\nabla_x\log p(x). xlogp(yx)=xlogp(xy)xlogp(x).

这就是文中前半句。

2. 作者实际用的不是这个“精确形式”,而是引导后的近似

文中式(8)对应的score组合是

g ~ lh ( x ) = ( 1 + η ) ∇ x log ⁡ p ( x ∣ y ) − η ∇ x log ⁡ p ( x ) . \tilde g_{\text{lh}}(x) = (1+\eta)\nabla_x\log p(x|y)-\eta\nabla_x\log p(x). g~lh(x)=(1+η)xlogp(xy)ηxlogp(x).

注意,这里不是 ∇ x log ⁡ p ( x ∣ y ) − ∇ x log ⁡ p ( x ) , \nabla_x\log p(x|y)-\nabla_x\log p(x), xlogp(xy)xlogp(x), 而是

  • 条件score前面乘了 ( 1 + η ) (1+\eta) (1+η)
  • 无条件score前面只减了 η \eta η

这就是引导带来的“改动”。

3. 把贝叶斯关系代进去

由上面

∇ x log ⁡ p ( x ∣ y ) = ∇ x log ⁡ p ( y ∣ x ) + ∇ x log ⁡ p ( x ) , \nabla_x\log p(x|y)=\nabla_x\log p(y|x)+\nabla_x\log p(x), xlogp(xy)=xlogp(yx)+xlogp(x),

代入 g ~ lh ( x ) \tilde g_{\text{lh}}(x) g~lh(x)

g ~ lh ( x ) = ( 1 + η ) [ ∇ x log ⁡ p ( y ∣ x ) + ∇ x log ⁡ p ( x ) ] − η ∇ x log ⁡ p ( x ) . \tilde g_{\text{lh}}(x) = (1+\eta)\big[\nabla_x\log p(y|x)+\nabla_x\log p(x)\big] -\eta\nabla_x\log p(x). g~lh(x)=(1+η)[xlogp(yx)+xlogp(x)]ηxlogp(x).

展开:

g ~ lh ( x ) = ( 1 + η ) ∇ x log ⁡ p ( y ∣ x ) + ( 1 + η ) ∇ x log ⁡ p ( x ) − η ∇ x log ⁡ p ( x ) . \tilde g_{\text{lh}}(x) = (1+\eta)\nabla_x\log p(y|x) + (1+\eta)\nabla_x\log p(x) - \eta\nabla_x\log p(x). g~lh(x)=(1+η)xlogp(yx)+(1+η)xlogp(x)ηxlogp(x).

后两项合并:

g ~ lh ( x ) = ( 1 + η ) ∇ x log ⁡ p ( y ∣ x ) + ∇ x log ⁡ p ( x ) . \tilde g_{\text{lh}}(x) = (1+\eta)\nabla_x\log p(y|x) + \nabla_x\log p(x). g~lh(x)=(1+η)xlogp(yx)+xlogp(x).

再写成一个整体的 log ⁡ \log log梯度:

g ~ lh ( x ) = ∇ x log ⁡ ( p ( y ∣ x ) 1 + η p ( x ) ) . \tilde g_{\text{lh}}(x) = \nabla_x\log\Big(p(y|x)^{1+\eta}p(x)\Big). g~lh(x)=xlog(p(yx)1+ηp(x)).

这一步非常关键。 它说明: 你现在用的“测量score”,已经不再是原来的 ∇ x log ⁡ p ( y ∣ x ) \nabla_x\log p(y|x) xlogp(yx)了。而是变成了 ∇ x log ⁡ ( p ( y ∣ x ) 1 + η p ( x ) ) . \nabla_x\log\Big(p(y|x)^{1+\eta}p(x)\Big). xlog(p(yx)1+ηp(x)).

4. 为什么论文里说偏置是 p ( y ∣ x ) η p ( x ) p(y|x)^\eta p(x) p(yx)ηp(x),不是 p ( y ∣ x ) 1 + η p ( x ) p(y|x)^{1+\eta}p(x) p(yx)1+ηp(x)

这正是最容易卡住的地方。 因为原始后验里本来就已经有一个 p ( y ∣ x ) p(y|x) p(yx)。原始目标后验:滤波公式对应的目标后验,省略归一化常数后是

p ( x ∣ y 1 : t , u 1 : t ) ∝ p ( y ∣ x ) , q ( x ) , p(x|y_{1:t},u_{1:t}) \propto p(y|x),q(x), p(xy1:t,u1:t)p(yx),q(x),

其中 q ( x ) q(x) q(x)表示动力学预测项,比如文中那一项

q ( x ) = ∑ i p ( x ∣ x t − 1 i , u t ) . q(x)=\sum_i p(x|x_{t-1}^i,u_t). q(x)=ip(xxt1i,ut).

所以原来目标的score是

∇ x log ⁡ p ( y ∣ x ) + ∇ x log ⁡ q ( x ) . \nabla_x\log p(y|x)+\nabla_x\log q(x). xlogp(yx)+xlogq(x).

用引导后的测量score替换后,你现在用的是

g ~ lh ( x ) = ∇ x log ⁡ ( p ( y ∣ x ) 1 + η p ( x ) ) . \tilde g_{\text{lh}}(x)=\nabla_x\log\big(p(y|x)^{1+\eta}p(x)\big). g~lh(x)=xlog(p(yx)1+ηp(x)).

再加上动力学项 ∇ x log ⁡ q ( x ) \nabla_x\log q(x) xlogq(x),得到整体score:

∇ x log ⁡ ( p ( y ∣ x ) 1 + η p ( x ) ) + ∇ x log ⁡ q ( x ) \nabla_x\log\big(p(y|x)^{1+\eta}p(x)\big)+\nabla_x\log q(x) xlog(p(yx)1+ηp(x))+xlogq(x)

合起来就是

∇ x log ⁡ ( p ( y ∣ x ) 1 + η p ( x ) q ( x ) ) . \nabla_x\log\Big(p(y|x)^{1+\eta}p(x)q(x)\Big). xlog(p(yx)1+ηp(x)q(x)).

而原始目标是

∇ x log ⁡ ( p ( y ∣ x ) q ( x ) ) . \nabla_x\log\Big(p(y|x)q(x)\Big). xlog(p(yx)q(x)).

所以新目标相对于原始目标,多出来的乘子就是

p ( y ∣ x ) 1 + η p ( x ) q ( x ) p ( y ∣ x ) q ( x ) = p ( y ∣ x ) η p ( x ) . \frac{p(y|x)^{1+\eta}p(x)q(x)}{p(y|x)q(x)} =p(y|x)^\eta p(x). p(yx)q(x)p(yx)1+ηp(x)q(x)=p(yx)ηp(x).

这就是论文说的: 引入了一个 p ( y t ∣ x t ) η p ( x t ) p(y_t|x_t)^\eta p(x_t) p(ytxt)ηp(xt) 形式的偏置。

动力学score项是(加扰后的)动力学模型score ∇ x t log ⁡ p s ( x t ∣ x t − 1 i , u t ) \nabla_{x_t}\log p_s(x_t|x_{t-1}^i,u_t) xtlogps(xtxt1i,ut) 的一个混合,其权重由各个祖先粒子的相对先验决定。 在我们的实现中,我们让每个粒子只从单个祖先粒子 x t − 1 i x_{t-1}^i xt1i 演化而来,这是一种粒子滤波中常见的近似做法[6]。 另一种做法是评估完整的混合先验[30],但这部分留待未来工作处理。

前一时刻有很多粒子 x t − 1 i x_{t-1}^i xt1i。 每个粒子都可能通过动力学传播到当前时刻某些位置。 所以当前的动力学先验不是单一分布,而是: 很多个“由祖先粒子传播出来的小分布”的混合,因此当前动力学score,本质上是这些小分布score的混合。


我们让每个粒子只从单个祖先粒子 x t − 1 i x_{t-1}^i xt1i演化而来

意思是作者没有在每一步都考虑:

  • 当前某个粒子可能同时来自很多祖先粒子的混合影响,而是采用了粒子滤波里常见的近似: 每个当前粒子只认一个父粒子。

你可以把它理解成“家谱关系”:

  • 当前这个粒子是谁生出来的?
  • 就指定一个祖先粒子负责它

这样做的好处是:

  • 算法更简单
  • 计算量更低
  • 很符合传统PF里常见做法

代价是:

  • 没有显式评估完整混合先验

作者也承认这一点,并说完整混合先验留到未来工作。

获得动力学模型score ∇ x t log ⁡ p s ( x t ∣ x t − 1 i , u t ) \nabla_{x_t}\log p_s(x_t|x_{t-1}^i,u_t) xtlogps(xtxt1i,ut)有多种方式。

一种方式是使用目标函数(4),学习一个以 x t − 1 x_{t-1} xt1 u t u_t ut为条件的去噪模型,从而近似该score。

E x , s ∼ [ 0 , 1 ] , ϵ ∼ N ( 0 , I ) [ ∥ ϵ − D ( x s , s ) ∥ 2 ] . (4) \mathbb{E}_{x,s\sim[0,1],\epsilon\sim\mathcal{N}(0,\text{I})}\left[\left\|\epsilon-D(x_s,s)\right\|^2\right].\tag{4} Ex,s[0,1],ϵN(0,I)[ϵD(xs,s)2].(4)
像测量那边一样,再训练一个以 ( x t − 1 , u t ) (x_{t-1},u_t) (xt1,ut)为条件的扩散/去噪网络。 好处是灵活。 缺点是:

  • 训练又多一个扩散模型
  • 推理时每个去噪步骤都要跑网络
  • 计算更重

另一种方式是,如果 p s ( x t ∣ x t − 1 , u t ) p_s(x_t|x_{t-1},u_t) ps(xtxt1,ut)是已知的,那么它的score可以解析地(或数值地)计算出来。

如果 p s ( x t ∣ x t − 1 , u t ) p_s(x_t|x_{t-1},u_t) ps(xtxt1,ut)是已知的,那就不用学了,直接算score即可。 好处是精确。 缺点是现实里通常这个模型并不知道,或者太复杂。

在本文中,我们选择第三种方案:通过最大化单步预测的对数似然来学习一个参数化动力学模型 f f f

L dy = E ( x t , x t − 1 , u t ) [ log ⁡ N ( x t ; μ f , Σ f ) ] . (9) \mathcal{L}_\text{dy}=\mathbb{E}_{(x_t,x_{t-1},u_t)}\left[\log \mathcal{N}(x_t;\mu_f,\Sigma_f)\right]. \tag{9} Ldy=E(xt,xt1,ut)[logN(xt;μf,Σf)].(9)

其中,高斯分布的均值 μ f \mu_f μf 和协方差 Σ f \Sigma_f Σf 由一个前馈网络的两个输出头 f μ , f σ f_\mu,f_\sigma fμ,fσ 来预测:

μ f = x t − 1 + f μ ( x t − 1 , u t ) , (10) \mu_f=x_{t-1}+f_\mu(x_{t-1},u_t), \tag{10} μf=xt1+fμ(xt1,ut),(10)

Σ f = exp ⁡ ( f σ ( x t − 1 , u t ) ) I . (11) \Sigma_f=\exp(f_\sigma(x_{t-1},u_t))\text{I}. \tag{11} Σf=exp(fσ(xt1,ut))I.(11)

学习一个参数化动力学模型 f f f,用高斯分布来描述一步预测。 也就是: 学一个单步高斯动力学模型,这是作者真正用的方法。

为什么选择第三种方案? 这是个非常实际的设计选择。

作者不想:

  • 再训练一个完整的扩散动力学模型,太贵
  • 也没有现成精确已知的动力学分布可直接算

所以他们选择折中方案:

只学习一个一步预测的高斯动力学模型。

好处是:

  1. 训练简单
  2. 单步监督就够
  3. 后面加扰后的score还能闭式算
  4. 推理时计算便宜

所以这一步跟文章整体思路完全一致: 模块化、单步训练、推理时高效。


L dy = E ( x t , x t − 1 , u t ) [ log ⁡ N ( x t ; μ f , Σ f ) ] . (9) \mathcal{L}_\text{dy}=\mathbb{E}_{(x_t,x_{t-1},u_t)}\left[\log \mathcal{N}(x_t;\mu_f,\Sigma_f)\right]. \tag{9} Ldy=E(xt,xt1,ut)[logN(xt;μf,Σf)].(9)

这里本质上是在做: 单步最大似然学习,意思是:

  • 给定上一时刻状态 x t − 1 x_{t-1} xt1
  • 给定动作 u t u_t ut
  • 让模型预测当前状态 x t x_t xt的高斯分布
  • 然后让真实 x t x_t xt在这个高斯分布下的概率尽量大

也就是: 希望模型预测出来的均值和方差,能够很好解释真实下一状态。 换一种最直白的话说:作者是在教这个网络:

“给你上一步状态和动作,你告诉我下一步大概会去哪,以及不确定性有多大。”

这就是动力学模型 f f f的任务。


均值 μ f \mu_f μf: 这里作者没有直接让网络预测 x t x_t xt,而是预测: 从 x t − 1 x_{t-1} xt1 x t x_t xt的变化量。 也就是:

f μ ( x t − 1 , u t ) f_\mu(x_{t-1},u_t) fμ(xt1,ut)

表示状态增量。 然后再写成:

μ f = x t − 1 + 增量 \mu_f = x_{t-1} + \text{增量} μf=xt1+增量

这样做很合理,因为在很多动力学问题里:

  • 当前状态通常和上一时刻很接近
  • 网络预测“变化多少”比“直接预测绝对位置”更容易学

这是一种残差形式,非常常见。


协方差 Σ f \Sigma_f Σf: 作者设为: Σ f = exp ⁡ ( f σ ( x t − 1 , u t ) ) I . \Sigma_f=\exp(f_\sigma(x_{t-1},u_t))\text{I}. Σf=exp(fσ(xt1,ut))I.

意思是:

  • 网络再输出一个标量或向量,表示方差的对数
  • 经过 exp ⁡ \exp exp 后保证方差为正
  • 再乘 I \text{I} I,表示这里采用对角、各向同性或简化协方差结构

你可以理解成: 模型不仅预测“下一步去哪”,还预测“我对这个预测有多不确定”,这很重要,因为状态转移本来就有随机性。

把动力学分布参数化成高斯好处: 这是本文一个很关键的工程设计点。 如果把

p ( x t ∣ x t − 1 , u t ) p(x_t|x_{t-1},u_t) p(xtxt1,ut)

设成高斯分布,那么在扩散里加入噪声之后,仍然会保持高斯形式。 而高斯分布的score是最容易算的,因为: 高斯分布的对数梯度有闭式公式,这就直接导向了式(12)。

在DnPF的背景下,将 p ( x t ∣ x t − 1 , u t ) p(x_t|x_{t-1},u_t) p(xtxt1,ut) 参数化为高斯分布的好处在于:加扰后转移分布的score可以在每个去噪步骤中用闭式形式计算为
ϵ dy = − β s ∇ x t log ⁡ p s ( x t ∣ x t − 1 , u t ) = β s Σ s − 1 ( μ s − x t ) , (12) \epsilon_\text{dy}= -\beta_s\nabla_{x_t}\log p_s(x_t|x_{t-1},u_t)=\beta_s\Sigma_s^{-1}(\mu_s-x_t), \tag{12} ϵdy=βsxtlogps(xtxt1,ut)=βsΣs1(μsxt),(12)

动力学去噪方向。当前这个带噪粒子 x t x_t xt,如果只考虑动力学模型,那么它应该朝着动力学预测的中心 μ s \mu_s μs移动。


p ( x t ∣ x t − 1 , u t ) p(x_t|x_{t-1},u_t) p(xtxt1,ut):这是动力学转移分布。意思是:已知上一时刻状态 x t − 1 x_{t-1} xt1和动作 u t u_t ut,当前状态 x t x_t xt会落在哪里。作者把它参数化成高斯: p ( x t ∣ x t − 1 , u t ) = N ( x t ; μ f , Σ f ) p(x_t|x_{t-1},u_t)=\mathcal{N}(x_t;\mu_f,\Sigma_f) p(xtxt1,ut)=N(xt;μf,Σf)。意思是:

  • 当前状态大概率在 μ f \mu_f μf附近
  • 不确定性由 Σ f \Sigma_f Σf描述

μ f \mu_f μf:这是动力学模型预测的下一步均值。 也就是:

按照动力学,下一步最可能在哪

Σ f \Sigma_f Σf: 这是动力学模型预测的不确定性。也就是:

我对“下一步在哪”有多确定

  • Σ f \Sigma_f Σf小:很确定
  • Σ f \Sigma_f Σf大:不太确定

μ s , Σ s \mu_s,\Sigma_s μs,Σs: 这两个不是原始动力学分布的参数,而是: 加了扩散噪声之后,这个分布在噪声尺度 s s s下的新均值和新协方差,也就是“扰动后的动力学分布参数”。

x t x_t xt: 这里最坑。 严格来说,这里其实应该写成带噪状态,也就是 x t , s x_{t,s} xt,s。 但作者前面说了,为了不让符号太长,他们后面把 s s s省略了。 所以式(12)里的 x t x_t xt,你不要理解成“干净真实状态”,而要理解成: 当前噪声尺度 s s s下的那个粒子位置,这个点非常重要。


作者先学了一个动力学模型 f f f,输出: μ f = x t − 1 + f μ ( x t − 1 , u t ) \mu_f=x_{t-1}+f_\mu(x_{t-1},u_t) μf=xt1+fμ(xt1,ut) Σ f = exp ⁡ ( f σ ( x t − 1 , u t ) ) I \Sigma_f=\exp(f_\sigma(x_{t-1},u_t))\text{I} Σf=exp(fσ(xt1,ut))I。所以对于每个祖先粒子 x t − 1 x_{t-1} xt1和动作 u t u_t ut,模型给出一个高斯: x t ∼ N ( μ f , Σ f ) x_t\sim \mathcal{N}(\mu_f,\Sigma_f) xtN(μf,Σf)。这表示:

“如果从这个祖先粒子出发,在这个动作下走一步,那么下一步大概在 μ f \mu_f μf附近,且不确定性是 Σ f \Sigma_f Σf。”

扩散模型里,不是直接在干净状态上工作,而是在带噪状态上工作。 带噪过程是: x t , s = α s x t + β s ϵ , ϵ ∼ N ( 0 , I ) x_{t,s}=\alpha_s x_t+\beta_s\epsilon,\quad\epsilon\sim\mathcal{N}(0,\text{I}) xt,s=αsxt+βsϵ,ϵN(0,I)

高斯分布的一个基本结论 如果 p ( x ) = N ( x ; μ , Σ ) p(x)=\mathcal N(x;\mu,\Sigma) p(x)=N(x;μ,Σ),那么它的score是: ∇ x log ⁡ p ( x ) = − Σ − 1 ( x − μ ) = Σ − 1 ( μ − x ) \nabla_x\log p(x)= -\Sigma^{-1}(x-\mu)=\Sigma^{-1}(\mu-x) xlogp(x)=Σ1(xμ)=Σ1(μx)。这是高斯分布的标准结果。

其中, μ s = α s μ f \mu_s=\alpha_s\mu_f μs=αsμf Σ s = α s 2 Σ f + β s 2 I \Sigma_s=\alpha_s^2\Sigma_f+\beta_s^2\text{I} Σs=αs2Σf+βs2I。 这样一来,学习得到的模型 f f f 对于每个粒子、每个时间步只需要计算一次,而不需要在每一个去噪步骤中都重复计算。

左边是什么? 左边本质上是: 加扰后动力学分布的score,乘了一个扩散里常见的缩放因子。你可以把它理解成: 动力学模型告诉当前粒子:你应该往哪边修正,才更符合“从祖先粒子出发、经过动作传播”得到的分布。

右边是什么? 对高斯分布来说,score有标准形式: 如果 x x x服从均值 μ \mu μ、协方差 Σ \Sigma Σ的高斯,那么它的score大致就是:

∇ x log ⁡ p ( x ) ∝ − Σ − 1 ( x − μ ) \nabla_x \log p(x)\propto -\Sigma^{-1}(x-\mu) xlogp(x)Σ1(xμ)

等价写法就是:

Σ − 1 ( μ − x ) \Sigma^{-1}(\mu-x) Σ1(μx)

所以式(12)是: 高斯分布score的闭式结果。


这个式子直观上是什么意思?

它表示:

  • 如果当前 x t x_t xt离高斯均值 μ s \mu_s μs很远
  • 那动力学score就会把它往 μ s \mu_s μs方向拉
  • 拉力大小还会受到协方差 Σ s \Sigma_s Σs影响

也就是说: 高斯越窄(协方差越小),拉回均值的力越强; 高斯越宽(协方差越大),允许的范围更广,拉力更弱。这很符合直觉。


μ s = α s μ f \mu_s=\alpha_s\mu_f μs=αsμf Σ s = α s 2 Σ f + β s 2 I \Sigma_s=\alpha_s^2\Sigma_f+\beta_s^2\text{I} Σs=αs2Σf+βs2I
表示:原始动力学高斯分布在加噪之后,对应的扰动分布参数。

原来一步动力学模型是:

x t ∼ N ( μ f , Σ f ) x_t\sim\mathcal N(\mu_f,\Sigma_f) xtN(μf,Σf)

现在扩散过程还会再给它加上噪声,于是分布变成新的高斯:

  • 均值缩放成 μ s \mu_s μs
  • 协方差变成 Σ s \Sigma_s Σs

这个形式来自高斯分布在线性变换和高斯加噪下仍保持高斯。 所以这里依然能闭式求score。


为什么作者特别强调“每个粒子每个时间步只需计算一次”?

如果用扩散网络学动力学score会怎样? 那你在每个去噪步骤 s s s都得把当前样本再喂给一个网络。如果去噪有很多步,计算会非常贵。

现在作者怎么做? 作者只需要: 在当前时间步开始时, 对每个粒子、给定祖先 x t − 1 x_{t-1} xt1和控制 u t u_t ut,跑一次动力学网络 f f f, 得到:

  • μ f \mu_f μf
  • Σ f \Sigma_f Σf

然后后面整个去噪过程中,动力学score都能用闭式公式算,不需要再跑神经网络。 所以它非常省。

B. Inference Procedure

对每个上一时刻的粒子,先用动力学模型预测一下它下一步可能在哪里;然后不要完全相信这个预测,而是再用“测量信息 + 动力学信息”一起做几步去噪修正,最后得到当前时刻的新粒子。先预测一个大概位置,再通过扩散去噪把粒子一步一步拉到当前后验分布上。

∇ x t log ⁡ p s ( x t ∣ y 1 : t , u 1 : t ) = ∇ x t log ⁡ p s ( y t ∣ x t ) + ∇ x t log ⁡ ∑ i p s ( x t ∣ x t − 1 i , u t ) . (6) \nabla_{x_t}\log p_s(x_t|y_{1:t},u_{1:t})=\nabla_{x_t}\log p_s(y_t|x_t)+\nabla_{x_t}\log \sum_i p_s(x_t|x_{t-1}^i,u_t). \tag{6} xtlogps(xty1:t,u1:t)=xtlogps(ytxt)+xtlogips(xtxt1i,ut).(6)
这句话的人话版是:

当前后验分布的修正方向 = 当前观测给的方向 + 上一时刻粒子经过动力学传播后给的方向。

也就是:

  • 观测说:你应该更像当前图像/测量支持的状态
  • 动力学说:你应该更像从上一时刻状态演化过来的状态

DnPF就是在每一步去噪里,把这两个方向合起来。 所以算法1并不是凭空来的,它就是把公式(6)做成了可执行流程。

“一个粒子在当前时刻是怎么来的”?

假设上一时刻有一个粒子:

x t − 1 i x_{t-1}^i xt1i

现在到了当前时刻 t t t,作者不是直接说“它就变成 x t i x_t^i xti”,而是分三步:

第一步:动力学先预测一个中心位置

用动力学网络 f μ f_\mu fμ预测:

x ^ t i = x t − 1 i + f μ ( x t − 1 i , u t ) \hat{x}_t^i=x_{t-1}^i+f_\mu(x_{t-1}^i,u_t) x^ti=xt1i+fμ(xt1i,ut)

这就是“如果只看动作和上一状态,我猜它下一步大概在这”。 这一步是粗预测。

第二步:在这个预测附近加噪声,得到热启动初值

不是直接把 x ^ t i \hat{x}_t^i x^ti当最终答案,而是构造一个带噪初值:

x t , s w i ∼ N ( α s w x ^ t i , β s w 2 I ) x_{t,s_w}^i \sim \mathcal N(\alpha_{s_w}\hat{x}_t^i,\beta_{s_w}^2\text{I}) xt,swiN(αswx^ti,βsw2I)

意思是:

  • 以动力学预测为中心
  • 再加一点随机扰动
  • 得到当前去噪过程的起点

这一步相当于说:

我不想从完全随机开始,因为太慢;我先站到一个差不多对的地方,再开始精修。

第三步:做多次去噪修正

在每个去噪步骤 s s s,计算:

ϵ i = ϵ lh i + ϵ dy i \epsilon^i=\epsilon_\text{lh}^i+\epsilon_\text{dy}^i ϵi=ϵlhi+ϵdyi

然后用这个总方向去更新粒子。 做完几步后,就得到当前时刻的最终粒子 x t i x_t^i xti

给定一组粒子 { x t − 1 i ∣ i = 1 , … , N } \{x_{t-1}^i\mid i=1,\ldots,N\} {xt1ii=1,,N},它们表示前一时间步的后验分布 p ( x t − 1 ∣ y 1 : t − 1 , u 1 : t − 1 ) p(x_{t-1}|y_{1:t-1},u_{1:t-1}) p(xt1y1:t1,u1:t1) ,式(6)提供了一种从下一时间步后验分布中进行采样的方式: 从纯噪声样本 x t , 0 i ∼ N ( 0 , I ) x_{t,0}^i\sim\mathcal{N}(0,\text{I}) xt,0iN(0,I) 出发,每个粒子都根据预测噪声,独立地经过一系列去噪步骤 s = 0 , … , 1 s=0,\ldots,1 s=0,,1 进行演化:

ϵ i = ϵ lh i + ϵ dy i , (13) \epsilon^i=\epsilon_\text{lh}^i+\epsilon_\text{dy}^i, \tag{13} ϵi=ϵlhi+ϵdyi,(13)

i i i个粒子在当前去噪步应该怎么移动,由两股力共同决定。
ϵ lh i \epsilon_\text{lh}^i ϵlhi

  • 当前观测 y t y_t yt
  • 会希望这个粒子更符合测量

简单说就是: 相机/传感器在拉它。

ϵ dy i \epsilon_\text{dy}^i ϵdyi

  • 根据上一时刻粒子 x t − 1 i x_{t-1}^i xt1i
  • 加上动作 u t u_t ut
  • 当前粒子应该更像动力学预测出来的位置

简单说就是: 系统运动规律在拉它。

其中, ϵ lh i \epsilon_\text{lh}^i ϵlhi(见式(8))对应学习得到的测量似然项, ϵ dy i \epsilon_\text{dy}^i ϵdyi(见式(12))对应动力学先验项。

分成四层来理解:

第1层:目标是什么? 想从当前后验分布里采样:

p ( x t ∣ y 1 : t , u 1 : t ) p(x_t|y_{1:t},u_{1:t}) p(xty1:t,u1:t)

也就是当前最合理的状态分布。

第2层:怎么采样? 不用传统重要性采样,而是用扩散模型的ODE/离散去噪过程来采样。 这意味着你需要在每个去噪步骤里知道:

  • 测量想把粒子往哪推
  • 动力学想把粒子往哪推

第3层:怎么得到这两个推力? 作者前面已经训练好了两个模块:

  • 测量项: ϵ lh \epsilon_\text{lh} ϵlh
  • 动力学项: ϵ dy \epsilon_\text{dy} ϵdy

然后把它们加起来:

ϵ i = ϵ lh i + ϵ dy i (13) \epsilon^i=\epsilon_\text{lh}^i+\epsilon_\text{dy}^i \tag{13} ϵi=ϵlhi+ϵdyi(13)

这就是当前第 i i i个粒子的总去噪方向。

第4层:怎么高效地做? 如果从纯噪声开始慢慢去噪,步数会很多,很贵。 所以作者用了一个技巧: 热启动(warm-start),也就是:

  • 不从“完全随机纯噪声”开始
  • 而是先用动力学预测一个差不多的位置
  • 然后在这个预测附近加一点噪声
  • 再从这个“半成品”开始去噪

这样就快很多。

ϵ lh = − β s [ ( 1 + η ) ∇ x log ⁡ p s ( x t ∣ y t ) − η ∇ log ⁡ p s ( x t ) ] , (8) \epsilon_\text{lh}=-\beta_s\left[(1+\eta)\nabla_{x}\log p_s(x_t|y_t)-\eta\nabla\log p_s(x_t)\right], \tag{8} ϵlh=βs[(1+η)xlogps(xtyt)ηlogps(xt)],(8)
ϵ dy = − β s ∇ x t log ⁡ p s ( x t ∣ x t − 1 , u t ) = β s Σ s − 1 ( μ s − x t ) , (12) \epsilon_\text{dy}= -\beta_s\nabla_{x_t}\log p_s(x_t|x_{t-1},u_t)=\beta_s\Sigma_s^{-1}(\mu_s-x_t), \tag{12} ϵdy=βsxtlogps(xtxt1,ut)=βsΣs1(μsxt),(12)

由于在扩散模型中执行大量去噪步骤 S = 1 / Δ s S=1/\Delta s S=1/Δs 的采样代价可能较高,因此我们按如下方式对去噪过程进行热启动(warm-start): 对于每一个前一时刻的粒子 x t − 1 i x_{t-1}^i xt1i,我们首先利用(学习得到的)动力学模型预测下一状态: x ^ t i = x t − 1 i + f μ ( x t − 1 i , u t ) \hat{x}_t^i=x_{t-1}^i+f_\mu(x_{t-1}^i,u_t) x^ti=xt1i+fμ(xt1i,ut)。 然后,对于选定的热启动噪声尺度 s w ∈ [ 0 , 1 ) s_\text{w}\in[0,1) sw[0,1) ,我们采样一个扰动后的初始状态 x t , s w i ∼ N ( α s w x ^ t i , β s w 2 I ) x_{t,s_\text{w}}^i\sim\mathcal{N}(\alpha_{s_\text{w}}\hat{x}_t^i,\beta_{s_\text{w}}^2\text{I}) xt,swiN(αswx^ti,βsw2I), 也就是说,我们在纯噪声和动力学模型预测结果之间进行插值。 随后,对于每一个去噪步骤 s = s w , … , 1 s=s_\text{w},\ldots,1 s=sw,,1,我们都使用式(13)来计算预测噪声。 在实际中,我们发现,对于本文研究的任务,取 s w ∈ [ 0.5 , 0.9 ] s_\text{w}\in[0.5,0.9] sw[0.5,0.9],并配合总共5到25个去噪步骤,效果较好。

热启动具体怎么做?

第一步:先预测一个粗略状态

x ^ t i = x t − 1 i + f μ ( x t − 1 i , u t ) \hat{x}_t^i=x_{t-1}^i+f_\mu(x_{t-1}^i,u_t) x^ti=xt1i+fμ(xt1i,ut)

这是动力学均值预测。 也就是:

  • 你上一帧在这里
  • 你做了这个动作
  • 所以下一帧我猜大概在那

第二步:把这个预测变成“带噪起点”

x t , s w i ∼ N ( α s w x ^ t i , β s w 2 I ) x_{t,s_w}^i\sim\mathcal N(\alpha_{s_w}\hat{x}_t^i,\beta_{s_w}^2\text{I}) xt,swiN(αswx^ti,βsw2I)

这是什么意思? 这表示:

  • 不是直接从纯噪声 x t , 0 ∼ N ( 0 , I ) x_{t,0}\sim\mathcal N(0,\text{I}) xt,0N(0,I)开始
  • 而是在一个噪声尺度 s w s_w sw处开始
  • 此时样本已经带有一部分动力学预测信息了

所以作者说:

我们在纯噪声和动力学模型预测结果之间进行插值

这句话很重要。 因为:

  • 如果 s w s_w sw很小,更接近纯噪声
  • 如果 s w s_w sw很大,更接近动力学预测

所以 s w s_w sw控制了: 你到底想相信动力学预测多少,还是想保留更多随机探索


s w s_w sw是热启动噪声尺度,它在 [ 0 , 1 ) [0,1) [0,1)之间。 根据前面这篇文章的约定:

  • s = 0 s=0 s=0:最噪
  • s = 1 s=1 s=1:最干净

所以如果从 s w s_w sw开始去噪,意味着:

  • 你不是从完全噪声的0开始
  • 而是从一个已经比较靠近干净样本的位置开始

我们在算法1中对这一推理过程进行了总结。


在这里插入图片描述

初始化:
如果初始先验分布 p ( x 0 ) p(x_0) p(x0)已知, 那就直接从先验里采样初始粒子。

如果你一开始就知道系统大概在哪
那就按这个已知先验生成初始粒子

如果不知道初始先验,那就根据初始观测 y 0 y_0 y0,用测量去噪模型来从条件分布里采样初始粒子。

我虽然没有先验
但我有第一帧观测
那我就根据第一帧观测直接猜初始状态分布

粒子滤波:

  1. 用动力学网络预测 x ^ t i , Σ t i \hat{x}_t^i,\Sigma_t^i x^ti,Σti(公式10,11)
  2. 热启动采样

C. Likelihood-Constrained Diffusion (似然约束扩散)

作者发现:当动力学模型太“强”、太“确定”时,粒子可能只会沿着动力学预测的轨迹走,哪怕观测已经暗示“你应该去另一个地方”,粒子也不容易跳过去。于是作者加了一个“约束机制”:如果粒子离观测支持的数据流形太远,就暂时削弱动力学项,让观测先把粒子拉回正确区域。

用有限个样本来近似后验分布的一个结果是:先验(动力学)分布与似然函数的支撑集可能是彼此分离的。这种情况在动力学模型近乎确定性时尤为常见;在这种情况下,即便最优地求解递归贝叶斯滤波方程(1),也可能无法得到一个被良好近似的后验分布。

什么叫“支撑集可能分离”?

“支撑集”你先不要想成特别抽象的数学词,你就把它理解成: 某个分布“主要有可能出现”的区域。比如:

  • 动力学分布说:当前物体大概率在A区域
  • 观测似然说:当前物体大概率在B区域

如果A和B差得很远,甚至几乎不重合,那就是: 先验支持区域和似然支持区域分离了

为什么这会出问题?

因为粒子是有限个的,不是无限连续的。 如果当前这批粒子都被动力学带到了A附近,而真正观测支持的是B附近,那么会发生:

  • 粒子都离B很远
  • 观测虽然想把粒子拉去B
  • 但粒子一开始压根不在B附近
  • 动力学项还在持续把它们往A方向拉

于是粒子可能根本“跳不过去”。 这就像:

你要从一条轨道跳到另一条轨道,但当前动力学太强,一直把你往原轨道按住。

为了解决这一问题,我们设计了一种约束优化过程,以确保粒子 x t i x_t^i xti始终保持接近似然流形 p ( x t ∣ y t ) p(x_t|y_t) p(xtyt),即使它们并不被先验 p ( x t ∣ x t − 1 i , u t ) p(x_t|x_{t-1}^i,u_t) p(xtxt1i,ut)所支持。

作者为了解决这个问题,提出: 似然约束扩散(Likelihood-Constrained Diffusion)。最简单的人话版就是:

如果当前粒子离“观测支持的流形”太远,就先别让动力学说了算,先削弱动力学项,让观测把粒子拉回去。

我们在每一个去噪步骤中,使用噪声模型输出 D ( x t i , y t , s ) D(x_t^i,y_t,s) D(xti,yt,s)的大小,作为粒子到由 p s ( x t ∣ y t ) p_s(x_t|y_t) ps(xtyt)所诱导的数据流形距离的一个代理量。 这种做法可以通过将去噪分数匹配解释为最大化证据下界(ELBO)[20]来加以合理化。 这促使我们定义如下代价函数:

c ( ϵ ) = ∣ ϵ ∣ − θ (14) c(\epsilon)=|\epsilon|-\theta \tag{14} c(ϵ)=ϵθ(14)

其中, θ > 0 \theta>0 θ>0是一个幅值阈值

D ( x t i , y t , s ) D(x_t^i,y_t,s) D(xti,yt,s)是什么? 这是前面训练好的条件去噪模型。输入是:

  • 当前带噪粒子 x t i x_t^i xti
  • 当前观测 y t y_t yt
  • 当前噪声尺度 s s s

输出是一个预测噪声。 前面你已经学过,它本质上和条件score有关。

为什么看它的“大小” ∣ D ∣ |D| D 作者这里不是只看方向,而是看: 输出噪声的幅值有多大。直觉上:

  • 如果当前粒子已经很接近“观测支持的数据流形”

    • 那去噪模型不需要做太大修正
    • 输出幅值会比较小
  • 如果当前粒子离这个流形很远

    • 去噪模型会说“你这里噪声/偏差很大,得大幅修正”
    • 输出幅值会比较大

所以 ∣ D ( x t i , y t , s ) ∣ |D(x_t^i,y_t,s)| D(xti,yt,s)可以作为:粒子离观测流形有多远的近似指标。

为什么作者说这和ELBO解释有关? 这里你不需要深陷ELBO公式。你只要抓住核心:

  • 扩散去噪训练本质上是在学“如何把带噪样本拉回真实数据流形”
  • 因此,网络预测出的噪声大小,确实能反映“当前样本有多不符合数据流形”

所以作者用它当作“距离代理量”是有理论支持的,不是纯拍脑袋。


c ( ϵ ) c(\epsilon) c(ϵ)是在判断: 当前粒子是不是离观测支持区域太远

为了在去噪过程中强制满足不等式约束 c ( ϵ ) ≤ 0 c(\epsilon)\leq0 c(ϵ)0,我们采用增广拉格朗日方案,用下式替代式(13):

ϵ i = ϵ lh i + ϵ dy i , (13) \epsilon^i=\epsilon_\text{lh}^i+\epsilon_\text{dy}^i, \tag{13} ϵi=ϵlhi+ϵdyi,(13)

ϵ = ϵ lh + 1 1 + λ + ρ c ( ϵ lh ) + ϵ dy (15) \epsilon=\epsilon_\text{lh}+\frac{1}{1+\lambda+\rho c(\epsilon_\text{lh})_+}\epsilon_\text{dy} \tag{15} ϵ=ϵlh+1+λ+ρc(ϵlh)+1ϵdy(15)

λ ← ( λ + ρ c ( ϵ lh ) ) + (16) \lambda\leftarrow(\lambda+\rho c(\epsilon_\text{lh}))_+ \tag{16} λ(λ+ρc(ϵlh))+(16)

其中, λ ≥ 0 \lambda\geq0 λ0是拉格朗日乘子, ρ ≥ 0 \rho\geq0 ρ0是惩罚参数,而 c + = max ⁡ ( 0 , c ) c_+=\max(0,c) c+=max(0,c)。 如果到数据流形的距离大于 θ \theta θ,那么式(15)会有效地缩小动力学项 ϵ dy \epsilon_\text{dy} ϵdy 的尺度。 在实际中,我们发现为每个维度分别保留代价和拉格朗日乘子是有益的,这样就可以在使用全局标量 θ \theta θ 的同时,对状态空间每个维度的噪声项进行独立缩放。 实验部分(图4)展示了带有和不带有似然约束的DnPF对比示例轨迹。


在这里插入图片描述图4. DnPF在Manipulator Spin任务上的预测结果。 图中展示的是物体位置归一化后X分量的估计值,红色曲线表示真实值。 在约 2.5 2.5 2.5s时,机械臂末端执行器与物体发生接触,这大大缩小了物体可能构型的空间。 在被拉向由观测诱导出的测量似然之后,DnPF粒子再次沿着这个(近乎确定性的)动力学模型演化,并紧密跟踪真实值。 上图:不带似然约束的粒子演化结果, 中图:带似然约束$ (\theta=2.0) 的粒子演化结果。下图:预测测量 s c o r e 的幅值 的粒子演化结果。 下图:预测测量score的幅值 的粒子演化结果。下图:预测测量score的幅值|\epsilon_{lh}|$。


D. Implementation

作者已经有了DnPF的理论和算法,现在要把它做成一个能在GPU上快速运行的版本,所以他们专门设计了一套“共享计算 + 并行粒子 + 轻量条件化”的实现方法。

在我们对DnPF的实现中,我们做出了一些设计决策,以实现快速推理。首先,由于每个粒子 x t i x_t^i xti 在每一个去噪步骤中都是相互独立的,因此我们可以在GPU上对粒子进行并行计算。其次,我们使用神经网络 E E E 在每个时间步只计算一次共享的观测编码 y enc = E ( y t , y t − 1 ) y_{\text{enc}}=E(y_t,y_{t-1}) yenc=E(yt,yt1)。对于低维观测,观测编码器 E E E 被参数化为前馈网络;对于图像观测,则被参数化为卷积网络。 我们还额外引入前一时刻观测 y t − 1 y_{t-1} yt1 作为条件,以便更容易预测状态空间中的速度分量。 对于固定数量的去噪步骤 s = s w , … , 1 s=s_\text{w},\ldots,1 s=sw,,1,我们预先并行计算FiLM conditioning[31]向量 Φ s w … Φ 1 \Phi_{s_\text{w}}\ldots\Phi_1 ΦswΦ1,其形式为 Φ s = F ( y enc , s ) \Phi_s=F(y_{\text{enc}},s) Φs=F(yenc,s),其中 F F F 是一个前馈神经网络。 这些条件向量的数量与粒子数 N N N 无关,并且可以在同一个去噪步骤中被所有粒子重复使用。 FiLM向量 Φ s \Phi_s Φs 用于对去噪模型 D ( x t i ; Φ s ) D(x_t^i;\Phi_s) D(xti;Φs) 施加条件,而该去噪模型本身可以保持较小规模,从而加速序列式扩散推理。 我们在图2中给出了该去噪架构的概览。

FiLM是一个条件化方法。 它的作用是“把条件信息注入到主网络里”。这里主网络是去噪模型 D D D,条件信息是:

  • 当前观测编码 y enc y_{\text{enc}} yenc
  • 当前去噪步 s s s

在这里插入图片描述Fig. 2. DnPF network structure for efficient denoising inference. 图2. 用于高效去噪推理的DnPF网络结构。


在所有实验中,我们都使用带有跳跃连接[32]和层归一化[33]的4层前馈网络,其中, F F F 和动力学模型 f f f 的每一层都有256个隐藏单元,而去噪模型 D D D 的每一层有128个隐藏单元。 对于扩散推理,我们使用DDIM调度[21],并将 α s = α ˉ s \alpha_s=\sqrt{\bar{\alpha}_s} αs=αˉs β s = 1 − α ˉ s \beta_s=\sqrt{1-\bar{\alpha}_s} βs=1αˉs 参数化,其中 α ˉ s ∈ [ 0 , 1 ] \bar{\alpha}_s\in[0,1] αˉs[0,1],同时通过欧拉积分来求解式(2)。 需要注意的是,我们的算法并不局限于DDIM;只要能够计算score项,它就兼容任意扩散模型或流模型的采样方案。 DnPF引入了若干推理超参数:去噪步数 S S S、热启动噪声尺度 s w s_\text{w} sw、引导强度 η \eta η 以及约束阈值 θ \theta θ。 需要注意的是,DnPF的训练过程与这些推理参数无关。 虽然DnPF在这些参数的合理取值范围内都表现良好,但我们发现,在训练完成后,对推理参数进行搜索以便针对所选评估指标最大化性能,是有益的。 关于运行时间与性能权衡的分析,请参见第V-G节。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐