オリィ研究所(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の手動インストールを行って無事インストールできました。
# 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のウィンドウです。
右側のプレイヤがエージェントです。学習開始直後の様子なのでべらぼうに弱いですが動いてはいますね。
Atari Pong using OpenAI Universe. pic.twitter.com/pIp14lQaQ5
— Tatsuya (@thht11) 2017年1月20日
学習が進むとこんな具合になるようです。
Highly trained AI agent playing Pong on OpenAI Gym. pic.twitter.com/jQ6zlpZuJR
— Tatsuya (@thht11) 2017年1月20日
ちなみに、--env-id
を別のもの(e.g. "flashgames.NeonRace-v0")に変えた場合はこんな感じです。デフォルトのA3CアルゴリズムはPong用にチューニングされたもので、おそらく望ましい結果は得られないと思われます。
NeonRace using @OpenAI Universe. #OpenAI #DeepLearning pic.twitter.com/NfAxBhHxta
— Tatsuya (@thht11) 2017年1月20日
TensorBoardで結果を見る
VNC版だとレイテンシの影響で観測と行動に遅延が生じて学習が難しくなるとのことだったんですが、とりあえず結果をみてみます。
最初に降下したのが若干気になりますが(おそらく開発機で試したせい)、徐々に報酬(reward)の値が増えていますね。
A3Cアルゴリズムについて
チューニング等についてはまた別に書きます。
こちらが詳しいです。
A3Cという強化学習アルゴリズムで遊んでみた話
※補足
ローカルにGPUを使える環境が無いなら、大人しく環境とエージェントの両方を同一リージョンのEC2に置くなどしないとパフォーマンス的に厳しいです。