サッカーを強化学習する
はじめに
この記事は強化学習苦手の会Advent Calenderの12日目の記事です。 私は11月末までKaggle上で開催されていたGoogle Research Football with Manchester City F.C.に参加していました。このコンペはGoogle Researchが用意したサッカーゲーム上でサッカーエージェント(プレイヤー)を作成し、その強さを競うというものです。
私はhigeponさんとチームを組ませていただき、強化学習アプローチでコンペ開催から終了まで取り組みました。そこでサッカーエージェントを強化学習で育成する際に工夫した点や苦労した点を共有できればと思います。
kaggle: Google Research Football competition
GitHub: Google Research Football
コンペの概要
ゲームのルールは通常のサッカーとほとんど同じです。オフサイドやレッドカード、ファールもありです。また今回のコンペではアクティブユーザー(ボールに一番近い)1人のみが操作可能という仕様でした。FIFAやウイイレとほぼ同じと考えてもらって大丈夫です。エージェントをkaggle上に提出すると毎日複数の敵と複数回対戦しその勝敗によって順位が変動する仕組みです。
ではゲーム上のエージェントをどのように学習するかというところですが、以下の3つで定義された環境を用いてエージェントを学習させていきます。
①試合の観測状態
②エージェントの行動
③エージェントの行動による報酬(見返り)
この3項目について以下で説明します。
①試合の観測状態(State)
Stateとしては生データとそこからの派生として3種類の表現方法が提供されています。
生データ
試合に関する全ての状態を含む生データ。情報量は一番多い。
(1)Floats
選手やボールの(x,y)座標、アクティブプレイヤーの番号など、ゲーム情報を115次元のベクトル表現として扱う表現方法。
(2)SMM(Simplified spacial minimap)
72 * 96のミニマップ画像(4ch)を用いた表現方法。シンプルな画像として扱える。
- 1ch目が自分のチームの選手の位置
- 2ch目が敵チームの選手の位置
- 3ch目がボールの位置
- 4ch目が操作可能なアクティブプレイヤーの位置
以下SMMの画像例
(3)Pixels
下記のような実際のゲーム画像を 72 * 96にダウンスケールした表現方法。グレースケールバージョンも用意されている。情報としてはリッチだがノイズも多め。
②エージェントの行動(Actions)
方向キーやパス、シュートなど全部で19の行動が設定されている。詳細は以下。
③エージェントの行動による報酬(Reward)
Google Research Football環境には予め2つの報酬関数が定義されている。
(1)SCORING報酬:
得失点に対応する報酬
得点したら+1で失点したら-1 というシンプルなもの。試合のスコアに対応する。
(2)CHECKPOINTS報酬:
相手フィールド半分を10個のエリアに分割しゴールに近づくにつれて+0.1ずつ与えられる即時報酬のようなもの。 なお敵が自分のフィールドに攻めてきてもCHECKPOINTによるマイナス報酬は発生しない。 上限が設定されており1試合で最大+1.0まで。
またgymのwrapperを使ってカスタム報酬を作成することも可能。
学習のアプローチ
本コンペではエージェントの学習方法として以下の3つのアプローチが取られていました。この記事で主に扱うのは強化学習ですがその他の2つの手法もここで簡単に触れておきます。
ルールベースアプローチ
コーディングによってエージェントの行動を決める方法です。人の手でルールを決めてagentの実装を行うため、エージェントの学習コストがなく、またドメイン知識を最も生かすことのできる方法であるため、コンペ開催直後から中盤にかけて多くの方が取り組んでいたアプローチだったのではないかと思います。
機械学習アプローチ
こちらはコンペ中盤から目立ち始めたアプローチです。どういうものかというと過去の対戦データを使ってエージェントを学習させるというものです。本コンペは作成したエージェントをkaggle上にアップロードして複数の相手と毎日対戦させることで暫定順位を出す設計になっており、各エージェントの対戦結果はデータとして取得できるものになっていました。
そこで機械学習モデルで過去のエージェントの行動を教師ラベルとして学習(模倣)するアプローチが中盤から終盤にかけて取り組まれていたと思います。学習器としてはRandom ForestやGBDTなどの決定木ベースのアルゴリズムが私が観測した範囲では使用されていました。コンペ上位の方も使用されている非常に有効なアプローチであったようです。
s_toppo's solution(6th)
強化学習アプローチ
こちらが今回の本題である強化学習アプローチです。機械学習アプローチと異なる点としては教師ラベルは利用せず、試合の結果(報酬)をもとにして各状態でのとるべき行動をエージェント自身が学習していく方法になります。コンペ上位の方で強化学習アプローチを取られている方が複数いたことからも本コンペでは強化学習アプローチは有効な手法であったと思われます。
取り組みの概要
以下、行った取組みの概要を示します。
- 強化学習アルゴリズムとしてSEED RL(V-trace)による分散型強化学習を採用
- 観測状態としてSMM(ミニマップ)を使用
- 学習序盤で対戦botの難易度を段階的に増加
- 学習序盤でCHECKPOINT報酬の減衰
- 複数の対戦相手による過学習の抑制
- カスタム報酬はノイズになりうるのであえて加えない
- 1620M steps(541,666試合)の学習
いくつかのポイントについて説明します。
SEED RL
今回はSEED RLという計算資源の拡張性に優れた分散型強化学習フレームワークを使用しました。こちらはGoogle Researchから2020年に出されたものでSEED RL内でIMPALA(V-trace),R2D2,soft-Actor-Criticの3つの強化学習アルゴリズムが利用可能となっています。本論文内でGoogle Research Football環境での性能評価を行っており、実装及びGCPによる計算環境も整っていたことからSEED RL内で扱えるIMPALA(V-trace)を強化学習アルゴリズムとして採用しました。また本論文では3つの観測状態(floats, SMM, Pixels)の比較も行なっており、SMMが良い結果を示していたことからSMMを利用することにしました。
序盤での対戦相手の難易度(difficulty)増加
Google Research Football環境にはあらかじめBot(NPCのようなもの)が用意されており、difficultyを変更することが可能であったため、easyモードに該当するdifficuly=0.05から最難易度であるdifficuly=1.0まで徐々に上げていきました。difficultyは学習時の平均得失点差が1を越した(勝ち越した)時に0.05ずつ上げていく方式を取りました。
CHECKPOINT報酬の減衰
CHECKPOINT報酬はエージェントをうまくゴール近くに誘導するために良い効果を発揮します。これは学習序盤では効果的なのですが、学習が進行してくると得点することよりもゴールの方向へ進むことに意味を見出してしまい、学習のノイズになってしまうことが考えられました。そこでCHECKPOINTの割合を徐々に減らしていき、最終的には0にすることで、試合に勝つことのみに報酬(SCORING報酬のみ)を与えるようにしました。CHECKPOINTの減衰はdifficultyの増加に合わせて行い、difficultyが最高難易度に達した時にCHECKPOINTがゼロになるように設定しました。
計算資源
GCPのAI Platformを利用しました。
SEED RLはactor(試合をplayしてデータを取得する役割) とlearner(データから学習をする役割)に分かれており、GPUがlearner、CPUがactorに対応します。
- GPU: p100*1
- CPU: n1-standard-4*96(合計384個のvCPU)
合計534体のactorを同時に並列で試合をさせて学習を行いました。
学習過程
今回作成したエージェントは最終的には1620Msteps(約54万試合分)の過程を経て学習されました。ここではその過程について説明していきます。
こちらは1620Mstepsまでの1試合ごとに返される報酬結果を示したものです。縦軸が対戦相手との得失点差を示していると考えてもらえればいいです。
0M ~ 160M steps
この期間は対戦botの難易度の増加とCHECKPOINT報酬の減衰を行なっていました。
LBスコア*: 700
(*kaggle上で公開されているLeader Boardのスコアのこと600が平均値)
160M ~ 900M steps
160Mあたりから性能が急激に落ちてしまいました。難易度とCHECKPOINT減衰のスピードが早すぎたのかもしれません。しかし200Mあたりから右肩上がりで学習していき、bot相手には圧勝できるようになりました。試合の様子はこんな感じです。
ところがkaggle上でのスコアは思うように伸びませんでした。
LBスコア: 800~900
900M~1400M steps
対戦相手のBotには大差で勝ち越せるようになっているにも関わらず、LB Scoreが思うように上がらないことからBotに過学習していると考え、対戦相手を追加することにしました。相手はkaggle上で公開されておりLBスコアが1100(当時上位5-10%の順位)とかなり高いルールベースのBotを利用しました。学習比率はBot : ルールベースBot=1 : 3の比で学習させました。
これにより停滞していたLBスコアの向上が見られました。
LB スコア:900-1100
1400M - 1620M steps
上記Botを追加し手元ではどちらもBotにも勝ち越せるようになりましたがLBスコアは期待以上には伸びませんでした。そこで新たに新たに機械学習ベースのBotを対戦相手として追加し学習させました。ここで時間(資金)切れとなり終了となりました。
LB Score 1100-1200
最終のエージェントの試合の様子
最終結果
本日(12/12)コンペが終了し、最終成績は以下のようになりました。
最終LBスコア 1174 (58th /1141)
ギリギリの銅メダル。。金銀目指していたので悔しさはもちろんありますが上位の方の手法を見る限り力不足だったなと思いました。
私たちの解法をまとめたDiscussion
難しかった点
① 学習の推移が予想できない
特に学習序盤ですが、推移の変動が大きく、学習がどのように進むのか予想できませんでした。今回はひとまずそれなりの時間放置して経過を見守るというスタンスを取りましたが、③で書いているようにコストがかなりかかるのでどの時点で学習を止めるべきかの判断が難しいように感じました。
② 思っていた以上に過学習する
最初はBot相手に強くなれば性能・スコアも右肩上がりで上がっていくと思っていたのですが今思うと過学習気味だったので、序盤から複数の相手と戦わせたり自己対戦をしていたらもう少しスコアが上がったのかなと思いました。
③ 学習コストが大きい
1620M stepsの学習を行うのにGCPのAI platformを利用しました。
この学習にざっくり20万円近くのコストがかかっています。
私たちは本コンペ用に抽選で配布された1人$1000(約10万4千円分)のGCPクーポンを運よく2人ともゲットすることができたので計算資金はそれなりにあったと言えますが、それでも強化学習にはかなりの学習コストを要することがわかりました。
④試行錯誤の数が限られる
強化学習は答えを与えない分データ効率が悪いので学習するまでに多くの時間を要します。そのためいろいろ試して比較するということがなかなかできず、どのように学習を進めていくべきかの判断が難しい印象を受けました。行動の探索空間を限定したり補助的な報酬を与えるなどのデータ効率を上げる工夫、試行の良し悪しをどの時点のどの基準で判断するかの意思決定が重要のように感じました。
試したけどうまくいかなかったこと
- アンサンブル学習
機械学習のように複数のRL エージェントを用意し選択行動を投票で決めるアンサンブルを行いましたがうまくいきませんでした。
- カスタムシナリオによる部分学習
通常の試合だけではなくゴール前での得失点に関わる状況に限定したシナリオを作成し学習をすることに取り組みましたが、単一で行うとこれまでの戦略を忘却したかのように全く異なる行動をとるようになり、それを避けようと通常の試合と混ぜながら行なっても性能の向上が見込めなかったのでボツとなりました。
上位解法の良さそうな取り組み
- 自己対戦学習
3位解法と6位解法はどちらも自己対戦を取り入れた自己対戦学習を行なっていました。自己対戦の場合、データ効率が倍になりかつ過学習にもある程度対策ができていたようで一つの良いアプローチだったのかなと思いました。ちなみに上位の方は自己対戦とは別に複数の敵との対戦も同時に行なっており過学習対策をしっかりされている印象でした。
- 階層的な行動空間
行動の選択肢はidle状態を除くと全部で17こありますが、全てが重要というわけではありません。6位解法では8つの方向移動行動を1つの移動行動としてまとめて、移動行動が選ばれた時にのみ方向を選択するという取り組みを行なっていました。これにより探索する行動空間を小さくすることができるのでデータ効率を上げる狙いがあったようです。非常に面白い取り組みだと感じました。
- 模倣学習
本コンペでは機械学習アプローチ(教師あり)も有効であったことから模倣学習も有効だったのではないかと考えました。模倣学習によりエージェントをある程度高いレベルまで学習させた後、自己対戦による強化学習などで学習を継続すれば効率よく、比較的少ないコストで学習ができたのではないかと考えました。
感想
今年の8月くらいから、強化学習の勉強を本格的にしたいと思い論文や書籍などで勉強していたところに、このような面白いコンペが開催されたので私としては非常に幸運でした。書籍では知っていた強化学習を行う上での難しさ(報酬設計、データ効率、過学習)を身をもって学ぶことができました。難しさを感じるコンペであったものの、学習初期はボールを素通りしたりオウンゴールをしていたエージェントがちゃんとパスをして相手のゴールに向かっていく姿にはちょっぴり感動しました。
金圏含めてこのエージェントより強いものはいくらでもいるんだけど、学習初期から試合の様子を見ているので「よくこんなに強くなって、、」って感じで見てます。 https://t.co/Yp9N9buz48
— きょうへい (@kuto_bopro) December 2, 2020
本コンペを通して改めて強化学習は非常に興味深い分野だなと思ったので今後も勉強していき、このような面白いコンペがあったら積極的に参加していきたいと思います。
ここまで読んでいただき、ありがとうございました。
その他参考文献
Google Research Footballの論文
Google Research Football環境で強化学習に取り組んだかなり質の高いブログ