Dwango Media Village(ドワンゴメディアヴィレッジ,dmv)

強化学習フレームワークRLlibの使い方

Dwango Media Villageの佐々木です。最近使い始めた強化学習のフレームワークRLlibの紹介をしたいと思います。

深層強化学習は最近着目を浴びている機械学習技術の1つで、盛んに研究がされています。大量のサンプルデータを必要とする教師あり学習とは異なり、強化学習は環境とエージェントのインタラクションから得られる経験データを必要とします。そのため、いかに効率的にインタラクションの経験データを集めるかが重要になります。プロセス・ノード間で経験データの収集プロセスを並列化することで収集効率を上げることができますが、実装如何で性能が大きく変わってしまいます。さらに学習法や探索法も日々新しい手法が提案される中、ゼロから最新の学習法をサポートする実験プログラムを実装するのは大変な作業です。

そこで実験のためのフレームワークとして RLlib [Liang et al., 2018] を使ってみることにしました。収束が早いQ学習のアルゴリズムApe-X [Horgan et al., 2018] をはじめとして代表的な手法が実装されています。GitHubのスター数が多い、つまり多くのひとが使っていそうというのも理由の1つです。

RLlibは便利ですが、様々なアルゴリズムをサポートしているために設定項目が多く、ドキュメントの説明も簡素なものしかありません。そこで、この記事ではApe-Xを例にしてRLlibの学習設定項目を説明していきたいと思います。はじめに導入として、Ape-X, RLlibの概要をおさらいします。そしてRLlibの簡単な使い方として学習の始め方を説明します。最後に学習を行う際の設定項目をApe-Xに関連するものを中心に説明していきます。

Ape-Xについて

Ape-Xは論文Distributed Prioritized Experience Replay [Horgan et al., 2018] で提案されたDQNの1種です。

Ape-Xの概念図
Ape-Xの概念図

Ape-Xは過去に提案されたDQNの性能を向上させる方法を組み合わせ、分散学習を導入したものです。多数の探索を行うWorkerを並列に実行し、得られた経験データをReplay Bufferに貯め、そしてQ-Networkのパラメーター更新はGPUを使って一括で行います。このときの勾配計算に使われるバッチ入力をReplay BufferからTD誤差にもとづく優先度を使って選びます。より具体的には以下の3つの方法が導入されています:

RLlibについて

RLlibはPythonの分散実行ライブラリRayの1つのサブパッケージであり、学習実験を行う際にはRayに加えて他のサブパッケージTuneと組み合わせて使えるようになっています。

Rayはプロセス・ノード間で共有可能なimmutableオブジェクトを介して実行される関数を非同期で実行するためのライブラリです。Ray特有のデコレートされたPythonの関数 foo を定義すると foo.remote() が呼べるようになります。そして foo.remote() を実行すると関数が実行されますが、オブジェクトの値そのものは即座に評価されずに計算の実行がスケジューラーに予約されます。関数が返すのは共有用のオブジェクトの固有IDです。このIDを ray.get() に渡すと計算が実行されます。

複数の計算過程を実際に実行するためのスケジューラーは ray.init() で開始することができます。RLlibで学習を行うということはスケジューラーに計算を予約することに相当します。サーバーは毎回新たに立ち上げるか、すでに走っているサーバーにネットワークを通して計算の実行を登録することも可能です。

Tuneはハイパーパラメータの推定や学習実験を遂行・可視化するためのライブラリです。パラメーター探索のために学習実験を複数回、メタな推論アルゴリズムなどを組み合わせて行うための機能が実装されています。学習実験を Experiment という単位で管理しており、キューとして複数の実験を溜め込み、順番に実行します。

学習の始め方

今回はRLLibの 学習サンプルスクリプト のように1回の強化学習実験のみを行うことを想定します。

学習実験を行うためには実験の内容を記述した辞書を ray.tune.tune.run_experiments() に渡すだけです。辞書の内容は以下の通りです:

runはA3C, IMPALAなどのアルゴリズムの名前を指定する必要があります。詳細は Rllibのページ を参照してください。強化学習の場合には名前に対応したAgentクラスが初期化され、メイン関数である _train() が複数回数呼び出されます。

Ape-XはRLlibではDQNの特別な場合として実装されています。 APEXAgentDQNAgent をオーバーライドしたクラスであり、主なパラメーターの説明は rayのソース にデフォルト設定と共に書いてあります。デフォルト以外の設定を行いたい場合には上記のExperimentの設定configに辞書を追加すれば上書きされます。また、configのおすすめ設定が結果付きで 公開されています

学習をカスタマイズしたい場合にはconfigを書き換える必要があります。以下はその項目の説明です。

