【新ver】Unity ML-Agents v0.4.0の新機能など

[Unity ML-Agents](https://github.com/Unity-Technologies/ml-agents)がひっそりとバージョンアップされv0.4.0になりました。公式から特に発表もなかったので、リリースから数日後に気づきました（笑）

v0.3からの変更点などを見ていきたいと思います。

#新サンプルの追加

新しくサンプルとしてWalker, Pyramids が追加されました。

**Walker**

<img width="936" alt="walker.png" src="https://qiita-image-store.s3.amazonaws.com/0/225485/3a5f76e4-4305-fcf1-7744-8c5eff7be870.png">

26自由度の2足歩行モデルです。前進することでプラスの報酬が与えられます。
[OpenAI Roboschool](https://blog.openai.com/roboschool/)のやつを再現したものだと思います。

**Pyramids**

![pyramids.png](https://qiita-image-store.s3.amazonaws.com/0/225485/fbc8d22d-f995-9120-599a-83f3a062980f.png)

フィールド内にあるボタンを押すとピラミッドが出現します。そのピラミッドを崩して、上に乗っかってる黄金ブロックをゲットすればゴールです。
いままでのサンプルに比べるとタスクの難易度は高いです。後述するCuriosity-Driven Explorationのためのサンプルでしょう。

# Visual Observation, ILのサンプル追加

Unityカメラを使って、映像から直接強化学習を行うこともできます。

<img width="206" alt="SnapCrab_NoName_2018-6-19_12-56-19_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/225485/7674f5e5-97bf-2f74-6665-9b3aa80ed954.png">

今までは、そのサンプルがGridWorldのみでしたが、以下の環境に追加されました。

- BananaCollector
- PushBlock
- Hallway
- Pyramids

また、Imitation Learningのサンプルもあらたに追加されました。

- Tennis
- Bouncer
- PushBlock
- Hallway
- Pyramids

# Curiosity-Driven Exploration

あらたにCuriosity-Driven Explorationと呼ばれる仕組みを使って強化学習できるようになりました。

エージェントの学習の過程には大きく分けて、Intrinsic Motivation(IM), Extrinsic Motivation(EM)の2つがあります。

参考：[Extrinsic vs. Intrinsic Motivation: What's the Difference?](https://www.verywellmind.com/differences-between-extrinsic-and-intrinsic-motivation-2795384)

![2795384-differences-between-extrinsic-and-intrinsic-motivation-5ae76997c5542e0039088559.png](https://qiita-image-store.s3.amazonaws.com/0/225485/823f5160-8f7b-b556-30c2-5b06f6affdd6.png)

EMは行為とは別のものが目的なのに対し、IMは行為そのものが目的になります。

現実世界では、外部報酬がほとんどないか、あるいは完全にないという状況があり、そのような状況ではEMによる方策決定はうまくいかないため、何かしらの工夫が必要になります。

Curiosity-Driven Explorationは、IMベースなモジュール(Intrinsic Curiosity Module : ICM)を強化学習アルゴリズムに組み込むことで、そのような外部報酬の乏しい環境で効率よく探索を行うための仕組みです。
Curiosity(好奇心)とは、つまり新規性のある環境に報酬を設定するということのようです。

![method.jpg](https://qiita-image-store.s3.amazonaws.com/0/225485/6629b3ba-f7fb-0f9e-5a36-3eab525cd77f.jpeg)


参考：[Curiosity-driven Exploration by 
Self-supervised Prediction](https://pathak22.github.io/noreward-rl/)

trainer-configのほうから簡単にオンオフできるので実際にサンプルPyramidsで試してみました。

![Pyramids_GIF.gif](https://qiita-image-store.s3.amazonaws.com/0/225485/ff85b1d1-a0b5-01ef-09cd-6d3982c49c2d.gif)

<img width="1059" alt="SnapCrab_NoName_2018-6-19_16-29-19_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/225485/7721898a-8476-e78d-aded-d7eb343a9fa2.png">

オレンジ：PPO
青：PPO+ICM

PPOのみでは27万回実行した時点では全く学習できていませんが、PPO+ICMでは12万回ほどで学習が収束しています。
Pyramidsのように状態空間が広く、外部報酬の乏しい環境ではICMを組み込むことで、効率よく探索を行える可能性があります。

#Unity Editorで強化学習が可能に

いままでML-AgentsではPythonフォルダにUnityの環境をビルドして、強化学習を行っていました。
しかし、v0.4.0からはUnity Editorから直接強化学習できるようになり、いちいちビルドする必要がなくなりました。

やり方は簡単で、まずUnityでBrainTypeをExternalにします。

<img width="613" alt="SnapCrab_NoName_2018-6-19_17-20-56_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/225485/3024425c-0bc4-458a-6ef4-6d2c499cd056.png">

そしたら、PythonフォルダでAnacondaを開き、いつものようにコマンド入力します。

```python
python learn.py --train
```

すると待機画面になります。

<img width="784" alt="SnapCrab_NoName_2018-6-19_17-23-4_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/225485/c9ea33e1-ce06-7ed3-5485-0f2c554604a3.png">

そしたら、Unityで実行ボタンを押します。

<img width="174" alt="SnapCrab_NoName_2018-6-19_17-23-35_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/225485/d412959a-7838-3868-c415-52718800fcba.png">

すると学習が開始されます。

わざわざビルドする手間が省けて非常に助かります。
もちろんいままでのようにビルドして学習というやり方もできます。

#参考

1. [Unity ML-Agents](https://github.com/Unity-Technologies/ml-agents)
2. [Roboschool](https://blog.openai.com/roboschool/)
3. [Curiosity-driven Exploration by Self-supervised Prediction](https://pathak22.github.io/noreward-rl/)