線形ガウス系に対するベイズフィルタの厳密解であるカルマンフィルタについてまとめます。ロボティクス、制御、信号処理、時系列推定など、非常に広い分野で使われています。
本記事では、カルマンフィルタをベイズフィルタの立場から捉え直し、前提、意味、更新式、そして導出までを教科書に近い丁寧さで整理します。数式の見た目だけを追うのではなく、各式が何をしているのかも併せて説明します。
カルマンフィルタが扱う問題
カルマンフィルタは、時刻とともに変化する隠れ状態 xt を、制御入力 ut と観測 zt から逐次推定する方法です。
ここでいう状態とは、推定したい内部変数をまとめたベクトルです。例えば移動ロボットなら、位置、速度、姿勢、角速度などをまとめて状態に含めます。
カルマンフィルタでは、各時刻の信念を確率分布
bel(xt)=p(xt∣z1:t u1:t)
として扱います。これは、時刻 t までの観測列 z1:t と制御列 u1:t をすべて使ったときの状態 xt の事後分布です。
ベイズフィルタの一般形では、この信念は次の 2 段階で更新されます。
(1)予測
bel(xt)=∫p(xt∣ut xt−1) bel(xt−1) dxt−1
(2)観測更新
bel(xt)=η p(zt∣xt) bel(xt)
この一般式はそのままでは実際に計算できないことが多いです。そこで、特別な仮定のもとでこのベイズフィルタを厳密かつ効率的に計算するのがカルマンフィルタです。
前提
カルマンフィルタが厳密に成立するためには、3 つの仮定が必要です。
1. 初期信念がガウス分布であること
初期状態に対する信念がガウス分布であるとします。
bel(x0)=N(x0 ; μ0 Σ0)
ここで μ0 は初期平均、Σ0 は初期共分散です。
2. 状態遷移が線形ガウスであること
状態遷移確率 p(xt∣ut,xt−1) が線形であり、ガウスノイズが加算されている形である必要があります。これはつまり、状態遷移モデルが
xt=Atxt−1+Btut+εt
と表されることを意味します。ここで
- xt は n 次元の状態ベクトル、ut は m 次元の状態ベクトル
- At は状態遷移行列(n×nの正方行列)
- Bt は制御入力行列(n×m の行列)
- εt は平均 0、共分散 Rt のガウスノイズ
です。ここで補足ですが、xt と ut をそのまま足しているのではないです。Bt は制御入力 ut を状態空間へ写し、その結果として生じる状態変化を表します。
例えばモータ指令は位置や姿勢そのものではありませんが、その指令がどのように状態変化へ寄与するかを Bt が表現します。
したがって状態遷移確率は
p(xt∣ut,xt−1)=N(xt,Atxt−1+Btut,Rt)
となります。
3. 観測モデルが線形ガウスであること
観測確率 p(zt∣xt) もまた、線形でガウスノイズが加算されている形である必要があります。観測モデルを
zt=Ctxt+δt
とします。ここで
- Ct は観測行列
- δt は平均 0、共分散 Qt のガウス雑音
です。したがって観測確率が
p(zt∣xt)=N(zt ; Ctxt Qt)
と表されることが必要になります。
カルマンフィルタの導出
では実際にカルマンフィルタを導出していきたいと思います。先ほどの仮定も改めて下記で必要に応じて導入していきます。
予測ステップ
まず bel(xt) に線形ガウス系を当てはめることから考えます。
予測分布
予測 belief は現時刻での観測 zt を取り込む前の
bel(xt)=p(xt∣z1:t−1,u1:t)
です。belief などについては
ベイズフィルタの導出(ロボットと環境との相互作用について)
『Probabilistic Robotics』 の Chapter2. Recursive State Estimation についてのメモです。確率的にロボティクスを扱う場合に必要となる基本的な用語の整理から、ベイズフィルタの導出までをまとめました。
の記事も参考にしてみてください。
bel(xt)=p(xt∣z1:t−1,u1:t)=∫p(xt∣xt−1,z1:t−1,u1:t)p(xt−1∣z1:t−1,u1:t)dxt−1=∫p(xt∣xt−1,ut)p(xt−1∣z1:t−1,u1:t−1)dxt−1
マルコフ性(状態 x が完全であること)から観測 z1:t−1 には依存しないため
p(xt∣xt−1,z1:t−1,u1:t)=p(xt∣xt−1,ut)
が成り立つこと、xt−1 では未来側にある ut には依存しないため
p(xt−1∣z1:t−1,u1:t)=p(xt−1∣z1:t−1,u1:t−1)
が成り立つことを用いて3行目の変換を行いました。以上より、予測 belief bel(xt) は、
bel(xt)=p(xt∣z1:t−1,u1:t)=∫p(xt∣xt−1,ut) bel(xt−1) dxt−1
と、前時刻を含んだ再帰的な形で表せます。
線形ガウス系の適用
ここまでは線形ガウス系を想定しておらず一般的な議論でしたが、ここからはカルマンフィルタで想定する系について考えていきます。
カルマンフィルタで想定する問題では、状態遷移を
xt=Atxt−1+Btut+εt
ノイズを
εt∼N(0,Rt)
と置きます。このとき遷移確率は
p(xt∣xt−1,ut)=N(xt;Atxt−1+Btut,Rt)
前時刻 belief もガウスとして
bel(xt−1)=N(xt−1;μt−1,Σt−1)
となります。いま状態遷移において
Atxt−1+Btut
は既知の定数で、この状態遷移 xt−1→xt がガウスノイズ εt によってふらつくことを想定しています。そのため、εt が平均 0 分散 Rt のガウス分布に従っていてそれが定数分だけ平均がずれる形になっているので、
遷移確率がすぐに計算できている(単にガウス分布の平行移動で表されている)ということです。
これらを用いると
bel(xt)=∫N(xt;Atxt−1+Btut,Rt)N(xt−1;μt−1,Σt−1)dxt−1
です。いま xt 自体は
xt=Atxt−1+Btut+εt
のように、ガウス分布に従う確率変数の線形変換とその和になっているので、ガウス分布に従います。そのため bel(xt) もガウス分布に従います。
平均と共分散
平均の予測は
E[xt]=E[Atxt−1+Btut+εt]=AtE[xt−1]+Btut+E[εt]=Atμt−1+Btut
より、
μˉt=Atμt−1+Btut
です。
共分散の予測は
Σt≡Cov(xt)=E[(xt−μt)(xt−μt)⊤]=E[(At(xt−1−μt−1)+εt)(At(xt−1−μt−1)+εt)⊤]=...=AtΣt−1At⊤+Rt
となります。
更新ステップ
状態 xt の事後分布
zt を新しい観測として、条件 z1:t−1,u1:t のもとでベイズの定理を使うと
p(xt∣z1:t,u1:t)⇔bel(xt)=p(zt∣z1:t−1,u1:t)p(zt∣xt,z1:t−1,u1:t) p(xt∣z1:t−1,u1:t)=p(zt∣z1:t−1,u1:t)p(zt∣xt) p(xt∣z1:t−1,u1:t)=p(zt∣z1:t−1,u1:t)p(zt∣xt)bel(xt)=η p(zt∣xt)bel(xt)
以上から状態 xt の事後分布は
bel(xt)=η p(zt∣xt)bel(xt)
となります。
- bel(xt) は予測分布
- p(zt∣xt) は観測尤度
- η は正規化定数
です。
この式は、予測と観測を掛け合わせて、より確からしい状態分布に更新していることを意味します。
計算1:予測分布について
以上の事後分布の導出は一般的なもので、ここからカルマンフィルタでの考え方を見ていきます。
まず予測ステップの結果として、状態 xt の予測分布がガウス分布で与えられているとします。
bel(xt)=N(xt;μt,Σt)
これは、時刻 t の観測 zt をまだ見ていない段階で、状態がどのあたりにありそうかを表しています。
計算2:観測モデルについて
次に、観測が状態からどのように生成されるかを表す観測モデルを導入します。
線形ガウスモデルでは、観測も予測時と同様にガウスノイズのふらつきをもっていることを仮定します。
zt=Ctxt+δt
δt∼N(0,Qt)
したがって尤度は
p(zt∣xt)=N(zt;Ctxt,Qt)
です。
計算3:ベイズ更新式へ代入
予測分布と観測尤度を用いると
bel(xt)=η p(zt∣xt)bel(xt)=η N(zt;Ctxt,Qt)N(xt;μt,Σt)
となり、事後分布 bel(xt) はガウス分布の積の形で表されます。この式計算を追っていきます。事後分布は
bel(xt)=η exp(−Jt)
Jt=21(zt−Ctxt)⊤Qt−1(zt−Ctxt)+21(xt−μt)⊤Σt−1(xt−μt)
と書き表せます。この Jt は、xt に関する二次式です。したがって、bel(xt) は xt に関するガウス分布になります。ここが更新ステップの数学的な核心で、予測分布も観測尤度もガウスであるため、その積もまたガウス分布に従います。
更新後の共分散
ガウス分布では、指数部の二次項の係数が共分散の逆行列に対応します。したがって、Jt を xt について 2 回微分すると、更新後共分散の逆行列が得られます。まず 1 回微分すると
∂xt∂Jt=−Ct⊤Qt−1(zt−Ctxt)+Σt−1(xt−μt)
さらに 2 回微分すると
∂xt2∂2Jt=Ct⊤Qt−1Ct+Σt−1
です。
よって更新後の共分散は
Σt=(Ct⊤Qt−1Ct+Σt−1)−1
となります。
更新後の平均
次に、更新後平均 μt を求めます。ガウス分布の平均は指数部 Jt を最小にする点なので、
∂xt∂Jt=0
を満たす xt が更新後平均になります。したがって
−Ct⊤Qt−1(zt−Ctμt)+Σt−1(μt−μt)=0
すなわち
Ct⊤Qt−1(zt−Ctμt)=Σt−1(μt−μt)
です。この式を整理すると
μt=μt+ΣtCt⊤Qt−1(zt−Ctμt)
が得られます。ここで現れる
zt−Ctμt
は観測残差と呼ばれます。予測された観測値 Ctμt と実際の観測 zt のずれです。
カルマンゲインの導入
ここで
Kt=ΣtCt⊤(CtΣtCt⊤+Qt)−1
をカルマンゲインと定義すると、更新式はより見通しのよい形になります。更新後の平均は
μt=μt+Kt(zt−Ctμt)
更新後の共分散は
Σt=(I−KtCt)Σt
と書けます。
この形を見ると、更新ステップは
- 予測平均 μt を出発点にして
- 観測残差 zt−Ctμt を
- カルマンゲイン Kt で重み付けして補正する
操作だと分かります。
全体の流れ
ここまでで細々とした計算など(だいぶと省略もしましたが)を見てきて、木を見て森を見ず状態になりつつあるので最後にカルマンフィルター全体の流れを再度見ておきたいと思います。
カルマンフィルタは各時刻で
を順番に繰り返して、状態の確率分布を更新していく方法です。
予測ステップ
別で定義した bel(x0) を出発点として再帰的に時刻 t−1 の分布が計算できているという状況を考え、時刻 t−1 までで、前時刻の状態についての
bel(xt−1)=N(xt−1;μt−1,Σt−1)
を持っているとします。線形ガウスモデルでは運動モデルが
xt=Atxt−1+Btut+εt
εt∼N(0,Rt)
であるため、予測分布 bel(xt) もガウス分布に従います。
bel(xt)=N(xt;μt,Σt)
μt=Atμt−1+Btut
Σt=AtΣt−1At⊤+Rt
以上より、予測ステップを終えると
bel(xt)
が計算できます。
更新ステップ
ベイズの定理から
bel(xt)=η p(zt∣xt)bel(xt)
です。予測分布 bel(xt) は先ほど求めました。
観測モデルもガウスノイズが加算される形式を仮定して
zt=Ctxt+δt
δt∼N(0,Qt)
p(zt∣xt)=N(zt;Ctxt,Qt)
この関係式を用いると、結果として更新後の分布
bel(xt)=η p(zt∣xt)bel(xt)=N(xt;μt,Σt)
が得られます。各パラメーターは
Kt=ΣtCt⊤(CtΣtCt⊤+Qt)−1
μt=μt+Kt(zt−Ctμt)
Σt=(I−KtCt)Σt
です。
脚注
- 積分計算を進めると同様の結果が得られますが別の機会に…。
- すいません、途中式はいつか加筆します。