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


過去11回でパソコンを自作した後に、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
に説明があるが、とりあえずこんなこと

をするみたい。

これも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に

STEPS_PER_EPOCH = 250000
EPOCHS = 200
STEPS_PER_TEST = 125000

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

STEPS_PER_EPOCH = 100000
EPOCHS = 50
STEPS_PER_TEST = 50000

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

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