Kaggle Halite コンペ + 強化学習

Halite by Two Sigma | Kaggle に参加していた。今回はお誘いいただいて @threecourse さん と @Seed57_cash さんとチームで挑んた。

コンペの目的

  • 4人プレイの岩塩(halite)集めゲーム
  • 1プレイヤーが複数の shipyards and ships を操作することが可能
  • 盤面サイズ 21 x 21 のボードゲーム
  • 詳細はここ

前半: チーム結成前

強化学習で解くことを決意。以前学んだ強化学習は記憶から飛んでいるので1から勉強し直すことに。決めた方針は

  • 強化学習は難しいので、とにかくシンプルスタート
  • 時間がたっぷりあるので DQN を自前で実装して理解を深める
  • halite コンペではなく、もっとシンプルな connectx コンペで練習する
  • Colab Pro

結果としてこの方針は良い面も悪い面もあった

良かった点

  • DQN の実装にとても苦労したので強化学習デバッグに強くなった。動いていないのはなぜか?に対して仮説が立てられるように
  • connectx は十分にシンプルな題材で、他にも強化学習で解いている人がいたので参考情報が多かった
  • Colab Pro はすばらしい :)

悪かった点

  • DQN は不安定だったのでかなりの時間を溶かしてしまった。理想的には理論を理解し、サンプルを実行しあとはライブラリを使うのが正解な気がする
  • 時間はたっぷりなかった。強化学習デバッグ・トレーニングに時間がかかる

後半: チーム結成後

@threecourse さんに pfrl を教えてもらい自分の実装を移植した。ライブラリを使うと責任の分担がはっきりするので observation, reward そして model に集中できる。さらに DQN が動くようになると数行の修正でより安定した PPO が動くようになりコストパフォマンスが大変良かった。チームメイトと slack で議論・情報共有しながらできたのはとても良かった。他にも @threecourse さん と @Seed57_cash さんがモデルについて話しているときに、「ああ。このくらいやらないとだめなんだ」というベースラインをしれたのは大変ありがたかった。

実装の詳細

  • ship の convert はハードコーディング
  • 1 ship が 1 agent
  • self play (自己強化学習
  • 上記2つから 4人対戦の場合 4 * ship の数の agent がいることになるので training 負荷が高かった
  • reward
    • 衝突回避が難しかった。結局大きな goal (= 最終的にゲームに勝つ)では衝突回避は学習できなかった。衝突を事後検知して失われたスコアに応じて負のrewardを与えた
    • ship は4方向の移動と動かないという選択肢があるのだが、compound 命令として deposit を定義した。これのおかげで deposit という行動を取ると reward を貰えることを学んでくれた
  • observation
    • 6チャンネルの 2D array (自分の位置、味方の船、shipyard の位置、時間経過、halite の位置、spawn予定地)

どこまで行けたか

  • 1人プレイ & 1 ship で halite をあつめて deposit => OK
  • 2人プレイ& 1 ship for each で haliteをあつめて deposit => OK
  • 2人プレイ & 2 ship for each => カオス

結局複数プレイヤー複数 ship は正しく動くところまで持っていけなかった。pfrl を正しくない方法で使っているのでそれが原因かもしれない。

所感

  • 強化学習は安定させるのが難しい。ただしデバッグ方法を理解すれば、かなりましになる。
  • チームでやるほうが学びがある。本当にありがたい。
  • 実世界で役に立つ強化学習もやってみたい。