Pendulum-v0とChainerRLで深層強化学習の比較メモ

試しにやってみただけの雑なメモです。

## 動機と目的
![pendulum.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459984/746e6088-c8cf-15aa-5954-a954db5bc700.png)

- 逆強化学習で（連続状態）・連続行動のタスクを扱いたい
- 手頃なテスト環境として、OpenAI Gymの[Pendulum-v0](https://gym.openai.com/envs/Pendulum-v0/)があった
- 深層強化学習ライブラリである[ChainerRL](https://github.com/chainer/chainerrl)をありがたく使わせてもらう
- どの手法が最も優れたエキスパートモデルを得られるのか……？

## 環境
- CPU : Intel Core i7-8700CPU @ 3.20Hz x 12
- メモリ : 32GB
- グラボ: GeForce RTX2080Ti 11GB

### ライブラリとか
- CUDA 10.0 / cuDNN 7.5.0 / CuPy 5.4.0
- Chainer 6.1.0
- ChainerRL 0.7.0

# 比較手法
ChainerRLで使えるエージェントのうち、連続行動空間に対応し、単一環境（asynchronousとかではない）で学習するものを利用。

- [REINFORCE](https://doi.org/10.1007/BF00992696) - 1992 の深層版？
- [DQN (Deep Q-Network)](https://arxiv.org/abs/1312.5602) - 2013
 - [NAF (Normalized Advantage Functions)](https://arxiv.org/abs/1603.00748) - 2016 を利用
- [DDPG (Deep Deterministic Policy Gradient)](https://arxiv.org/abs/1509.02971) - 2015
- [TRPO (Trust Region Policy Optimization)](https://arxiv.org/abs/1502.05477) - 2015
- [PCL (Path Consistency Learning)](https://arxiv.org/abs/1702.08892) - 2017
- [A2C (Advantage Actor-Critic)](https://arxiv.org/abs/1708.05144) - 2017
- [PPO (Proximal Policy Optimization)](https://arxiv.org/abs/1707.06347) - 2017
- [TD3 (Twin Delayed Deep Deterministic Policy Gradient)](http://arxiv.org/abs/1802.09477) - 2018
- [SAC (Soft Actor-Critic)](https://arxiv.org/abs/1812.05905) - 2018


## 実験
ChainerRLのexampleをほぼそのまま利用。パラメータはなるべく以下の設定で統一した。

```python
step = 10 ** 6
reward_scale_factor = 1e-2
update_interval = 1000
batchsize = 64
replay_start_size = 1000
final_exploration_step=10 ** 4
eval_interval = 10000
eval_nruns = 10
replaybuffer size = 10 ** 6
gamma = 0.95
opt = chainer.optimizers.RMSpropGraves()
n_hidden_layer = 2
n_hidden_channels = 64
soft_update_tau = 1e-2
```
実験はほぼ同時にスタート。なのでもしかしたら多少重かったかも（スタート直後にnvidia-smiで見たものの、GPUのメモリは使い切っていなかった気がする）

# 結果
まず、生のログデータをそのままExcelでグラフ化してみる。横軸はエピソード、縦軸は各エピソードにおける累積報酬。なお、上述のパラメータにあるように、報酬にはスケール1e-2が掛かっている（掛けないとPPOでの学習に失敗）。

![pendulum_graph1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459984/1806d44e-53ec-db53-7be7-4e135d80dc30.png)


……見にくいにも程があるので、50区間での移動平均をとったグラフを次に示す。

![pendulum_graph2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459984/ec39fca9-afbb-2262-2db2-6e1f12a0fd87.png)

学習成功勢と失敗勢に見事に分かれている。

## 学習時間とテスト時報酬
各種記録データの生成時間から割り出した学習時間と、bestモデルの評価時報酬（100エピソード）の表。

| method    | time [s] | score(mean)  | score(median) | score(stdev) |
|-----------|----------:|--------------|---------------|--------------|
| DQN       | 14783    | -1394.794537 | -1446.292322  | 141.6817202  |
| REINFORCE | 6623     | -1324.556777 | -1417.614616  | 223.1694692  |
| DDPG      | 7855     | -155.7196851 | -126.4669975  | 87.37769227  |
| TD3       | 13141    | -268.9419578 | -237.1870402  | 176.927272   |
| TRPO      | 3781     | -175.9193336 | -131.9095672  | 116.1852969  |
| PPO*       | 5789     | -159.89914   | -127.0784465  | 91.37168868  |
| A2C       | 2200     | -174.2695782 | -128.9251996  | 103.3684168  |
| SAC       | 27204    | -160.3874612 | -127.6972927  | 92.99764631  |
| PCL       | 17285    | -1203.062252 | -1182.344651  | 186.9649068  |
*PPOは設定ミスで最終時モデルしか保存されておらず、やむなくそちらを利用。でも学習曲線的におそらくそこまで変わらない……はず

# 感想
bestモデルじゃないのにPPOつよい。DDPGが意外と健闘していてびっくり（学習が不安定だけどたまーに良いモデルがある？？）
パラメータチューニングとか色々余地はあるし、一回しか学習していないし、もしかしたら環境によっても違うし、なので一概には言えませんが、何かの参考になれば。
自分は結局PPOでエキスパートを作ろうと思いました。