Pyroを用いた近似推論(approximate inference)|Pyroドキュメントに学ぶ統計モデリングの実装 #2

  f:id:lib-arts:20200915170215p:plain

当シリーズではPyroのドキュメントを元に統計モデリングの実装について確認しています。

Pyro Documentation — Pyro documentation

#1ではPyroの導入として概要の確認・インストール・簡単な動作確認を行いました。

#2では"An Introduction to Inference in Pyro"を参考に、引き続き実行例の確認を行っていきます。

An Introduction to Inference in Pyro — Pyro Tutorials 1.4.0 documentation

以下、目次になります。
1. 理論面の把握
2. 実装の確認
3. まとめ

 

1. 理論面の把握
1節では問題設定やアルゴリズムの理論面の把握を行います。

f:id:lib-arts:20200920161645p:plain

まず、冒頭部の記載ですが、近年の機械学習は近似推論として考えられるとした上で、このチュートリアルでは「シンプルな物理問題における生成モデルに対しPyroの推論を用いて考える」としています。

f:id:lib-arts:20200920162208p:plain

上記で取り組むにあたっての簡単な例として重み(weighs)の値の導出を行っています。ここで、scaleがあまり信用できないという前提を置くとしています。数式の意味としてはguessが与えられた状態でのweightの分布をguessを中心とした正規分布によって、さらにweightを中心とした正規分布でmeasurementが与えられると考えて良いと思います。

f:id:lib-arts:20200927165635p:plain

f:id:lib-arts:20200927165653p:plain

上記のようにmeasurmentに9.5、guessの初期値に8.5を与え、実行を行います。また推論の実行にあたってはpyro.infer.SVIを用いており、SVI(Stochastic Variational Inference)の計算にあたってmodel、guide、optimの三つの引数を設定しています。SVIについては詳しくは#3で下記を確認しながら取り扱います。

SVI Part I: An Introduction to Stochastic Variational Inference in Pyro — Pyro Tutorials 1.4.0 documentation


2. 実装の確認
2節ではチュートリアルの実装を確認していきます。

f:id:lib-arts:20200927171557p:plain

f:id:lib-arts:20200927165635p:plain
まずは1節でmodelの引数に与えたconditioned_scaleの実装を確認します。正規分布からのサンプリングをscale関数とpyro.conditionで表現されています。これは尤度関数や誤差関数と同様な理解で大丈夫です。

f:id:lib-arts:20200927172339p:plain

次にguideですが、上記のようにscale_parametrized_guideで実装されています。このguideは変分推論を行うにあたって、複雑な関数で表される尤度を近似する簡単な関数です。変分法は関数を入力とみなす汎関数における最適化のことを意味しますが、ここで用いる汎関数をguideとしています。

f:id:lib-arts:20200927165653p:plain

設定を行ったら上記のように実行を行います。optimにはpyro.optim.SGDという、Pyroに実装された勾配法を用いています。

チュートリアルには他の関数なども記載されていますが、使い方を確認する段階では少し内容が多い印象なので省略します。


3. まとめ
#2では"An Introduction to Inference in Pyro"を参考に、Pyroのチュートリアルを確認しました。
SVI(Stochastic Variational Inference)についての詳細の確認もした方が良いと思われるので、#3では"An Introduction to Stochastic Variational Inference in Pyro"について確認していきます。

SVI Part I: An Introduction to Stochastic Variational Inference in Pyro — Pyro Tutorials 1.4.0 documentation