LoginSignup
23
31

More than 5 years have passed since last update.

OpenAI UniverseでするAtari Pongの強化学習

Last updated at Posted at 2017-01-20

オリィ研究所(http://orylab.com/)の畑中です。
今回は2016年12月にOpenAIがリリースしたAI学習プラットフォームUniverseでAIエージェントを育ててみました。

Universeとは

公式ブログの説明が詳しいですが、UniverseはAIの知能を測定・訓練するためのプラットフォームです。汎用人工知能を作ることを目標として作られた環境とのことです。

Universe上でAIエージェントは人間と同じようにコンピュータを利用することで学習を行います。具体的にはエージェントはVNCクライアントとしてピクセルを観察して、キーボード、マウスコマンドを生成することでリモートデスクトップを操作します。キーボード、マウスコマンドを使って制御を行うところがポイントで、これによって既存のプログラムの内部情報を把握していなくとも制御が可能になって、別のタスクにも適用できる汎用性のあるデータが手に入るということのようです。ブラウザ上でのタスクも学習可能で、将来的にはKhan Academyのレッスンなんかも行えるようになるとのことです。

使ってみる

OpenAIが公開しているUniverse関連のレポジトリです。1つ目のレポジトリだと必要最低限の環境構築をするだけですが、2つ目の方ではTensorFlowで実装されたA3Cアルゴリズムが最初から使えるのでこちらの環境を構築していきます。

環境

  • macOS Sierra 10.12.2

準備

READMEを参考に諸々のパッケージをインストールします。

$ conda create --name universe-starter-agent python=3.5
$ source activate universe-starter-agent

$ brew install tmux htop      

$ pip install gym[atari]
$ pip install universe
$ pip install six
$ pip install tensorflow
$ conda install -y -c https://conda.binstar.org/menpo opencv3
$ conda install -y numpy
$ conda install -y scipy

pyenv環境下だと2つ目のコマンドのsource activate <env-name>がシェルごと落ちるというエラーが発生する場合があるので、その場合は

$ source $PYENV_ROOT/versions/<version>/bin/activate

とactivateをフルパス指定することで回避できます。
こちらを参考にさせていただきました。
pyenvとanacondaを共存させる時のactivate衝突問題の回避策3種類

他には自分の環境だと、universeのインストールの箇所で

Failed building wheel for fastzbarlight

とエラーが出たので、

イーロン・マスク氏が関わるOpenAIの人工知能プラットフォーム「Universe」を動かしてみる

こちらのページを参考にXQuartzをインストールして、

$ brew install Caskroom/cask/xquartz

fastzbarlightの手動インストールを行って無事インストールできました。

fastzbarlight/setup.py
# extra_link_args=[os.path.join(os.path.dirname(__file__), 'src/fastzbarlight/vendor/zbar-0.10/zbar/.libs/libzbar.a')],
extra_link_args=[os.path.join(os.path.dirname(__file__), '/usr/local/Cellar/zbar/0.10_3/lib/libzbar.a')],
$ cd path/to/fastzbarlight
$ python setup.py install

それと、VNCサーバとWebSocketサーバを動かすためのコンテナが要るので、Dockerが入ってない方はDocker for Macから取ってきてインストールしましょう。

これで環境構築は終了です。

動作確認

$ cd path/to/universe-starter-agent
$ python train.py --num-workers 2 --env-id gym-core.PongDeterministic-v3 --log-dir /tmp/vncpong

上記のコードでエージェントに学習させます。フラグは以下のようになってます。

--num-workers      並列で学習するワーカの数
--env-id           学習用の環境
--log-dir          学習の中間結果を吐き出すディレクトリ

READMEによるとワーカの数はコア数を超えないようにするのがパフォーマンス的に良いようです。

上記のコマンドで以下の4つのプロセスが起動します。

  • 方策勾配法で強化学習を行うプロセス
  • 環境から受け取ったランダムなノイズを利用するプロセス
  • 別々のワーカ間でパラメータを同期させるパラメータサーバ
  • TensorBoardのプロセス

tmuxのセッションも同時に生成されるのでそれぞれのプロセスの状況をウィンドウから確認できます。

$ tmux a
$ ctrl-b <window-number>

ではMacに標準でインストールされているVNCクライアントソフトを使ってエージェントが学習する様子を見てみましょう。ちなみに何らかの理由ですでに5900ポートが埋まっている場合は、自動でインクリメンタルにポート番号が増えていくので注意です。

$ open vnc://localhost:5900

以下のような表示になります。左側はtmuxのウィンドウです。
右側のプレイヤがエージェントです。学習開始直後の様子なのでべらぼうに弱いですが動いてはいますね。

学習が進むとこんな具合になるようです。

ちなみに、--env-idを別のもの(e.g. "flashgames.NeonRace-v0")に変えた場合はこんな感じです。デフォルトのA3CアルゴリズムはPong用にチューニングされたもので、おそらく望ましい結果は得られないと思われます。

TensorBoardで結果を見る

VNC版だとレイテンシの影響で観測と行動に遅延が生じて学習が難しくなるとのことだったんですが、とりあえず結果をみてみます。
スクリーンショット 2017-01-20 18.19.40.png
最初に降下したのが若干気になりますが(おそらく開発機で試したせい)、徐々に報酬(reward)の値が増えていますね。

A3Cアルゴリズムについて

チューニング等についてはまた別に書きます。
こちらが詳しいです。
A3Cという強化学習アルゴリズムで遊んでみた話

※補足

ローカルにGPUを使える環境が無いなら、大人しく環境とエージェントの両方を同一リージョンのEC2に置くなどしないとパフォーマンス的に厳しいです。

23
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
31