この記事はすでに古くなっています。以下の2018/11版の方をご覧ください。
Unityで機械学習を利用できるようにするUnity公式のml-agentsをWindows7で動かすまでのメモです。
(2017/11/11 トレーニングの自動終了について追記)
ざっくりと概要
ml-agentsはUnity Machine Learning Agentsを略した名前です。「Unityの機械学習エージェント」ということですね。
機械学習には様々なものがありますが、このプロジェクトでは機械学習の代表格であるTensorFlow(テンソル・フロー)というオープンソースを利用します。ゲーム専用ではなく、デファクトスタンダードなAIシステムを採用しているのは大きな利点だと思います。TensorFlowは手書き文字や写真に写っているものを推定するなど様々な用途に使われていて、応用範囲がとても広いです。以前から使ってみたいと思っていましたが、よいきっかけになりました。
今回のプロジェクトの利用の流れは大体以下の感じです。
機械学習には、「学習する段階」と「学習成果を使って実行する段階」の2段階があります。機械学習を行うTensorFlowはPythonで動くソフトウェアですので、学習する段階はUnityとPythonを連携させて行います。学習結果はデータファイルに出力されます。それをUnityに含めてビルドすれば、機械学習で作成したAIに状況を判断させることができます。こうやって作成した「学習成果を使って実行する」アプリにはTensorFlowは不要なので、単体で配布することができます。
現在のml-agentsはβ版で、ビルドができるのは[Windows, mac, Linuxのスタンドアロン実行形式][iOS][Android]の3種類とありました。
ふとした疑問
- 単体アプリになったあとは学習しないのだろうか?
- それなりに効果のある学習をするには1万回とかの試行が必要なので、人間が遊ぶ回数では学習させても効果はなさそう
- プレイヤーの操作を記録しておいて、別途学習させる、ということになるのかな?
前提
インストール
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/installation.mdの流れに沿って作業を進めます。大まかには以下のとおりです。
ではインストールをはじめましょう。
Anaconda 64-bit版のインストール
TensorFlowを動かすのに必要なので、Anacondaというデータサイエンス向けの機能が沢山用意されているPythonパッケージをインストールします。このパッケージはPythonを含むので、同時にPythonのインストールも完了することになります。
(Anacondaについての詳細はこちら)
Downloads - Anacondaを開いて、利用するPythonのバージョンの[64-Bit Graphical Installer]をクリックしてダウンロードします。
ダウンロードが完了したら、実行して、設定はそのままでインストールを完了させます。完了したら[Next]を押して、以下のチェックは不要なので外して、[Finish]をクリックして完了です。
ml-agentsリポジトリーの入手
Unity公式が提供している[ml-agents]リポジトリーを入手します。GitHubリポジトリーなのでクローンするのが本道な気もしますが、今回はシンプルにZIPをダウンロードして使います。
GitHub - Unity-Technologies/ml-agents: Unity Machine Learning Agents Toolkit を開きます。右の方の[Clone or download]ボタンをクリックして、[Download ZIP]をクリックします(cloneの方がいい人はクローンしてください)。
[ドキュメント]フォルダー下の[Unity Projects]フォルダー内など、Unityからアクセス可能な場所にZIPファイルを展開します。
展開したフォルダー内のunity-environment
フォルダーにUnityのプロジェクト、python
フォルダーにPython関連のファイルが入っています。ここからは、このフォルダー内にインストールをしていきます。
Pythonの仮想環境の作成
Pythonは、プロジェクトごとに個別に環境を持たせることができます。通常のPython3ではvenv
で行いますが、Anacondaはconda
で同様のことを行います。
(余談:Pythonは特別な環境設定をせずに、複数の異なるバージョンや32-bit版、64-bit版のものをインストールしても問題ありません。プロジェクトごとに、[venv]や[conda]で必要なバージョンの仮想環境を作成して使うことができます。進んでます)
Anacondaのプロンプトを起動します。
[スタート]メニューから[すべてのプログラム]>[Anaconda3 (64-bit)]>[Anaconda Prompt]を起動します。
Anaconda版のPythonが利用できるコマンドプロンプトが開きます。この後の作業で、文字コードがUTF-8
じゃないとエラーが出る部分があるので、以下を実行して、コマンドプロンプトの文字コードをUTF-8に切り替えておきます。
chcp 65001
追記2017/12/8 以下のような The system cannot write to the specified device.
エラーが発生した場合
コマンドラインのフォントがUTF-8の日本語に対応していないと以下のようなエラーが発生します。
その場合、以下のように対処します。
- エラーが発生したコマンドプロンプトを閉じます
- 改めて、[スタート]メニューから[すべてのプログラム]>[Anaconda3 (64-bit)]>[Anaconda Prompt]を起動します
- タイトル部分を右クリックして、プロパティを選択します
- フォントタブを選択して、フォントをMS ゴシックに変更して、[OK]をクリックします
以上で、改めてchcp 65001
を実行すれば切り替わります。
続き
cd
コマンドでml-agents-master
フォルダーを開きます。エクスプローラーでml-agents-master
フォルダーを開いてから、上のアドレスバーをクリックしてパスをコピーします。
コマンドプロンプトでcd
と入力して、右クリックして[貼り付け]を選べば楽です。
以下を実行して、Anacondaの環境下にml-agents
用の環境を作って、Python3.6.3が使えるようにします。Pythonのバージョンはその時々に応じて変更して構いません。
conda create -n ml-agents python=3.6.3
[Proceed]の問いが表示されたら[Enter]キーを押してインストールを開始します。
ml-agentsのSetup
の実行
残りのインストールは、パッケージに含まれるSetup.py
で行えます。これはml-agents
環境にインストールしたいので、環境を切り替えます。
activate ml-agents
これで、コマンドラインの行頭が(ml-agents)
に変わります。この後のインストールは、全てこの環境内に行われます。
cd python pip install .
しばらく待って、コマンドラインが表示されたらインストール完了です。この後もコマンドプロンプトは利用しますので、閉じないでおいてください。
ml-agentsのボールのサンプルのセットアップ
Unityで機械学習をさせるための準備をします。ボールのバランスを取るサンプルを使います。ここからはml-agents/Getting-Started-with-Balance-Ball.md at master · Unity-Technologies/ml-agents · GitHubに従って作業をします。
- Unity2017.1以降のバージョンを起動
- [OPEN]を選択
- 先にダウンロードした[ml-agents-master]フォルダー内の[unity-environment]フォルダーを選択して開く
- 以下のような警告が表示されたら、構わず[Continue]して読み込む
- [Project]ビューから[ML-Agents]>[Examples]>[3DBall]フォルダーを開いて、[Scene]シーンをダブルクリックして開く
これで、ご存知の以下のシーンが開きます。
- [Edit]メニューから[Project Settings]>[Player]を開く
- [Inspector]ビューで以下を設定
- [Resolution and Presentation]欄の[Run In Background]にチェックが入っていることを確認
- 同様に[Display Resolution Dialog]が[Disable]になっていることを確認
- [Hierarchy]ビューから[Ball3DAcademy]オブジェクトを開いて、[Ball3DBrain]を選択
- [Inspector]ビューで[Brain Type]を[External]に変更
- [Ctrl]+[S]キーを押して、シーンを保存する
- [File]メニューから[Build Settings]を選択
- ビルドターゲットとして、とりあえず[PC, Mac & Linux Standalone]を選択
- [Build]をクリック
- フォルダーを[ml-agents-master]まで戻してから、[python]フォルダーをダブルクリックして開く
- ファイル名を
3DBall
として、[保存]ボタンをクリック
以上でビルドが完了したら、学習用の実行ファイル3DBall
の出来上がりです。
トレーニングする
トレーニングはJupyter(ジュピター)を使って行うと楽です。すでにインストール済みなのでコマンドラインから以下で起動します。
jupyter notebook
これで呼び出したパスが参照できます。python
フォルダーにいた場合、以下のような具合です。
動作確認と環境設定の確認用の[Basics.ipynb]というファイルと、PPOで学習させる[PPO.ipynb]の2つがJupyterのノートブックです。Basicsは飛ばして、早速学習させましょう。
[PPO.ipynb]をクリックして開きます。
ノートブックでは、説明を読んだり、実行するプログラムをステップごとに実行していくことができます。(1)が実行対象で、ここではプロジェクト名である「Unity ML Agents」と、この学習のアルゴリズムは「Proximal Policy Optimization(PPO)」と呼ばれるもので、詳細はhere
で読んでくれ、というようなコメントになっています。
(2)の[Run]ボタンで、現在選択されているセルが実行されますが、実行する前に1つだけ環境設定が必要です。下にスクロールさせて、4つ目のセルを表示します。env_name
から始まる行を探して、environment
を消して、実行ファイル名である3DBall
に書き換えてください。
これで準備完了です。最初の「Unity ML Agents]のセルをクリックして青枠で囲まれたら、[Run]ボタンを押して実行します。自動的に次のセルがアクティブになりますので、また[Run]を押して実行します。「Export the trained Tensorflow graph]のセルになるまで[Run]をしてください。
しばらく待っていると、以下のような小さいウィンドウが表示されて、先にビルドした[3DBall]が起動して学習を始めます。。
更に待つと、Mean Reward: 10.82324
のようなメッセージが表示されはじめます。
何回目かにSaved Model
と表示されたら、その前のMean Reword
の数値を確認してください。それが成功率です。75を越えるぐらいでしたらかなり頭が良くなっていますので、学習を終了させましょう。
[3DBall]の[x]ボタンをクリックして閉じてください。
JupyterにJSONDecodeError
などが表示されますが大丈夫です。
Mean Reward
の値は、時々低い値になる場合があります。そのままですと、かなり頭が悪いAIになります。学習を継続させれば改善しますので、改善したい場合は[3DBall]を閉じずに待ってください。再び、Mean Reward
が表示されるようになり、また何回目かでSaved Model
が表示されます。納得がいく値が出るまで待ってください。
納得のいく数字がでて実行ファイルを停止したら、Jupyterに切り替えてExport the trained Tensorflow graph
の下のセルを[Run]して実行します。
このように表示されたら、学習した人工知能のデータが保存されます。
なお、手動で停止しなくても、max_steps
で定義されているステップ数を実行したら自動的に学習は終了して、.bytes
ファイルが保存されます。デフォルトでは5e5
が代入されていますが、これは5*10
の5
乗で、50万ステップを表しています。1e5
ぐらいにしておくと、10
万回で自動的に終了して保存されます(2017/11/11追記)
トレーニング結果をUnityに組み込む
プラグインのインポート
TensorFlowの学習成果をUnityに組み込んで、単独のアプリとして動くようにしましょう。TensorflowのデータをUnityで扱えるようにするためのプラグインが必要なので、Unityのプロジェクトにインポートします。
- https://s3.amazonaws.com/unity-agents/TFSharpPlugin.unitypackage から
TF#
をダウンロード - ダウンロードが完了したら、ダブルクリックするか、Unityの[Project]ビューにドラッグ&ドロップしてインポートする
- [Edit]メニューから[Project Settings]>[Player]を選択
- [Inspector]ビューの[Other Settings]欄で以下を設定
- [Scripting Runtime Version]を[Experimental(.Net 4.6 Equivalent)]にする
- Scripting Defined Symbols欄に
ENABLE_TENSORFLOW
を入力
以上ができたら、[File]>[Save Scene]、[File]>[Save Project]をしてから、Unityを一度閉じて、起動し直します。これで、TensorFlowのデータを組み込むためのInternal Brain Typeが使えるようになります。
学習データを組み込む
学習データを組み込んで、Unityで結果を見ましょう。
- Unityを起動して、[unity-environment]プロジェクトを開く
- [Project]ビューから[ML-Agents]>[Examples]>[3DBall]>[TFModels]フォルダーを開く
- 予め入っている[3DBall]ファイルは不要なので削除する
- フォルダー内の[3DBall.bytes]をドラッグして、Unityの[Project]ビューの[ML-Agents]>[Examples]>[3DBall]>[TFModels]フォルダーにドロップ
- [Hierarchy]ビューから[Ball3DAcademy]オブジェクトを開いて、子供の[Ball3DBrain]を選択
- [Inspector]ビューの[Brain Type]欄を[Internal]に変更
- [Project]ビューの[ML-Agents]>[Examples]>[3DBall]>[TFModels]フォルダーから[3DBall]をドラッグして、[Inspector]ビューの[Graph Model]欄の[Missing]となっているところにドラッグ&ドロップ
以下は恐らく最初から設定済みですが、念のため確認しておいてください。
- [Graph Placeholders]欄を開いて、[Size]が
1
か確認 - [epsilon]欄の[Value Type]を[floating point]にして、[Min Value]と[Max Value]をどちらも
0
にする- 上記2つの設定は、3DBallがContinuous controlで制御する設定なので、TensorFlowモデルがノイズパラメーターを必要としているので設定しています。Discrete Controlだった場合は
epsilon
は不要です
- 上記2つの設定は、3DBallがContinuous controlで制御する設定なので、TensorFlowモデルがノイズパラメーターを必要としているので設定しています。Discrete Controlだった場合は
以上できたら実行してください。学習が成功していれば、ボールをなるべく落とさないようにパネルが自動制御されるはずです。以下はRewardが80
ぐらいの学習データで動かしたものですが、安定して制御できています。
学習していない状態を確認する
学習を殆どさせていないとどうなるでしょうか。殆ど学習させていないデータを用意したので確認してみましょう。
https://github.com/tanakaedu/unity-ml-agents/raw/master/3DBall.bytes をダウンロードして、[Project]ビューの[TFModels]フォルダーにドラッグ&ドロップします。
[Hierarchy]ビューから[Ball3DAcademy]オブジェクトの子供の[Ball3DBrain]を選択して、[Inspector]ビューの[Graph Model]欄に、[3DBall 1]をドラッグ&ドロップして設定してください。
実行してみてください。全くバランスが取れなくなります。これが初期に近い状態です。この状態から機械学習をさせて、先に確認したような動きに変わったのです。
学習回数について
デフォルトでは5万回学習するごとにSave Models
が表示されるようになっています。Jupyterの以下のsave_freq
が保存するまでの学習回数の設定です。
この値を変更すると、保存タイミングを変更することができるようになります。500回に減らしたのが下手バージョンのデータです。経過を見る限り、今回の内容なら2万回ぐらいで十分に上達するようです。
再学習の手順
学習させたあと、もう一度学習し直そうと最初から[Run]し直しても、[Load the environment]のところでtimeout
が発生して失敗します。
再学習させる場合は、[restart the kernel]アイコンをクリックしてカーネルの再起動をします。
[Restart]をクリックします。
右上に[Restarting kernel]と表示されて、消えるまで待ちます。
↓
これで、一番上から[Run]し直せばtime outせずに学習させられます。
終了方法
色々閉じるので、簡単に手順をまとめておきます。
- Unityを、[File]>[Save Scene]と[File]>[Save Project]をしてから閉じる
- Jupyterを開いていたWebブラウザーを閉じる
- Jupyterを起動した[Anaconda Prompt]で、[Ctrl]+[C]キーを押す
- Jupyterが停止したら、
exit
を実行してコマンドプロンプトを閉じる
以上です。
プロジェクトの再起動
設定が完了したプロジェクトを再開する方法です。
- Unityを起動して、[unity-environment]プロジェクトを開く
- [スタート]メニューから[すべてのプログラム]>[Anaconda3 (64-bit)]>[Anaconda Prompt]を選択して、コマンドプロンプトを起動
- 以下を実行して、
ml-agents
の環境に切り替え
chcp 65001 activate ml-agents
cd
コマンドで、[ml-agents-master]フォルダー内の[python]フォルダーに移動- 以下でJupyterを起動
jupyter notebook
PPO.ipynb
をクリックしてノートブックを起動
以上です。
まとめ
長かったですが、以上で機械学習を利用するUnityプロジェクトの環境構築が完了です。TensorFlowを利用した様々な機能を開発するよい土台となりそうです。
次は、このサンプルが何をやっているかの調査をして、把握できたらUnityプロジェクトの[examples]フォルダーに入っている他のサンプル([Basic][GridWorld][Tennis]の3つ)もいじってみたりしつつ、応用範囲を広げて行ければと考えています。
参考URL
- Anaconda で Python 環境をインストールする - Qiita
- GitHub - Unity-Technologies/ml-agents: Unity Machine Learning Agents Toolkit
- TensorFlow
- Home - Anaconda
- ml-agents/Getting-Started-with-Balance-Ball.md at master · Unity-Technologies/ml-agents · GitHub
- 3. Running the Jupyter Notebook — Jupyter/IPython Notebook Quick Start Guide 0.1 documentation