这篇笔记继续写 Denoising Particle Filters 的第二部分。论文标题里的 Single-Step Objectives指的是用一种类似扩散模型的单步去噪目标来学习状态估计而不是把整个粒子滤波轨迹展开成可微计算图去反向传播。上一篇把动机和相关工作讲完了这篇重点拆方法、实验和几个容易理解错的地方。如果你在做机器人定位、时序状态估计或者想把生成模型塞进贝叶斯滤波框架这篇文章值得认真读完。1. 为什么要在粒子滤波里谈去噪粒子滤波本身是一个递归的蒙特卡洛估计器t 时刻我们手里有一组加权粒子{z_t^i, w_t^i}对应状态后验 p(z_t | x_{1:t}) 的近似。它的每次迭代只有三个操作从转移模型里采样新粒子、用观测似然更新权重、按权重重采样。这个流程看起来简单但对两个模型的要求非常高——转移模型 g(z_t | z_{t-1})决定粒子往哪里散观测似然 ℓ(x_t | z_t)决定哪些粒子值得保留。很多学习类方法都把注意力放在转移模型上但实际做粒子滤波的人都有体会观测似然一旦给错粒子多样性会迅速崩塌估计结果比转移模型偏差更致命。问题在于这两个模型在真实场景里往往不是现成的需要从数据里学。传统做法是端到端地训练一个可微粒子滤波器把时序上的滤波损失展开成计算图。也就是说给定一段观测序列你让滤波器跑一步、两步、三步……然后在最终估计上计算 MSE 或者负对数似然再让梯度穿透整个轨迹回到网络参数。这种做法思路很直接但工程上非常痛苦序列一长梯度要么消失要么爆炸粒子的离散重采样又不可微梯度方差大得离谱。论文里提到一个阶段性改进叫双步目标two-step objective也就是不展开整条轨迹只展开两个时间步用两帧之间的预测误差作为学习信号。双步目标确实让展开长度从 T 降到了 2但它本质上还是时间展开误差会在两帧之间叠加梯度还是会被重采样污染。作者想做的更彻底最好根本不用跨时间展开。这就引出了去噪的视角。1.1 粒子滤波的两难模型好不如似然好我做了几年的状态估计一个很深的感受是粒子滤波的性能瓶颈经常不在粒子放得准不准而在权重给得对不对。转移模型差一点最多是粒子分布宽一些重采样后还能靠观测拉回来但似然函数如果给错了形状权重分布会极端化一会儿所有粒子权重都趋近于零一会儿某一个粒子吃掉全部权重有效样本数崩得极快。学习似然函数最麻烦的地方是监督信号不明确。给定一个粒子 z_t^i我们只有观测 x_t并没有这个粒子离真实状态有多远的标签。回归目标不知道该往哪里打。端到端方法试图用未来观测的似然来间接监督但这是间接信号梯度的路径绕了一大圈。去噪视角给了一个很漂亮的替代方案把观测 x_t 看作真实状态 z_t 经过观测函数后再加噪声的结果。那么给定 x_t 判断 z_t 的概率就变成了从带噪观测中还原干净信号的条件去噪问题。扩散模型已经反复证明了这种任务不需要显式标签只要构造含噪样本对学一个噪声预测器就行。论文把同样的逻辑移植到粒子滤波的更新算子上单步目标由此而来。1.2 双步目标的病态来自哪里双步目标表面上多了一步前瞻似乎能学到短期的动态变化但它的病态来自两个层面。第一个层面是模型层面的误差累积。双步目标需要把两个时刻的状态转移、观测生成和权重更新全部串起来前一步的转移误差会直接污染后一步的权重监督信号。换句话说梯度计算时你在对一个积分过程求导可每一步的模型都在变反向传播出来的梯度其实混合了不同时刻的误差很难说清是哪个模块的问题。第二个层面是算法层面的不可微性。粒子滤波每步都可能有重采样操作重采样是一个离散的采样过程不存在解析梯度。常见做法是给重采样加一个软化的近似比如用核函数把权重平滑化或者直接做重参数化采样。这些软重采样都会引入额外的近似超参数而这些超参数又不是训练目标的一部分结果就是训练时一个精度的样子推理时另一个精度的样子。单步目标之所以能绕开这个问题是因为训练时根本不渲染滤波轨迹。它只需要同一时刻的状态-观测配对加噪声、预测噪声、算L2损失整个训练过程跟时间方向完全解耦。1.3 去噪目标的第一个直觉把状态估计当条件生成如果你熟悉扩散模型可能马上会发现这里的相似性。扩散模型把一张干净图像逐步加噪直到变成纯高斯噪声然后用一个网络学从噪声中预测加入的噪声这个逆过程。粒子滤波里的观测模型其实也在做类似的事真实状态是干净图像观测是加了噪声的图像粒子滤波要做的是从带噪观测中还原状态的分布。这个类比一开始可能觉得只是形式上的巧合但它带来了非常实际的收益。扩散模型已经证明用多尺度噪声训练出来的网络对不同程度的退化都有鲁棒性。粒子滤波里的粒子离真实状态的距离也是变化的——在预测阶段粒子比较发散在观测更新后粒子比较集中——如果我们训练一个只能在固定噪声水平下工作的网络效果就会很脆。多噪声水平的去噪训练相当于给状态估计做了一套覆盖各种偏差尺度的数据增强。2. 方法框架从预测-更新到去噪-精化这一节进入论文的核心方法。为了说清楚先把记号固定下来隐状态 z_t ∈ R^d观测 x_t ∈ R^m。我们关心的递归贝叶斯估计要交替完成两步预测p(z_t | x_{1:t-1}) ∫ p(z_t | z_{t-1}) p(z_{t-1} | x_{1:t-1}) dz_{t-1}更新p(z_t | x_{1:t}) ∝ p(x_t | z_t) p(z_t | x_{1:t-1})。传统可微粒子滤波把 p(z_t | z_{t-1}) 和 p(x_t | z_t) 都参数化成神经网络然后端到端训练。DPF 的差别在于这两个条件分布都不直接回归而是被去噪网络隐式表达。2.1 记号和问题重述假设我们有一条训练轨迹最理想的情况下有真实状态序列 z_{1:T} 和观测序列 x_{1:T}。但请注意论文设计的目标函数并不强制要求真实状态存在这一点后面讲数据构造时会展开。我们需要学习两个模块转移模块 T_θ给定上一时刻状态 z_{t-1} 和当前观测 x_t估计当前状态 z_t 的分布更新模块 L_θ给定当前观测 x_t 和粒子 z_t计算粒子的权重 w_t^i。在标准粒子滤波里转移模块采样的粒子其实可以依赖当前观测这叫引导滤波器proposal distribution论文并没有回避这一点。T_θ和L_θ的划分不是严格的时序划分而是功能划分一个是生成候选状态一个是评估候选状态。DPF 的核心是T_θ 和 L_θ 都不直接输出概率密度而是通过一个共享的去噪网络去近似对应的条件分布。共享的好处是转移和更新在同一个特征空间里彼此约束训练时不会出现两个模块各学各的、对不上信号的情况。2.2 预测算子的去噪化先看转移模型。标准的参数化方式是把 z_t 建模成 z_t f_θ(z_{t-1}) σ_process ε其中 ε 是过程噪声。这里 f_θ 可以是一个神经网络。但问题在于f_θ 的训练信号来自哪里如果只有观测序列没有真实状态这个回归目标本身就缺了标签。DPF 的做法是把给定 z_{t-1} 预测 z_t改成给定 z_{t-1} 和含噪观测预测观测噪声。直觉上z_t 隐式地藏在 x_t 里我们不需要直接还原 z_t只需要让网络学会识别哪些信息是观测里还没被噪声掩盖的。具体实现中网络输入是上一时刻状态特征和当前含噪观测特征输出是加入观测的噪声估计。这个预测任务对每个时间步独立成立因此训练时不需要把 z_{t-1} 和 z_t 的预测误差在时间上展开。有人可能会问这样训练出来的转移模型还能不能叫转移模型它的确不再是一个显式的 p(z_t | z_{t-1})但它仍然在完成基于上一时刻信息生成当前状态候选的职责。推理时我们用去噪网络给出的特征来构造粒子的 proposal而不是直接拿网络输出当状态值。2.3 更新算子的去噪化更新算子是最关键的部分也是和普通扩散模型差异最大的地方。粒子滤波里权重必须正比于观测似然 p(x_t | z_t^i)。怎么从去噪网络里得到这个似然论文的思路是训练一个条件观测生成模型给定状态 z_t观测 x_t 的分布满足 x_t h_φ(z_t) σ_obs ε。这里 h_φ 不是显式学出来的观测函数而是用去噪网络在状态条件下预测观测噪声来代替。于是p(x_t | z_t^i) ∝ exp( -|| ε - ε_θ(z_t^i, x_t, σ) ||^2 / (2σ^2) )也就是说网络残留误差越小说明这个粒子越能解释当前观测权重就该越高。这是一个从条件生成模型推导似然的通用技巧扩散模型领域叫做从去噪评分近似条件密度。需要注意这里不是简单地把网络输出当分数而是有一个高斯密度假设在背后。观测模型被建模成干净观测 状态的确定性函数 高斯噪声所以似然的形式才是高斯的。如果实际系统噪声不是高斯理论上可以换更复杂的密度形式但训练目标就要相应调整。2.4 单步目标函数的具体形态把上面两块合起来整个训练目标其实就是一个带条件的去噪损失。示意如下L(θ) E_{t, (z_t, x_t), ε, σ} [ λ(σ) · || ε - ε_θ( z_t, x_t σ·ε, σ ) ||² ]其中 ε_θ 是去噪网络它的输入包括粒子状态 z_t条件信息、含噪观测 x_t σε待去噪信号以及噪声水平 σ。真实噪声 ε 是采样出来的网络要做的事就是把 ε 预测出来损失就是两者之间的平方误差。这个公式和标准扩散模型的训练目标几乎一样唯一显著的区别是多了条件 z_t。但千万别因此小看它——正是这个条件让网络学会的不是从纯噪声里还原观测而是在已知状态假设下评估观测的合理性。训练时每个样本只涉及单个时间步的状态-观测对没有任何时间方向的展开这让它的梯度方差远小于时序目标。λ(σ) 是噪声水平的加权项。不同 σ 下损失的绝对量级差别很大如果不做加权网络会偏向学习大噪声样本小噪声下的精细去噪能力会退化。论文使用的加权方式本质上是在平衡各噪声尺度的梯度贡献这一点在消融实验中单独做了验证。3. 训练细节为什么单步能绕开时序病态方法框架清楚了还得看训练管道是怎么搭的。这里有很多容易踩坑的细节读论文时如果不仔细容易忽略。3.1 训练数据怎么构造训练 DPF 需要的不是一堆标注好的真实状态而是状态-观测在同一时刻的配对。最理想的数据来源是仿真器因为仿真器可以随时输出真实状态。但论文强调单步目标并不强依赖状态标签——如果没有真实状态可以用滤波器自身的估计结果或者某种初始化先验来代替 z_t。我在复现时发现这个设计的实际含义是训练数据可以和应用场景解耦。比如要部署在某个复杂的机器人平台上你不需要费劲标注真值只需要一条连续的观测序列自己用某个粗糙的滤波器跑一遍把中间粒子和观测配对存下来就能训练。当然没有真值时训练的收敛更慢、噪声更大但至少是可用的。更实际的数据构造方式是数据增强同一对 (z_t, x_t) 可以在多个噪声水平 σ 下重复采样。论文的默认做法是每个 batch 内混合多种 σ让网络在每个 batch 里都接触到从精细到粗糙的不同尺度。这样训练出的网络在推理时无论粒子偏离真实状态多少都有对应的去噪能力。3.2 噪声调度和时间嵌入扩散模型的噪声调度设计非常讲究DPF 直接沿用了这一套。噪声水平 σ 从小到大覆盖一个区间比如从 0.01 到 5.0具体取值取决于观测的量级。推理时粒子与真实状态的误差既可能小于观测噪声也可能大于观测噪声所以调度区间要略宽于先验估计的偏差范围。为了让网络知道当前用的是哪个 σ输入里要加入噪声水平的嵌入向量。这个嵌入通常经过一个小型 MLP 或者正弦位置编码再和观测特征相加。很多人复现时容易忽略这个条件直接把 σ 丢掉结果网络只能记住一个平均噪声水平下的行为测试时一换噪声就垮掉。另外论文里提到一个细节训练时 σ 是从调度区间里随机采样而不是固定一组值。这保证了网络不是只在几个离散尺度上工作而是学会在连续尺度上插值。这个随机采样策略几乎是零成本地提升了模型对不同噪声的鲁棒性。3.3 损失函数的平衡项刚才公式里的 λ(σ) 值得单独说。如果不加这个权重直接对不同 σ 的损失求平均大噪声样本的 MSE 数值天然会更大梯度也会被它们主导。但真实应用中小噪声情况粒子已经比较准才是滤波器稳定性的关键因为这些样本决定了权重更新的锐度。常见的加权方式有 λ(σ) 1/σ²这样做的效果是让各噪声水平下的有效信噪比接近。也可以采用基于梯度方差的启发式加权但论文使用的还是更经典的 SNR 加权。我在自己的实验里试过不做加权、线性加权和 1/σ² 加权差距非常明显不加权时粒子滤波的估计在低噪声传感器下明显偏钝换 1/σ² 之后低噪声表现立刻恢复。3.4 与双步目标在收敛行为上的区别如果有条件的话可以自己在代码里对比两种目标。双步目标训练时loss 曲线会呈现明显的周期性波动——因为每个 batch 里的两帧样本组合不同梯度方向变化剧烈而且时不时会出现一个特别大的梯度尖峰基本都对应着重采样附近的样本。单步目标下loss 曲线会平滑很多。每一个样本对是独立同分布的梯度方差几乎完全取决于 batch 内的噪声尺度混合程度和时间无关。这相当于把原来轨迹展开的风险换成了条件分布建模的风险前者很难控制后者可以通过增大 batch、调整噪声调度来控制。我认为这是论文最务实的一个贡献它把训练难度从一个工程上难以稳定的问题变成了一个已经有成熟工具的生成模型问题。4. 实验解读哪些结论值得记论文的实验设置横跨合成系统和真实数据两类场景。我不打算复述每个表格只讲几个实验设计上的亮点和值得记住的结论。4.1 合成非线性系统上的精度变化合成场景通常是一个一维或二维的非线性状态空间模型比如带强烈非线性的振荡系统。这类系统的特点是状态转移和观测模型都存在明显的非线性耦合传统粒子滤波如果模型不准精度会迅速下降。论文的对比结果显示DPF 在中等噪声水平下的滤波精度明显优于几个基线。更有意思的是它的优势在观测似然不对称时最明显。所谓不对称是指同一个观测误差在不同方向上对应的状态偏差不一样例如传感器在某个方向上的分辨率特别差。标准粒子滤波用固定协方差的似然函数时很难表达这种不对称而去噪网络学到的条件分布天然可以适应这种数据驱动的形状。4.2 粒子数、噪声水平与性能的交互我印象最深的是粒子数量的实验。直觉上粒子数越多越好但论文展示了另一个结论DPF 用较少的粒子就能达到传统方法很多粒子才能达到的精度。原因是粒子的分布合理性不同。传统方法如果似然函数给得粗糙大量粒子都落在低权重区域有效粒子数很低DPF 的去噪网络给出了更平滑、更准确的权重面粒子落在有效区域的概率大大提高。不过这里有个边界粒子数非常少时DPF 的优势也会被重采样离散误差抵消。粒子数从 10 涨到 100 时收益最明显从 100 涨到 1000 时基本饱和。这和我在实际部署里的经验一致——粒子滤波的收益曲线是凹的堆粒子数是最不经济的优化手段。4.3 真实数据的迁移表现真实数据实验上论文考虑的是训练时用一种噪声水平测试时换成另一种噪声水平的场景。传统方法面对这种 shift 通常很脆因为模型只见过训练时那一种噪声尺度。DPF 因为训练时覆盖多种噪声水平天然具备对噪声尺度变化的鲁棒性。严格说这种鲁棒性不是白来的。多噪声训练相当于一种隐式的数据增强代价是网络在非常干净的观测上可能不如专门训练的模型锐利。但真实部署中传感器噪声总是波动的这种泛化比极致的锐度更有价值。4.4 消融实验的关键发现消融实验做了三组去掉条件输入、固定噪声水平、把单步目标换成双步目标。去掉条件输入之后网络退化成一个单纯的观测自编码器粒子滤波的权重更新完全失去状态判别性性能急剧下降。这说明 z_t 这个条件不是锦上添花而是整个方法的核心。固定噪声水平之后训练更稳定但推理时一旦粒子偏差超过固定尺度权重面就会出现大片平坦区域粒子无法区分。换成双步目标之后短序列上性能接近但序列一长就出现梯度波动最终收敛精度明显差于单步目标。5. 我理解的边界与易错点读这篇论文时有几个地方如果不结合粒子滤波的背景去理解很容易产生误判。这里单独列出来说。5.1 别把去噪网络当成观测似然这是一个关键误区。去噪网络本身输出的是一堆特征或者噪声预测并不直接是一个概率值。要让网络输出变成粒子权重你必须经过一次从噪声预测到密度估计的转换。论文里用的是高斯密度假设把网络残差代入高斯核计算权重。这意味着网络只学到了一个条件评分函数真正算权重时仍然需要你选择密度形式。实际复现时这个转换的系数也就是那个 σ² 的分母很重要。设得太小会过度惩罚偏差大的粒子导致权重悬殊、粒子退化设得太大又会让所有粒子权重趋同更新失效。论文里的设置通常和训练时使用的噪声尺度挂钩但真实数据上可能需要额外调。5.2 单步目标不等于只看一步单步目标针对的是训练时的梯度路径推理时仍然在递归地做多步滤波。也就是说模型每个时刻的网络调用是独立的但粒子状态会跨时间累积。这和只看一步的贪心算法有本质区别训练目标是单步的不代表模型不利用历史信息因为当前粒子状态本身已经携带了历史信息。这个区别很重要不然你会误以为 DPF 无法应对长期遮挡或观测缺失的场合。实际上观测缺失时粒子滤波照样靠转移模型往前推只是这时候去噪网络没有观测可条件权重更新会被跳过或弱化。单步目标只是让学习更容易不是让模型失去记忆能力。5.3 重采样策略仍然关键论文的重心在训练目标但推理时的重采样策略依然决定最终效果。我试过在不同任务上换用多项式重采样、残差重采样和系统重采样差异非常明显。系统重采样通常会带来更低的方差但计算量稍高多项式重采样简单但容易引入额外噪声。如果你的部署环境对响应时间敏感建议在推理时加入有效样本量ESS阈值判断ESS 低于某个阈值才触发重采样否则继续递推。这个小技巧和论文方法完全正交但组合使用效果很好能省掉大量无意义的重采样开销。6. 结合我自己的复现经验如果要从零实现最后分享一下我从零复现这个方法的实际流程。如果你打算在项目里试用可以按下面的顺序推进能少走不少弯路。6.1 最小可复现流程首先你需要一个能产出状态-观测对的数据源。最省事的是随便选一个非线性运动模型自己写个仿真器同时记录真值和观测。然后定义去噪网络。状态维度不高时一个带条件输入的 MLP 就够了高维状态加图像观测则建议用类似扩散模型的 U-Net 结构。输入是观测和噪声水平的嵌入条件特征是状态向量输出是和观测相同维度的噪声预测。训练数据构造。对每个时刻的状态-观测对随机采样 σ 和噪声 ε构造含噪观测 x_t σε把 (z_t, 含噪观测, σ, ε) 存成一个样本。训练损失。直接用预测噪声和真实噪声的 MSE 乘上 λ(σ)优化器建议用 AdamW学习率 3e-4 起步。推理。先跑一个标准的 bootstrap 粒子滤波骨架把似然函数换成基于去噪网络残差的高斯核其他流程完全保留。一个容易犯错的点训练时状态 z_t 和观测 x_t 必须是同一时刻的配对。如果你不小心用了上一时刻的状态配对当前观测网络会学到错误的时序关联推理时权重更新会失真。6.2 稳定训练的几个技巧第一输入归一化一定要做。状态和观测的量级如果差太多去噪网络的损失会被大尺度变量主导。我习惯先把观测标准化到零均值单位方差再乘上噪声水平这样 σ 的物理含义更清晰。第二每个 batch 内混合多种噪声尺度。不要一个 batch 全是大噪声下一个 batch 全是小噪声这样梯度方向会来回震荡。固定一个噪声水平列表比如 0.01 到 2.0 之间均匀取 10 档每个 batch 内按档位均衡采样。第三梯度裁剪是必需品。虽然单步目标比双步目标稳定但极端噪声样本仍然可能产生大梯度。梯度范数裁剪到 1.0 左右训练几乎不会出现 NaN。第四如果在真实数据上训练且没有真值状态建议先用一个粗糙的扩展卡尔曼滤波器生成伪状态标签再送入去噪网络训练。伪标签的噪声会让训练目标变成一种噪声之上的噪声但实践中仍然能学到有效的权重区分度比完全冷启动好得多。6.3 可以继续扩展的方向DPF 的框架本身没有绑定具体网络结构所以扩展空间很大。我在自己的项目里试过把去噪网络换成分层结构一个模块做观测去噪一个模块做状态之间的转移校正效果比单网络好但训练复杂度也上去了。另外多模态观测的融合也值得试不同传感器可以各自加噪、各自去噪最后在权重更新时做乘积融合这和粒子滤波的多传感器更新天然吻合。还有一个方向是把它和在线学习结合。单步目标的样本独立性非常友好新数据来了可以直接做增量训练不需要缓存整条轨迹。这在机器人持续部署的场景里很有吸引力。我自己读完这篇论文最大的感受是状态估计问题里很多难其实是被训练目标的选择放大了。粒子滤波本身不复杂复杂的是把一个递归过程变成可优化的计算图。从去噪扩散模型里借一个单步目标看起来只是换个损失函数实际上是把问题从时序层面的病态求解转成了空间层面的条件生成建模。这个视角对做在线估计的人来说价值不亚于再刷几个百分点精度。 SEO 优化官网定制响应式建站教育培训建站