ニューラルネットの重みをベイズ推定しましょう
論文の内容および実験結果については ニューラルネットへのベイズ推定 - Bayesian Neural Network にて解説しています
ニューラルネットワークの過学習防止としてもちいられる Dropout という枠組みがあります。これがネットワークの重みに対してベイズ推定を行っていることに相当するということが Uncertainty in Deep Learning にて主張されています。
本リポジトリはこの論文を元にデータセットや活性化関数、dropout の種類などを変えた時に重みの事後分布による予測がどのように分布するか、を可視化することを目的としています。
BNN モジュールの実行に必要なパッケージは以下のとおりです.
chainer==1.24.0
numpy
matplotlib
scikit-learn
pandas
docker + docker-compose で実行するのがもっとも手軽です。実行のためにホストマシン上に docker 及び docker-compose をインストールしておいてください。 インストール後に以下のコマンドを実行すると localhost:7010 に jupyter notebook が起動します
cp project.env .env
docker-compose build
docker-compose up -d
docker-compose ps
を実行してちゃんと jupyter が起動しているか確認します.(State が Up になっていれば OK です) 以下の例であれば localhost:7010 に jupyter が起動しています.
➜ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------
bayse-jupyter /usr/bin/tini -- jupyter n ... Up 0.0.0.0:7010->8888/tcp
http://localhost:7010/notebooks/notebooks/simple_sample.ipynb にサンプルコードがありますので参考にしてください
from bnn import BNNEstimator
from bnn import article_data
clf = BNNEstimator()
x_train, y_train, _ = article_data.make_data(size=100, function_type="art1")
# data_name は出力先のフォルダを作成するのに必要
clf.fit(x_train, y_train, data_name="art1")
python main.py -h
optional arguments:
-h, --help show this help message and exit
-e E number of epochs.
-m MASK, --mask MASK type of mask function. dropout, gaussian, none.
-a ACTIVATE, --activate ACTIVATE
type of activate function.
-d DATA, --data DATA
--hidden HIDDEN number of hidden dimensions.
NOTE: docker で動かしている場合には container 内部でコマンドを実行する必要があります。
docker exec -it bayse-jupyter bash
でコンテナに潜り込んだ後に実行してください。
python main.py
- hidden layer dim: 512
- activation: relu
- mask function: dropout
- optimizer: Adam (weight decay 4 * 10^-5)
活性化関数を sigmoid
に変更
python main.py -a sigmoid
隠れ層の次元を 512 -> 32 に変更
python main.py --hidden 32
データセットを変更
python main.py --data art2