LuxAIコンペで銅メダルのためにやったこと

LuxAIで銅メダル取れました

kaggle LuxAIコンペでギリギリ銅メダルを取ることができました。116thです。

f:id:wata101wata:20220102213310p:plain
会社の同僚とチーム組んでやってました

コンペの取り組み方針や実施したアプローチの詳細を書いていこうと思います。

やったこと

アプローチ三分類

ルールベース

まずはデータサイエンスを用いず、完全にルールベースで取り組みました。この段階ではルールを読み込みながらアイデアをひたすら実装する段階でした。

強化学習

強いAIを作るための花形技術といえば強化学習ですね。pythonでは以下の組み合わせで手っ取り早く実装できそうでした。

  • opengym

    • 強化学習全体を動かしていくためのライブラリ。強化学習は①エージェントがシミュレーターで動いてデータを集める②集めたデータを用いてエージェントを学習させる、をぐるぐると回していくイメージです。opengymでは各要素がモジュール化されていて全体の見通しがつきやすく動かしやすくなっています。
  • stable-baseline3

学習を実行するところまでは実現できましたが、残念ながら記録は伸びませんでした。コンペのdiscussionを見てもopengym+stable-baseline3でうまくいっている人はいないようでした。コンペの1st強化学習でしたが、使っているアルゴリズムは異なるようでした。今後深掘りしたいです。

教師あり学習

今回のコンペでは投稿されたAIの対戦履歴が得られる仕様でした。よって、上位者の行動を正解として分類問題に落とすことができました。今回のコンペではモデリングの自由度が高いことが面白い点でした。例えば、各wokerごとに予測を出すのか、全てのマスに対して同時に予測を出すのかなどで説明・目的変数・モデルアーキテクチャが様々考えられます。教師あり最も強かったアプローチは、ゲームのマップの情報を階層構造として説明変数とし、全てのマスについてworkerの行動を予測する方針で、モデルとしてはUnetを使うものでした。Unetはセグメンテーションでよく用いられるもので、各ピクセルに対してクラスを予測するものですからうまくフィットしたと考えています。

終わりに

強化学習でうまくいかなかったのが心残りなので上位の解法を再現して深掘りしたいです。