Model-Free Episodic Controlモデルで学習させてみる

過去１１回でパソコンを自作した後に、Ubuntu14.04、CUDA、cuDNN、chainer、dqn、LIS、Tensorflow、OpenAIGymを順次インストールし、いくつかモデルを走らせた。特に前回はPseudo-countを学習させるべく進めたが、dependenciesのインストールにおいてopencv3がうまくインストールできず、挫折している。
http://qiita.com/masataka46/items/caddc177d0c34d165b73

今回は
Frank He（ShibiHe）氏が作成したModel-Free Episodic ControlモデルのコードでOpenAIGym上で学習させる。
C. Blundell氏らDeepMindの「Model-Free Episodic Control」論文はこちら。
http://arxiv.org/pdf/1606.04460v1.pdf
中身をごく端的に言うと、episodic memoryを使って海馬を模した、ってところ。

Frank He氏のGitHub上のコードはこちら。
https://github.com/sudeepraja/Model-Free-Episodic-Control
ざっと見たところ、Theanoを使ってる。

##GitHub上からコードをもってくる
適当なディレクトリにgit cloneする。

```
git clone https://github.com/ShibiHe/Model-Free-Episodic-Control.git
```

##dependenciesのインストール
どうやら新たにLasagneというのと、annoyというものが必要らしい。

まずLasagneのインストール。よくわからんが、とりあえずpipで試してみる。

```
sudo pip install lasagne
```

成功したみたい。次にannoy。これは得体がしれないから、とりあえず調べてみる。githubのこちら
https://github.com/spotify/annoy
に説明があるが、とりあえずこんなこと
![annoy01.png](https://qiita-image-store.s3.amazonaws.com/0/116706/07a56768-cf3f-2a99-53ee-601fe4674ae4.png)
をするみたい。

これもpipでいけるみたい。

```
sudo pip install annoy
```

annoy-1.8.0がインストールされた。

##まずはdefaultで走らせてみる
何も考えずに

```
THEANO_FLAGS='device=gpu0, floatX=float32' python run_nature.py
```

としたところ

```
ImportError: No module named sklearn.neighbors
```

と出た。scikits-learnというのが必要らしい。よってインストールする。

```
sudo pip install -U scikit-learn
```

再度run_nature.pyを実行したところ、案の定

```
No ROM File specified or the ROM file was not found.
```

と出た。ROMがそれらしき場所に無かったので予想通り。とりあえずrun_nature.pyの23行目で指定されているdefaultのms_pacman.binを入れる。

しかしどこのディレクトリに入れるべきかわからない。READMEには

Model-Free-Episodic-Control

├ dqn_ep -> source codes

├ roms -> game roms

└ README.md

という記述があるので、dqn_epと同じ階層にromsというフォルダを作り、その中に入れてみる。再度実行。

なんか学習が始まったっぽいが、いつものようなゲームの画面が出てこない。romに問題があるのだろうか？

```
THEANO_FLAGS='device=gpu0, floatX=float32' python run_nature.py
Using gpu device 0: GeForce GTX 1070 (CNMeM is disabled, cuDNN 5005)
/usr/local/lib/python2.7/dist-packages/theano/tensor/signal/downsample.py:6: UserWarning: downsample module has been moved to the theano.tensor.signal.pool module.
  "downsample module has been moved to the theano.tensor.signal.pool module.")
/media/ohmasa/several data/home/ohmasa/openAIGym/model_free_episodic_control1/Model-Free-Episodic-Control/dqn_ep/q_network.py:178: UserWarning: theano.function was asked to create a function computing outputs given certain inputs, but the provided input variable at index 1 is not part of the computational graph needed to compute the outputs: <CudaNdarrayType(float32, col)>.
To make this warning into an error, you can pass the parameter on_unused_input='raise' to theano.function. To disable it completely, use on_unused_input='ignore'.
  givens=train_givens, on_unused_input='warn')
INFO:root:OPENING ms_pacman_09-19-00-15_0p00025_0p99/results.csv
INFO:root:training epoch: 1 steps_left: 250000
INFO:root:steps/second: 1005.88, avg: 20.12
INFO:root:training epoch: 1 steps_left: 249975
INFO:root:steps/second: 1133.29, avg: 42.38
INFO:root:training epoch: 1 steps_left: 249970
INFO:root:steps/second: 1110.49, avg: 63.74
INFO:root:training epoch: 1 steps_left: 249964
INFO:root:steps/second: 1100.99, avg: 84.49
INFO:root:training epoch: 1 steps_left: 249957
INFO:root:steps/second: 432.21, avg: 91.44
INFO:root:average loss: 3.1379
INFO:root:testing epoch: 1 steps_left: 125000
INFO:root:training epoch: 2 steps_left: 250000
INFO:root:steps/second: 375.21, avg: 97.12
INFO:root:average loss: 3.1827
INFO:root:training epoch: 2 steps_left: 249972
INFO:root:steps/second: 447.47, avg: 104.12
INFO:root:average loss: 3.1154
INFO:root:training epoch: 2 steps_left: 249967
INFO:root:steps/second: 447.03, avg: 110.98
INFO:root:average loss: 2.8808
INFO:root:training epoch: 2 steps_left: 249961
INFO:root:steps/second: 515.27, avg: 119.07
INFO:root:average loss: 3.5165
INFO:root:training epoch: 2 steps_left: 249954
INFO:root:steps/second: 359.12, avg: 123.87
INFO:root:average loss: 3.1382
INFO:root:testing epoch: 2 steps_left: 125000
INFO:root:training epoch: 3 steps_left: 250000
INFO:root:steps/second: 350.62, avg: 128.40
INFO:root:average loss: 3.1239
INFO:root:training epoch: 3 steps_left: 249950
INFO:root:steps/second: 359.13, avg: 133.02
INFO:root:average loss: 3.2046
INFO:root:training epoch: 3 steps_left: 249855
```

ここまで1時間くらい。学習の進行があまりに遅くないか？

```
INFO:root:steps/second: 415.57, avg: 391.70
INFO:root:average loss: 3.2587
INFO:root:training epoch: 47 steps_left: 249963
INFO:root:steps/second: 398.32, avg: 391.83
INFO:root:average loss: 2.7436
INFO:root:training epoch: 47 steps_left: 249952
INFO:root:steps/second: 317.72, avg: 390.35
INFO:root:average loss: 3.0604
INFO:root:testing epoch: 47 steps_left: 125000
INFO:root:training epoch: 48 steps_left: 250000
INFO:root:steps/second: 337.22, avg: 389.29
INFO:root:average loss: 3.1287
INFO:root:training epoch: 48 steps_left: 249973
```

48epochで15時間くらい。run_nature.pyに

```py
STEPS_PER_EPOCH = 250000
EPOCHS = 200
STEPS_PER_TEST = 125000
```

とある。48ecpochで1,200,000stepsくらいか。いったん停止させ、改めて

```py
STEPS_PER_EPOCH = 100000
EPOCHS = 50
STEPS_PER_TEST = 50000
```

として再学習。６時間ほどで学習が終了した。

```
INFO:root:steps/second: 359.80, avg: 378.48
INFO:root:average loss: 3.1362
INFO:root:training epoch: 49 steps_left: 99890
INFO:root:steps/second: 319.69, avg: 377.31
INFO:root:average loss: 3.0497
INFO:root:testing epoch: 49 steps_left: 50000
INFO:root:training epoch: 50 steps_left: 100000
INFO:root:steps/second: 333.04, avg: 376.42
INFO:root:average loss: 3.2018
INFO:root:training epoch: 50 steps_left: 99974
INFO:root:steps/second: 319.29, avg: 375.28
INFO:root:average loss: 3.0544
INFO:root:testing epoch: 50 steps_left: 50000
```