EnsekiTT Blog

EnsekiTTが書くブログです。

PPOで強化学習する時のベストプラクティスの話

スポンサーリンク

こんにちは、えんせきです。
熱は出なくなったのですがいかんせん喉のイガイガがとれません。
とても寒いからエアコンも消せないし加湿器かなにかを導入するか迷っています。

つまりなにしたの?

Best Practices when training with PPOを読んだので適用する時に都度英語を読まないで良いように日本語メモにした。
(日本語訳ではなく実装時に読み取れればいい程度なので情報は落ちる)
PPOはml-agentsにデフォルトで入っている強化学習手法

ensekitt.hatenablog.com
これの続き
f:id:ensekitt:20180128180202j:plain


PPOって?

Proximal Policy Optimization
https://blog.openai.com/openai-baselines-ppo/
OpenAIが2017年に発表した強化学習のアルゴリズムでml-agentsにデフォルトで入っていてこれまでもそれで学習していた。
日本語に訳すと近接方策最適化とかそんな感じ?

一般的な話

PPOも別に万能強化学習アルゴリズムってわけじゃないので当然ハイパーパラメータの調整によって性能が大きく変わる。
ここでは、学習過程でパフォーマンスを発揮しやすくするためのベストプラクティスを紹介する。

ハイパーパラメータの話

バッチサイズは連続か離散で分ける

バッチサイズ(batch_size)は勾配降下法の勾配の更新に使用する試行回数に対応している。連続値による動作を行う場合は、この値は大きめに取り、離散値による動作を行う場合はこの値を小さくする。
目安:

  • 連続値(Continuous):512-5120
  • 離散値(Discrete):32-512

前にやってた倒立振子は完全にここを連続値向けにすることを忘れていてプルプルしっぱなしだった。

beta値(離散動作向け)

beta値はエントロピー正則化の強さに対応していて、方策をどれくらいランダムにするかを調整する。これは離散的な動作を行うモデル向け。
これを増やすとランダムな動作が増えるので局所に落ちやすい場合などは入れておくと良いかもしれない。
また、Beta値はエントロピーが報酬の増加とともに徐々に減少するように調整したいパラメータなので、TensorBoardからエントロピーを確認して、報酬に対してあまりにも急にエントロピーが低下する場合は、ベータを増やす。逆に報酬に対してあまりにもエントロピーが低下しない場合はベータを減らす。
目安:

  • 1e-4 - 1e-2

バッファサイズ

バッファサイズ(buffer_size)は勾配降下を実行される前にバッファリングする経験数に対応している。これはバッチサイズの倍数にしなければいけない*1。通常は大きなバッファサイズにするとより安定した更新に対応する。
目安:

  • 2048 - 409600

Epsilon

Epsilonは勾配降下を更新している時に古い方策と新しい方策との間の発散具合の許容範囲(閾値)に対応する。この値を小さくすると更新が安定するが、学習にかかる時間は長くなる。
目安:

  • 0.1 - 0.3

隠れユニット

隠れユニット(hidden_units)はニューラルネットワークの全結合隠れ層にいくつのユニットがあるかに対応する。単純な問題(正しい行動が状態入力の単純な組み合わせになっているもの)に対してはこの値を小さくする。実行するべき行動が状態変数間の非常に複雑な相互作用である問題については、もっと大きくする。
目安:

  • 32 - 512

学習率

学習率(Learning_rate)は勾配降下の各更新ステップでの学習の強さに対応する。学習が不安定で報酬が一貫して増加しない場合は小さめに設定する。
目安:

  • 1e-5 - 1e-3

世代パス数

世代パス数(num_epoch)は勾配降下中の経験バッファをパスする回数。バッチサイズが大きければ数世代パスできる。パスする世代を減らすと安定した更新ができるけど学習は遅くなる。
目安:

  • 3 - 10

計画対象期間

計画対象期間(time_horizon)は経験バッファに経験を追加する際に、エージェント毎にどれくらいのステップ数を収集するかに対応している。エピソード内で報酬が頻繁に発生したり、エピソードが非常に大きい場合、これはとても少ない数字になる。しかし、安定した学習のためにはこのパラメータはエージェントの行動のシーケンス内のすべての重要な行動を捉えるのに十分な大きさである必要がる。
目安:

  • 64 - 2048

最大ステップ数

最大ステップ数(max_steps)は、学習プロセス中に実行されるシミュレーションのステップ数(フレームスキップをかけた後の値)に対応する。複雑な問題に適用するためにはこの値を大きくする必要がある。
目安:

  • 5e5 - 1e7

正規化

正規化(Normalize)は、正規化が状態入力に適用されるかどうかに対応する。この正規化は、状態の実行平均と分散に基づいて行われる。正規化は、複雑な連続(Continuous)制御問題の場合に役に立つが、より単純な離散問題には有害の可能性があるので慎重に適用した方がいい。
目安:

  • 連続(Continuous) True(複雑じゃなければFalse)
  • 離散(Discrete)False

これに従ったらプルプルがすぐに収まりました。

ensekitt.hatenablog.com

*1:バッチサイズのn倍みたいなパラメータじゃないんだね

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。