はじめてのBayes by Backprop

# ニューラルネットワークの重みにベイズを突っ込んでみよう

この頃増えてきている確率的なニューラルネットワークとは何だろうということで、調べてみた。
[TensorFlow Probability](https://www.tensorflow.org/probability?hl=ja)で簡単に実装できるようになったので、これから流行るだろうし。
ライブラリの元論文。
[Edward: A library for probabilistic modeling, inference, and criticism](https://arxiv.org/pdf/1610.09787.pdf)

そもそも、ニューラルネットワークはいろいろと便利だけど、やたらと自信満々という問題がある。
SoftMaxは、自信を語ってるわけでもないので、知らないデータでも、必ず何か元気よく答えるし。
データが大量にあって、外れ値がない場合は良いけれど、実データ使うとそうも言えない。医療データとか、特に。
例えば、車載向けにSemantic setgmentationをした場合、データを増やせば何とかなる（Epistemic uncertainty）なのか、そもそも問題がそういうもんで、データ増やしてもどうにもならない（Aleatoric uncertainty）か、わけて考えたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/535fdb0e-a2dc-5f3f-aa2a-fcbe5647f6c3.png)
[What Uncertainties Do We Need in Bayesian Deep Learning for Computer Vision?](https://proceedings.neurips.cc/paper/2017/file/2650d6089a6d640c5e85b2b88265dc2b-Paper.pdf)（NIPS2017）
この例でわかるように、データを増やしたところでSemantic setgmentationのボーダーの部分はどうこう出来るモノでもない。

で、こういう、もやっとしたデータ処理と言えば、ベイズだろうということで、この頃確率的なニューラルネットワークというのが増えている。
基本的に、ニューラルネットワークの重みとかActivationを確率にして、そのDistributionを求めることになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/a3ee2c99-fd7b-3572-d0db-99427617e595.png)
いつものが、左で、真ん中がActivationに確率突っ込んだので、右が重みに確率付き。

この確率の導き出し方は、ベイズの歴史を紐解くわけで、いっぱいある。
MCMCを使うのから、画像生成なんかで大活躍しているVariational Inferenceを使ったのまで。
この中から今回はBayes by Backpropというのを、紹介する。これが出てから、大規模なネットワークにも適用できるようになって、リバイバルの元になっている模様。（とはいえ、Dropoutも結局ベイズだからとか言い出すと、みんな普通にいつも使っていたとも。）

いろいろある手法の全体像は、こちらのSurveyがわかりやすい。上の図もこっから。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/303df558-4d6b-8387-ed25-e374ca2426aa.png)
[Hands-on Bayesian Neural Networks – A Tutorial for Deep Learning Users](https://arxiv.org/pdf/2007.06823.pdf)（2022年）

# Bayes by backprop
Variational Inferenceを用いる手法で、重みをGaussianに近似して、Reparameterization trickを使ってGaussianのアップデートをBackpropagationで行う手法らしい。

今回は、最初の論文を追いかけてみる。
[Weight Uncertainty in Neural Networks](https://arxiv.org/pdf/1505.05424.pdf)（ICML2015）
ベイズは今までの積み上げがすごくて、これを今から追いかけるとかなり大変なので、必要最低限のところから見ていく。

まずは、学習データを$D= (x_i, y_i)$、重みを$w$とする。
そうすると、いつものPoint estimate手法でLossを計算すると、最尤推定だと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/0a13a290-b0cf-16bf-1c6a-d471fc4613be.png)
最大事後確率だと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/bdd6985e-a855-641d-c31d-3a6c3ad24c16.png)
この時、$w$がGaussian priorの場合はL2 regularization (weight decay)、Laplace priorの場合はL1 regularizationになる。

ここで、重みに、確率分布を当てはめて、もっとモヤっとさせる。
新しいデータ$(\hat{x_i}, \hat{y_i})$が来た時、$\hat{y_i}$の確率は以下で計算する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/f7ad49af-94d3-4656-2320-5e691b074117.png)
近似するので、出来るだけこの近似は元のと同じようになって欲しいので、KL-divergenceを最小化させる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/bf64b191-cb22-6666-5230-0659d3c2a562.png)
この頃人気の画像生成系ネットワークで良くみるvariational free enerygyとかELBOとか言われるものが導き出された。
右側の期待値は、$q$の分布が全て元のMLEにくるようにすれば、大きくできる。
これを更に変形すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/6446c25c-8201-5aec-c3b0-be3a8fbef029.png)
この新しいLoss関数$f$を最小化すれば良くなった。
期待値の中で微分をしたいので、reparameterization trickを使う。まだ、新しい分野ということで、表記ゆれが激しく、pathwise derivative estimator, infinitesimal perturbation analysis, stochastic backpropagationなんかとも呼ぶらしい。
まず$w$をGaussianで近似する。この際、分散は正にしたいので、以下の形にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/7180b1b2-5929-6dca-9fb6-09548f01a9c9.png)
これにより、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/66387810-91b3-0c17-228d-becd406dc92f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/f16969d7-d478-7f7a-5aa6-37d670c6839a.png)
の計算が出来て、普通にBackpropagationが使える。

これで、重みのパラメーターは2倍になっているけど、ネットワークの自信のなさは説明がつく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/556eee18-722f-12b5-1033-3dbc744e1ca4.png)
左が、Bayes by Backpropで右がいつものNeural Network。
データがないところで、Inferenceをすると違いが良くわかる。

導出の部分は、VAEの有名論文に詳しい。
[Auto-Encoding Variational Bayes](https://arxiv.org/abs/1312.6114)

この重みをGaussianではなくBernoulliで近似するとGaussianと違って、パラメータ数は増えなくDropoutと同義になるらしい。
[Bayesian Convolutional Neural Networks with Bernoulli Approximate Variational Inference](https://arxiv.org/abs/1506.02158)

Bayes by BackpropをConvに当てはめている論文もあり
[Uncertainty Estimations by Softplus normalization in Bayesian Convolutional Neural Networks with Variational Inference](https://arxiv.org/abs/1806.05978)
[Variance Networks: When Expectation Does Not Meet Your Expectations](https://arxiv.org/abs/1803.03764)
これから、流行るのではなかろうか。