学習の設定項目

項目が多いのでカテゴリに分けて説明します。カテゴリは実装と対応していないので注意してください。

Workerに関するもの

Workerは分散で探索を行うプロセスを意味します。学習を実行するマシンのリソース(CPU, GPU)に応じて設定する必要があります。並列して実行するWorkerの数は num_workers x num_envs_per_worker になります。

名前説明
num_workersintworkerの数
num_cpus_per_workerint1つのworkerあたりに割り当てるCPUの数
num_gpus_per_workerint1つのworkerあたりに割り当てるGPUの数
num_envs_per_workerint1つのworkerあたりに割り当てる環境の数

Workerに関するもの

APE-XではWorkerがε-greedyアルゴリズムを使って環境とインタラクション (Rollout)して経験データを生成します。εの値は1.0から exploration_final_eps へと学習が進むにつれて変更され、変更は schedule_max_timesteps ステップごとに exploration_fraction の割合だけ変更されます。つまり、新しい\(\epsilon\)の値、\(\epsilon_{i+1}\)は以下のように決まります:

\[ \epsilon_{i+1} = \epsilon_{i} + (\epsilon_{final} - \epsilon_{0}) \]

\(\epsilon_{final}\), \(\epsilon_{0}\)はそれぞれ exploration_final_eps 、\(\epsilon\)の初期値(=1.0)です。

名前説明
per_worker_explorationboolworkerごとにε-greedyのεの値を変えるか否か
exploration_fractionfloatεを減らす大きさ
horizonint/nullRolloutが特定のステップ数までが達したら強制的に止める
learning_startsint何ステップRolloutしたら学習を開始するか
sample_asyncboolRolloutを非同期に実行するか否か
sample_batch_sizeint何ステップ分を1つのバッチとしてReplay bufferに送るか

Replay Bufferに関するもの

Prioritized Experience Replay [Schaul et al., 2016] はReplay BufferにQ学習にとってどのくらい役立つかの優先度をつけ、優先度が高いものを多く学習する手法です。優先度の付け方は以下のアルゴリズムに従います:

論文の図より引用
論文の図より引用

9行目の\(p_i\)は優先度を決めるための確率で、TD誤差の絶対値に定数を加えたものです。

\[ p_i=|\delta_i|+\epsilon \]

TD誤差のみで確率分布をつくると特定の経験のみが集中して使われ続けてしまいます。そのため実際には分布\(p_i\)の調整を\(\alpha, \beta\)を使ってアニーリングしています。特に\(\beta\)は prioritized_replay_beta から final_prioritized_replay_beta へと学習が進むにつれて\(\epsilon\)と同様に大きくなります。

名前説明
buffer_sizeintバッファ大きさ
prioritized_replaybool優先度付き経験再生をするか否か
worker_side_prioritizationboolWorkerがRolloutしたときに優先度づけを行うか
prioritized_replay_epsfloatTD誤差から優先度の確率分布を計算する際に加える定数 ε
prioritized_replay_alphafloatTD誤差から優先度の確率分布を計算する際に加える定数 α
beta_annealing_fractionfloatβの変更幅
prioritized_replay_betafloatβの初期値
final_prioritized_replay_betafloatβの上限値
compress_observationsboolReplay Bufferに貯めるときに観測情報をLZ4で圧縮するか否か

経験データの前処理に関するもの

環境からのデータ処理については Rayのページ に概要が載っています。Preprocessorは環境(Gym.Env)のラッパーとして働き、主に観測情報の事前処理を担当します。環境がatariの場合には以下の4つが適用されます(ただし custom_preprocessor を指定した場合は除く)

名前説明
preprocessor_prefstring観測情報の前処理方法
observation_filterstringPreprocessorの後に行われる処理。デフォルトは何もしないNoFilterになる
synchronize_filtersboolFilterのパラメーターをIterationごとに同期するか否か
clip_rewardsbool各ステップの報酬を\([-1, 1]\)に抑えるかどうか。trueの場合には numpy.sign() が使われる。
compress_observationsboolReplay Bufferに貯めるときに観測情報をLZ4で圧縮するか否か

Q-Learningに関するもの

1 Iterationは以下のステップに相当します。 checkpoint_freq はこのIterationが単位になっていることに注意してください。

  1. 学習を行う timesteps_iteration 分stepが経過するか、 min_iter_time_s 秒たつまでの間以下を繰り返す:
    • Replay Bufferからサンプリング
    • 勾配計算
    • 重み更新
    • workerの重みを更新する
    • 優先度を更新する
  2. 優先度の計算・割り当て
  3. ログの更新(Tensorboardの更新)

Replay Bufferへのデータ追加・リプレイは非同期で行われます。

