HELLO CYBERNETICS

深層学習、機械学習、強化学習、信号処理、制御工学、量子計算などをテーマに扱っていきます

変分ベイズ法の心

 

 

follow us in feedly

ベイズ推論の基本

ベイズモデリングの概要については下記の記事を参考にしてください。

www.hellocybernetics.tech

概要をさらっとなぞると、ベイズ推論の基本的な話としては、観測データ $x$ の真の確率分布 $\hat p(x)$ を知る由もないので、確率モデル $p(x | \theta)$ でモデル化し、更にパラメータ $\theta$ にも事前分布 $p(\theta)$ を仮定します。

$$ p(x, \theta) = p(x | \theta)p(\theta) = p(\theta | x) p(x) $$

という確率分布に対していつでも成り立っている乗法定理から、

$$ p(\theta | x) = \frac{p(x|\theta)p(\theta)}{p(x)} $$

とできます。そこで 各 $i$ に対して $x_i$ が互いに独立でかつ同じ確率分布から生起しているとすれば、$D = \{x_1, \cdots, x_N\}$ というデータが手元にあるとして、事後分布

$$ p(\theta | D) = \frac{p(D|\theta)p(\theta)}{p(D)} $$

と書くことが出来ます。 この事後分布を使って、下記のベイズ予測分布を計算し

$$ p(x_{new} | D) = \int_{\theta} p(x_{new} | \theta) p(\theta | D)d\theta $$

真の分布を近似してみたり、あるいは予測に使ってみたりします。これがベイズの基本的な流れになるわけです。

ベイズ予測分布を計算するためには、当然事後分布 $p(\theta | D)$ を予め求めておく必要があり、これを求める(推論する)ことを学習とひとまず呼ぶことにします(実は事後分布を周辺化して消してしまうことを考えれば、予測分布を直接求めるようなアルゴリズムを考えても良いわけで、ベイズ推論は実はもっとフレキシブルです)。

変分ベイズ学習

変分法の心

一旦、ベイズ推論における学習のことに集中しましょう。今達成したいことは、$p(\theta | D)$ という関数を求めるということです。この関数は事後分布と呼ばれてます。この関数を決めることによって$\theta$ の実現値の発生源を決めようとしているわけです($\theta$を求めようとしているのではなく、 $\theta$ がどのようにバラつくのかを知ろうとしている)。$\theta$ の発生源として使える関数をどのように決定すると良いのでしょうか。

関数を決定する上で大事だと思われるのは、この関数がどんなふうになれば「良い(あるいは悪い)」と言えるかの指標です。そのような指標はすでに与えられているとしましょう。指標を $M(p)$ と書くことにします。仮に良さを表す$M(p)$がどういうものかわかっているなら、これが最大化されるように関数 $p$ を調整してやればいいということです(通常はELBOと呼ばれる指標が使われるが、これは後述する)。

兎にも角にも、$\theta$の発生源となる関数 $p$ を指標 $M(p)$ を使って決めてやろうとしているのです。決して $\theta$ という値をどうするかを決めようとしているのではなく、 $p$ という関数そのものをどのようなものにしてやろうかを決めようとしていることに注意してください。ちなみに、 $M(p)$ は 関数$p$ を引数に取って、スカラー値を返します。このスカラー値が大きければ大きいほど「良い $p$」を入力したということになります。

では関数 $p$ を手当たり次第に試しに入れまくってやって、$M(p)$ を評価していき、一番大きな値を返した $p$ を選べば解決じゃないか!という話です。ただし、当然 $p$ の選び方なんて無数にあるわけなので、この世に存在するありとあらゆる関数(今回の場合は確率分布)を評価して見るなんて無理なのです。

そこで、変分法が登場します。変分法とは、 $M(p)$ に 関数$p$ を試しに入れまくる際に、入れ方を関数の形をほんの少しだけ変えて入れてみるという方法を取ることにします。すなわち、とある $p$ で $M(p)$ を評価したあとに、今度はちょっとだけ $p$ を変えた $ p + \delta p$ で $M(p+\delta p)$ を評価するということです。

もしも上記のことを試してみて、

$$ M(p+\delta p) - M(p) = 0 $$

