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

作って遊ぶ機械学習。

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

ベイズ混合モデルにおける近似推論① ~変分近似~

今回から数回に分けてベイズ混合モデルの構築法と種々の近似推論(変分近似、ギブスサンプリング、崩壊型ギブスサンプリング)に関してお話ししたいと思います。

混合モデルの代表的なアプリケーションはクラスタリングですが、今回ご紹介するモデルの構築方法はクラスタリングにとどまらず、もっと凝ったモデルを構築するための基本パーツになるものです。例えば時系列情報を取り扱うためのHMM(Hidden Markov Model)自然言語処理でよく使われているLDA(Latent Dirichlet Allocation)などはこれらの混合モデルを拡張することにより得ることができます。レゴブロックのように、アイデア次第ではそれ以上に複雑で豊かな表現力を持ったモデルを構築することも可能です*1

さて、今回の記事ではまず始めに混合モデルの例としてポアソン混合モデルを導入します。そして、以前にご紹介した変分近似(=変分推論、変分ベイズを使うことによって簡単なデータのクラスタリング実験を行ってみたいと思います。

 

[必要な知識]

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

 

ポアソン混合モデル

ベイズ学習の枠組みでは、まず始めにデータがどのような確率分布に従って発生しているのかをモデル化する作業から入ります。さっそくではありますが、今回の例では次のようなベイズポアソン混合モデルを考えてみたいと思います*2。今回はデータ数を{N}、データの次元数を{D}クラスタの数を{K}とおくことにします。

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

まずこの式(1)ですが、これは今回のモデルのすべての登場人物たちとその関係性を表しています。{x}{D \times N}のデータ行列です。{z}はサイズが{K \times N}の隠れ変数で、{z_n^{(k)} \in \{0,1\}}かつ{\sum_{k=1}^{K}z_n^{(k)}=1}を満たします。この離散変数{z}が「データがどこから発生するのか」を表す「スイッチ」の役割になるんですね。{\lambda}ポアソン分布の平均値パラメータで、今回は{K}個それぞれのクラスタに対して{D}個の平均値パラメータが必要なので、サイズは{K \times D}になります。{\pi}は混合係数と呼ばれる{K}次元の確率変数で、それぞれのクラスタが選ばれる確率を示しています。

さて、それぞれのパーツを具体的に定義していきましょう。

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

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

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

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

式(2)は、混合係数パラメータ{\pi}に関する事前分布を表しています。ベイズ学習では推定したい変数はすべて確率分布を持つので、このようにパラメータも確率分布を使って表現するわけですね。今回{\pi}は後ほどカテゴリカル分布に対するパラメータに使われるので、ここではその共役事前分布であるディリクレ分布を指定しています。{\alpha}は超パラメータと呼ばれているもので、今回はある固定値を持つものとします。

同様に、式(3)はポアソン分布の平均値パラメータ{\lambda}の確率分布を表しており、{a}{b}はさきほどと同じように事前分布を決める超パラメータです。こちらはポアソン分布に対する共役事前分布を選ぶ必要があるので、今回はガンマ分布からサンプルされるようにモデル化されています。こういった指数分布族の共役関係は覚えておいて損はないです。

式(4)は混合モデルで最も大事な部分です。ここではカテゴリカル分布を使うことによって所属クラスタを示す変数{z}をサンプルしているわけですね。今回{z_n}は1 of K表現を用いることにします。例えば{z_n}が3番目のクラスタを示している時は{z_n = [0,0,1,0]}などと書きます。

最後に、式(5)でようやくデータ{x}が出力されます。若干、{K}に関する掛け算の部分がトリッキーなので注意してください。{z_n}はある{k}番目の要素だけ1をとり、それ以外は0になるので、{z_n}で指定された1つのポアソン分布だけが消されずに残るという「スイッチ」の仕組みになっています。{z_n}に何が格納されているかによって、{x}がサンプルされる分布が切り替わるわけですね。

 

さて、上式のモデルはデータの発生過程を表しているので、実際に人工的なデータをシミュレートすることができます。3回ほどプログラムを回して異なるデータを発生させてみると次のような感じになります。(D=2、K=4、N=300)

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

隠れ変数{z}のもつ値は色で判別できるようにしています。このように、我々の持っている事前の仮説(モデル)から具体的な例(データサンプル)をシミュレートすることができるというのがベイズ学習の大きな特徴です。

 

・変分近似による隠れ変数Zの推定

さて、我々がやりたいのはただ単にデータをシミュレートして遊ぶだけではありません。例えばクラスタリング問題を混合モデル上の推論問題として解釈すると、「(色分けされていない)データ{x}だけが与えられたときに、それぞれのデータ{x_n}に対応する隠れ変数{z_n}は何か?」ということになります。発生源{z_n}をデータごとに特定したいわけです。

さて、この問題ですが、なかなか一筋縄ではいきません。なぜかというと、一般的なクラスタリングの問題では隠れ変数{z}だけではなくそれぞれのクラスタのパラメータ(平均値など)も未知であるからです。この問題はベイズ学習では次のような事後分布を計算することに対応します。

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

この分布はパラメータと隠れ変数が複雑に絡み合った、非常にやっかいな同時確率分布になっています。なんとかして「答えの確率分布は、ぐちゃぐちゃです」とは言わずに、「点{x_n}クラスタ◯◯◯に属し、その平均値は△△△です」のように我々が解釈できる答えがほしいところです。

 

ということで、今回はこの事後分布を近似推定する手段として変分近似を導入することにします。変分近似の基本に関しては別の記事があるのでそちらを参考にしてください。

 変分近似(Variational Approximation)の基本(1)

ここでやりたいことは真の事後分布をもっと簡単な近似事後分布で表現するということです。ここでは真の(同時)事後確率分布を直接推定することは諦め、次のような分解された分布によって近似することを考えます。

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

「隠れ変数とパラメータの複雑な相関関係は無視しちゃおう!」ってアイデアになります。で、具体的にどうやって近似分布を求めるかなんですが、次のKLダイバージェンスを近似事後分布{q}に関して最小化する最適化問題を考えることにします。

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

KLダイバージェンスは2つの分布間の「距離」のようなものを測るんでしたね。分解されたより単純な確率分布を仮定して、KLダイバージェンスの基準でなるべく真の分布に近いものを求めてあげようというのが狙いです。

さて、このような分解の仮定を置くと、近似事後分布は次のように分解された分布ごとに繰り返し更新できることがわかります(過去の記事をご参照ください。)。 

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

ここで、{\langle \rangle}は期待値操作を行うことを表しています。ここまでくればあとはモデルの式(1)~(5)を代入して頑張って積分計算(期待値計算)をやれば更新式が導けます。

まず式(9)におけるパラメータの近似事後分布ですが、下記のようにポアソン分布の平均値パラメータ{\lambda}と混合係数{\pi}の分布は、運が良いことに、関連する項が自然に分解されます。

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

最初に定義した具体的な確率分布(式(2)~(5))を当てはめて計算をすると、それぞれの近似事後分布は次のようになります。

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

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

共役事前分布を導入したおかげで、結果が事前分布と同じ形状の確率分布になりましたね。

次に、肝心の隠れ変数{z}の近似事後分布を式(10)を使って計算します。

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

ここでも具体的な確率分布を当てはめて計算すれば,次のようなカテゴリカル分布が得られます。

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

実装上は{\hat{\pi}_n}の正規化を忘れないでください。

 

・簡単な実験

さて、適当に作った非負2次元データに対して今回の変分近似アルゴリズムを動かしてみましょう。(D=2、K=6,N=300)

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

左の図が正解のクラスタ割り当てを表し、右の図が変分近似による100イテレーション後の推定結果になります。今回はクラスタリングをすることが目的なので色の組み合わせまで当てる必要はありません。このくらい明確にクラスタ構造が見えるようなデータでは、変分近似はほぼ確実に正解にたどり着くことができます。

 

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

入力データを変えてもう1度やってみました。こちらのデータはちょっと難しかったかもしれません。左図の左下のクラスタにはかなりオーバーラップが見えますね。右図の推定結果は、正解とは異なる分け方になってしまっています。この場合はデータの数を増やすか、データの次元数(使えるデータの種類数) を増やすことによって精度向上が期待できます。

 

・まとめ

ということで、今回はベイズポアソン混合分布を例にとって、対応する変分近似アルゴリズムを導出し、簡単な実験を行ってみました。今回ご紹介したように、カテゴリカル分布を使った混合モデルは確率分布をスイッチする役割を果たします。ちょうどプログラミング言語におけるif分のようなものであると考えると、その重要性がおわかりいただけるのではないかと思います。

変分近似の導出のところは実際に手を動かしてやってみると良いです。行列計算や複雑な同時分布の計算がない分だけ、PRML等に載っているガウス混合モデルより簡単だと思います。

次回以降は、ギブスサンプリングや崩壊型ギブスサンプリングを今回と同じモデルに対して適用し、また簡単な実験をしてみたいと思います。

*1:例えば深層学習と呼ばれる技術(多層パーセプトロンオートエンコーダ畳み込みニューラルネットなど)もすべてベイズモデルで書き下すことができます。ちょっと手間がかかりますが。

*2:多くの教科書ではガウス混合モデルを紹介しているかと思いますが、多次元分布なのでちょっと計算が面倒なのと、同じ例では芸がないと思ったので今回はポアソン分布にしました。実際、非負のデータって結構いっぱいあるので便利なんじゃないかと思います。