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


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

動機と目的

  • 逆強化学習で(連続状態)・連続行動のタスクを扱いたい
  • 手頃なテスト環境として、OpenAI GymのPendulum-v0があった
  • 深層強化学習ライブラリである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とかではない)で学習するものを利用。

実験

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

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での学習に失敗)。

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

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

学習時間とテスト時報酬

各種記録データの生成時間から割り出した学習時間と、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でエキスパートを作ろうと思いました。