まだタイトルない

アウトプット用です

【Kaggle挑戦記】シミュレーションコンペ Lux AIに参加してきました。【#12】

f:id:teyoblog:20211212220002j:plain:w500

こんにちは。

2021年8月16日から2021年12月6日まで開催されていた Lux AI Challengeに参加してきました。

結果についてはこれからの2週間の評価期間を経て確定となりますが、初めてのシミュレーションコンペということでいけて銅メダルか?というラインなので今回は解法振り返りというより取り組みを振り返るようなポエムを書いていこうと思います。

参加した動機

まずはこちらの実際のゲームの動画?を見てみてください。

かわいいですね。

なので参加することにしました。

概要

  • 昼30ターン、夜10ターンを9サイクル360ターンが試合時間
  • 最後に街をたくさん残していたほうが勝ち
  • ワーカーは資源を使って街を作る
  • 街は燃料を保持し、夜のターンに燃料を消費する
    • 燃料が足りなければ街もワーカーも消滅する

こんな感じです。実際にルールベースなコードを書いたりする際にはクールタイムなど詳細なルールがありますので詳しく理解する必要があります。

ルールベースで取り組む

このコンペは Halite コンペに似ているということがDiscussionにあったためどんなソリューションがかったの軽く調べてみました。

この記事を見て上位陣のagentがなんターンくらいで研究レベルを50/200にしているかを調べたりしてみましたが特に収穫はありませんでした。

ルールベースでも戦えることがわかったことと、公開ノートにルールベースのノートがあったのでまずはコレで勉強。

https://www.kaggle.com/huikang/lux-ai-working-title-bot

解読にとても時間がかかったのですが初めてガッツリとオブジェクト指向を活用したコードを読んだのでとても勉強になりました。

頭と実力が足りず特に新しいルールを実装する事はできませんでした。(というか本当によくできた神ノートすぎて・・・

石炭やウランが研究レベルが50/200にってからしか採集市に行かないようになってたのでそこをフライングして採集に行くようにしたもののうまく行かず・・・

本を買ってモチベーションを上げる

今回はこの3冊を買って読みました。どの本もこのコンペに落とし込むには似たような公開ノートもなく気合が必要に感じましたが、2冊目のCNNを使ったタスクに落とし込む発送とかは後述する模倣学習の理解に助かったように思います。後単純日本は面白かった

ちなみにこの本ゲーム好きな人にはおすすめです。(アフィちゃうで

圧力コンペに浮気

短期間のテーブルデータコンペが来ていたのでそっちに1ヶ月位浮気してました。
並行でいけるかと思ったのですが全く並行して取り組めませんでした・・・

Lux AI再開

圧力に行く前に投稿しててルールベースのagentがかなり低い位置に居たので他の手法を試すことにしました。

Reinforcement Learning(強化学習)とImitation Learning(模倣学習)があったのですが、今回は模倣学習の考え方がとっつきやすかったのでそっちをやることにしました

こちらのノートLux AI with Imitation Learning を参考にしました。

マップ状況を 20ch,h32,w32で表現して入力データに、とった行動をラベルにして学習する仕組みです。

学習データ増やしてLrスケジュールするともっと良くなるよっていうノートやアンサンブルのノートも公開されたのでとりあえずそれをサブしたら調子がいいと銀圏付近まで伸びることを観測しました。

しかしみんなそれを投稿しちゃうのでだんだん順位は下がります...

自分なりのアレンジをする

まず単純に学習データはLB1位のチームが対戦するたびに増えるのでどんどん学習データを増やすことで公開されてるノートより上に立てることは容易に想像できるのでスクレイピングして収集します。

その他模倣学習のモデルをゴニョゴニョて上を目指しました

  • alphazeroっぽいアーキテクチャを作る
    • resblock19層、filter数128はおそすぎてタイム・アウトしちゃいました。
  • poolingにGeMpoolingを使ってみる
    • loss自体は改善されました
  • 公開ノートのresblockのレイヤー数を増やす
  • CVを同エピソードでtrain valid別れないようにする
  • 序盤だけルールベースにする
  • アンサンブル
    • ユニット数に応じてシングルモデルに切り替える
  • targetsizeを下げた学習(Discussion
    • 結局うまく推論させることができませんでした...

f:id:teyoblog:20211212220351p:plain

手元で学習させてたalpha風モデル(植えず茶色い方)はval scoreはいいのにLB弱すぎてずっと泣いてました

f:id:teyoblog:20211212220419p:plain

Agentが馬鹿な問題を深堀り

コンペ終盤3日くらいのところでagentが全く建築しないので本番想定でlogitを眺めることにしました

(おそすぎる・・・・)

oof
f:id:teyoblog:20211212220428p:plain

本番想定
f:id:teyoblog:20211212220436p:plain

桁が違いすぎる・・・

batchnormalizationがだめ?

学習時はvalidもbatch size大きいのに対して本番はbatch size1で推論してるからそこでノーマライズ効かなくておかしくなってる?

いいえ違いました

pytorch:BatchNorm1dでのaffine=True or False,track_running_stats=True or False の設定の違い

batch normalizationのtrack_running_statsはdefaultでTrueです。Trueだと推論時は学習サンプル集合の平均と分散を使用して,正規化。Falseだと学習時と同様に入力データの平均と分散を使用して正規化。とのことなので問題はないです

ではなぜ・・・・・

torch.jit.trace()がうまくできてなかった

このコンペは推論時間に制限があるためjit.traceして事前にコンパイルすることで推論速度の高速化を公開ノートがしていたので自分もそうしていました。

しかし、ローカルで保存したものをkaggleで読み込んでjit.traceしても正常な予測結果にならないことがわかりました。この問題はまだ解決していなくて、結果的にmodelのインスタンスを作成してweightを読み込んでjit.traceすることにしました。コレでagentがアホ問題は解決されました。コレが最終日前日夜のことでした笑

タイム・アウトしないようにアンサンブルして提出

後はアンサンブルを作って提出して終わりになりました。

www.kaggle.com

12/11現在最終日のサブが自己ベストまで来ているので粘ってよかったなと思います。

f:id:teyoblog:20211212220449p:plain

次はもうちょっと分かるコンペでマスター目指していきたいです!!!