chainerRL

chainerrl の DQN gym のサンプルの処理をまとめてみた

私は記憶力が弱い

複雑なプログラムを読み解こうとすると、10分後には「あれ?どうなってたっけ?」と忘れてしまう。最初に全体像を把握してからブレイクダウンする方針をとることにしている。

強化学習のアルゴリズムを調べる必要があったので、chainerrl のサンプルをおってみた。想定通り頭に入りにくかったので、(ちょっとあやしい)クラス図にまとめることにした。

Deep Q Network

他にも解説があるのでサクッとまとめる。CNN + Q学習というのは以前からあったらしい。DQN ではいくつかの工夫がなされた。

  • 似通った特徴量をもたせると効率的な学習にならない:
    • 脳の海馬を参考に CNN 特徴量をストックしておき、ランダムサンプリングすることで Q 学習の学習データを相関が少ないものにした
  • 理論的な漸化式にしたがってステップごとにQを更新すると、Qが安定しない
    • Q を一定時間固定した
  • その他、いくつかのパラメータチューニング(すみません、雑で)

実行環境

chainerrl を git clone した。

理解するためにはデバッグしながらクラスを追いかけるのがやりやすい。PyCharm でブレークポイントを入れながら、デバッグモードで実行した。エディター上で変数のクラス型が表示されるので便利。

GPU を使わなかったので、Run -> Edit Configuration の Script Parameters にて
--gpu -1 を設定した。

PyCharm で仮想環境を作成した。requiremetns.txt にしたがって作成。

またパスが通るように chainerrl と examples 配下の ale、gym を右クリック -> Mark Directory as -> Source Root を指定した。

(なんちゃってな)クラス図

対象は train_dqn_gym.py。

可視化するにあたって下記のように表記した。

  • いくつかの抽象化がされているため、処理に直接かかわる重要なクラスのみを青で着色
    • クラスの関係や構造については、抽象化と集約で関係を表示
  • 処理フローの骨格について緑で着色
    • 処理フローについては矢印で表示
  • 大まかな処理のカタマリについてコメントで補足

まとめてみたらこんな感じになった。

train_dqn_gym.py.png

処理の概要

OpenAI の gym 環境の準備

chainerrl をインストールすると gym がインストールされる。

引数をしていしないと PendulumEnv という振り子の環境が指定される。envs.classical_control パッケージの PendulumEnv クラスが使われる。

また、実験の時間を指定するため、gym.wrappers.time_limit パッケージの TimeLimit クラスが使われる。

エージェントの準備

DQN エージェントの設定をおこなう。

もとの論文では CNN + Q 学習 + Experience Replay だったが、CNN + Q 学習をシンプルに FCQuadraticStateQFunction にまとめている。このクラスで 画像の特徴ベクトルとアクションのマトリクスで行動の価値(Q値)を計算する。

最適化だけすると探索ができなくなるので、LinearDecayEpsilonGreedy で探索する。ε-greedy 法というマルチアーム・バンデットアルゴリズムの一種である。

ReplayBuffer も保持しておき、適切なタイミングで更新する。

実験の実行

experiments.train_agentパッケージの関数から実験が実行される。

gym 環境の更新と DQN の学習が繰り返し行われる。

その他

train_dqn_gym.pyと同じディレクトリにdqn_outというディレクトリが作成される。ログやモデルのファイルが出力されるので参考にしてください。