在引入粒子滤波之前,有必要对其相关知识进行介绍。
动态模型的一个主要特点是在概率模型中引入时间序列的概念,使得每个样本之间不再独立同分布,而变得有依赖关系了。
我们所看到的序列被称为观测序列,每个观测值背后都有一个隐变量,这个隐变量即系统状态,因此,动态模型又称为状态空间模型。
动态模型又分为三大类:
动态模型满足两个假设:
动态模型可以用两个方程定义:
z t = g ( z t − 1 , u , ε ) x t = h ( z t , u , δ ) z_t=g(z_{t-1}, u, \varepsilon) \\ x_t=h(z_t, u, \delta) zt=g(zt−1,u,ε)xt=h(zt,u,δ)
第一个式子表示前一个状态和后一个状态之间的关系;第二个式子表示该时刻的状态和该时刻的观测值之间的关系。 u u u是系统的一个输入信号,可有可无。
卡尔曼滤波是一个典型的线性动态系统,它可以被定义为:
z t = A ⋅ z t − 1 + B + ε x t = C ⋅ z t + D + δ z_t=A\cdot z_{t-1}+B+\varepsilon \\ x_t=C\cdot z_{t}+D+\delta zt=A⋅zt−1+B+εxt=C⋅zt+D+δ
其中, ε ∼ N ( 0 , Q ) \varepsilon \sim N(0, Q) ε∼N(0,Q), δ ∼ N ( 0 , R ) \delta \sim N(0, R) δ∼N(0,R),即 ε \varepsilon ε和 δ \delta δ都是服从高斯分布的噪声,它们的方差矩阵分别为 Q Q Q和 R R R。
不管是线性动态系统还是非线性动态系统,它们所关注的问题通常都是filtering问题,即给定了第1时刻到第t时刻的观测值,求t时刻隐状态的概率,也就是 P ( z t ∣ x 1 , ⋯ , x t ) P(z_t|x_1, \cdots, x_t) P(zt∣x1,⋯,xt)。
在求解filtering问题时,通常有两个步骤:
在这两个步骤中, P ( z t ∣ x 1 , ⋯ , x t − 1 ) P(z_t|x_1, \cdots, x_{t-1}) P(zt∣x1,⋯,xt−1)相当于对 z t z_t zt的先验,因为此时 t t t时刻的观测值是未知的;在知道 t t t时刻的观测值 x t x_t xt之后,对该先验概率进行更新,得到 z t z_t zt的后验概率 P ( z t ∣ x 1 , ⋯ , x t ) P(z_t|x_1, \cdots, x_t) P(zt∣x1,⋯,xt)。
对预测公式的详细推导如下:
P ( z t ∣ x 1 , ⋯ , x t − 1 ) = ∫ z t − 1 P ( z t − 1 , z t ∣ x 1 , ⋯ , x t − 1 ) d z t − 1 = ∫ z t − 1 P ( z t ∣ z t − 1 , x 1 , ⋯ , x t − 1 ) ⋅ P ( z t − 1 ∣ x 1 , ⋯ , x t − 1 ) d z t − 1 = ∫ z t − 1 P ( z t ∣ z t − 1 ) ⋅ P ( z t − 1 ∣ x 1 , ⋯ , x t − 1 ) d z t − 1 \begin{aligned} P(z_t|x_1, \cdots, x_{t-1}) & = \int_{z_{t-1}}P(z_{t-1}, z_t|x_1, \cdots, x_{t-1})dz_{t-1} \\ & = \int_{z_{t-1}}P(z_t|z_{t-1}, x_1, \cdots, x_{t-1})\cdot P(z_{t-1}|x_1, \cdots, x_{t-1})dz_{t-1} \\ & = \int_{z_{t-1}}P(z_t|z_{t-1})\cdot P(z_{t-1}|x_1, \cdots, x_{t-1})dz_{t-1} \end{aligned} P(zt∣x1,⋯,xt−1)=∫zt−1P(zt−1,zt∣x1,⋯,xt−1)dzt−1=∫zt−1P(zt∣zt−1,x1,⋯,xt−1)⋅P(zt−1∣x1,⋯,xt−1)dzt−1=∫zt−1P(zt∣zt−1)⋅P(zt−1∣x1,⋯,xt−1)dzt−1
对更新公式的详细推导如下:
P ( z t ∣ x 1 , ⋯ , x t ) = P ( x 1 , ⋯ , x t , z t ) P ( x 1 , ⋯ , x t ) = 1 P ( x 1 , ⋯ , x t ) P ( x t ∣ x 1 , ⋯ , x t − 1 , z t ) ⋅ P ( x 1 , ⋯ , x t − 1 , z t ) = 1 P ( x 1 , ⋯ , x t ) P ( x t ∣ z t ) ⋅ P ( z t ∣ x 1 , ⋯ , x t − 1 ) P ( x 1 , ⋯ , x t − 1 ) = P ( x 1 , ⋯ , x t − 1 ) P ( x 1 , ⋯ , x t ) P ( x t ∣ z t ) ⋅ P ( z t ∣ x 1 , ⋯ , x t − 1 ) \begin{aligned} P(z_t|x_1, \cdots, x_{t}) & = \frac{P(x_1, \cdots, x_{t}, z_t)}{P(x_1, \cdots, x_{t})} \\ & = \frac{1}{P(x_1, \cdots, x_{t})}P(x_t|x_1, \cdots, x_{t-1}, z_t)\cdot P(x_1, \cdots, x_{t-1}, z_t) \\ & = \frac{1}{P(x_1, \cdots, x_{t})}P(x_t|z_t)\cdot P(z_t|x_1, \cdots, x_{t-1})P(x_1, \cdots, x_{t-1}) \\ & = \frac{P(x_1, \cdots, x_{t-1})}{P(x_1, \cdots, x_{t})}P(x_t|z_t)\cdot P(z_t|x_1, \cdots, x_{t-1}) \end{aligned} P(zt∣x1,⋯,xt)=P(x1,⋯,xt)P(x1,⋯,xt,zt)=P(x1,⋯,xt)1P(xt∣x1,⋯,xt−1,zt)⋅P(x1,⋯,xt−1,zt)=P(x1,⋯,xt)1P(xt∣zt)⋅P(zt∣x1,⋯,xt−1)P(x1,⋯,xt−1)=P(x1,⋯,xt)P(x1,⋯,xt−1)P(xt∣zt)⋅P(zt∣x1,⋯,xt−1)
此处的第一项由于概率中和隐变量没有关系,属于已知量,所以可作为常数看待。
卡尔曼滤波中的所有概率(条件概率、联合概率等)都是服从高斯分布的,因此我们可以得到filtering问题的解析解。但是对于非线性非高斯的动态系统,所有概率都有可能不是高斯分布的,因此是得不到解析解的,我们只能通过采样的方式(蒙特卡洛法)来近似求得所有概率的值。
本节主要介绍蒙特卡洛采样法,即以抽样的方法去近似求得后验概率 P ( z ∣ x ) P(z|x) P(z∣x)。大多数情况下,当得到后验概率时,我们更关心的是与该后验概率相关得期望,如 E z ∣ x [ f ( x ) ] E_{z|x}[f(x)] Ez∣x[f(x)]。
E z ∣ x [ f ( z ) ] = ∫ f ( z ) P ( z ∣ x ) d z ≈ 1 N ∑ i = 1 N f ( z i ) E_{z|x}[f(z)] = \int f(z)P(z|x)dz≈ \frac{1}{N}\sum_{i=1}^Nf(z^i) Ez∣x[f(z)]=∫f(z)P(z∣x)dz≈N1i=1∑Nf(zi)
这里从 P ( z ∣ x ) P(z|x) P(z∣x)中随机采样了N个样本,记作 z ( 1 ) , z ( 2 ) , ⋯ , z ( N ) z^{(1)}, z^{(2)}, \cdots, z^{(N)} z(1),z(2),⋯,z(N)。
当 P ( z ∣ x ) P(z|x) P(z∣x)很复杂,或维度特别高时,我们难以在 P ( z ∣ x ) P(z|x) P(z∣x)中采样,此时需要应用重要性采样(importance sampling)来解决这一问题。
在重要性采样中,我们引入了一个简单的,易于采样的分布 q ( z ∣ x ) q(z|x) q(z∣x),则:
E z ∣ x [ f ( z ) ] = ∫ f ( z ) P ( z ∣ x ) d z = ∫ f ( z ) p ( z ∣ x ) q ( z ∣ x ) q ( z ∣ x ) d z = 1 N ∑ i = 1 N f ( z ( i ) ) ⋅ p ( z ( i ) ∣ x ) q ( z ( i ) ∣ x ) \begin{aligned} E_{z|x}[f(z)] & =\int f(z)P(z|x)dz \\ & = \int f(z) \frac{p(z|x)}{q(z|x)}q(z|x)dz \\ & = \frac{1}{N} \sum_{i=1}^Nf(z^{(i)})\cdot \frac{p(z^{(i)}|x)}{q(z^{(i)}|x)} \end{aligned} Ez∣x[f(z)]=∫f(z)P(z∣x)dz=∫f(z)q(z∣x)p(z∣x)q(z∣x)dz=N1i=1∑Nf(z(i))⋅q(z(i)∣x)p(z(i)∣x)
这里从 q ( z ∣ x ) q(z|x) q(z∣x)中随机采样了N个样本,记作 z ( 1 ) , z ( 2 ) , ⋯ , z ( N ) z^{(1)}, z^{(2)}, \cdots, z^{(N)} z(1),z(2),⋯,z(N)。上式中的 q ( z ∣ x ) q(z|x) q(z∣x)称为提议分布(proposal distribution), p ( z ( i ) ∣ x ) q ( z ( i ) ∣ x ) \frac{p(z^{(i)}|x)}{q(z^{(i)}|x)} q(z(i)∣x)p(z(i)∣x)表示权重(weight),可以写作 w i w^{i} wi。
这里的filtering问题也就是之前在背景里讲过的 P ( z t ∣ x 1 , ⋯ , x t ) = P ( z t ∣ x 1 : t ) P(z_t|x_1, \cdots , x_t)=P(z_t|x_{1:t}) P(zt∣x1,⋯,xt)=P(zt∣x1:t),此时t时刻第i个样本的权重可写成 w t ( i ) = P ( z t ( i ) ∣ x 1 : t ) q ( z t ( i ) ∣ x 1 : t ) w_t^{(i)}=\frac{P(z_t^{(i)}|x_{1:t})}{q(z_t^{(i)}|x_{1:t})} wt(i)=q(zt(i)∣x1:t)P(zt(i)∣x1:t)。
在迭代计算filtering问题过程中,我们需要在每个时刻都求N个权重( w 1 ( 1 ) , w 1 ( 2 ) , ⋯ , w 1 ( N ) w_1^{(1)}, w_1^{(2)}, \cdots, w_1^{(N)} w1(1),w1(2),⋯,w1(N)),这是十分困难的(主要是因为 P ( z t ( i ) ∣ x 1 : t ) P(z_t^{(i)}|x_{1:t}) P(zt(i)∣x1:t)不好求)。因此我们希望找到一个递推公式使得通过前一个时刻求出来的权重得到后一个时刻的权重。
由此想法,引出另一个算法,即序列重要性采样(sequential importance sampling, SIS)。
序列重要性采样的思路是找到 w t ( i ) w_t^{(i)} wt(i)和 w t − 1 ( i ) w_{t-1}^{(i)} wt−1(i)这两个权重之间的递推关系。为简便(避免积分运算),SIS将关注点设在求概率 P ( z 1 : t ∣ x 1 : t ) P(z_{1:t}|x_{1:t}) P(z1:t∣x1:t)上,而不是 P ( z t ∣ x 1 : t ) P(z_t|x_{1:t}) P(zt∣x1:t)上,因此
w t ( i ) ∝ P ( z 1 : t ∣ x 1 : t ) q ( z 1 : t ∣ x 1 : t ) w_t^{(i)} \varpropto \frac{P(z_{1:t}|x_{1:t})}{q(z_{1:t}|x_{1:t})} wt(i)∝q(z1:t∣x1:t)P(z1:t∣x1:t)
首先看分子:
P ( z 1 : t ∣ x 1 : t ) = P ( z 1 : t , x 1 : t ) P ( x 1 : t ) = 1 P ( x 1 : t ) P ( z 1 : t , x 1 : t ) = 1 P ( x 1 : t ) P ( x t ∣ z 1 : t , x 1 : t − 1 ) P ( z 1 : t , x 1 : t − 1 ) = 1 P ( x 1 : t ) P ( x t ∣ z t ) P ( z 1 : t , x 1 : t − 1 ) = 1 P ( x 1 : t ) P ( x t ∣ z t ) P ( z t ∣ z 1 : t − 1 , x 1 : t − 1 ) P ( z 1 : t − 1 , x 1 : t − 1 ) = 1 P ( x 1 : t ) P ( x t ∣ z t ) P ( z t ∣ z t − 1 ) P ( z 1 : t − 1 , x 1 : t − 1 ) = 1 P ( x 1 : t ) P ( x t ∣ z t ) P ( z t ∣ z t − 1 ) P ( z 1 : t − 1 ∣ x 1 : t − 1 ) P ( x 1 : t − 1 ) = P ( x 1 : t − 1 ) P ( x 1 : t ) P ( x t ∣ z t ) P ( z t ∣ z t − 1 ) P ( z 1 : t − 1 ∣ x 1 : t − 1 ) \begin{aligned} P(z_{1:t}|x_{1:t}) & = \frac{P(z_{1:t}, x_{1:t})}{P(x_{1:t})} \\ & = \frac{1}{P(x_{1:t})} P(z_{1:t}, x_{1:t}) \\ & = \frac{1}{P(x_{1:t})}P(x_t|z_{1:t}, x_{1:t-1})P(z_{1:t}, x_{1:t-1}) \\ & = \frac{1}{P(x_{1:t})}P(x_t|z_t)P(z_{1:t, x_{1:t-1}}) \\ & = \frac{1}{P(x_{1:t})}P(x_t|z_t)P(z_t|z_{1:t-1}, x_{1:t-1})P(z_{1:t-1}, x_{1:t-1}) \\ & = \frac{1}{P(x_{1:t})}P(x_t|z_t)P(z_t|z_{t-1})P(z_{1:t-1}, x_{1:t-1}) \\ & = \frac{1}{P(x_{1:t})}P(x_t|z_t)P(z_t|z_{t-1})P(z_{1:t-1}|x_{1:t-1})P(x_{1:t-1}) \\ & = \frac{P(x_{1:t-1})}{P(x_{1:t})}P(x_t|z_t)P(z_t|z_{t-1})P(z_{1:t-1}|x_{1:t-1}) \end{aligned} P(z1:t∣x1:t)=P(x1:t)P(z1:t,x1:t)=P(x1:t)1P(z1:t,x1:t)=P(x1:t)1P(xt∣z1:t,x1:t−1)P(z1:t,x1:t−1)=P(x1:t)1P(xt∣zt)P(z1:t,x1:t−1)=P(x1:t)1P(xt∣zt)P(zt∣z1:t−1,x1:t−1)P(z1:t−1,x1:t−1)=P(x1:t)1P(xt∣zt)P(zt∣zt−1)P(z1:t−1,x1:t−1)=P(x1:t)1P(xt∣zt)P(zt∣zt−1)P(z1:t−1∣x1:t−1)P(x1:t−1)=P(x1:t)P(x1:t−1)P(xt∣zt)P(zt∣zt−1)P(z1:t−1∣x1:t−1)
注意,这里的 P ( x 1 : t − 1 ) P(x_{1:t-1}) P(x1:t−1)和 P ( x 1 : t ) P(x_{1:t}) P(x1:t)都是已知的,视为常数。
然后看分母:
由于 q q q是我们任意指定的,所以我们假定 q q q为以下这种形式:
q ( z 1 : t ∣ x 1 : t ) = q ( z t ∣ z 1 : t − 1 , x 1 : t ) q ( z 1 : t − 1 ∣ x 1 : t − 1 ) q(z_{1:t}|x_{1:t})=q(z_{t}|z_{1:t-1}, x_{1:t})q(z_{1:t-1}|x_{1:t-1}) q(z1:t∣x1:t)=q(zt∣z1:t−1,x1:t)q(z1:t−1∣x1:t−1)
综合以上,我们得到:
w t ( i ) ∝ P ( z 1 : t ∣ x 1 : t ) q ( z 1 : t ∣ x 1 : t ) ∝ P ( x t ∣ z t ) P ( z t ∣ z t − 1 ) P ( z 1 : t − 1 ∣ x 1 : t − 1 ) q ( z t ∣ z 1 : t − 1 , x 1 : t ) q ( z 1 : t − 1 ∣ x 1 : t − 1 ) = P ( x t ∣ z t ) P ( z t ∣ z t − 1 ) q ( z t ∣ z 1 : t − 1 , x 1 : t ) w t − 1 ( i ) w_t^{(i)} \varpropto \frac{P(z_{1:t}|x_{1:t})}{q(z_{1:t}|x_{1:t})} \varpropto \frac{P(x_t|z_t)P(z_t|z_{t-1})P(z_{1:t-1}|x_{1:t-1})}{q(z_{t}|z_{1:t-1}, x_{1:t})q(z_{1:t-1}|x_{1:t-1})}=\frac{P(x_t|z_t)P(z_t|z_{t-1})}{q(z_{t}|z_{1:t-1}, x_{1:t})}w_{t-1}^{(i)} wt(i)∝q(z1:t∣x1:t)P(z1:t∣x1:t)∝q(zt∣z1:t−1,x1:t)q(z1:t−1∣x1:t−1)P(xt∣zt)P(zt∣zt−1)P(z1:t−1∣x1:t−1)=q(zt∣z1:t−1,x1:t)P(xt∣zt)P(zt∣zt−1)wt−1(i)
这样一来,就解决了从前一时刻的权重递推后一时刻权重的问题了。
从上一节我们已知 w t ( i ) ∝ P ( x t ∣ z t ) P ( z t ∣ z t − 1 ) q ( z t ∣ z 1 : t − 1 , x 1 : t ) w t − 1 ( i ) w_t^{(i)} \varpropto \frac{P(x_t|z_t)P(z_t|z_{t-1})}{q(z_{t}|z_{1:t-1}, x_{1:t})}w_{t-1}^{(i)} wt(i)∝q(zt∣z1:t−1,x1:t)P(xt∣zt)P(zt∣zt−1)wt−1(i),此时假设 z t z_{t} zt只和 z t − 1 z_{t-1} zt−1相关,则 q ( z t ∣ z 1 : t − 1 , x 1 : t ) = q ( z t ∣ z t − 1 , x 1 : t ) q(z_{t}|z_{1:t-1}, x_{1:t})=q(z_{t}|z_{t-1}, x_{1:t}) q(zt∣z1:t−1,x1:t)=q(zt∣zt−1,x1:t)。
总结来说该算法可以写成:
前提:t-1时刻的采样已经完成,则 w t − 1 ( i ) w_{t-1}^{(i)} wt−1(i)已知;
在t时刻:
for i=1: N
end
w t ( i ) w_t^{(i)} wt(i)归一化: ∑ i = 1 N w t ( i ) = 1 \sum_{i=1}^Nw_t^{(i)}=1 ∑i=1Nwt(i)=1
在实际运行过程中,SIS会出现权值退化(权值衰减)问题,即在迭代过程中, w t ( i ) w_t^{(i)} wt(i)会变得越来越小,或越来越不平均。比如有100个样本,99个样本的权重都接近0,只有一个样本的权重接近1。这样的样本方差过大,不适合去逼近一个分布。这种问题是由高维空间所引起的,维数越高,需要的样本容量是呈指数级往上增的(维度灾难)。应对这个问题,通常有两个解决方法:
假设共采样了三个样本,它们的权重分别为0.1,0.1,0.8,显然第三个样本的权重远远大于另外两个样本。重采样的思想实际上就是将样本的权重视为概率,即有0.1的概率会抽取到样本1和样本2,有0.8的概率会抽取到样本3。因此,在重采样后,假设重新抽取到了10个样本,那么它们的分布很大可能会如上图所示,有80%的样本属于原来的样本3,有10%的样本属于原来的样本1和样本2。新采样得到的样本的权重都是相同的(0.1)。
实际上将序列重要性采样与重采样结合起来就是基本的粒子滤波算法。
提议分布的选择与最终效果的好坏是息息相关的,一般来说,我们选择
q ( z t ∣ z 1 : t − 1 , x 1 : t ) = q ( z t ∣ z t − 1 , x 1 : t ) = P ( z t ∣ z t − 1 ) q(z_t|z_{1:t-1}, x_{1:t})=q(z_t|z_{t-1}, x_{1:t})=P(z_t|z_{t-1}) q(zt∣z1:t−1,x1:t)=q(zt∣zt−1,x1:t)=P(zt∣zt−1)
在上一节中我们已经推导出了基本粒子滤波算法的步骤,那么可将其改进为:
整个改进完的算法叫做Sampling importance resampling(SIR Filter),实际上就是SIS+Resampling+提议分布。