強化学習環境まとめ

### Abstract

* 強化学習環境について紹介
  * なんだかんだいろんな環境で遊んできたので紹介

----

# とりあえず強化学習(Reinforcement Learning: RL)の概要

----

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38555/28477fc2-022e-72ee-c870-bf2a3e9f7954.png)

----

### 強化学習の要素

* エージェント (agent)
* 環境 (environment)
* 行動 (action)
* 報酬 (reward)
* 状態 (status)

---

### 強化学習についてつづきはこちら

[趣味の強化学習](https://qiita.com/ikeyasu/items/67dcddce088849078b85)

---

### 全ての基本[OpenAI Gym](https://gym.openai.com/)

```python
import gym
env = gym.make("Taxi-v1") # <- 環境を作成
observation = env.reset() # <- リセット。初期の状態sを受け取る
for _ in range(1000):
  env.render() # <- 描画する。学習時には無くても良い
  action = env.action_space.sample() # <- これは推論・探索に置き換え
  observation, reward, done, info = env.step(action)
           # ↑ ステップをまわす。状態s、報酬r、終了フラグ等が返られる
```

---

### OpenAI Gymにあるもの

* Atariのゲーム
* Box2D: 古典力学的な2D物理演算エンジン
* Classic control: 典型的な強化学習タスク
* MuJoCo: 商用3D物理演算エンジン
* Roboschool: フリーのMuJoCo互換
* Algoriths, ToyText: 単純なタスク

---

### Atariのゲーム

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38555/c253b60a-bc47-178c-4d5e-ee1384377a8e.png)

AtariショックのAtari。単純なゲームが多い。

---

### Atariのゲームの例

[ブロック崩し](https://gym.openai.com/envs/Breakout-v0/)
[パックマン](https://gym.openai.com/envs/MsPacman-ram-v0/)
[その他](https://gym.openai.com/envs/#atari)

---

### Atariには無理ゲーが多い

以下、DQN論文より引用。下の方は、人間でも無理ゲー。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38555/1faee6c9-a6e8-fc5a-cd0d-7d7e2a313c98.png)

---

### 無理ゲーの例

[MontezumaRevenge-v0](https://gym.openai.com/envs/MontezumaRevenge-v0/)
[PrivateEye-v0](https://gym.openai.com/envs/PrivateEye-v0/)

※ Montezumaは集中的に研究され、最近は解けたと主張する[論文](https://eng.uber.com/go-explore/)がある

---

### Breakoutを見てみる

```test-breakout-v0.py
import gym
env = gym.make("Breakout-v0")
timestep_limit = env.spec.tags.get(
  'wrapper_config.TimeLimit.max_episode_steps')
obs_space = env.observation_space
obs_size = obs_space.low.size
action_space = env.action_space
observation = env.reset() # <- リセット。初期の状態sを受け取る
for _ in range(1000):
  env.render() # <- 描画する。学習時には無くても良い
  action = env.action_space.sample() # <- これは推論・探索に置き換え
  observation, reward, done, info = env.step(action)
```

---

### Box2Dの例：BipedalWalker-v2

[![Image from Gyazo](https://i.gyazo.com/dcd96b328b778407cf34aec4c9bda826.gif)](https://gyazo.com/dcd96b328b778407cf34aec4c9bda826)

---

### MuJoCo: Ant-v2

[![Image from Gyazo](https://i.gyazo.com/3ce076cbc55ab1fabc3647e709bc0743.gif)](https://gyazo.com/3ce076cbc55ab1fabc3647e709bc0743)

---

### Robotics: FetchPickAndPlace-v1

[![Image from Gyazo](https://i.gyazo.com/059ed48d06f424a118f191477157dad8.gif)](https://gyazo.com/059ed48d06f424a118f191477157dad8)

---

---

### RoboSchool: RoboschoolAnt-v1

[![Image from Gyazo](https://github.com/ikeyasu/roboschool_chainerrl/raw/master/doc/demo1.gif)](https://github.com/ikeyasu/roboschool_chainerrl/raw/master/doc/demo1.gif)

---

### Roboschool

* Bulletエンジンで、MuJoCo互換の環境を実装。
  * MuJoCoのライセンス費は高い
  * Dockerで使うにはさらに高いライセンス費が必要（今時の学習環境に合わない）
* なんか全体的にコード品質が低く、未完成感
* READMEには、Roboschool2を作っていると書いてある（がどこで？）

---

### Roboschoolを読んでみる

https://scrapbox.io/ikeyasu/roboschool_state%E3%81%AE%E8%AA%BF%E6%9F%BB

---

### PyBullet

* 去年ぐらいにPyBullet自身がGymに対応
* よく見ると、Roboschoolのコードが入っている
* 今後、これが本流となる見込み

---

### PyBullet（余談）

* 最近のRLの潮流として、Domain Adaptationがある
* 現実世界とシミュレーションのギャップをいろいろな方法で埋める手法
  * Sim2Realという
* そのためには、シミュレーター自体のパラメーターを色々いじくれる必要がある
  * Roboshcool は、BulletエンジンをC＋＋でラップしてPythonから使っていたので、エンジン自体をいじくりにくかった
  * PyBulletはエンジン自体をPythonでラップしているのでパラメーターを変更しやすい

---

### gym-gazebo

* [Gazebo](http://gazebosim.org/media) は、ROS（Robot operating system）のシミュレーター
* Gazebo　を Gym化したのが、[gym-gazebo](https://github.com/erlerobot/gym-gazebo)
  * 導入が大変で試していない

---

### deep racer (virtual league)

* AWSが作った[ハードウェア](https://aws.amazon.com/jp/deepracer/)
* それのシミュレーター。Robomaker がベース。つまり、Gazebo

https://github.com/aws-robotics/aws-robomaker-sample-application-deepracer
https://aws.amazon.com/jp/deepracer/schedule-and-standings/leaderboard-virtual-london-loop-2019/?p=drl&exp=btn&loc=2

---

### [Unity ML-Agent](https://unity3d.com/jp/machine-learning)

* UnityをRLAgentにつかうもの
* Unityを使って環境をビルドして一つのアプリにする
  * Pythonを使って環境を構築できるフレームワークでは無い
  * 環境がポータブルなアプリになるので単に利用するだけの人は環境構築が楽

---

### [Animal AI-Olympics](http://animalaiolympics.com/)

* Unity ML-Agentを使って作った環境
* 動物が生き延びるためのタスク（Competition）
* [食べ物・障害物・毒の沼等がある](http://mdcrosby.com/blog/animalai2.html)
* ソースは[少し読んだ](https://twitter.com/ikeyasu/status/1124936800043057152)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38555/d26e91ff-ccd9-cb6f-4dab-c1dc0a5bb571.png)

---


### [lis](https://github.com/wbap/lis)

* Unityを使ってAnimal AI-Olympicsのような事をする環境
  * 相当古い実装で最近更新が無い。Unity ML-Agentはつかわれていない
  * Unity開発環境をそのまま使うので、ポータブルなアプリではない

* [LIS (Life in Silico) のソースを読んでみる](https://qiita.com/ikeyasu/items/0f4c3c362a3aa9beebc4)

---

### [PyLIS](https://github.com/wbap/PyLIS)

* lisをPyBulletで書き直したもの
* ユーザーは少なそう