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

オリィ研究所(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に置くなどしないとパフォーマンス的に厳しいです。


『 機械学習 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。