作って遊ぶ機械学習。

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

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

さて、前回は変分近似の目的(複雑過ぎて解析解が得られないような確率分布の近似)と、近似のための指標(KL divergence)に関して解説しました。

今回は、変分近似の「公式」を導いてみたいと思います。近似分布$q(z)$に関して「分解の仮定」を置くことにより、数値最適化における勾配法のような繰り返しの更新手続きが得られ、近似分布が数値的に計算できることを示します。

 

[必要な知識]

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

  • 前回の記事の内容
  • 勾配法

 

前回は、近似分布と真の事後分布の間のKL divergenceをなるべく小さくすることで、うまく近似分布を得ようという方針にしました。

\[ KL(q(z)||p(z|x)) = - \int q(z) \ln \frac{p(z|x)}{q(z)} dz \]

で、ここが一番のミソなのですが、変分近似では、近似したい分布を次のように複数の分布に分解されるという仮定を置きます。

\[ p(z|x) \approx q(z) = \prod_{i} q(z_i) \]

今回は簡単のために、2つの分布に分解するということにしておきましょう。*1

\[ q(z) = q(z_1)q(z_2) \]

変分近似におけるKL divergenceの最小化方法は、数値最適化における偏微分を使った勾配法と似たような繰り返し更新の戦略を取ります。つまり、$q(z_1)$と$q(z_2)$を一度にえいっと更新するのではなく、一方を固定して一方を更新、というのを繰り返します。

    1. $q(z_2)$をランダムに初期化する。
    2. $q(z_2)$を固定した上で、KL divergenceを最小化する$q(z_1)$を求める。
    3. $q(z_1)$を固定した上で、KL divergenceを最小化する$q(z_2)$を求める。
    4. 以上の2,3を十分な回数まで繰り返す。*2

 では、実際に上記のステップ2のための更新式を導いてみましょう。(ステップ3はステップ2と同じです。)

ここからちょっと数学になります。$q(z_1)$を更新するためには、$q(z_2)$を固定し、KL divergenceを$q(z_1)$のみの関数であると考えます*3。 式を式に代入し、KL divergeneの式から$z_1$に無関係な項を$c$にまとめてしまうと、

\[ KL(q(z)||p(z|x)) = - \int \int q(z_1)q(z_2) \ln \frac{p(z_1, z_2|x)}{q(z_1)q(z_2)} dz_1dz_2 \\ = - \int \int q(z_1)q(z_2) \{ \ln p(z_1, z_2|x) - \ln q(z_1) - \ln q(z_2) \} dz_1dz_2 \\ = - \int q(z_1) \bigl\{ \int q(z_2) \ln p(z_1, z_2|x) dz_2 - \int q(z_2) \ln q(z_1)dz_2 \bigr\}dz_1 \\ + \int q(z_1)q(z_2)\ln q(z_2) dz_1dz_2 \\ = - \int q(z_1) \{\int q(z_2) \ln p(z_1, z_2|x) dz_2 - \ln q(z_1) \}dz_1 + c \;\;\;\;(1) \]

積分計算が入れ子になっているので注意してください。さらに計算を進めると、この式は結局次のような開始地点とはまた別のKL divergenceに落ち着くことが分かります。

\[ (1) = - \int q(z_1) \ln \frac{exp \{\int q(z_2) \ln p(z_1, z_2|x) dz_2 \}}{q(z_1)}dz_1 + c \\ =KL(q(z_1) || exp \{ \int q(z_2) \ln p(z_1, z_2|x) dz_2 \} ) +c \]

KL divergenceは2つの分布が一致するとき、最小値0を取ります。したがって式の最小値は次のようにして得ることができます。

\[ \ln q(z_1) = \int q(z_2) \ln p(z_1, z_2|x) dz_2 + c \]

ここでの定数項$c$は分布を正規化(積分が1になる)するための定数です。上記の期待値計算(積分)はちょっと長ったらしいので、ブラケット$\langle \cdot \rangle$を使って書き直すのが便利です。

\[ \ln q(z_1) = \langle \ln p(z_1, z_2|x) \rangle_{q(z_2)} + c \]

一応この式が変分近似の公式になります。「自分以外の分布で期待値を取る」と覚えておけばOKです。

実際の応用では、具体的な確率モデルを設定し、上の期待値計算を頑張って手計算します。一つ大事なポイントは、この式を評価した結果が簡単に正規化できる(積分できる)確率分布になっていることです。これに関しては実際、モデルや分解の仮定を色々変えて手計算してみるという、地道な試行錯誤が必要な場合もあります。一方で、線形ガウスモデルや混合モデル、パラメータに対する共役事前分布の設定など、うまく計算できることが良く知られているモデルの構築方法があるので、よっぽどのことがない限り、そういった便利な部品を組み合わせるのが良いと思います。*4

 

さて、ひとまず確率モデルに基づく変分近似の適用方法をまとめておきましょう。

  1. 確率モデルを定義する。(混合ガウス分布、HMMなど)
  2. 事後分布に関する分解の仮定をする。
  3. 公式を使って更新式を導出する。
  4. 実装して動かす。*5

 

一応変分近似を使った近似アルゴリズムを動かすのに必要な知識はこれだけなのですが、なんだか抽象的で、なんだかしっくりこないなぁという感じがするんじゃないかと思います。

次回は、この方法を使って簡単な変分近似の使用例と、簡単ではない(けど現実的な)変分近似の使用例を紹介したいと思います。

[続き・関連]

変分近似(Variational Approximation)の基本(3) - 作って遊ぶ機械学習。

*1:実際の応用では、具体的なモデルに合わせて適切な分解を思いつく必要があります。例えば標準的な混合モデルでは、パラメータと隠れ変数の2つに分解すれば効率の良い近似アルゴリズムが得られます(EMアルゴリズム)。もっと複雑なモデルだと、2つ以上の細かい分解が必要になってくる場合や、すべての変数レベルでバラバラにする場合(平均場近似、mean field approximation)もあります。基本的には計算ができる最低限の分解数に収めていくのが最適化の観点では良いのですが、より多くのメモリを使用するという欠点もあります。

*2:繰り返し計算を行う回数は、"変分下限"と呼ばれる実数値を毎ステップごとに評価して決めるのが一般的です。変分下限は変分近似における目的関数で、具体的な計算方法はまた別の機会に解説します。

*3:この場合KL divergenceは関数$q(z_1)$の関数になっているので、汎関数と呼ばれます。汎関数を最適化する問題なので"変分法"という名前がついています。今回の記事ではKL divergenceの一般的な性質を使って更新則を導きますが、数学的な変分を使って同じ更新則を導くことも可能です。

*4:公式の右辺が正規化できるようにモデルを組むのが理想ですが、どうしても正規化できないような複雑なケースにはさらなる近似を考えるしかありません。例えば、さらに細かい分解の仮定を考えてみる、$q(z)$に適当なパラメトリックな分布(ガウス分布など)をおいて勾配法などの数値最適化法を適用してパラメータを求める、サンプリングを用いて必要な$q(z)$の統計量を求める、ラプラス近似を用いる、などです。

*5:ここでも変分下限の計算も実装しておくと、デバッグに便利です。また別の機会に紹介します。