読者です 読者をやめる 読者になる 読者になる

作って遊ぶ機械学習。

~基礎的な確率モデルから最新の機械学習技術まで~

ベイズ混合モデルにおける近似推論② ~ギブスサンプリング~

MCMC 動く

さて、今回はMCMCの代表的な手法であるギブスサンプリングを使って、混合モデルによるクラスタリングを行いたいと思います。今回も前回の変分近似の記事と同様、ポアソン混合分布を具体的なモデル例として使っていきます。

 

[必要な知識]

下記をさらっとだけ確認しておくといいです。

 

・ギブスサンプリング

さて、ギブスサンプリングでは、サンプルを取りたい同時分布{p(z_1,z_2,z_3)}に対して、下記のような繰り返し手続きを用いて変数{z_1,z_2,z_3}を順にサンプリングします。

f:id:sammy-suyama:20160729175801p:plain

他の変数を既にサンプリングされた値で固定し、残りを確率分布からサンプルする、というのを繰り替えしていきます。それぞれの確率分布が、注目している変数をサンプリングするのに十分なほど簡単になっているのがギブスサンプリングが適用できる条件です。証明は今回省きますが、このような手続きで得られたサンプルは、数が十分に多ければ真の分布から得られたものとみなすことができます。

ギブスサンプリングは変分近似と比べ、細かい積分計算(期待値計算)を必要としない分だけいくらか変分近似より楽に導出できるかと思います。また、サンプリング手法が元々積分計算を近似するために開発されたという経緯もあり、変分近似と比べて若干適用できるモデルの範囲が広いです。変分近似とギブスサンプリングの簡単な比較はこちらの記事をご参照ください。

 

ポアソン混合モデルに対するギブスサンプリング

さて、前回と同様、お題としてポアソン混合モデルを使用します。利便上もう一度確率モデルを書いておくことにします。 

f:id:sammy-suyama:20160706122448p:plain

{x}{z}はそれぞれ観測データと隠れ変数の集合で、{\lambda}{\pi}はパラメータです。

それぞれのパーツは具体的に次の様に設定します。

f:id:sammy-suyama:20160706122512p:plain

f:id:sammy-suyama:20160706122531p:plain

f:id:sammy-suyama:20160706123807p:plain

f:id:sammy-suyama:20160706122606p:plain

早速このモデルの事後分布({x}が観測された後の残りの確率変数の分布)の推定にギブスサンプリングを適用してみましょう。今回はパラメータ{\{\lambda, \pi \}}と隠れ変数{z}を別々に分けることによって、十分容易にサンプリングが出来る確率分布が得られることを示します。

f:id:sammy-suyama:20160729184242p:plain

f:id:sammy-suyama:20160729184710p:plain

まずパラメータである{\lambda}{\pi}のサンプルから見てましょう。すべての隠れ変数{z}がすでにサンプルされたある値で固定された状態になっているので、パラメータの分布はちょこちょこっと計算すると次のようなガンマ分布とディリクレ分布の独立した積になることがわかります(表記を簡単にするためインデックス{i}は取り除きます)。

f:id:sammy-suyama:20160729185837p:plain

ガンマ分布に関しては、さらにそれぞれのクラスタ{k})と次元({d})ごとに独立にサンプルすればOKだということがわかりますね。実装上では、お使いのプログラミング言語のライブラリでガンマ分布とディリクレ分布からそれぞれ値をサンプルすればOKです。

さて、パラメータがサンプルされたので、今度は隠れ変数{z}をサンプリングしてみることにします。{\lambda}{\pi}が一旦サンプルされた値で固定されると、次の様に{z}はそれぞれデータ点ごとに独立にサンプリングできることがわかります。

f:id:sammy-suyama:20160729190112p:plain

このようにしてすべての{z_n}をサンプルし終えたら、また{\lambda}{\pi}のサンプリングに戻ります。

 

・簡単な実験

さて、導出したポアソン混合モデルのギブスサンプリングを使って、簡単なトイデータのクラスタリングをしてみましょう。可視化のためデータの次元{D}は2に固定し、データ数は300とします。サンプリングのイタレーションは50回とします。

次の結果はクラスタ{K=2}とし、多少クラスタ間のオーバーラップがあるデータから隠れ変数をサンプリングしてプロットしてみたものです。

f:id:sammy-suyama:20160730013101p:plainf:id:sammy-suyama:20160730012717g:plain

左の図が正解のクラスタリングで、右図はサンプリングのプロセスをアニメにしています。右図を見ると、サンプリング数が増えていっても2つのクラスタのちょうど中間くらいにあるデータに対する割り当てはずっと安定しません。サンプリング法では、このような事後確率の不確実性がそのままサンプルされる値のバラツキ加減によって表現されるわけですね。 

 

次はクラスタ{K=6}のデータを分離してみた結果です。

f:id:sammy-suyama:20160730012556p:plain f:id:sammy-suyama:20160730012834g:plain

サンプリングの途中で誤ったクラスタ分けに一度収束しかけていますが、30回目くらいでなんとか運良く脱出し、最終的には正しい結果が得られたようですね。ギブスサンプリングはじっくり待てば理論的には真の事後分布からのサンプルを得ることが出来るのですが*1、実際には局所的に尤度の高い位置にひっかかってしまい抜け出せなくなってしまう場合も多いです。

 

・まとめ

ということで、今回はポアソン混合分布に対するギブスサンプリングを導出し、簡単な実験をやってみました。ガウス混合分布と比べてパラメータ数も1つ少なく行列計算も必要ないので、実際に手で計算してみてアルゴリズムを導出してみることをオススメします。変分近似と比べてもいくぶんか導出は楽ですね*2

次回は1つ発展として崩壊型ギブスサンプリング(Collapsed Gibbs sampling)を紹介する予定です。

*1:真の事後分布が得られることと、想定している正解のクラスタリング結果が得られることとは同値ではないので注意してください。

*2:前回の変分近似の記事と結果の式を比べてみると、期待値計算を除いてほとんど同じになっていると思います。実を言うと、前回の記事のtexをそのままコピーして今回の記事の式を作っています。