以前インストールしたChainerで、Deep Q Network(DQN)を動かしてみたのでメモっておく。
hirotaka-hachiya.hatenablog.com
DQNの論文については、以下参照。
hirotaka-hachiya.hatenablog.com
以下、ATARIでDQNを学習するまでの手順である。
1)RL-Glueのインストール
RL-Glueはアルバータ大で開発された強化学習のエージェント、環境、実験プログラムを接続する標準インタフェースである。それぞれのプログラムは、C/C++、Java、Python、Matlabおよび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の学習が始まる。ちなみに、左がハンドメードエージェントで、右が強化学習エージェントである。
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