ML-Agentsのサンプルの動かし方

#概要
ML-Agentのサンプルモデルの学習方法と動かし方についてまとめた記事です。大まかな流れだけのメモだと思ってください。Anacondaやpipなど使用します。これらの設定方法は各自行ってください。細かい環境などは[前回の記事](https://qiita.com/Kana-km/items/bcebbff310ada92539f9)を参考にしてください。

#環境
- macOS Catalina 10.15.5
- Anaconda 4.8.3
- python 3.8.3
- pip 20.1.1

#3DBallモデル
今回はML-Agentsのサンプル内にある3DBallというモデルを使用し、学習方法などを説明していきます。3DBallはボックスの上に乗っているボールを落とさないようにするモデルのことです。

[前回の記事](https://qiita.com/Kana-km/items/bcebbff310ada92539f9)の続きです。

左下の Assets/ML-Agents/Examples/3DBall/Scenes を開き、赤い印をつけたモデルをダブルクリックします。下の画像のようになると思います。
![スクリーンショット 2020-09-05 21.40.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427834/209808b6-8bb1-587d-ecfd-de03e7fff1ad.png)
赤く印つけた再生ボタンを押すと下の画像のようになります。サンプルのモデルはすでに学習済みなので、ボールを落とさないように動いていることが確認できます。
![qiita_gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427834/3c3adccb-7a41-693e-4d01-70f7206eb1ce.gif)
次からモデルの学習方法について説明していきます。
#学習する環境を整える
まずはじめにモデルを学習させるAnacondaの仮想環境を作成します。
ML-Agentsではpython 3.6.1 以降が必要です。今回はpython 3.8.3 を使用します。

```
$ conda create -n mlagents python=3.8.3 anaconda
$ conda activate mlagents
```

次にpythonパッケージの ml-agents、 ml-agents-env をインストールします。
前回ダウンロードした ml-agents-release_6 に移動して以下のコマンドを実行します。

```
cd ml-agents-envs
pip3 install -e ./
cd ..
cd ml-agents
pip3 install -e ./
cd ..
```

これでモデルを学習させる環境が整いました。

#モデルを学習させる
次に3DBallを学習させていきます。
やることは以下の３つです。

- ハイパーパラメータを設定する。
- Anacondaの仮想環境でプログラムを実行する。
- unityのモデルを実行する。

##ハイパーパラメータを設定する
ml-agents-release_6/config で学習アルゴリズムやパラメータを設定します。
ppo、sacというフォルダがあります。それぞれ強化学習のアルゴリズムになります。

- PPO : Proximal Policy Optimization
- SAC : Soft Actor-Critic

とりあえずppoを使用します。このファイル内にppoのパラメータを設定するYAMLファイルがあります。YAMLファイルを作成することでハイパーパラメータを自由に設定することができます。3DBallのパラメータはすでに3DBall.yamlに設定されているのでそのまま使用します。

##Anacondaの仮想環境でプログラムを実行する
学習させるpythonスクリプトを実行します。さっき作成した仮想環境で ml-agents-release_6/ml-agents に移動し以下のコマンドを実行してください。

```
mlagents-learn ../config/ppo/3DBall.yaml --run-id=3DBall --train
```
--run-id はなんでもいいです。実行すると次の画像のようにunityのロゴが出てきます。
![スクリーンショット 2020-09-06 2.24.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427834/3787264d-c7c8-2f84-a297-ce3c77805e13.png)

##unityのモデルを実行する
次にunity上でモデルを実行します。実行ボタンを押すだけでいいです。学習が進むと以下の画像のようになります。
![スクリーンショット 2020-09-06 3.15.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427834/78040667-c30e-50d8-c4fe-96eec897fd36.png)
「Mean Reward」は平均報酬です。3DBallは最大値が100になっています。16万ステップあたりから最大になっていることがわかります。「Std of ReWard」は報酬の標準偏差です。小さくなるほど良いです。20万ステップあたりで学習仕切れていることがわかります。

１万ステップと１５万ステップの挙動を以下に示します。ボールを落とさないように学習できていることがわかります。

１万ステップ
![10000step.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427834/815258bd-33d0-cb2a-5fd3-e4b5f2257f8d.gif)
１５万ステップ
![15000step.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427834/b1fde558-ef11-f316-ae52-0cb243dc7369.gif)

#学習後のモデル
学習したモデルは ml-agents/results にさっき指定した --run-id の名前のフォルダができています。そのフォルダの中の 3DBall.nn が学習済みのモデルになります。新しく学習したモデルを使用する場合はunityの Assets/ML-Agents/Example/3DBall/TFModels に 3DBall.nn を追加し、Agent の Behavior Parameters の Model で 3DBall.nn を選択してください。

#まとめ
ML-Agentsのサンプルモデルの動かし方について記事を書きました。ML-Agentsでの学習方法は基本的にこの流れになります。間違っていることがあるかもしれないので参考程度にしてください。また公式に[ドキュメント](https://github.com/Unity-Technologies/ml-agents/blob/release_6_docs/docs/Readme.md)があります。

[次回](https://qiita.com/Kana-km/items/5d3bbb28c897ea860d59)はカートポールのモデルを作成し、学習させる記事を書きたいと思います。
#参考にさせてもらったサイト
[Unity ML-Agents 0.15.0 のチュートリアル(1)](https://note.com/npaka/n/nccaed59e1505#s3KJc)