TF2RL: TensorFlow2.x 向け強化学習ライブラリ

友人の [@ohtake_i](https://qiita.com/ohtake_i) が開発している強化学習向けのライブラリ[TF2RL](https://github.com/keiohta/tf2rl)の紹介記事。
私もちょこちょこお手伝い (issue対応・PR作成) させてもらってます。
（拙作のリプレイバッファライブラリ[cpprb](https://gitlab.com/ymd_h/cpprb)もTF2RLのために作ったと言っても過言ではない。）

# 1. はじめに

名前のとおり、[TensorFlow](https://www.tensorflow.org/) 2系で書かれた強化学習向けライブラリです。
TensorFlow 1系は、`Session`だとか`placeholder`だとか、とっつきにくい部分がありましたが、TensorFlow 2系になってかなり書きやすくなっているので、「TensorFlowは書きにくいから[PyTorch](https://pytorch.org/)一択」と思っている人こそ見てもらいたい。


# 2. 実装済みアルゴリズム

最新の状況は、GitHubの[README](https://github.com/keiohta/tf2rl#algorithms) に記載されています。
2020年8月26日現在、以下のアルゴリズムが実装済みです。（随時まだまだ増やしていく予定です。）

* [VPG](https://papers.nips.cc/paper/1713-policy-gradient-methods-for-reinforcement-learning-with-function-approximation.pdf)
* [PPO](https://arxiv.org/abs/1707.06347)
* [DQN](https://storage.googleapis.com/deepmind-media/dqn/DQNNaturePaper.pdf)
    * [DDQN](https://arxiv.org/abs/1509.06461)
    * [Prior. DQN](https://arxiv.org/abs/1511.05952)
    * [Duel. DQN](https://arxiv.org/abs/1511.06581)
    * [Distrib. DQN](https://arxiv.org/abs/1707.06887)
    * [Noisy DQN](https://arxiv.org/abs/1706.10295)
* [DDPG](https://arxiv.org/abs/1509.02971) ([TD3](https://arxiv.org/abs/1802.09477)、[BiResDDPG](https://arxiv.org/abs/1905.01072)含む)
* [SAC](https://arxiv.org/abs/1801.01290)
* [MPC](https://arxiv.org/abs/1708.02596)
* [GAIL](https://arxiv.org/abs/1606.03476)
* [GAIfO](https://arxiv.org/abs/1807.06158)
* [VAIL](https://arxiv.org/abs/1810.00821) ([スペクトラル正規化](https://arxiv.org/abs/1802.05957)含む)

また、一部のアルゴリズムは、[ApeX](https://arxiv.org/abs/1803.00933)や[GAE](https://arxiv.org/abs/1506.02438)にも対応しています。


# 3. インストール方法
TensorFlowのバージョンは、2.0から最新の2.3まで対応しているはずです。
TensorFlowのバージョンの関係から、デフォルトではTensorFlowを依存ライブラリとしてインストールしないので、[pip](https://github.com/pypa/pip)なり[conda](https://docs.conda.io/en/latest/)なりでインストールしておいてください。
（もちろんGPU版でもOKです。2.1以降は[PyPI](https://pypi.org)のバイナリはCPU/GPU版の区別がなくなりましたので、今後気にする機会も減っていくとは思いますが）

```shell:pipの場合
pip install tensorflow
```

```shell:condaの場合
conda install -c anaconda tensorflow
```


TF2RLは、PyPIに[公開](https://pypi.org/project/tf2rl/)しているので、pipでインストールすることが可能です。

```shell
pip install tf2rl
```

# 4. 利用方法

以下が、[README](https://github.com/keiohta/tf2rl#getting-started)に記載のDDPGを利用したコード例です。
アルゴリズムのエージェントを構築し、環境(`gym.Env`)とともに`Trainer`に渡してあげるとアルゴリズムに沿って学習します。

```python:DDPGでPendulumの例
import gym
from tf2rl.algos.ddpg import DDPG
from tf2rl.experiments.trainer import Trainer


parser = Trainer.get_argument()
parser = DDPG.get_argument(parser)
args = parser.parse_args()

env = gym.make("Pendulum-v0")
test_env = gym.make("Pendulum-v0")
policy = DDPG(
    state_shape=env.observation_space.shape,
    action_dim=env.action_space.high.size,
    gpu=-1,  # Run on CPU. If you want to run on GPU, specify GPU number
    memory_capacity=10000,
    max_action=env.action_space.high[0],
    batch_size=32,
    n_warmup=500)
trainer = Trainer(policy, env, args, test_env=test_env)
trainer()
```

学習結果は、TensorBoardで確認することができます。

```shell
tensorboard --logdir results
```


いくつかのパラメータは、`argparse`経由でプログラム実行時のコマンドラインのオプションとして渡すことが可能です。



# 5. 課題と今後
元々スクリプト&コマンド実行を前提としていたので、 `Trainer` が `argparse`と強く結合していて、[Google Colab](https://colab.research.google.com/)等のノートブック環境でうまく実行できません。 (`Trainer` 以外のエージェントはだいたい問題なく動くので、モデルだけ利用＆学習のためのループはスクラッチで記述することは可能です。)
そのうち、`Trainer`にメスを入れてなんとかしたいと思っています。




# おわりに

何故かアクティブにフィードバックをくれるのは、中華系と思われる方々が多いようです。
日本人ユーザーももっと増えてくれって思っているので、使ってみてフィードバック（issue, PR）をくれるととても嬉しいです。