甲斐性のない男が機械学習とか最適化とかを綴るブログ

うどんくらいしか食べる気がしない

ベイズ推論による機械学習入門を読んだので軽くメモ

はじめに

タイトルの通りです。以下の本を一通り読んだので、再度読む際の手助けになるようメモを残します。

機械学習スタートアップシリーズ ベイズ推論による機械学習入門 (KS情報科学専門書)

機械学習スタートアップシリーズ ベイズ推論による機械学習入門 (KS情報科学専門書)

まだ理解が怪しい部分も多々ありますが、取りあえず忘れる前に。。。

全体を通してのポイント

ベイズ推論の枠組み

ベイズ推論においては、観測データも分布のパラメータ、回帰等の重み係数も潜在変数も確率変数として扱う。観測されたデータをDとし、未知の確率変数(分布のパラメータ、重み係数、潜在変数等々)を{\bf \theta}とした時、以下の2ステップを行うのがベイズ推論の枠組み。

  1. モデル\displaystyle p(D, {\bf \theta})の構築(モデリング
  2. 事後分布\displaystyle p( {\bf \theta} | D) = \frac{p(D, {\bf \theta})}{p({D})}の計算

この事後分布を求めることがベイズ推論における「学習」。ベイズ推論は全てこの枠組みの中で扱われるので、後は如何にモデリングするかと、如何に求めたい確率変数の事後分布を計算するか、という話になる。モデルが複雑な場合、事後分布は解析的に求められない場合もあるので、その時は変分推論やギブスサンプリングなどを使って近似的に事後分布を求める。

予測分布

更に、求めた事後分布を使って、未観測のデータ{\bf x}_*に対し、何らかの知見を得たい場合もある(知見の内容はタスクによって異なる。例えば、回帰の場合は、入力{\bf x}_*に対応する出力y_*を求める等)。その時は以下の予測分布を計算する。


\displaystyle p({\bf x}_* | D) = \int p( {\bf x}_* | {\bf \theta}) p( {\bf \theta} | D) d  {\bf \theta}

1章

基本的にこの章は後の章で語られる内容のアウトラインが載っている。この章で語られる内容で特に重要なのは、上記のベイズ推論のポイントと以下の関係式。

  • 周辺化 \displaystyle p(y) = \int p(x, y) dy
  • 条件付き分布 \displaystyle p(x | y) = \frac{p(x, y)}{p(y)}

また、独立の諸概念も重要。

  • 変数間の独立性p(x, y) = p(x)p(y)(これが成り立つ時、xyは独立という)
  • 条件付き独立p(x,z|y) = p(x|y)p(z|y)yを観測した下でxzは独立だが、yを観測しなければxzは独立でないことに注意)

2章

確率密度関数については書籍を参照するとして、取りあえず期待値が大事。エントロピーとかKLダイバージェンスとかも大事だけど、期待値がわからないと後々お話にならなくなる。特に、


\displaystyle \langle  f({\bf x}) \rangle_{p({\bf y})} = \int f({\bf x}) p({\bf y}) d{\bf y} =  f({\bf x})  \int p({\bf y}) d{\bf y}  =  f({\bf x })
\displaystyle \langle  f({\bf x}) \rangle_{p({\bf x}, {\bf y})} = \int \int f({\bf x}) p({\bf x}, {\bf y}) d{\bf x}d{\bf y} =  \int f({\bf x}) \int  p({\bf x}, {\bf y}) d{\bf y} d{\bf x}  = \langle f({\bf x }) \rangle_{p({\bf x})}

と、期待値を取る関数に出てこない確率変数は、期待値計算から外せることは重要。
また、同時分布の期待値とか、条件付き期待値とかは込み入ってくると混乱するので注意。迷った時は期待値の定義、


\displaystyle \langle   f({\bf x}) \rangle_{p({\bf x})}  = \int f({\bf x}) p({\bf x}) d{\bf x}

に立ち返るのが吉。