名前説明
double_qboolDouble Q-Learningを適用するか否か
duelingboolDueling Networkを適用するか否か
gammafloat報酬の割引率
n_stepintn-step Q-Learningのnの値
target_network_update_freqint何ステップごとにQ-networkを更新するか
timesteps_per_iterationintIterationのステップ間隔
min_iter_time_sint1 Iterationにかける最小の秒数
train_batch_sizeintQ-Networkのバッチの大きさ

Q-Networkに関するもの

Q-Networkの前向き計算・後ろ向き計算はTensorflowかPyTorchを使って行います。Q-Networkの構成は自分で書くこともできますが、環境のもつobservation_spaceに合わせて自動的に構成を決めてくれます。特に画像の場合にはCNNが適用され、Convolutionのカーネル大きさのみを設定で上書きすることも可能です。

名前説明
hiddensintConvolution層のあとのFully-Connectedな層の大きさ
noisyboolNoisy Network [Fortunato et al., 2017] を適用するか否か。これがtrueの場合にはε-greedyは使われない
sigma0floatNoisy Networkの初期パラメーター
num_atomsintQ-networkの出力分布の数。1より大きくするとdistributional Q-learning [Bellemare and Dabney, 2017] になる
v_minfloatdistributional Q-learningのパラメーター
v_maxfloatdistributional Q-learningのパラメーター

Optimizerに関するもの

名前説明
optimizer_classstringOptimizerの種類。Ape-Xの場合はAsyncReplayOptimizerを使う
debugboolデバックモードの切り替え
max_weight_sync_delayintモデルパラメーターの更新を前回行ってから何ステップ最低で待つか
num_replay_buffer_shardsintReplayの並列数
lrfloat学習率
adam_epsilonfloatAdam Optimizerのεの値
grad_norm_clippingfloat勾配のノルムの最大値

その他

batch_modetruncate_episodescomplete_episodesのどちらかから選ぶことができます。complete_episodesの場合はエピソードが終わるまでBufferに送りません。

名前説明
schedule_max_timestepsintハイパーパラメータを学習の進み具合に応じて変える場合のステップ間隔幅
gpuboolGPUを使うか
gpu_fractionfloatGPUの使用率(0~1, 1が100%)
monitorbool定期的にRollout結果を動画で保存するか否か
batch_modestringBatchのサンプリング方法。
tf_session_argsdictTensorflowのSessionを初期化するときのパラメーター

tf_session_argsは以下が設定することが可能です。詳しいことはTensorflowのドキュメントを参照してください。

参考文献

[horgan2018] [Horgan et al., 2018] Horgan, D., Quan, J., Budden, D., Barth-Maron, G., Hessel, M., van Hasselt, H., & Silver, D. (2018). Distributed Prioritized Experience Replay. In International Conference on Learning Representations (pp. 1–19). https://doi.org/10.1007/11564096

[liang2018] [Liang et al., 2018] Liang, E., Liaw, R., Moritz, P., Nishihara, R., Fox, R., Goldberg, K., … Stoica, I. (2018). RLlib: Abstractions for Distributed Reinforcement Learning. In International Conference on Machine Learning. https://arxiv.org/abs/1712.09381

[scaul2016] [Schaul et al., 2016] Schaul, T., Quan, J., Antonoglou, I., & Silver, D. (2016). Prioritized Experience Replay. In International Conference on Learning Representations (pp. 1–21). http://arxiv.org/abs/1511.05952

[lafferty2010] [Lafferty et al., 2010] Lafferty, J. D., Williams, C. K. I., Shawe-Taylor, J., Zemel, R. S., & Culotta, A. (2010). Double Q-learning. Advances in Neural Information Processing Systems, 23, 2613--2621.

[wang2016] [Wang et al., 2016] Wang, Z., Schaul, T., Hessel, M., & Lanctot, M. (2016). Dueling Network Architectures for Deep Reinforcement Learning Hado van Hasselt. In International Conference on Machine Learning (Vol. 48, pp. 1995–2003). https://doi.org/10.1109/MCOM.2016.7378425

[fortunato2017] [Fortunato et al., 2017] Fortunato, M., Azar, M. G., Piot, B., Menick, J., Osband, I., Graves, A., … Legg, S. (2018). Noisy Networks for Exploration. In International Conference on Learning Representations. https://arxiv.org/abs/1706.10295

[bellemare2017] [Bellemare and Dabney, 2017] Bellemare, M. G., & Dabney, W. (2017). A Distributional Perspective on Reinforcement Learning. In International Conference on Machine Learning. https://arxiv.org/abs/1707.06887

Author

Publish: 2018/12/10

Kazuma Sasaki