log_prob_fn: MCMCサンプリングの実装 [66f95ca, 8aaa0ff, cded7c5] - pymc4のソースコード読んでみた
TL;DR
- 複数の未観測変数の対数確率の合計を計算しています. これがMCMCサンプリングのコアの部分です.
コミット
2018/06/21から2018/06/23の間のコミットです.
- add target_log_prob_fn which works with the tff mcmc sampler · pymc-devs/pymc4@66f95ca · GitHub
- modify target_log_prob_fn · pymc-devs/pymc4@8aaa0ff · GitHub
- remove log_prob_fn · pymc-devs/pymc4@cded7c5 · GitHub
以下ファイルが修正されています.
- pymc4/model/base.py: 対数確率を計算するメソッドを2つ実装
- log_prob_fn <= 今回はここを読みます.
- target_log_prob_fn <= 次回
- pymc4/inference_sampling_sample.py
iteritems()
の代わりにkeys()
を使うことで未使用の変数を減らしているだけです.
Model - model/base.py
log_prob_fn
複数の未観測変数の対数確率の合計を計算しています.
注意) x
引数は関数内で使用されていないので, 後のコミットで削除されています.
def log_prob_fn(self, x, *args, **kwargs): logp = 0 for i in self.unobserved.keys(): logp += self.unobserved[i].rv.distribution.log_prob(value=kwargs.get(i)) return logp
前提条件として, 次のように掛け算(x)は値のlogを取ることで足し算(+)に変換できます.
- 変数1の確率関数 x 変数2の確率関数 x 変数3の確率関数 x … x 変数nの確率関数 ↓
- 変数1の対数確率関数 + 変数2の対数確率関数 + 変数3の対数確率関数 + … x 変数nの対数確率関数