Kaggle Halite コンペ + 強化学習
Halite by Two Sigma | Kaggle に参加していた。今回はお誘いいただいて @threecourse さん と @Seed57_cash さんとチームで挑んた。
コンペの目的
前半: チーム結成前
強化学習で解くことを決意。以前学んだ強化学習は記憶から飛んでいるので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 を正しくない方法で使っているのでそれが原因かもしれない。