概要
Unity上で機械学習ができるライブラリが公式より発表されたみたいです。
記事を読んでみると、
・多くの自律エージェントが互いに作用する世界でのエージェントのふるまいをシミュレーションできる(漠然としてるけど行動学とかそのへんかしら)
・車の自動運転技術など産業用アプリケーションに関する研究を物理の効いたUnityの世界で実行できる
・自律的な思考を持つAIプレイヤーをゲームに導入できる
みたいなことが書いてあります。以前からUnityはゲーム以外の学術方面での利用も推し進めてるようですが、やっぱり気になるのは開発するゲームに訓練されたAIプレイヤーを導入できることでしょうか。
ゲームでの機械学習というと、DeepMindのDeep Q-Networkなんかが有名ですが、このライブラリでもDQNが利用できるみたいです。
Unity Machine Learning - Reinforcement Learning Demo
実際に試す
GitHubに必要なファイルがあるので、CloneするなりDownload Zipするなりします。
まだベータ版ですので扱いにはお気を付けください。
Unityは2017.1以上のバージョンが必要です。
Unity Editorでml-agent/unity-environmentを開いて、Assets/ML-Agents/Examples/3DBall内のSceneを読み込みましょう。これはあらかじめ用意されたサンプルシーンです。
こんな感じのシーンが読み込まれます。
HierarchyからBall3DAcademy > Ball3DBrainのInspectorを開き、Type Of BrainをExternalにセットしてください。学習を有効にするために必要な設定です。
実際に学習を行うにはビルドする必要があります。
どういうことかというと、学習機能自体はこのプロジェクトには含まれておらず、ビルドしたのち外部ライブラリであるTensorFlowによって行われるようです。
ビルドする前にPlayer SettingsからRun in Backgroundにチェックを入れ、Display Resolution Dialogのチェックを外しておきます。
ビルドはダウンロードしたルートフォルダの中のpythonフォルダに保存します。
ではビルドも済みましたし実際に学習……と行きたいところですが、そのまえにpythonの学習環境を整える必要があります。
Pythonの設定
まずはPythonをインストールします。ドキュメンテーションにはPython2.7でもPython3でもいけるとありますがTensorflowはWindowsではPython3系でしか動かないようなのでこちらをインストールします。(Macでは2.7系でもうごくっぽいですが未検証)
Python Release Python 3.6.2 | Python.org
インストールが済んだらコマンドプロンプトからpython --versionを入れてPython3系がインストールされてることを確認しましょう。
では設定に移ります。先ほどビルドを展開したpythonフォルダに移動し、
pip3 install .
を入力すると自動で必要なパッケージ類をインストールしてくれます。
学習
インストールが済んだらいよいよ学習を始めていきます。
pythonフォルダーで jupyter notebook を入力してjupyterを立ち上げます。
ブラウザから localhost:8888 にアクセスし、 PPO.ipynb を開いて Hyparameters セクションの env_name にビルドしたバイナリの名前(拡張子抜き)をセットします。
また、デフォルトでは訓練を 5e5(50万)回行う設定になってますが、筆者のPCは貧弱なのでこれを減らしておきます。
Hyparameters セクションの max_steps を5e4に変更します。
一番トップのコードのセクションにフォーカス(青カーソルが出る)を合わせ、 Run をカチカチと押してすべてのコードを実行していきますと、ビルドした実行ファイルが立ち上がり、学習が始まっていきます。
しばらく放置すると Train the Agents セクションに学習してるログが吐かれます。
Mean Reward: 9.350500454959013
Mean Reward: 76.65897435897344
Mean Reward: 88.24444444444323
Mean Reward: 56.52788461538383
Mean Reward: 54.5907834101375
Saved Model
こんな感じで続いていき、学習が終了するとビルドしたアプリケーションが終了します。
python/models/ppo/<バイナリ名>.bytes
があることを確認してください。これが学習データです。こいつをExamples\3DBall\TFModelsに移動しておきます。
学習した結果を確認する
こんな感じで学習が終了したので、こんどはこれをUnity Editorに読み込んで結果を確認してみます。
もう一度さっきのプロジェクトを開きます。
まず、TensorFlowSharpのunitypackage をプロジェクトに追加します。
Player Settings で Other Settings から、
1) Scripting Runtime Version
を Experimental (.NET 4.6 Equivalent)
にセット
2) Scripting Defined Symbols に ENABLE_TENSORFLOW を追加
したのち、一度Editorを再起動します。
3DBall のSceneを読み込んで、最初に設定したBall3DBrainのInspectorを開きます。
Type Of BrainをInternalにセットし、Graph Modelに先ほど移動したbytesファイルをセットします。
Graph PlaceholdersのSizeを1にセットし、
Name : epsilon
Value Type : Floating Point
Min Value : 0
Max Value : 0
に設定します。
ではいよいよPlayしてみましょう。板がボールを落とさぬよう勝手に傾きを調整しています。
感想
とりあえずWikiのまんまに一通り試してみましたが、数多ある機械学習ライブラリとそのサンプルの中では圧倒的に手軽にすごいことが試せますね。(どこでもMNISTしかやらないから)
これがUnityという強力なプラットフォームで実現可能になった効果は大きいと思います。カスタムのプロジェクトでのML-Agentsの導入方法についてもWikiにあるのでまだまだいろいろなことが試せそうで夢がひろがりんぐしてます