ということが起こった場合にはどういうことが考えられるでしょう。 $p$ をほんの少しだけ変えても評価値は変わらなかったので、この辺りの $p$ が一先ず解の候補になりそうです。仮に評価指標 $M(p)$ が単峰ならば、上記の $p$ を答えとしてしまうことができます。上記の $M(p+\delta p) - M(p) $ を変分とよんでみることにしましょう。この関数を引数に取ってスカラーの値を返すようなもの(今回で言えば評価指標 $M(p)$ )を「汎関数」と言います。そして、上記の汎関数に入れる関数を少しだけ変えたらどうなるんだろうか?という考えに基づいて変分を考え、関数を決めてやろうという試みを変分法と言います。

なんだか微分と似たような話です!ただし、 $p$ は値ではなく関数なのでもうちょっと話は複雑ですが…。

何が複雑なのかというと、微分であれば、$ f(x) $ の微分を考えるために、$x + \Delta x$ というものを考える必要があります。そのときに $x=5$ に対して $\Delta x = 0.00001$ としてちょっとだけ変えていれてやるか…、みたいなことが出来るわけです。では 関数 $p$ をちょっとだけ変えるために $\delta p$ をどのように選べば良いでしょうか?  

  f:id:s0sem0y:20190112170850p:plain

  端点を固定しつつ、ちょっとだけ関数の形状をずらす

    f:id:s0sem0y:20190112170958p:plain

  関数の形状のある一部分のみをずらす   上の方が自然な方針に見えますか?それとも下のほうが自然な方針に見えますか?実は私達が求めたいと思っている $p$ の形状の本質を知らない限り、どちらが良いとは言えません($M(p)$ の評価値を良くするような変更の仕方としか言いようが無いから!)。これが微分に対して変分の方が複雑ですという意味です。(上の方が数学的には扱いやすそうな気はしますよね。物理の1分野である解析力学で学ぶ変分法で最初に学ぶのはおそらくこの形になるでしょう)。

変分ベイズ法の戦略

さて、変分法なるものの存在を知ったところで、変分ベイズ法の話に突入します。まず、私達が求めようとしている関数 $p$ はパラメータ $\theta$ の事後分布です。いま評価指標である $M$ はすでに決まっているとします。上記で見たように、基本的に変分をどのように扱えば良いかの方針というのは簡単には決まりません。$p$ は本来どんな形状であるのかは我々は知りませんし、変分としてどのような変え方をして関数を探していけば良さそうなのかも我々は知りません。

それでも、 $M$ を片っ端から評価していって良さげな $p$ を見つけなければなりません。これを実施するために $p = q(\eta)$ と置いてしまうのです。これは一体何をしたのかというと、 $q(\eta)$ は我々にとって計算しやすく、 $\eta$ を少し変えてやれば $q(\eta)$ の形も少し変わるような良い関数を選んだのです。そうすることで、$p$ の考えうる形状と、そして変分としてどのように変更を加えていくかの方針を $\eta$ に託すことにしたのです。

  1. $M(p)$ に基づいて一番良い $p(\theta | D)$ を探したい。
  2. $p1(\theta | D), p2(\theta | D),...$ と片っ端から試すのは苦労する。
  3. $p$ をほんの少し $\delta p$ だけ変えて、$M(p + \delta p) - M(p)$ を評価していくことに。
  4. 関数の探す範囲と変え方 $\delta p$ の方針が分からない。
  5. 関数 $p(\theta | D) = q(\eta)$ と置いてしまって、$\eta$ を変えることで変え方と探索する範囲を決定

ということです。そうして得られた $q(\eta)$ をあたかも $\theta$ の事後分布として扱って以後予測分布などに使っていくということになります。この方針で優れている点は、最終的には

$$ M(p(\theta | D)) = M(q(\eta)) $$

と置いてしまったので、変分法で $M(p+\delta p) - M(p) $ を考えることが

$$ \begin{align} & M(p+\delta p) - M(p) \\ \leftrightarrow & M(q(\eta)+\delta q(\eta)) - M(q(\eta)) \\ \leftrightarrow & M(q(\eta + \Delta \eta)) - M(q(\eta)) \\ \leftrightarrow & M(\eta + \Delta \eta) - M(\eta) \end{align} $$

のように書き換えられてしまうことです($q(\eta)$ は私達が計算しやすく仮定した関数なので、$M(q(\eta))$ という入れ後になった関数は簡単に $M(\eta)$ と入れ子を意識しなくても良い関数に出来てしまうのです)。私達が考えているのは、結局$\eta$ を少し変えることだけなのです。これは従来ニューラルネットワークなどでも使ってきた勾配法が使えます。

そうして $M(\eta)$ を評価して求まった $\eta$ を使って、元々仮定した $q(\eta)$ を $\theta$ の事後分布の形状として採用してやればいいということになります。