Unityが機械学習のライブラリを公開したので使ってみる　(和訳付き)

# はじめに
Unityで強化学習がしたい...と嘆いていたところ，なんとUnity公式が機械学習のライブラリを公開してくれました．

[Introducing：Unity Machine Learning Agents](https://blogs.unity3d.com/jp/2017/09/19/introducing-unity-machine-learning-agents/)
[GitHub：Unity ML Agents](https://github.com/Unity-Technologies/ml-agents/wiki)

# 和訳
以下，簡単にUnity blogを和訳しました． 

>
私たちは，Unityというゲームエンジンをゲーム制作だけでなく機械学習にも使えるよう取り組んでいます．
開発の第一歩として，**Unity Machine Learning Agents**を紹介します．
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/watch?v=tmoz3ojbTn0/0.jpg)](http://www.youtube.com/watch?v=tmoz3ojbTn0)

>
少し前まではエージェントの行動は人間が手作業でコードを書苦ことで実装するのが普通でしたが，
現在では機械学習を用いることで，学習環境とのインタラクションを通じて振る舞いを学習することができます．
![image3.png](https://qiita-image-store.s3.amazonaws.com/0/203894/3cdf809d-930c-a58a-11a4-dd70336563c3.png)

>
学習において，訓練環境の質は訓練結果に大きな影響を及ぼすため，非常に重要な問題です．
私たちは，機械学習の開発にUnityの便利な開発環境，高品質な物理エンジンやグラフィックを利用することで，複数エージェントの行動について興味のある研究者の方々，自動運転などの並列処理に興味のある研究者，さらにはAIに興味のあるゲーム制作者の方々を助けることができると考えています．

>
私たちは，**Unity Machine Learning Agents** (略して **ML-Agents**) のオープンベータ版を本日公開しました．（2017/9/19）
**ML-Agents SDK**を利用することで，Unityを高度な訓練環境にすることができます．

>
![image4.png](https://qiita-image-store.s3.amazonaws.com/0/203894/a139a138-42cd-d3c7-cde9-2c77a6935d2d.png)
これは，ML-Agentsの学習環境を表しています．

>
学習環境には，**Agent**，**Brain**，**Academy**の3種類のオブジェクトが存在します．
- **Agent**：
それぞれのエージェントは，それぞれに独自の状態や観測装置を持ち，環境内で独立して行動し，その報酬を受け取ることができます．
エージェントの行動は，リンクされているブレインによって決定されます．
- **Brain**：
ブレインは，リンクされているエージェントの行動を決定するという役目を持ちます．
行動の決定方法には，以下の4つがあります．
外部的：Python APIを使用し，オープンソケットを介して通信することで**TensorFlow**を使用する方法．
内部的（実験的）：TensorFlowSharpを介して，プロジェクトに埋め込まれた学習済みモデルを使用する方法．
プレーヤー：プレーヤーの入力を使用する方法．
ヒューリスティック：手動でコード化した動作を使用する方法．
- **Academy**：
アカデミーは，学習を行う空間の制御を担うオブジェクトです．
時間の管理や，レンダリング品質の管理を行います．

>
複数のエージェントを一括して1つのブレインへとリンクさせることで，一括して行動決定を行うことができ，それによって並列計算の利点を得ることができます．

>---以下デモ動画---

日本語だと一瞬で内容が把握できて良いですね．
主に**強化学習**に関するライブラリのようです．
Unity blogでも述べられている通り，Unityという高品質なゲームエンジン内で強化学習が行えるなんて最高ですね！


また，今後は研究者よりは主にゲーム制作者に焦点を当てて開発を進めていくそうです．

# チュートリアル
チュートリアル的なものがGitHubにあったので，実際に試してみようと思います．

[Getting Started with the Balance Ball Environment](https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Getting-Started-with-Balance-Ball.md)

以下，チュートリアルページの簡単な和訳．

1. Unity 2017.1 以降をインストール (最新の.NET環境が必要なため，必ず2017.1以降のバージョンにする)
2. [GitHub](https://github.com/Unity-Technologies/ml-agents/wiki)からリポジトリをクローン，もしくはzipでダウンロード
3. ml-agents-master\unity-environment フォルダをUnityで開く
4. Assets/ML-Agents/Examples/3DBall/　にあるSceneファイルをダブルクリックし，環境をロードする
5. ヒエラルキーから Ball3DAcademy -> Ball3DBrain のInspectorを開き，Type Of BrainをExternalにセット
6. 画面上部のバーから Edit -> Project Settings -> Player
    6. Resolution and Presentation -> Run in Background がチェックされていることを確認
    7. Resolution and Presentation -> Display Resolution Dialog がDisabledににセットされていることを確認
8. 画面上部のバーから File -> Build Settings へ行き，設定を確認後ビルド
    9. 保存先は，一つ上の階層にあるpythonフォルダにしてください

Unityでの作業はここで一旦終わりです．
ここからはpythonの環境設定を行います．

pythonのインストールができていない方は以下からダウンロードしてインストールしてください．
https://www.python.org/
今だと3系がおすすめです．
もしくは，Anacondaなどの統合開発環境をインストールするのもよいと思います．
[Qiita：Anaconda で Python 環境をインストールする](https://qiita.com/t2y/items/2a3eb58103e85d8064b6)

では，pythonの環境設定を行います．
先ほどビルドを保存したpythonフォルダでコマンドプロンプトを開きます(shift+右クリックで開けます)．
そして，必要なパッケージをインストールするため，以下のコマンドを実行します．
`pip3 install .`
これで完了です．
（Anaconda環境の方はすでに必要なパッケージがインストールされているので，この部分は省いて大丈夫です．）

これで学習を行う準備がととのいました．
それでは学習を行っていきます．

1. まず，pythonフォルダーでコマンドプロンプトを開き， `jupyter notebook` と入力してjupyterを立ち上げます
2. ブラウザを開き，アドレスに localhost:8888 と入力し，jupyterを開きます
3. PPO.ipynb を開いて Hyparameters の欄にある変数 env_name の部分をビルドしたexeファイルの名前に書き替えます
    4. 例：sample.exeの場合，file_name="sample" とする
4. 上から順にすべてのスクリプトを実行します（コード枠をクリックし，Ctrl+Enterで実行できます）

すべて実行が完了すると，python/models/ppo/ フォルダに sample.bytes のようなファイルが生成されると思います．
このファイルはTensorFlowのグラフデータで，このファイルに学習の結果が保存されています．
このデータを利用して，Unityで学習の結果を見てみましょう．

1. 生成されたファイルを，Unityの Examples\3DBall\TFModels フォルダに移動します
2. TensorFlowSharp のunitypackage を[ここ](https://s3.amazonaws.com/unity-agents/TFSharpPlugin.unitypackage)からダウンロードし，Unity に import します
3. 画面上部のバーから Edit -> Project Settings を開き，Other Settings 欄へ移動
    4. Scripting Runtime Version を Experimental (.NET 4.6 Equivalent) にセットします
    5. Scripting Defined Symbols に ENABLE_TENSORFLOW を追加します
6. ここで一度Unityを再起動してください
7. ヒエラルキーから Ball3DAcademy -> Ball3DBrain のInspectorを開き，Type Of BrainをInternalにセット
8. さらに，Graph Model に先ほど移動したbytesファイルをセットします

これで完了です．
ではPlayしてみましょう．ボールが落ちないように板が動く様子が確認できると思います．
自分の環境では板がぷるぷる震えていました．

# 感想
Unity公式が作っただけあって，すごく使いやすいと思います．
欲を言えば，jupyterを起動することなく，UnityだけでPythonのライブラリが使えれば...難しいですかね．
欲しかった機能がほとんどあるので，いろいろやれそうです．

# 今後の予定
[Documentation](https://github.com/Unity-Technologies/ml-agents/tree/master/docs)には，さらに以下のような項目があります．

- How to make a new Unity Environment
- How to organize the Scene
- How to use the Python API
- How to use TensorflowSharp inside Unity [Experimental]
- Agents SDK Inspector Descriptions
- Training on the Cloud with Amazon Web Services

この辺を参考に，いろいろ学習させてみたいと思います．