確率密度関数の対数を取った関数\ln p({\bf x})、基本的な期待値( \langle  {\bf x} \rangleとか \langle \ln {\bf x} \rangleとか)も、後々の章(特に4章、5章の変分推論辺り)で何度も使う。本当に何度も使うので、何度も見返す。

3章

2章で挙がっている確率分布の各パラメータおよび線形回帰の重み係数をベイズ推論の枠組みで推定する章。事前分布として共役事前分布を使うので、(この章で示されている問題については)事後分布が解析的に計算でき、しかも事前分布として同じ形の分布で求まるので、データを得るたびに逐次的に更新することも可能。考え方としては、

  1. 学習したいパラメータ\thetaの事前分布p(\theta)として共役事前分布を設定
  2. こうすると事後分布は事前分布と同じ形になり、p( {\bf \theta} | D) = \frac{p(D, {\bf \theta})}{p({D})}= \frac{p(D|{\theta})p(\theta)}{p({D})} \propto p(D|{\theta})p(\theta) としてp(D)は定数として扱うことが可能(後から帳尻を合わせる)。
  3. 尤度p(D | \theta)p(D | \theta) = \prod_{i=1}^N p(x_i|\theta)と観測データが独立だと仮定(後の章で観測データ間にも独立ではないモデルもあり)

また、計算のテクニックとして、以下のようなものが使われている。

  • 事後分布が事前分布と同じ形になることから、\ln p(D|{\theta})p(\theta)をうまく展開し、2章で計算済みの事後分布の対数をとった式のパラメータと対応を取ることで、事後分布のパラメータを計算
  • 予測分布を求める際、積分の計算が難しい時は、ベイズの定理に立ち返りp({\bf x}_*)=\frac{p({\bf x}_* | \theta) p(\theta)}{p(\theta | {\bf x}_* )}となることから、上記の事後分布計算と同じく対数をとって分布の式とパラメータの対応を取ればよい
  • 予測分布計算時、いきなり事後分布のパラメータで予測分布求めようとすると、ややこしくなるケースもあり、その場合はまず事前分布を用いて予測分布を計算し、後から対応するパラメータを事後分布のものに置き換えればよい

4章

生成モデル

観測データの生成過程を仮定して、確率分布p(D, {\bf  \theta})モデリングしたものが生成モデル。例えば、観測されたデータに多峰性が見れられる場合、これを単一の分布のみで表現しようとしても、うまく表現しきれない。このような多峰性のあるデータは、

  1. K個のクラスタがあり、観測データ{\bf x}はそのいずれかのクラスタ(例えば、\theta_kを持つk番目のクラスタ)から生成されたと仮定p(\bf{x} | \theta_k)
  2. {\bf x}が割り当たっているクラスタ{\bf s}  \in \left\{0, 1 \right\}^K \ \ {\rm s.t.} \ \ \sum_{i=1}^K s_i = 1(割り当たっているクラスタの要素のみ1、それ以外0)で表現すると、{\bf x}の確率分布はp({\bf x}| {\bf s} ,\Theta) = \prod_{k=1}^K p(\bf{x} | \theta_k)^{s_k}
  3. このクラスタの割り当て{\bf s}も割り当て比率パラメータ\piに支配されるカテゴリ分布の確率変数と仮定p({\bf s}| \pi)
  4. クラスタのパラメータの事前分布p(\Theta)を仮定(ここでも共役事前分布使うと幸せになれる)
  5. クラスタ割り当てのカテゴリ分布の事前分布p(\pi)を仮定(こちらもカテゴリ分布の共役事前分布であるディリクレ分布を使うと幸せ)
  6. 以上のことから、データ生成のモデルをp({\bf X}, {\bf S}, \Theta, \pi) = p({\bf X}|{\bf S} , \Theta) p({\bf S}| \pi)  p(\Theta) p(\pi) = \prod_{i = 1}^N p({\bf x}_i| {\bf s}_i ,\Theta) p({\bf s}_i| \pi)  p(\Theta)p(\pi)と仮定

