🙋
「パーティクルフィルタ」って名前は聞いたことがあるんですけど、何をするものなんですか?粒子が出てくるってことは物理シミュレーションですか?
🎓
いい質問だね。物理の粒子じゃなくて「推定」のための粒子なんだ。たとえばロボットが自分の位置を知りたいとき、センサの値はノイズだらけで本当の位置はわからない。そこで「ここにいるかも」という候補をたくさんバラまく。その1つ1つが粒子だ。粒子の散らばり全体で「位置の確率分布」を表す、というのがパーティクルフィルタの考え方だよ。
🙋
候補をたくさん持つだけだと、どれが正しいか決められない気がするんですが…どうやって本当の位置に近づくんですか?
🎓
そこで「重み」を使うんだ。新しい観測が来るたびに、各粒子に「この観測をどれだけうまく説明できるか」で点数をつける。観測にピッタリの粒子は重みが大きく、外れている粒子は重みが小さい。重みは w_i ∝ exp(−(y−x_i)²/(2σ_r²)) というガウス尤度で計算する。重み付きの平均をとると、それがフィルタの推定値だ。上のキャンバスで、推定の曲線が観測のバラつきよりずっと滑らかに真値を追っているのが見えるはずだよ。
🙋
重みをつけるだけなら簡単そうですね。でも「リサンプリング」っていうパラメータがありますけど、これは何のためにあるんですか?
🎓
それがパーティクルフィルタの肝なんだ。重みをつけ続けると、観測と合わない粒子の重みはどんどんゼロに近づく。最後にはたった1個の粒子に重みが集中してしまう。これを「重み退化」と呼ぶ。リサンプリングは、重みの小さい粒子を捨てて、重みの大きい粒子を複製する操作だ。これで粒子群を「いまもっともらしい場所」に集め直す。左のセレクトを「リサンプリングなし」にすると、下のESSグラフが1に向かって急落するのが見えるよ。
🙋
ESSグラフ、本当にガクッと下がりました。逆に系統的リサンプリングだと、ギザギザしながらも高い値を保っていますね。これは何を見ているんですか?
🎓
それが有効サンプルサイズ、ESS = 1/Σw_i² だ。重み付きの粒子群が「実質何個の等重み粒子に相当するか」を表す。リサンプリング直後は全粒子が等重みになるからESSは粒子数まで戻る。次のステップで重みが偏るとまた下がる。このギザギザは「退化しては立て直す」を繰り返している証拠なんだ。ESSが落ちきって1付近で張りつくと、もう推定は良くならない。
🙋
なるほど。じゃあカルマンフィルタっていうのも聞きますが、パーティクルフィルタとは何が違うんですか?
🎓
ざっくり言うと「分布の表し方」が違う。カルマンフィルタは確率分布を平均と共分散の1つのガウス分布で表す。線形でガウスのシステムなら最適で、しかも軽い。でも「2つの場所のどちらかにいる」みたいな多峰の分布は表せないし、強い非線形だと精度が落ちる。パーティクルフィルタは分布をサンプルの集まりで表すから、多峰でも非線形でも非ガウスでも扱える。代わりに粒子数の分だけ重いんだ。だから自己位置推定や物体追跡のような「ぐにゃぐにゃした」問題で使われることが多いよ。
カルマンフィルタは状態の確率分布を「平均と共分散」という1つのガウス分布で表すため、線形・ガウスのシステムでは最適ですが、非線形・非ガウスのシステムでは精度が落ちます。パーティクルフィルタは確率分布を多数の重み付きサンプル(粒子)の集まりで表すため、分布が多峰性であっても、システムが非線形であっても扱えます。代償として粒子数に比例した計算コストがかかります。本ツールでは粒子数を変えて、コストと推定精度のトレードオフを体感できます。
リサンプリングをしないと、観測と合わない粒子の重みが下がり続け、最終的にほぼ1個の粒子に重みが集中します(重み退化)。こうなると有効サンプルサイズ ESS が1まで落ち、分布をたった1点で表すことになり推定が改善しなくなります。リサンプリングは、重みの小さい粒子を捨て、重みの大きい粒子を複製することで粒子群を「重要な領域」に再配置し、ESS を回復させます。本ツールで方式を「リサンプリングなし」にすると、ESS が急落する様子が確認できます。
ESS = 1 / Σw_i² は、重み付きの粒子群が「実質的に何個の等重み粒子に相当するか」を表す指標です。全粒子が等しい重みなら ESS は粒子数そのものに等しく、1個の粒子に重みが集中すると ESS は1になります。ESS が粒子数の半分など、ある閾値を下回ったときにだけリサンプリングを行うのが実務的な手法で、不要なリサンプリングによる多様性の喪失(サンプル枯渇)を防げます。
粒子数を増やすほど確率分布をきめ細かく表現でき、推定の分散が下がって安定しますが、計算コストは粒子数に比例して増えます。1次元の単純な問題なら数百個で十分なことが多い一方、状態が高次元になると必要な粒子数は指数的に増える「次元の呪い」が起こります。実務では、許容できる計算時間の範囲で粒子数を増やし、ESS が極端に落ちないか、推定が安定するかを確認しながら決めます。
ロボットの自己位置推定(モンテカルロ位置推定):掃除ロボットや自律走行車が、地図とノイズだらけのセンサ情報だけから「自分が今どこにいるか」を推定する場面でパーティクルフィルタが使われます。各粒子が「ありうる位置と姿勢」を表し、レーザーやカメラの観測と地図が合う粒子の重みを上げます。最初は部屋中に散らばっていた粒子群が、ロボットが動くにつれて真の位置の周りに収束していく様子は、本ツールの粒子雲の収束とまったく同じ考え方です。
物体追跡(ビジュアルトラッキング):動画の中で人や車を追い続けるアルゴリズムにもパーティクルフィルタが使われます。対象が他の物体の陰に隠れたり、似た見た目の物体が複数あったりすると、状態分布が多峰になります。1つのガウス分布で表すカルマンフィルタでは扱いにくいこの状況でも、粒子群なら複数の候補を同時に保持でき、隠れから出てきたときに正しい方を取り戻せます。
金融・経済の状態空間モデル:株価のボラティリティのように、直接は観測できず時間とともに変化する「潜在変数」を、観測されるリターン系列から推定する確率的ボラティリティモデルでも逐次モンテカルロ法が活躍します。分布が非ガウスで、モデルが非線形でも適用できる柔軟さが評価されています。
航法・センサフュージョン:GPSが届かないトンネル内や屋内での測位、複数センサの統合(慣性センサ+気圧計+地磁気など)でもパーティクルフィルタが用いられます。観測モデルが複雑で非線形でも、粒子ごとに尤度を評価するだけでよいため、扱いやすいという利点があります。
まず最大の落とし穴が、「粒子を増やせば必ず精度が上がる」と考えてしまうことです。確かに粒子数を増やすと推定の分散は下がりますが、計算コストは粒子数に正比例して増えます。さらに深刻なのが「次元の呪い」で、状態が高次元になると、同じ精度を保つのに必要な粒子数が次元に対して指数的に増えます。3次元の位置と姿勢を同時に推定するような問題に、1次元の感覚で粒子数を決めると、まったく足りずに発散します。本ツールは1次元なので数百個で十分ですが、高次元では補助粒子フィルタやラオ・ブラックウェル化など、粒子数を抑える工夫が必須になります。
次に、「リサンプリングは毎ステップ必ず行うべき」という思い込みです。リサンプリングは重み退化に対抗する一方で、重みの大きい粒子を何度も複製するため、粒子の多様性を奪う「サンプル枯渇」という副作用があります。プロセスノイズが小さいと、複製された粒子がほとんど動かず、粒子群が数個の点に縮退してしまいます。実務では ESS が粒子数の半分など閾値を下回ったときにだけリサンプリングする「適応的リサンプリング」が標準です。本ツールの「リサンプリングなし」と毎ステップ実行する方式の中間が、実は一番良いことが多いのです。
最後に、「推定値は重み付き平均をとればよい」という単純化に注意してください。状態分布が単峰で真値の周りに対称なら重み付き平均で問題ありませんが、分布が多峰のとき、つまり「Aにいるか、Bにいるか」という状況で平均をとると、AとBの中間という「どちらでもない場所」を推定値として出してしまいます。これは物体追跡で対象が見失われたときに典型的に起こる失敗です。多峰性が疑われるときは、平均ではなく最大重み粒子(MAP推定)やクラスタリングで代表点を選ぶなど、状況に応じた要約が必要になります。