Morikatron Engineer Blog

モリカトロン開発者ブログ

【DQfD】人間のプレイを参考にして学習する強化学習アルゴリズムを実装してみる【前半】

 

はじめに

こんにちは。モリカトロンでエンジニアをやっている竹内です。

ゲーム×AIと聞いてまず最初に思い浮かぶのは、やはり囲碁やブロック崩しなどを人間を上回る性能で学習していく「強化学習」の分野ではないでしょうか。個人的にもこの分野にとても興味を持っています。

 

たしかに強化学習とゲームAIは「環境のシミュレーターが用意されており、イテレーションを回しやすい」「報酬関数が明確」といった点で比較的相性が良く、実用例でいえばデバッグやバランス調整のための自動プレイエージェントを作成する手法の一つとして活躍が期待されています。*1

しかしながら商用ゲームの多くは探索空間が膨大でランダム探索では報酬が得られにくく、まともに学習するには膨大な計算資源と計算時間、慎重なパラメータのチューニングを要するといった点で、実応用上はまだまだ課題が多いのが現状です。

こうした「報酬が疎で効率的に探索するのが難しい」という課題を、比較的簡単に解決するためのアプローチの一つとして、「人間のプレイから方策を模倣する」手法があります。*2

そこで今回は強化学習アルゴリズムの中でも、人間のデモプレイを参考にして学習を行うDeep Q-learning from Demonstrations(DQfD)という手法を、実際に実装しながら紹介していきたいと思います。

 

なお、記事が少し長くなりそうなので全体を前後半に分け、前半をDQfDの概要、後半を実装編とさせていただきます。(まだまだ勉強中の身ですので、不正確な箇所等ございましたら、ご指摘いただけるとありがたいです。)

 

前提とする知識

強化学習、特にDeep Q Network(DQN)とその派生に関する基本的な知識があれば十分です。具体的にはDQNPrioritized Experience ReplayDueling NetworkおよびDouble Q-Learningについての大まかな知識を前提としています。

これらについては元の論文の他に、わかりやすく解説されたブログ記事などがすでにいくつかありますので、google検索などから辿ってフォローしていただけたらと思います。今回これらの手法については解説を省かせていただきます。

 

(個人的に参考になると感じた記事)

DQN: DQNをKerasとTensorFlowとOpenAI Gymで実装する

Prioritized Experience Replay:Let's make DQN: Double Learning and Prioritized Experience Replay

Dueling Network: 実装例から学ぶDueling Network DQN

Double Q-Learning: シンプルな実装例から学ぶQ学習、DQN、DDQN

DQNとその派生: DQNからRainbowまで~深層強化学習の最新動向~

 

DQfDとは

DQfDはGoogle DeepMind社の Deep Q-learning from Demonstrations(Hester et al.)

という論文によって2018年*3に発表された手法です。

ベースとなる手法は、DQNにその派生手法である

の3つを重ねたPrioritized Dueling Double Deep Q-Networks(PDD DQN)です。(Dが多い)

このPDD DQNにさらに「人間のプレイデータを学習に利用する部分」を加えたものがDQfDとなります。

 

DQfDの特筆すべき点として、従来のDQNでは学習が難しかった*4Atari2600のMontezuma's Revengeにおいて人間の平均スコア*5を上回るハイスコアを叩き出すことに成功しているという点が挙げられます。


DQfD playing Montezuma's Revenge

(論文著者による、DQfDで学習したAIがMontezumaをプレイする動画)

 

Montezuma's Revengeを攻略した手法としては他にもGo ExploreRandom Network DistillationLearning Montezuma's Revenge from a Single Demonstrationなどがありますが、DQfDはMontezuma's Revengeに特化した特別なチューニングなしでAtariの他のタイトルについても同様に学習ができるという点や、タイトルによってはデモを上回る性能を発揮できるという点などが強みです。

 

デモを利用して学習を行う模倣学習の他の手法としては、行動模倣(Behavior Cloning)や逆強化学習(Inverse Reinforcement Learning)などが挙げられますが、報酬関数を設定しなくて良い反面、環境の報酬を利用しづらく、ゲーム環境においてはまだ未開拓かなという印象です。(ここらへんは自分のリサーチ不足かもしれません)

 

また、このDQfDにはApe-X DQfDR2D3といった派生手法があり、前者はエージェントによるサンプリングを並列化することでMontezuma's Revengeをデモより早いスピードで攻略し、後者はリカレントニューラルネットワークを利用したR2D2の手法と組み合わせることで、より複雑なタスクを3D環境で攻略しています。


Montezuma's Revenge: Ape-X DQfD vs. Expert Player

(人間のプレイと比較する動画のデザインが素晴らしい)

 

解説

ここからはPDD DQNに新しく手を加えられた箇所を中心に論文に沿って解説していきます。冒頭で触れた通り、今回DQfDのベースとなっているPDD DQNについての説明は省略させていただきます。(丸投げですみません)

 

デモンストレーションからのサンプル

通常の優先度付き経験再生では、エージェントが環境を走って集めてきたサンプルをミニバッチとして抽出する際、TD誤差の絶対値|\delta_i|で重み付けした確率で重点サンプリングを行います。このとき新しいサンプルについては最も高い優先度をつけ、学習に使用したサンプルに関しては重みをp_i=|\delta_i|+\epsilonに更新します。

DQfDでは重みを更新する際のを、エージェントからのサンプルに対しては\epsilon=0.001、デモからのサンプルに対しては\epsilon=1と設定することで常にデモからサンプルされる確率が高くなるようにします。(割とシンプル)

 

損失関数の追加

PDD DQNに加えてデモの行動を効率的に模倣するために、いくつかの新しい損失関数が導入されているので順を追って解説していきます。

 

