CPUで気軽に強化学習してみた話(DeepMind A3C)

どうもオリィ研究所[(http://orylab.com)](http://orylab.com)の畑中です。

近ごろ強化学習界隈の盛り上がりが素晴らしく、[OpenAI Universe](https://universe.openai.com/)や[DeepMind Lab](https://github.com/deepmind/lab)のようなプラットフォームがリリースされるなど、開発は今後さらに活発化していくと思われます。ですが従来のDQN等の強化学習手法だとGPUや大規模分散環境が前提になっていたりとハード面がネックになって気軽に試すというわけにもいかなかったりすることが多いかと思います。

ということで何かいいものはないかと探していたところ、DeepMindが開発したA3Cという手法が良さげだったので、手元のMacBookで気軽に強化学習してみます。

## A3Cとは
Asynchronous Advantage Actor-Criticの略記です。
DeepMindが2016年に発表した手法で、従来の手法のようにGPUや大規模分散環境等の特殊なハードウェア環境には依存せず、CPUのマルチスレッドを利用して学習を行います。パラメータを最適化する方法として複数のエージェントを利用して勾配更新を非同期的に行う点に特徴があります。GPUを使う従来の手法の半分程度の時間で最高水準の結果を出せるとのことです。

[論文](https://arxiv.org/pdf/1602.01783.pdf) (疑似コード付き)

論文内で従来の手法との性能比較がされていたので見てみます。ちなみにDQNの場合はNVIDIA K40 GPUを利用した結果でA3Cの場合は16コアのCPUを利用したものです。

こちらがAtariのPong(ページ下部に動画あり)の結果。y軸がゲームのスコアで、DQNと比較すると何倍も早く最高値に到達していることがわかります(21点先取で勝利)。
![スクリーンショット 2017-02-10 2.18.33.png](https://qiita-image-store.s3.amazonaws.com/0/59997/e1aaa2eb-daec-0fbd-fe09-085f8f2b8072.png)

こちらがSpace Invadersのもの。先ほどのPongの場合だとスコアに上限があったのですが、Space Invadersには(おそらく)無いため、スコアの開きが顕著になっています。

![スクリーンショット 2017-02-10 2.18.54.png](https://qiita-image-store.s3.amazonaws.com/0/59997/9348b48c-180e-9409-ca52-4143aa2d27ca.png)

とまあ、ざっと見てみるにとても良さげなので早速動かしてみます。

## 環境
 - PC: MacBook Air(Early 2015)
 - プロセッサ: 2.2GHz Intel Core i7
 - メモリ: 8GB 1600 MHz DDR3
 - GPU: Intel HD Graphics 6000 1536MB


## 準備

[miyosuda](https://github.com/miyosuda)さんの実装が素晴らしかったので訓練用、テスト用コードをお借りして環境を作っていきます。

[miyosuda / async_deep_reinforce](https://github.com/miyosuda/async_deep_reinforce)

ちなみにゲームのプレー動画をファイル保存したい場合は保存機能追加版のこちらをお使いください(要ffmpeg)。

[tatsuyah / async_deep_reinforce](https://github.com/tatsuyah/async_deep_reinforce)

Anaconda(もしくはminiconda)のインストールがされていない場合、下記を参考にインストールし、仮想環境を構築します。

[HomebrewのインストールからpyenvでPythonのAnaconda環境構築までメモ](http://qiita.com/oct_itmt/items/2d066801a7464a676994
)

```
$ git clone git@github.com:miyosuda/async_deep_reinforce.git
$ cd path/to/async_deep_reinforce
$ git clone https://github.com/miyosuda/Arcade-Learning-Environment.git
$ cd Arcade-Learning-Environment
$ cmake -DUSE_SDL=ON -DUSE_RLGLUE=OFF -DBUILD_EXAMPLES=OFF .
$ make -j 4

$ pip install .
```

以下のライブラリがインストールされていない場合はpipもしくはbrewでインストールしておきます。

 - Tensorflow
 - cv2
 - matplotlib
 - sdl

以上で環境構築は終了です。

## 試す

### 学習

async_deep_reinforce内で使われているALEはAtariのエミュレータがベースになっており、constants.py内で指定するROMファイルを切り替えることで学習対象のゲームの切り替えが可能です(初期値はpong.bin)。

```async_deep_reinforce/constants.py
ROM = "pong.bin"    
```

他に試してみたいタイトルがある場合、ROMファイルは以下のサイトから取ってくるのが良さげです(Space Invadersのものは[こちらのレポジトリ](https://github.com/tambetm/simple_dqn)のものを使った)。

[Atari 2600 VCS ROM Collection](http://www.atarimania.com/rom_collection_archive_atari_2600_roms.html)


a3c.pyを実行すると学習が始まります。

```
$ python a3c.py
```

### テスト

学習結果を表示します。

```
$ python a3c_display.py
```


## 結果を見る(動画)

### Pong
#### 学習初期(≒720000step。≒1時間)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Atari Pong played by reinforcement learning agent using DeepMind&#39;s A3C algorithm. At 720000 step. <a href="https://twitter.com/hashtag/RL?src=hash">#RL</a> <a href="https://twitter.com/hashtag/Atari?src=hash">#Atari</a> <a href="https://twitter.com/hashtag/MachineLearning?src=hash">#MachineLearning</a> <a href="https://twitter.com/hashtag/DeepMind?src=hash">#DeepMind</a> <a href="https://t.co/PMsP88NZlZ">pic.twitter.com/PMsP88NZlZ</a></p>&mdash; tsy (@thht11) <a href="https://twitter.com/thht11/status/829877344256958464">2017年2月10日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

#### 学習後期(≒16Mstep。≒24時間)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Atari Pong played by reinforcement learning agent using DeepMind&#39;s A3C algorithm. At 16M step. <a href="https://twitter.com/hashtag/RL?src=hash">#RL</a> <a href="https://twitter.com/hashtag/Atari?src=hash">#Atari</a> <a href="https://twitter.com/hashtag/MachineLearning?src=hash">#MachineLearning</a> <a href="https://twitter.com/hashtag/DeepMind?src=hash">#DeepMind</a> <a href="https://t.co/awJg63T4HK">pic.twitter.com/awJg63T4HK</a></p>&mdash; Tatsuya (@thht11) <a href="https://twitter.com/thht11/status/829854867099234304">2017年2月10日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

### Space Invaders

#### 学習初期(≒720000step。≒1時間)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Space Invaders played by reinforcement learning agent using DeepMind&#39;s A3C algorithm. At 720000 step. <a href="https://twitter.com/hashtag/RL?src=hash">#RL</a> <a href="https://twitter.com/hashtag/MachineLearning?src=hash">#MachineLearning</a> <a href="https://twitter.com/hashtag/DeepMind?src=hash">#DeepMind</a> <a href="https://t.co/8wMUjOqlqP">pic.twitter.com/8wMUjOqlqP</a></p>&mdash; tsy (@thht11) <a href="https://twitter.com/thht11/status/829876701718982656">2017年2月10日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


#### 学習後期(≒16Mstep。≒24時間)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Space Invaders played by reinforcement learning agent using DeepMind&#39;s A3C algorithm. At 16M step. <a href="https://twitter.com/hashtag/RL?src=hash">#RL</a> <a href="https://twitter.com/hashtag/MachineLearning?src=hash">#MachineLearning</a> <a href="https://twitter.com/hashtag/DeepMind?src=hash">#DeepMind</a> <a href="https://t.co/oAthx7MAVl">pic.twitter.com/oAthx7MAVl</a></p>&mdash; tsy (@thht11) <a href="https://twitter.com/thht11/status/829878184493543424">2017年2月10日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>



## 結果を見る(Tensorboard)

### Pong

x軸が総ステップ数、y軸がスコアです。8M stepを超えたあたりから急激にスコアが伸びているのが確認できます。
![スクリーンショット 2017-02-09 12.56.31.png](https://qiita-image-store.s3.amazonaws.com/0/59997/4e0888e7-25ef-a97b-f491-b8056c7e322a.png)


### Space Invaders

論文内のグラフに比べるとスコアの伸びが少なくもう少しパラメータのチューニングが必要なようですが、学習はなされています。
![スクリーンショット 2017-02-10 9.23.23.png](https://qiita-image-store.s3.amazonaws.com/0/59997/b31498e3-88d4-d3c4-2e21-3668501152bb.png)


## おわりに
まあ学習に１日かかっているのを気軽と見るかはアレですが(爆)、手元のCPUのみの環境で強化学習アルゴリズムが試せて、結果を視覚的に理解しやすい形で確認できるというのは機械学習の裾野を広げるという意味では良いことかと思います。

今後も新しい手法が次々出てくると思われますので、この辺はチェックしておいた方が良さそうです。

[DeepMind News&Blog](https://deepmind.com/blog/)
[OpenAI Blog](https://openai.com/blog/)

## 参考文献

- [深層強化学習：ピクセルから『ポン』](http://postd.cc/deep-reinforcement-learning-pong-from-pixels-1/)
- [Simple Reinforcement Learning with Tensorflow Part 8: Asynchronous Actor-Critic Agents (A3C)](https://medium.com/emergent-future/simple-reinforcement-learning-with-tensorflow-part-8-asynchronous-actor-critic-agents-a3c-c88f72a5e9f2#.c9yr7fx99)
- [ゼロからDeepまで学ぶ強化学習](http://qiita.com/icoxfog417/items/242439ecd1a477ece312)
- [DQNの生い立ち　＋　Deep Q-NetworkをChainerで書いた](http://qiita.com/Ugo-Nama/items/08c6a5f6a571335972d5)
- [これからの強化学習(書籍)](https://www.amazon.co.jp/%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E3%81%AE%E5%BC%B7%E5%8C%96%E5%AD%A6%E7%BF%92-%E7%89%A7%E9%87%8E-%E8%B2%B4%E6%A8%B9/dp/4627880316)
- [強くなるロボティック・プレイヤー(書籍)](https://www.amazon.co.jp/%E5%BC%B7%E3%81%8F%E3%81%AA%E3%82%8B%E3%83%AD%E3%83%9C%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF-%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%97%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9-%E3%83%97%E3%83%AC%E3%83%9F%E3%82%A2%E3%83%A0%E3%83%96%E3%83%83%E3%82%AF%E3%82%B9%E7%89%88-%E5%AE%9F%E8%B7%B5%E3%81%A7%E5%AD%A6%E3%81%B6%E5%BC%B7%E5%8C%96%E5%AD%A6%E7%BF%92-%E5%85%AB%E8%B0%B7-%E5%A4%A7%E5%B2%B3/dp/4839956731/ref=sr_1_1?ie=UTF8&qid=1486713200&sr=8-1&keywords=%E5%BC%B7%E3%81%8F%E3%81%AA%E3%82%8B%E3%83%AD%E3%83%9C%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF)