Open6

Pythonではじめるベイズ機械学習入門学習履歴

ひまわりひまわり

VAE等々に興味があり、下の書籍を参考にベイズ機械学習に挑戦しています。
https://amzn.asia/d/fIMLEKN
ただ、この書籍は結構難しめで、統計学をさらっとしかやっていない私には難しかったのでつまずいたところで参考にしたサイト等々を貼っていこうと思います。
※あくまで、学習履歴なので、私は詳しい説明は行いません。学習方法の参考にしてください。

ひまわりひまわり

第一章に入る前に、ベイズ統計の考え方について調べておくことをおすすめします。(普通の統計学とはかなり異なるので)
https://ai-trend.jp/basic-study/basic/bayesian-statistics/
こちらのサイトが参考になりました。

第一章 1.3 代表的な確率分布

ベルヌーイ分布や二項分布、正規分布は授業でやったのでわかっていたのですが、ベータ分布やディリクレ分布、ガンマ分布は説明を見ても全くわかりませんでした。
ディリクレ分布はベータ分布を多次元に拡張したものなので、ベータ分布がわかればなんとかなるだろうと思い、自分なりに調べました。
参考になったサイトを貼っておきます。

https://www.headboost.jp/what-is-beta-distribution/#:~:text=ベータ分布は、成功数,する連続確率分布です。
このサイトはベータ分布をかんたんに、実例を交えて説明しています。このサイトでベータ分布の気持ちとやらを掴めます。

https://www.slideshare.net/matsukenbook/ss-251140887
このスライドではより具体的な説明がなされています。ただ、少し一様分布の順序統計量のところが難しいのでそこは読み飛ばしてしまっても良いかもしれません。

https://r-tips.hatenablog.com/entry/beta-distribution
このサイトでは実際に数式を用いてベータ分布を求めています。自分で二項分布の事後確率を求めることで力もつくと思います。

https://mathlandscape.com/gamma-beta/
ベータ関数とガンマ関数の関係についてはこちらのサイトを参考にすると良いと思います。

ベータ分布がわかると、ディリクレ分布やガンマ分布もすらっと呑み込めると思います。

ひまわりひまわり

1.4 近似推論手法

どうやら推論手法は大きく分けてMCMCと変分推論の2つがあるようです。
書籍の説明はかなり大雑把で理解が難しかったので参考にしたサイトを貼っていきます。

MCMC

https://www.docswell.com/s/mutopsy/Z9M875-mcmc-229798441
本当にわかりやすかったです。これを読めばMCMCについてはだいたい理解ができるのではないでしょうか。

変分推論

https://dx-consultant-fast-evolving.com/the-meaning-of-kl-divergence/
KLダイバージェンスについて、役割や生まれた経緯を踏まえて的確に説明してくれています。
https://qiita.com/ceptree/items/9a473b5163d5655420e8
KLダイバージェンスと分布の類似度の関係を可視化してくれています。

ひまわりひまわり

2.4 Pyroの概要

意外とここのサンプルコードでつまりました。

with pyro.plate('sample', len(y)):
       pyro.sample('obs', pyro.distributions.Bernoulli(theta), obs=y)

yの長さだけ繰り返しベルヌーイ分布に従う確率変数(尤度関数)を作ることはわかるのですが、そうすると、obs=yのところに違和感がありませんか?
obs=yとしているため、y全体を観測結果とした尤度関数をyの長さ個作成していることになります。これ、1個で十分ではありませんか?
実際に、

with pyro.plate('sample'):
       pyro.sample('obs', pyro.distributions.Bernoulli(theta), obs=y)

としても全く結果は変わりませんでした。
自分でも公式リファレンス等々調べてみたのですが、わからずじまいでした
誰か教えて下さい...

ひまわりひまわり

2.4 Pyroの概要 を二項分布で実装してみる

plateを用いてベルヌーイ分布に従う確率変数を複数用いなくとも、二項分布(Binomial)1つで代用できると書いてあったので実装してみました。(間違っていたら教えて下さい)

y = torch.tensor(6, dtype=torch.float)

def model(y):
    alpha = torch.tensor(1.0)
    beta = torch.tensor(1.0)
    N = torch.tensor(10)
    theta = pyro.sample('theta', pyro.distributions.Beta(alpha, beta))

    pyro.sample('obs', pyro.distributions.Binomial(N,theta), obs=y)

def guide(y):
    alpha_q = pyro.param("alpha_q", torch.tensor(5.0), constraint=constraints.positive)
    beta_q = pyro.param("beta_q", torch.tensor(5.0), constraint=constraints.positive)

    pred_q = pyro.sample('theta', pyro.distributions.Beta(alpha_q, beta_q))
    return pred_q

実行結果はほぼおなじになったのでいけてるのではないでしょうか..?

ひまわりひまわり

2.6 Tensorflow Probabilityの概要 変数変換

学期末の最終課題に追われていて少し放置していました。今日から再開です。
Xが確率密度関数fX(x)に従うとき、XをY=g(X)に変換した際の、Yの確率密度関数fY(y)についての公式です。なぜ微分が出てくるのかわからなかったので調べてみました。
こちらのサイトが参考になりました。
統計検定一級レベルみたいです。自己肯定感上がりますね
ちなみに、g(X)はYとXを一対一に対応させる単調関数でない場合は、工夫が必要なようです。
https://laid-back-scientist.com/change-of-variables