1. Large Margin Classification Loss

DQfDの肝となる部分です。

状態sでデモがとった行動をa_EとするとLarge Margin Clasification Lossは

\displaystyle J_{E}(Q)=\max_{a\in A}[Q(s,a)+l(a_E,a)]-Q(s,a_E)

と定義されます。

ここで、l(a_E, a)a=a_Eのとき0、そうでないときは正の値(実際には0.8)をとる関数です。

直感的には「デモが選択した以外の行動に対しては損失がより大きくなる」ととらえることができ「デモの行動を模倣するようにQ関数を学習する」ための損失だと考えることができます。

 

バッチサイズ1のシンプルな具体例で考えてみます。

状態s=s_Eの時にデモがとった行動がa_E、現在のQ関数による評価値がQ(s_E, a_E)=0.5、デモの行動以外で現在一番評価値が高い行動a_AについてはQ(s_E, a_A)=0.2であったとします。

この時

\displaystyle\max_a[Q(s_E,a)+l(a_E,a)]=Q(s_E,a_A)+l(a_E,a_A)=0.2+0.8=1.0

となり、損失は

\displaystyle J_{E}(Q)=1.0-0.5=0.5

と計算されるので、学習時はこの損失が小さくなるように(よりデモの評価値が高く、それ以外の評価値が低くなるように)パラメータが更新されることになります。

デモの行動を正解(a=a_Eのとき損失が0になる)として、他の行動の評価値にあえて0.8ポイントの下駄(margin)を履かせることで、間違ったQ関数の推論を修正していくようなイメージでしょうか。

ただしこの損失が適用されるのはデモからのサンプルのみとなります。

 

2. NステップTD誤差

DQNで用いられる通常のTD誤差

\displaystyle J_{DQ}(Q)=(r_t+\gamma \max_aQ(s_{t+1}, a_{t+1})-Q(s, a))^2

に加えてnステップ先まで考慮した際のTD誤差

\displaystyle J_n(Q)=(r_t+\gamma r_{t+1}+\ldots+\gamma^{n-1}r_{t+n-1}+\max_a\gamma^nQ(s_{t+n}, a)-Q(s, a))^2

が導入されています。

分散型強化学習手法であるA3Cなどにも採用されている手法ですが、論文によると「デモの行動軌跡の価値をそれ以前の状態に伝播させ、事前学習をよりよくする」と言及されています。つまり、「すぐには報酬が発生しないが、数ステップ先の報酬に結びつくような行動」にも相応の価値を与え、デモの行動を効率的に覚えていくためのアプローチだと言えそうです。実際にはn=10が採用されています。 

 

3. L2正則化

上記の損失に加えて、さらにL2正則化項(重みとバイアスのパラメータの二乗和)が加えられます。これは比較的少ないデモからのサンプルに過剰に適合してしまうのを防ぐために導入されています。

J_{L2}(Q)=\sum_i |w_i|^2​​​

 

学習の際は1~3の損失に重みを付けた和を最終的な損失とします。

​J(Q)=J_{DQ}(Q)+\lambda_1J_n(Q)+\lambda_2J_E(Q)+\lambda_3J_{L2}(Q)​​​

実際には\lambda_1=1.0, \lambda_2=1.0, \lambda_3=10^{-5}が使用されています。

 

事前学習

デモの行動を効率的に模倣するため、エージェントは環境を走る前にデモからのサンプルによって75万ステップの事前学習を行います。事前学習を行うことで環境を走る際の初期の方策をデモに近いものにすることができ、より学習を早めることができると考えられます。*6

 

その他

上記以外に、論文ではあまり触れられていないものの重要だと思った点を挙げておきます。

  • 残機が減ってもエピソードを続行

これまでのDQN系列の手法では残機が減る=エピソードの終わり(ただし環境はリセットしない)としていましたが、DQfDでは残機が全て無くなるまでを1エピソードとしています。

  • ε-greedyのεを0.01に固定

ε-greedyのεについては論文末尾のSupplementary Materialに0.01と記載されているのですが、どうやら1に近い値から減少させるのではなく常に0.01のまま変化させないようです。(Combining Imitation Learning and Reinforcement Learning Using DQfDのブログに記載がありました) 

  • デモのサンプルは削除しない

エージェントからのサンプルはリプレイバッファが溢れ次第古いものから削除されていきますが、デモからのサンプルは削除せず、学習を通して使い続けます。

  •   報酬をlogスケールに変換

通常のDQNでは得られる報酬を1か-1にクリッピングしていましたが、DQfDではより大きい報酬が得られる行動を優先するように報酬をr_{agent} = sign(r)\log(1+|r|)という形の対数スケールに変換します。

 

まとめ

人間のデモから効率よく方策を学習するDQfDという手法を紹介しました。

次の記事でTensorflow2.0による具体的な実装と検証、考察などを行なっていきます。

(Atari2600の中からHeroとMontezuma's Revengeを学習する予定です。)

 

参考文献

 

*1:ゲームと機械学習の最前線(CEDEC2019)[CEDEC2019]人工知能にテストプレイを丸投げできるか?(モリカトロンAIラボ)などに実応用例が紹介されていますので参考になるかと思います。

*2:他のアプローチとしては好奇心などの内的報酬をモデル化する、報酬が手に入る寸前のシーンから遡って学習する、人手で頑張って報酬を密に設計するなどがあります。

*3:AAAIでは2018年、arXiv上では2017年に公開されています。

*4:オリジナルのDQNではスコア0.0、つまり最初の鍵を手にいれることすらできませんでした。

*5:DQNの論文では約4300という記載があります。

*6:実は派生手法のApe-X DQfDでは事前学習は廃止されていたりします。