機械学習周りのプログラミング中心。 イベント情報
ポケモンバトルAI本電子書籍通販中

汎用行動選択モデルの学習 part06 DQNの自前実装【PokéAI】

前回まで、教師あり学習であらゆるパーティの行動選択を行えるモデルを学習させ、3層16チャンネル程度の全結合DNNである程度適切な行動がとれることがわかりました。 今回からはバトルの勝敗を報酬とした強化学習に取り組みます。

select766.hatenablog.com

実装面の課題として、まず強化学習フレームワークを選定する必要があります。もともとChainerベースのChainerRLを使っていたのですが、Chainerの開発終了に伴いPyTorchに移行を進めているという背景があり、強化学習フレームワークもPyTorchに対応したものが必要です。フレームワークの候補はいくつかありRLlibを少し触ってみたのですが、基本的に一人用ゲームの環境を想定した作りとなっており、対戦ゲームでモデル同士を自己対戦させるにはそれなりの追加実装を必要とします。また、状態によって選択可能な行動が制約される(技のPP切れ、交代先が瀕死かどうかなど)ことに対応する実装も必要です。そこで今回は、既存の強化学習フレームワークを使わず自前でDQN (Deep Q-Network)を実装することにしました。メリットは、ポケモンバトル用に特化した実装ができるため自由度が高く、コードの見通しが良くなります。デメリットはDQN以外の強化学習アルゴリズム(A3C, ACER, PPO等)を使いたくなった場合には各アルゴリズムを自前で実装しなければならない点です。本当は確率的な行動選択をモデリングするACER等の方策ベースの強化学習アルゴリズムのほうが読み合いを要するゲームにふさわしいように思えますが、その域に至るのは当分先と考え、実装が容易な価値ベースのDQNを実装することにしました。より具体的には、DQNを少し改良したDouble DQNを実装しました。

実装は、

を参考にDQNのコアアルゴリズムを実装しつつ、ポケモンバトルのシミュレータの呼出し方法などに即してデータの取り回しを独自に実装しました。

システムの構成を下図に示します。

f:id:select766:20200611214915p:plain
強化学習システム構成

ポイントは、モデルの更新を行うTrainerと、バトル中の行動を決定するAgentを分離している点です。DQNの学習では、(state(ターンNの状態), action(ターンNで選択した行動), next_state(ターンN+1の状態), reward(ターンNで得た報酬))という組の情報をreplay bufferに集積してモデルの更新に使うわけですが、バトルには2人のプレイヤーが必要で、それぞれ同じターンに異なる状態を観測することになります(自分のポケモンが覚えている技の情報がstateの一部に含まれるため)。Agentはプレイヤー1人分の視点で時系列を記録することにより見通しを良くしたうえで、両方のプレイヤーが得たreplay bufferをTrainerが持つ単一のreplay bufferに集積することで1つのモデルを更新するという仕組みとしました。

学習結果を軽く説明します。バトルごとに100パーティから2パーティをランダムにピックアップし、3層16チャンネルのモデルを10000エピソード(バトル数)学習させました。 学習後のモデルとランダムに行動するエージェントを、同じ100パーティから2パーティランダムにピックアップした条件で1000回対戦させたところ学習後のモデルの勝率が66.6%となり、学習の効果があることがわかりました。 前回教師あり学習で得たモデルはランダムに対する勝率が66.7%となり、今回の強化学習結果と近い強さである可能性が高いことがわかりました。モデル同士の対戦は未実装のため、今後評価していければと思います。 ランダムに行動する相手に対してあまり高くない勝率なのは、バトルの条件が1vs1なので、ポケモン同士の相性がかなり効いている可能性があります。

次回、学習したモデルがとった行動の分析を提示できればと思います。