覚え書きブログ

Deep Learning覚え書き(ChainerでDQN)

以前インストールしたChainerで、Deep Q Network(DQN)を動かしてみたのでメモっておく。
hirotaka-hachiya.hatenablog.com
DQNの論文については、以下参照。
hirotaka-hachiya.hatenablog.com

以下、ATARIDQNを学習するまでの手順である。
1)RL-Glueのインストール
RL-Glueはアルバータ大で開発された強化学習のエージェント、環境、実験プログラムを接続する標準インタフェースである。それぞれのプログラムは、C/C++JavaPythonMatlabおよびLispのうちどの言語で書いても大丈夫です。ただし、それぞれの言語のcodecをインストールする必要があります。
http://glue.rl-community.org/wiki/Main_Page

今回は、RL-Glueのコアパッケージ(RL-Glue Core)と、C/C++と、Pythonのcodecをインストールする。RL-Glue Coreと、C/C++ Codecに関しては、それぞれ下記のページからdebパッケージをダウンロードし、dpkgを用いてインストールする。
https://sites.google.com/a/rl-community.org/rl-glue/Home/rl-glue
https://sites.google.com/a/rl-community.org/rl-glue/Home/Extensions/c-c-codec

> sudo dpkg -i rl-glue_3.04-1_amd64.deb
> sudo dpkg -i rl-glue-c-codec_2.0-1_amd64.deb
> ls /usr/lib/librl*/usr/lib/librlagent-1:0:0.so.1
/usr/lib/librlagent-1:0:0.so.1.0.0
/usr/lib/librlagent.a
/usr/lib/librlagent.la
/usr/lib/librlagent.so
/usr/lib/librlenvironment-1:0:0.so.1
/usr/lib/librlenvironment-1:0:0.so.1.0.0
/usr/lib/librlenvironment.a
/usr/lib/librlenvironment.la
/usr/lib/librlenvironment.so
...

上記のようにRL-Glue coreとC/C++ codecのライブラリが/usr/libにインストールされているので、LD_LIBRARY_PATHに設定する。

> export LD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATH

Python Codecに関しては、下記のページからソースファイル(python-codec-2.02.tar.gz)をダウンロードし、インストールする。
https://sites.google.com/a/rl-community.org/rl-glue/Home/Extensions/python-codec

> tar -xvzf python-codec-2.02.tar.gz
> cd python-codec/src
> sudo python setup.py install

Python Codecのsrcフォルダのパスを、PYTHONPATHに設定する。

> export PYTHONPATH=~/Works/RL/python-codec/src:$PYTHONPATH

2)Arcade-Learning-Environment(ALE)のインストール
ALEは、RL-Glueの強化学習エージェントを、ATARIの2600種類のゲームを用いて評価するためのプラットフォームである。
http://www.arcadelearningenvironment.org/

下記のページから、最新版0.5.1をダウンロードして、インストールする。
http://www.arcadelearningenvironment.org/downloads/

> unzip Arcade-Learning-Environment-0.5.1.zip 
> cd Arcade-Learning-Environment-0.5.1
> cmake -DUSE_SDL=ON -DUSE_RLGLUE=ON -DBUILD_EXAMPLES=ON .
> make -j 4
...
[100%] [100%] Built target sharedLibraryInterfaceExample
Built target videoRecordingExample

3)ROMをダウンロード
ALEが読み込むATARIのROMファイル(Roms.zip)を、下記のサイトからダウンロードし解凍する。
http://www.atarimania.com/rom_collection_archive_atari_2600_roms.html

> unzip Roms.zip
Archive:  Roms.zip
 extracting: HARMONY CART ROMS.zip   
 extracting: ROMS.zip
> unzip ROMS.zip
> cp ROMS/Video Olympics – Pong Sports (Paddle) (1977) (Atari, Joe Decuir – Sears) (CX2621 – 99806, 6-99806, 49-75104) ~.bin /tmp/pong.bin

今回は、卓球ゲームのPONGを強化学習に学習させる。PONGゲームのROMは、上記のようにROMSフォルダ以下に「Video Olympics – Pong Sports (Paddle) (1977) (Atari, Joe Decuir – Sears) (CX2621 – 99806, 6-99806, 49-75104) ~.bin」というファイルで保存されている。名前が長すぎて、後でALEに食わせる時に面倒なので、tmpフォルダに「pong.bin」という省略したフィル名でコピーしておく。

4)DQN-chainerのインストール
Ugo-Namaさんが実装し提供しているChainer上で動作するDQNをインストールする。
DQN-chainerのブログ記事:qiita.com
DQN-chainerのgit:https://github.com/ugo-nama-kun/DQN-chainer

git cloneを実行しインストールする。

> git clone https://github.com/ugo-nama-kun/DQN-chainer.git

5)DQNの学習の実行
4つのターミナルを立ち上げて、以下のコマンドをそれぞれ実行する。

