SVI(Stochastic Variational Inference)①|Pyroドキュメントに学ぶ統計モデリングの実装 #3
当シリーズではPyroのドキュメントを元に統計モデリングの実装について確認しています。
Pyro Documentation — Pyro documentation
#1ではPyroの導入として概要の確認・インストール・簡単な動作確認を、#2ではPyroを用いた推論について取り扱いました。
#3では#2で用いたSVIの詳細について確認を行います。
以下、目次になります。
1. 理論面の把握
2. 実装の確認
3. まとめ
1. 理論面の把握
1節では理論面の把握を行います。
上記は#2の際に確認しましたが、PyroにおけるSVI(Stochastic Variational Inference)においては、model、guide、optimizerの3つを主な引数とするので、その辺を念頭に置きながらご確認いただけたらと思います。
SVIは変分推論(Variational Inference)の考えがベースとなっていますが、変分推論を理解するにあたって上記のELBO(evidence lower boud)はまず最初に抑えると良いです。
式自体は上記と同様で、EMアルゴリズムの文脈で出てくる式を主に話を進めます。さて、さらに変分推論自体は変分法(calculus of variations)が元になっており、変分法は関数を入力とする関数である汎関数(functional)の最適化を扱う分野とされています。ここで確率分布のq(z)に対して汎関数のELBOの最大化(KL divergenceの最小化とみて良い)を行うのが変分推論です。
上記のように、この際に用いるq(z)のことをPyroではguideとしています。
また、このページでは上記のような「コインに細工されているかどうか」を取り扱う問題設定を元に実装しています。すなわち、『表と裏が同じ頻度で出るか』を考えるとしています。
確率モデリングを元に「コインに不正がないか」を考えるにあたって、ベータ分布(beta distribution)を用いて事前の知見を表現した上で考えるとされています。ここではを用いており、最終的にがピークとなる対称的な確率分布になれば「不正のないコイン」として良いだろうとされています。また、確かめるにあたっての実験として10回コイン投げを行ったとしています。
観測については上記のように、6回が表で4回が裏が出たとしています。
これらの前提を元に2節では具体的な実装を確認していきます。
2. 実装の確認
2節では実装の確認を行います。
まず、確率モデルについてですが、上記のように記載されています。に基づいてサンプリングした"latent_fairness"をに代入し、をdist.Bernoulliの引数に与えています。また同時に観測値も与えています。
Primitives — Pyro documentation
pyro.sampleの引数にobsで与えていますが、ドキュメントを確認すると観測データをこのように与えるとしています。
次にguideの設定ですが、上記で解説されています。ここでのの制約としてはは0〜1の範囲における確率分布であらねばならないことについて言及されています。それを受けてここではシンプルな設定として、とをパラメータとする新たなベータ分布を考えるとしています。また、ベルヌーイ分布とベータ分布の共役性(conjugacy)についても簡単に言及されています。
optimizerに関しては、上記のようにAdamを用いています。
実行結果は上記のように、事後分布における平均と近しい値である0.532..になっていることが確認できます。またここでコインのfairnessを評価するにあたっては、頻度だけに注目すると0.60になっていたのが、0.532...とより0.5に近い値になっており、サンプルが少ない際に極端な結論にならないようにしてくれていると考えて良いと思います。
3. まとめ
#3では"SVI Part I: An Introduction to Stochastic Variational Inference in Pyro"について取り扱いました。
#4では引き続き、"SVI Part II: Conditional Independence, Subsampling, and Amortization"について確認していきます。