等のようにモデリングする。
このモデルから、観測データに対するクラスタ割り当ての事後分布\displaystyle p({\bf S}|{\bf X}) = \int \int \frac{p({\bf X}, {\bf S}, \Theta, \pi) }{p({\bf X})} d\Theta d\pi を計算したいが、モデルが複雑すぎてp({\bf X})が解析的に求まらない。そのため、近似的に事後分布の推定を行う。

ギブスサンプリング

上のモデルを例にすると、

  1. \Theta, \piが既に観測されているものとして(2でサンプリングした\Theta, \pi を使う)、{\bf S} \sim p({\bf S}| {\bf X}, \Theta, \pi)とサンプリング
  2. {\bf S}が既に観測されているものとして(1でサンプリングした{\bf S}を使う)、\Theta, \pi \sim p(\Theta, \pi | {\bf X}, {\bf S} )とサンプリング
  3. この操作を繰り返す

この繰り返し回数が十分に多い場合、真の分布に近づくことが知られているため、繰り返し続けると所望のデータをサンプリングできるようになる。もちろん、サンプリングする対象となる分布p({\bf S}| {\bf X}, \Theta, \pi)p(\Theta, \pi | {\bf X}, {\bf S} )は十分にサンプリングしやすい分布である必要があるので、式を展開して2章で挙がっているような基本的な分布を導かないといけない(モデルによってはそれができないこともあるので、共役事前分布を使うと幸せになるというのはここに繋がる)。

変分推論


\displaystyle p({\bf S}, \Theta, \pi | {\bf X}) \simeq q({\bf S}) q(\Theta, \pi)

等のように、各確率変数間の独立性を仮定した分布で近似するのが変分推論。真の分布とのKLダイバージェンスが最小となるq({\bf S}) q(\Theta, \pi)を求めればよく、それは


\displaystyle \ln q({\bf S})= \langle \ln p({\bf X}, {\bf S}, \Theta, \pi ) \rangle_{q(\Theta, \pi)}
\displaystyle \ln q(\Theta, \pi) = \langle \ln p({\bf X}, {\bf S}, \Theta, \pi ) \rangle_{q({\bf S})}

として計算できる(あくまで、上記モデルに対する近似式。もう少し一般的な表現は書籍参照)。こちらも一方の結果を用いで、もう一方の計算を行う形になっているため、更新を十分な回数繰り返す必要がある。また、実際には、下記のような式展開して期待値を解析的に求める。

  1. 変分推論を基に、各近似分布q(\cdot)の形を求める。2章に述べられている期待値の性質(上記の無関係な確率変数が期待値計算から外せる性質含む)をうまく使い、q(\cdot)が何分布の関数かがわかるまで式を展開する。
  2. 全ての近似分布の形がわかったら、それぞれの期待値を計算する。これまた2章で計算済みの各分布の基本的な期待値を流用する。

ここでもギブスサンプリングと同様、期待値を解析的に計算するために、2章で挙がっているような基本的な分布を導く必要があるので、やはり共役事前分布を使った方がハッピー。

崩壊型ギブスサンプリング

上記のギブスサンプリングでは、パラメータ\Theta, \pi についてもサンプリングで求めたが、


\displaystyle p({\bf X}, {\bf S}) = \int \int p({\bf X}, {\bf S}, \Theta, \pi) d\Theta d\pi

として周辺化すれば、p({\bf S}| {\bf X})からサンプリングするだけでよくなる。ただし、周辺化した結果が十分にサンプリングしやすい確率分布になることが条件。このモデルの例では、周辺化した結果{\bf s}_1 \cdots, {\bf s}_Nが互いに依存し合うようになり(元々は{\bf X},\Theta, \piを与えられた下での条件付き独立)、このままではN個の潜在変数を同時にサンプリングしなければならず計算量が莫大になる。この問題をp({\bf s}_n | {\bf X}, {\bf S}_{ \backslash n})と、サンプリングしたい{\bf s}_n以外の潜在変数{\bf S}_{ \backslash n}は全て観測済みとして、個別にサンプリングするアイデアで解決。

5章