> rl_glue
RL-Glue Version 3.04, Build 909
RL-Glue is listening for connections on port=4096
> cd DQN-chainer
> python dqn_agent_nature.py
RL-Glue Python Agent Codec Version: 2.02 (Build 738)
	Connecting to 127.0.0.1 on port 4096...
> cd DQN-chainer
> python experiment_ale.py 


DQN-ALE Experiment starting up!
RL-Glue Python Experiment Codec Version: 2.02 (Build 738)
	Connecting to 127.0.0.1 on port 4096...
> cd Arcade-Learning-Environment-0.5.1
> ./ale -game_controller rlglue -use_starting_actions true -random_seed time -display_screen true -frame_skip 4 /tmp/pong.bin

下図のようなウィンドウが立ち上がり、DQNのpongの学習が始まる。ちなみに、左がハンドメードエージェントで、右が強化学習エージェントである。
f:id:hirotaka_hachiya:20160605215206p:plain

experiment_ale.pyの出力は、以下のように学習の進捗(エピソード番号、ステップ数、報酬の合計)を表す。とりあえず171エピソードまで走らせてみたが、下記のように報酬が少し改善(-21から-16に)しているのがわかる。ただし、強化学習エージェントが時々打ち返せるようになった程度で、まだまだ弱い。

>python experiment_ale.py 


DQN-ALE Experiment starting up!
RL-Glue Python Experiment Codec Version: 2.02 (Build 738)
	Connecting to 127.0.0.1 on port 4096...
Freeze learning for Evaluation
Evaluation ::	 824 steps 	-21.0 total reward	 
DQN is Learning
Episode 1	 824 steps 	-21.0 total reward	 
DQN is Learning
Episode 2	 1294 steps 	-18.0 total reward	 
DQN is Learning
Episode 3	 1070 steps 	-21.0 total reward	 
DQN is Learning
Episode 4	 826 steps 	-21.0 total reward	 
DQN is Learning
Episode 5	 1005 steps 	-21.0 total reward	 
DQN is Learning
Episode 6	 1321 steps 	-19.0 total reward	 
DQN is Learning
Episode 7	 1162 steps 	-20.0 total reward
...
Episode 169	 1316 steps 	-19.0 total reward	 
DQN is Learning
Episode 170	 1317 steps 	-19.0 total reward	 
DQN is Learning
Episode 171	 1619 steps 	-19.0 total reward	 
Freeze learning for Evaluation
Evaluation ::	 3354 steps 	-16.0 total reward

dqn_agent_nature.pyは、以下のようにトータルのステップ数、選択した行動の種類、報酬、Epsilonの値(行動選択のランダム性を表す)および最大のQ値を出力する。

> python dqn_agent_nature.py

ANDOM
 Time Step 193072 /   ACTION  1  /   REWARD 0.0   / EPSILON  0.807211  /   Q_max  -0.594820
RANDOM
 Time Step 193073 /   ACTION  1  /   REWARD 0.0   / EPSILON  0.807210  /   Q_max  -0.585124
RANDOM
 Time Step 193074 /   ACTION  0  /   REWARD 0.0   / EPSILON  0.807209  /   Q_max  -0.671875
RANDOM
 Time Step 193075 /   ACTION  2  /   REWARD 0.0   / EPSILON  0.807208  /   Q_max  -0.869213
RANDOM
 Time Step 193076 /   ACTION  2  /   REWARD 0.0   / EPSILON  0.807207  /   Q_max  -0.892671
RANDOM
 Time Step 193077 /   ACTION  1  /   REWARD 0.0   / EPSILON  0.807206  /   Q_max  -0.944676
RANDOM
 Time Step 193078 /   ACTION  2  /   REWARD 0.0   / EPSILON  0.807205  /   Q_max  -0.932488
RANDOM
 Time Step 193079 /   ACTION  2  /   REWARD -1.0   / EPSILON  0.807204  /   Q_max  0.051145
RANDOM
 Time Step 193080 /   ACTION  1  /   REWARD 0.0   / EPSILON  0.807203  /   Q_max  0.057747
RANDOM
 Time Step 193081 /   ACTION  2  /   REWARD 0.0   / EPSILON  0.807202  /   Q_max  0.061561
RANDOM
 Time Step 193082 /   ACTION  1  /   REWARD 0.0   / EPSILON  0.807201  /   Q_max  0.046304
RANDOM
 Time Step 193083 /   ACTION  1  /   REWARD 0.0   / EPSILON  0.807200  /   Q_max  0.040366
RANDOM
 Time Step 193084 /   ACTION  2  /   REWARD 0.0   / EPSILON  0.807199  /   Q_max  0.044192
RANDOM
 Time Step 193085 /   ACTION  1  /   REWARD 0.0   / EPSILON  0.807198  /   Q_max  0.038262
RANDOM