ML-Agents v0.3のImitation Learning(模倣学習)サンプルで個性的なAIを作成してみた

#はじめに
ML-Agents v0.3からImitation Learning(模倣学習)が追加されたということで、このサンプルを使って個性的なAIを作成してみました。
まだあまり日本語のドキュメントがなく、TensorFlowによる学習環境の作成も必要なため、サンプル実行のための手順も合わせて簡単に説明します。

#Imitation Learning(模倣学習)とは
Unite2018のML-Agentsに関する講演資料（[リンク](https://www.slideshare.net/UnityTechnologiesJapan/unite-2018-tokyounity-for-mlagents-96376475)）を読んで理解して程度ですが、Reinforcement Learning(強化学習)とImitation Learning(模倣学習)は以下のような違いがあります。

・強化学習：報酬に対して最適な行動をするように学習する。報酬の仕組みによっては人間の思いもよらないような行動も可能。
・模倣学習：教師となる人間の行動をもとに学習する。人間の失敗を含めて学習するので、人間臭い動きになる（教師の個性が出る）。

#環境
・Windows10(64-bit)
・Unity 2018.1.0f2 (64-bit)
・ML-Agents Beta 0.3.1b
・Miniconda3


#TensorFlowによる学習環境を作成する
1. Minicondaをインストールし、`conda create --name mlagent python=3.5`でpython3.5の環境を作成します
2. `conda activate mlagent`で作成した環境をアクティベート
3. {ML-Agentsの解凍パス}\ml-agents-0.3.1b\にカレントディレクトリを移動
4. `pip install -r ./requirements.txt`で必要なモジュールをインストール

後続の手順で引き続きこのコンソールで作業するのでコンソールは閉じずに残してください。
閉じてしまったら、`conda activate mlagent`でアクティベート後に、{ML-Agentsの解凍パス}\ml-agents-0.3.1b\にカレントディレクトリを移動してください。


#Imitation Learning(模倣学習)のサンプルのビルド
1. {ML-Agentsの解凍パス}\ml-agents-0.3.1b\unity-environmentをUnity 2018.1.0f2で開きます。（バージョンが違いますが、そのまま開いて大丈夫）
2. Assets\ML-Agents\Examples\BananaCollectorsにあるBananaImitationを開きます。
 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/30897ad9-4c40-c3ba-29c1-2c7cb2eb9e7a.png)
3. あとはそのままBuild Settingsでビルド（出力先のフォルダ名はBananaImitationとしました。）
4. 以下のファイルが出力されればOKです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/50716716-d16b-8036-a545-09d3ff70ba77.png)

#模倣学習させる
先ほど作成したTensorFlowによる学習環境で開いたコンソールに戻り、`python python/learn.py {BananaImitationの出力先ディレクトリ\BananaImitation.exe --train --slow`のコマンドを実行します。

コマンドが成功すればUnityのアプリが起動します。起動したらキーボードのWASDキーで黄色いバナナを頑張って獲得してください。
周りにいる生徒役のAIは最初はうまく動いてくれませんが、そのうち学習し、動いてくれるようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/4973c1d2-d7df-dec3-5abe-c4765a3492de.png)

#学習したモデルを組み込む事前準備①（モデルのインポート）
数分間ゲームをプレイすると学習が完了し、自動的にアプリが終了します。ml-agents-0.3.1b\models\ppo配下に学習したモデルデータ(BananaImitation_ppo.bytes)が作成されているので、これをml-agents-0.3.1b\unity-environment\Assets\ML-Agents\Examples\BananaCollectors\TFModelsにコピーします。

#学習したモデルを組み込む事前準備②（TensorFlowSharp in Unityのインポート）
Unity上で作成したモデルを動かすために[TensorFlowSharp in Unity](https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Using-TensorFlow-Sharp-in-Unity.md)のUnitypackageをダウンロードし、インポートします。
インポート後にPlayer Settings→Other Setttingsを開き、Scripting Define Symbolsに`ENABLE_TENSORFLOW`の文字列を追加します。
#学習したモデルを組み込む
1. BananaImitationのシーンを開きます
2. ヒエラルキービューのAcademyオブジェクトの子オブジェクトのStudentBrainを選択
3. インスペクターでBrain TypeをInternalに設定
4. 下にでてくるGraph Modelにインポートしたモデルを設定

![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/6aa6c1aa-8e8c-b31d-f0f1-8d243eacd0b3.png)

#実行結果
あとはPlayボタンを押せばAIが動きだします。私がやった結果はこんな感じになりました。まだ賢いとはいえませんが、バナナをとってくれていますね。
![ダウンロード (2).gif](https://qiita-image-store.s3.amazonaws.com/0/60734/476f6624-d5bc-bf0a-3cfb-629c1c6ccb0d.gif)

#個性を出してみる
最初のモデルの学習時は紫色のバナナを取らないように、慎重に操作して学習させてみましたが、今度はアグレッシブに操作して学習させてみました。結果は以下のとおりです。元気ですね！
![ダウンロード (3).gif](https://qiita-image-store.s3.amazonaws.com/0/60734/c993ae3d-c392-17d6-5f72-15408e65e236.gif)

#終わりに
今回は詳細な学習の設計まで踏み込めてはいませんが、サンプルを動かすだけで簡単に結果を得ることができました。
教師役のふるまいによって個性を持つので、是非自分だけのAIをつくってみて下さい！