各種応用に対して、モデルの構築と変分推論(一部ギブスサンプリング)を導出している。この中のいくつかは実際に実装してみようと思うので、ここでは考え方のみメモ。

線形次元削減

観測されたデータ{\bf y}が低次元の潜在変数{\bf x}を元に、 {\bf W}^T {\bf x} + {\bf \mu}という線形変換で生成されると考える。また、実際にはノイズが乗っているはずなので、ガウス分布N({\bf y}| {\bf W}^T {\bf x} + {\bf \mu}, \sigma^2 {\bf I})で生成されると仮定。更に他のパラメータについても事前分布がガウス分布に従うと仮定(\sigma^2は既知のものとして話を進めているが、ガンマ事前分布など使って推定してもよい)。後は変分推論の期待値計算をすれば低次元の潜在変数{\bf x}や変換行列 {\bf W}を推測することができる。

非負値行列因子分解

観測された行列{\bf X}が全ての要素非負であるとし、{\bf X} \simeq {\bf W} {\bf H}という非負値の行列に近似分解することを考える。ここで、S_{dmn} \simeq W_{dm}H_{mn}となる潜在変数{\bf S}を考えることで、効率的な変分推論が導き出せる。また、非負値なので{\bf S}ポアソン分布、{\bf W}, {\bf H}の事前分布はガンマ分布を考える。

隠れマルコフモデル

これまで観測データ間はたがいに独立して得られるものとして扱っていたが、時系列データ等ではその仮定は成り立たない。隠れマルコフモデルでは、

  1. 観測されるデータ{\bf x}_nは現在の状態{\bf s}_nに基づいてデータが観測される(状態{\bf s}_nクラスタ割り当ての潜在変数として持つ混合分布)。
  2. データを観測したら、遷移確率に基づいて次の状態に遷移する({\bf s}_n \rightarrow {\bf s}_{n + 1})。

というモデルを構築する。変分推論は状態の潜在変数{\bf S}の分布を\prod_i^N q({\bf s}_i)と分離して近似する完全分解変分推論とq({\bf S})と分離せずに近似する構造化変分推論がある(その中間であるミニバッチを使った近似もあり)。前者は特別なことをせずに、変分推論の期待値を導き出せるが、後者はうまいこと式変形してフォワードバックワードアルゴリズムと呼ばれる動的計画法が使える形に持っていかないと、計算量が増大する。

トピックモデル

複数の文書を観測データとして、単語の出現頻度を元に文書を解析。各文書中には複数の潜在トピックが存在すると仮定。文書d中のn番目に出てくる単語{\bf w}_{dn}には、どのトピックから発生したかというトピック割り当て潜在変数{\bf z}_{dn}が紐づき、各単語は対応するトピックkのカテゴリ分布に従うと仮定。また、トピック割り当て自体もカテゴリ分布に従うと仮定し、これらのカテゴリ分布のパラメータはディリクレ事前分布に従うモデルを構築。後は頑張って変分推論の期待値計算。

テンソル分解

協調フィルタリングに時間軸を導入し、その時のトレンドを踏まえた推薦を行うようにしたモデル。時間方向の軸には前回の状態を平均とするガウス分布を仮定(線形動的システム)。ここでは、完全分解変分推論を考えているので、推論計算自体はこれまでと同様。

ロジスティック回帰、ニューラルネットワーク

ロジスティック回帰、ニューラルネットワークベイズ推論版。これまでの近似(平均場近似)とは違い、ガウス分布で事後分布を近似。変分パラメータを用いた勾配法で真の分布とのKLダイバージェンス最小化を行う。この勾配法を使うため、再パラメータ化トリックを使うが、これが良く分からない。

おわりに

兎にも角にもわかりやすいです。式展開がわからなくなって何度も行ったり来たりしましたが、PRML10章で卒倒した僕でも割りと短期間で最後まで行けたので、ベイズ推論の入り口として、適切な書籍の1つだと思います。ただ機械学習自体の入門としては少ししんどいので、機械学習全体を俯瞰したのち、その1つの枠組みとしてベイズ推論があると捉えられるようになった上で、読むべきかなと思います。