（論文）World Models（2018）

* 論文
    * arxiv  https://arxiv.org/abs/1803.10122
    * blog  https://worldmodels.github.io/
* 日本語情報
    * https://www.slideshare.net/DeepLearningJP2016/dlworld-models-95167842 

# サマリ
* 環境の遷移そのものを予測するのではなく、VAEの潜在空間の遷移をRNNで予測するという形で、環境モデルを学習
* 学習された環境モデルをシミュレータとして用いて強化学習することもできる

# 感想
* 連続空間上の遷移に対する強化学習にのみ使える？ mixture of Gausian distribution とか仮定してるし。

# Introduction
* RLには小さなネットワークしか使われていない。大きなRNNは計算大変。
    * Agentを、大きな world model と小さな controller model に分割することで実現するというアイデアを提唱
        * まず、教師なし学習の枠組みで、大きな world model を学習
        * 次に、学習した world model を用いて controller model を学習
        * これにより、controler model は小さな探索空間上でpolicyを学べばよくなる
    * RNN-based な model-based reinforcement learning

# Agent Model
* Vision(**V**), Memory(**M**), Controller(**C**) の３つのコンポーネントから成る
![image.png](https://qiita-image-store.s3.amazonaws.com/0/112276/111135b1-e25a-ca81-867c-e6b0e6eca4f8.png)
* それぞれのコンポーネントについて説明した後、Agent Model 全体について改めて説明する

## VAE(**V**) Model
* **V** の役割は、高次元な入力を抽象的な表現に圧縮すること
* 今回はシンプルなVAEを用いた
* ![image.png](https://qiita-image-store.s3.amazonaws.com/0/112276/65d6d749-b990-38e8-734c-cee6349f3490.png)

## MDN-RNN(**M**) Model
* **M** の役割は、未来を予測すること
* **V** によって抽象化された z に対して未来を予測する
    * z を直接当てに行くのではなく、p(z) を当てに行く。自然環境は複雑であり遷移は確率的だから。
        * mixture of Gaussian distribution で p(z) を近似。結局、Mixture Density Network として知られる MDN-RNN の枠組み
        * MDN-RNN https://arxiv.org/abs/1704.03477
        * ちゃんと読めてないが、多分、τは学習時は1で適用時に選択するパラメタだと思う

## Controller(**C**) Model
* **C** の役割は、rolloutしたときの期待累積報酬が最大となるような行動を決定すること
* ![image.png](https://qiita-image-store.s3.amazonaws.com/0/112276/0c069f71-c6dc-e67e-fa3a-7f92c23a0733.png)
* **C** は可能な限りシンプルかつ小さくした
![image.png](https://qiita-image-store.s3.amazonaws.com/0/112276/9e0cdb44-fbd6-af9c-be33-6f0f78760ebc.png)

## Putting **V**, **M**, and **C** Together
![image.png](https://qiita-image-store.s3.amazonaws.com/0/112276/b8deff0c-67ad-8e97-271e-7d13703de1e7.png)
* **V** や **M** はGPUで backpropagation を用いて学習
* **C** は Covariance-Matrix Adaptation Evolution Strategy(CMA-ES)を用いてCPUで並列処理して学習
    * CMA-ESについての日本語参考情報： http://satuma-portfolio.hateblo.jp/entry/2017/12/09/025009
* **V**, **M**, **C** はそれぞれ別々に学習される

# Car Racing Experiment
* 学習手順は論文中の下記サマリの通り
![image.png](https://qiita-image-store.s3.amazonaws.com/0/112276/12f2a77d-8767-f072-e5db-7c11608f48f3.png)
* **V** だけから **C** を決めることも原理的には当然できる
    * ![image.png](https://qiita-image-store.s3.amazonaws.com/0/112276/da83d360-0ec1-ac99-b7f5-426ec4bbf9e1.png)
* でも **M** を入れないと急カーブ曲がれない
    * (個人感想)そりゃあそうだろう。**V** は1フレームの情報だけで、スピードとかの情報持たないわけだから。と思ったけど、それでもA3Cより良いのか。
* 下表のように、**M** を入れた Full World Model にすると Gym Leaderboard を超えた
![image.png](https://qiita-image-store.s3.amazonaws.com/0/112276/2a8cf799-d51c-7175-25e3-cd84d645f0fb.png)
* あとは、VAEで画像を復元した結果を見たりしている(**Dreams**)

# VizDom Experiment
* **Dreams** から学習してみた。つまり、**C**の学習の際に、実環境ではなく **M** を利用
* 学習手順は論文中の下記サマリの通り
![image.png](https://qiita-image-store.s3.amazonaws.com/0/112276/88455f7e-1f35-59fe-a547-e888b7287154.png)
* 注意点として、**Dreams** から学習するためには、**M** は $ z_{t+1} $ を当てるだけでなく、エピソードが終了かどうか ($ done $) も当てる必要がある。
    * (個人感想) $ done $ は連続値じゃなくて0/1だけど、混合正規分布を仮定で良いのだろうか
* **Dreams** で **C** を学習する時はzとhがあればよいので、**C** の学習には **V** を使う必要がない
* **Dreams** で学習する時はτを高くする必要がある。なぜなら、**Dreams**に対してAdverasarialなpolicyを学習してしまう可能性があるが、**Dreams** と **Real** は完全に同じではないから。つまり、**Dreams** が **Real**を再現できていないゆえに有効な、変なpolicy(Cheating)を学習してしまうと、**Real**で同じpolicyを用いてもうまくいかない
    * この話は Model-based RL の世界では長らく問題である。決定的ではなくBayesianなModelを用いたPILCOでは少し解決されているが完ぺきではない。今の主流は、Model-basedな方法でpolicyをpre-trainして、**Real** でModel-freeな方法でpolicyをfine-tuneすることだ
* τを変えて実際に実験した結果が下表。わかりやすい
![image.png](https://qiita-image-store.s3.amazonaws.com/0/112276/56894643-62bb-5fbb-6f4d-528702a44d84.png)

# Iterative Training Procedure
* 枠組みとしては以下のようになるはず
![image.png](https://qiita-image-store.s3.amazonaws.com/0/112276/8e87466b-2e72-2816-3641-f090e27e3cea.png)
* World Modelの改善にとって有用なデータをReal Worldから取得する必要があるが、そのためには、Mは次のactionやrewardまで予測しないといけない。これはなかなかハードなタスクだ。
    * (個人感想)Vizdoomで**Dreams**から学習した時にこれらが不要なのは何故だっけ？確定的なrewardにしたから？だとしたらこれは Iterative Training だからという話ではなく、単により汎用的にするためにはという話？

# Discussion
あとでかく