動く変分混合ガウス分布(導出編)- 動く PRML シリーズ(2)

やりたいこと

動く PRML シリーズ、第2回は変分混合ガウス分布 (variational Bayesian Gaussian mixture model, VB-GMM) です。
はじめに、前回の繰り返しになりますが、反復繰り返し型の機械学習アルゴリズムを理解するためには、大きく分けて二つのステップがあることを再確認します。一つ目はもちろん、

  • 更新式を導出すること。

反復アルゴリズムの理論的性質はすべて更新式の形に反映されています。従って、この更新式を自力で導出することはとても勉強になります。

そして、二つ目は、

  • イテレーションの内容をグラフにプロットし、実際の挙動を体感すること。

更新式には確かに必要なこと全てが記されていますし、熟練の研究者であれば、更新式の形から、その実際の挙動をある程度予測することが可能です。


しかし、それは楽譜だけを見てオーケストラを聴き取るようなものではないでしょうか。そのような力を手に入れる最良の訓練は、もちろん、楽譜と実際の音楽を何度も繰り返し聴き比べることです。

そこで本記事では、変分混合ガウス分布 (VB-GMM) の導出から始め、繰り返しごとに結果をプロットするプログラムを python で実装し、初期値応答、局所解頑健性、収束性能などを体感することを目標とします。

生成モデル

VB-GMM では、GMM と同じく、K 個のクラスから N 個のデータ点が生成されていると考えます。つまり、この分布からデータを生成したければ、K 個の面があるサイコロを N 回振って、k の目が出た回数だけ k 番目の正規分布からデータ点をサンプルすればよいのです。簡単ですね。
尤度関数は GMM と同じく、

  
  
となります。
さらに、変分ベイズ法はベイズ推定アルゴリズムなので、パラメータの事前分布 を導入する必要があります。

ベイズ推定の位置付け

変分ベイズ法は EM アルゴリズムに基づく繰り返し最適化法のひとつですが、EM アルゴリズムが適用できる問題には大きく分けて最尤推定、MAP 推定、ベイズ推定の三種類があり、それぞれ推定の目標が異なります。
観測変数を X、モデルパラメータを とすると、最尤推定

  

を、MAP 推定は

  

を、ベイズ推定は

  

を推定することに相当しています。MAP 推定やベイズ推定では、生成分布 の他に事前分布 が必要なことが、ベイズの定理から分かります。

事前分布

先に述べた通り、変分ベイズ法では事前分布が必要なため、これを導入します。事前分布として、閉形式で更新式が導出できることが保証されている共役事前分布

  
  

を使用します。

変分事後分布

さてベイズ推定では、観測変数で条件付けられた潜在変数の事後分布 を推定するわけですが、様々な理由から、これをこのまま閉形式で導出することは出来ません。
そこで、 をいくつかの変分事後分布 の積で近似し、変分事後分布の積 と真の事後分布 の KL ダイバージェンスが最小となるように各分布を更新していきます。変分法の一般的な導出は PRML に譲りますが、大事なことは、

  • 共役事前分布を導入すれば、変分事後分布は事前分布と同じ形の指数型分布を使って書ける。例えば、正規分布なら正規分布、ディリクレ分布ならディリクレ分布というように。
  • さらに、 の変分事後分布は、全ての確率変数の同時分布 の対数尤度の に関する期待値を用いて計算できる。

という二点です。変分混合ガウス分布では、様々な理由*1から、 の形に分解します。

変分 E ステップ (VB-E Step)

変分推論の更新式はひたすら機械的に導出することができます。
まず、Z は多項分布にしたがうので、Z の変分事後分布も多項分布の形で書くことができます。ここでは、多項分布のパラメータを とおきます。

  

Z の変分事後分布の対数形は、Z 以外の潜在変数に関する完全同時分布の期待値として書けるので、

  
  
  

となります。従って
  
となります。

ちなみに具体的な値はというと、例えば
  
となります。ここで、 は事後ハイパーパラメータ(後述)であり、 はディガンマ関数です。 が常に 1 より小さいことを考えると、この期待値は通常 -3 とか -5 とかいう値になります。このことを覚えておくとデバッグの際に重宝するでしょう。


については書く気すら起こりません…。というか、覚えていません。PRML を見て関数として実装して、その中身については忘れてしまうのが吉でしょう。

変分 M ステップ (VB-M Step)

自然な分解

E-Step では明示しませんでしたが、変分事後分布を導出する際には、更新しようとしている変数のみを残し、不要な項をどんどん定数項に押し込んでいきます。次に述べる変分 M ステップでは の変分事後分布を計算するわけですが、これをちゃんと計算してやると、なんと

  

の形で書けることが分かります。そこで、文献によっては始めからこの形の分解を与えているものもあります。この導出はかなり文章を食うので省略します。

クラス混合比の更新

モクモクと計算していきます。変分事後分布を事後ハイパーパラメータ (posterior hyperparameter) を用いて と書き、混合比の対数事前確率

  
を用いると、

  
  
  
  
となります。ここで、 です。

さらに、 と比較することで、クラス混合比に対する更新式

  

を得ます。some cheat なんて言われることもありますが、変分事後分布の計算は基本的に係数合わせだけで出来るので、微分してゼロを解く必要はありません。らくちんですね。

クラス平均と精度の更新

簡単なんですが、手間はかかります。手で導出する時は正規分布のハイパーパラメータを先に計算して、後でウィシャート分布のパラメータに集中するのが吉だと思います。導出は、例によって一次元で行います。


一次元版の正規ウィシャート分布は、変数変換により正規ガンマ分布で書くことができるため、事前分布と事後分布を
  
  
と書きます。事前分布の対数確率は

  

と書けるので、
  
  
  
  
となります。


係数を比べることにより、
  
  
  
  
を得ます。


更に、ガンマ分布とウィシャート分布は
  
と変数変換できるため、
  
  
を得ます。多次元ウィシャート分布の場合は、
  
となることが知られています。(PRML を参照のこと。)

初期化

通常は負担率の初期値を k-means 法によって与えますが、一様乱数から始めたほうが推論特性が見やすいため、負担率を一様乱数からサンプルして推論を始めます。

実装

長くなりましたが、これでようやく実装に必要な式を手に入れることが出来ました。それでは実装編へどうぞ。(鋭意執筆中…)

*1:一般的な分解法については Winn, Bishop の Variational Message Passing を参照のこと。基本的には、グラフィカルモデル上で潜在変数同士がリンクを持たないように分解しなければならない。