本文仅用于个人学习的总结。不保证正确性。
前段时间报名的深蓝学院的激光SLAM的课程基本结束,感觉和之前阅读的《概率机器人》一书内容有很多相通,于是决定再读一遍这本书,希望能够有更深入的了解。看到了之前就搞不懂的“粒子滤波”部分,下定决心认真学习,虽然还是没有完全搞懂,但学习的深入了一些。
0. 参考资料
bilibili的讲解视频,非常系统:https://www.bilibili.com/video/BV1wW411S7mn?p=1
简书:随机模拟-Monte Carlo积分及采样:https://www.jianshu.com/p/3d30070932a8
1. 贝叶斯滤波
贝叶斯滤波是第二章节的内容,后面第三章卡尔曼滤波、第四章的粒子滤波,都属于贝叶斯滤波体系。贝叶斯滤波首先通过上一时刻的状态,预测当前时刻的结果,然后根据观测结果进行更新。
在bilibili的视频中,Up主解释了什么叫“滤波filtering”,即求解
p
(
x
t
∣
z
1
:
t
)
p(x_t|z_{1:t})
p(xt∣z1:t)。截图中Up主采用的符号表示与我常见的正好相反,他用
z
z
z表示状态,
x
x
x表示观测,但为了统一,还是采用
x
x
x为状态,
z
z
z为观测这种表示。截图由右上角部分,表示如果是一个线性高斯系统,采用卡尔曼滤波;非线性非高斯,可以采用扩展卡尔曼进行线性化,也可以采用粒子滤波这种非参数表示方法。关于卡尔曼滤波可以参考之前总结的博客。
2. 粒子滤波
Up主讲到,基本的粒子滤波是“sequential importance sampling (SIS) + resampling”,即“序列重要性采样+重采样”。所谓SIS是重要性才采样(IS)的一种改进,我没搞懂大概的区别。大概来说,就是我需要得到一个分布的采样结果(称“目标分布”,但这个分布可能未知或者很难求得(我一直没搞懂什么叫“未知”,因为后面计算重要性时还是带入进行了计算,所以不太理解实际应用时是个什么情况),于是我们用一个估计的分布,叫做“建议分布”,来得到目标分布的结果。
首先根据建议分布生成一组采样数据,即一组粒子。之后对每个粒子赋予不同的权重,权重的定义从图上可以看出来就是
p
(
z
)
/
q
(
z
)
p(z)/q(z)
p(z)/q(z) 即目标分布与建议分布的比值,可以理解为,如果这两个分布越接近,比值接近于1,则建议分布的采样结果就是真实目标分布的采样结果;否则,若比值接近于0,意味着建议分布在这个区域的采样没有参考价值(目标分布在这个区域概率密度极低)。经过此操作后,带权重的粒子就能更好的逼近真实分布。下图(b)中
g
g
g为建议分布,
f
f
f为目标分布,下方的短线段表示根据建议分布采样得到的粒子群;©中根据
f
/
g
f/g
f/g 的值给不同的粒子赋予不同的权重,可以看出虽然在
[
8
−
10
]
[8-10]
[8−10]之间有大量粒子,但权重很低。
在完成重要性采样后,需要再经过一个“重采样”过程,按照当前粒子的重要性加权进行采样,得到相同数量的粒子且权重都一样。之所以采用重采样,是因为若不进行重采样,在之后需不断滤波更新权重时,权重会分布的极其不均匀,出现极少数粒子权重极大,大多数粒子权重接近0的退化情况,本质原因还是粒子数量相比于空间维度不充足。解决方法有:1. 增加粒子数量(不现实,需指数级别增加);2. 寻找更接近目标分布的建议分布(也不现实,真的能很精确就不需要这么搞了);3. 重采样。
完整的 SIR(Sequential Importance - Resampling)算法如下。可以看出,权重在Sampling时进行更新,更新的依据就是目标分布与建议分布的比值(这部分由 sequential importance sampling 推导得出)。
如果将建议分布采用观测模型进行带入,便得到了粒子滤波算法中,采用观测模型进行权重计算的方法。由于之前的权重都是相同的,而且之后权重进行归一化,所以直接计算而不需要迭代。
3. 小结
稀里糊涂,就算自己大概懂了吧。理解了重要性、重采样的由来是有这么多的数学依据,以及不理解什么叫目标分布很难采样,希望以后学习过程中能不断理解。
注:所有图片来自:《概率机器人》、参考资料中bilibili的视频截图、简书的配图。
4. 后记
- 粒子滤波是对所有粒子施加运动模型,然后利用观测进行赋权,不需要计算后验;
- 采样xt比计算xt的密度要容易:采样是运动模型的前向仿真,而计算位姿的概率意味着重新推测误差参数,这需要计算物理运动模型的逆。