Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Lux AI Season 2が始まったので Season 1を振り返る。

Lux AI Season 2が始まったので Season 1を振り返る。

KaggleのシミュレーションコンペLux AIのSeason 1のルール概要説明と、上位ソリューションの紹介です。

Avatar for kenmatsu4

kenmatsu4

March 30, 2023
Tweet

More Decks by kenmatsu4

Other Decks in Technology

Transcript

  1. 4 ⾃⼰紹介(松井 健⼀) 株式会社Mobility Technologies AI技術開発部 データサイエンスグループ グループマネージャー(Kaggle Master) (株式会社

    ディー・エヌ・エーより出向) プロジェクト、コンペティション、著書 • DRIVE CHART AIを活⽤した事故削減⽀援サービス ) https://drive-chart.com/ • Kaggle Master (Competition Rank Highest 300 / 138,947 位) (⾦1, 銀7(うちsolo 4), 銅5 (うちsolo 5)) • SIGNATE 産業技術総合研究所 衛星画像分析コンテスト 2位 URL • 「ワンランク上を⽬指す⼈のためのPython実践活⽤ガイド 第7章 Pythonではじめる統計学」 • 「アクセンチュアのプロフェッショナルが教える データ・アナリティクス実践講座」共著 経歴 ⼤⼿SIer ⇒ ⼤⼿通信キャリア (ソフトバンク)⇒ 外資系コンサルティングファーム(アクセンチュア) ⇒ 現職
  2. 松井は最近になってこのLux AI season 2から始めたので、下記⼿順以外にもっとやれることがあ るかもしれません。コメント・ご指摘あれば是⾮もらえると嬉しいです︕(private shareにならな い範囲で) このコンペでやること 1. ルールを理解する

    2. 開発キット、プラットフォーム、データの理解 3. AIモデルを作る(基本的には、盤⾯情報を⼊⼿してユニットへの指⽰を出⼒ するもの。よくあるのは下記の3つの⼿法。) 1. ルールベース 2. 模倣学習 3. 強化学習 4. モデルをサブミット
  3. 数ページ前に記載の通り、360ターンの間でユニットと都市に指令を出し、最終的に都市の数が多 い⽅が勝ちと⾔うゲーム。 1. ルールを理解する。 ⽊、⽯炭、ウランの 3種の資源を集めて 燃料とする。 ユニット(Worker)を動か して資源を集めたり都市を 建設する。

    ユニット(Worker)が都市を建設、都市は Workerを作れる。都市は研究を⾏い⾼度な 資源を扱えるようになる。 ⽇中🌞 夜⭐ 夜を凌ぐために必 要な燃料の量 燃料の⾜りないユニッ トや都市は破壊される
  4. ローカルで対戦実⾏を⾏うと結果の情報がreplay.json形式で得られる。これを分析したり、学習 のためのデータとしたりすることができる。 2. 開発キット、プラットフォーム、データの理解 replay.jsonの構造 replay["results"] {'ranks‘: [ {'agentID': 0,

    'rank': 1}, {'agentID': 1, 'rank': 2}], 'replayFile': 'replay.json'} replay["teamDetails"] [{'name': './kits/python/customize_001/main.py', 'tournamentID': ’’}, {'name': './kits/python/simple/main.py', 'tournamentID’: replay["allCommands"] [[{'agentID': 0, 'command': 'bw 5 1'}, {'agentID': 0, 'command': 'bcity u_1'}, {'agentID': 1, 'command': 'm u_2 n'}], [{'agentID': 0, 'command': 'bw 5 1'}, {'agentID': 0, 'command': 'm u_1 n'}], [{'agentID': 0, 'command': 'bw 5 1'}, {'agentID': 1, 'command': 'm u_2 s'}], [{'agentID': 0, 'command': 'bw 5 1'}, {'agentID': 0, 'command': 'm u_1 s'}, {'agentID': 1, 'command': 'm u_2 n'}], [{'agentID': 0, 'command': 'r 5 1'}, {'agentID': 0, 'command': 'm u_1 n'}], [{'agentID': 1, 'command': 'm u_2 s'}], [{'agentID': 0, 'command': 'bcity u_1'}, {'agentID': 1, 'command': 'm u_2 n'}], [{'agentID': 0, 'command': 'm u_1 s'}], [{'agentID': 0, 'command': 'm u_1 c'}, {'agentID': 1, 'command': 'm u_2 s'}], [{'agentID': 0, 'command': 'm u_1 n'}, {'agentID': 1, 'command': 'm u_2 n'}], [], [{'agentID': 0, 'command': 'm u_1 s'}, {'agentID': 1, 'command': 'm u_2 s'}], [{'agentID': 0, 'command': 'm u_1 n'}, {'agentID': 1, 'command': 'm u_2 n'}], [], [{'agentID': 0, 'command': 'bw 5 1'}, {'agentID': 0, 'command': 'bcity u_1'}, {'agentID': 1, 'command': 'm u_2 sʼ}], …, [{'agentID': 0, 'command': 'r 5 6'}, {'agentID': 0, 'command': 'bcity u_4'}, {'agentID': 0, 'command': 'bcity u_5'}, {'agentID': 0, 'command': 'bcity u_6'}, {'agentID': 0, 'command': 'bcity u_8'}]] どちらのチームが 勝ったかランクで表⽰ 対戦に利⽤したagentの プログラムコードの場所 lux-ai-2021 ./kits/python/customize_001/main.py ./kits/python/simple/main.py --python=python3 --out=replay.json --statefulReplay true --width 12 --height 12 対戦実⾏コマンド 各ユニット、都市の選択した アクションがstep毎に記録されている
  5. ローカルで対戦実⾏を⾏うと結果の情報がreplay.json形式で得られる。これを分析したり、学習 のためのデータとしたりすることができる。 2. 開発キット、プラットフォーム、データの理解 replay.jsonの構造 lux-ai-2021 ./kits/python/customize_001/main.py ./kits/python/simple/main.py --python=python3 --out=replay.json

    --statefulReplay true --width 12 --height 12 対戦実⾏コマンド {'cities': {'c_1': {'cityCells': [{'cooldown': 0, 'x': 1, 'y': 5}], 'fuel': 0, 'id': 'c_1', 'lightupkeep': 23, 'team': 0}, 'c_2': {'cityCells': [{'cooldown': 0, 'x': 1, 'y': 6}], 'fuel': 0, 'id': 'c_2', 'lightupkeep': 23, 'team': 1}}, 'globalCityIDCount': 2, 'globalUnitIDCount': 2, 'teamStates': {'0': {'researchPoints': 0, 'researched': {'coal': False, 'uranium': False, 'wood': True}, 'units': {'u_1': {'cargo': {'coal': 0, 'uranium': 0, 'wood': 0}, 'cooldown': 0, 'type': 0, 'x': 1, 'y': 5}}}, '1': {'researchPoints': 0, 'researched': {'coal': False, 'uranium': False, 'wood': True}, 'units': {'u_2': {'cargo': {'coal': 0, 'uranium': 0, 'wood': 0}, 'cooldown': 0, 'type': 0, 'x': 1, 'y': 6}}}}, 'map': [[{'resource': {'amount': 347, 'type': 'uranium'}, 'road': 0}, {'road': 0}, {'resource': {'amount': 415, 'type': 'coal'}, 'road': 0}, {'road': 0}, {'road': 0}, {'resource': {'amount': 374, 'type': 'wood'}, 'road': 0}, {'resource': {'amount': 329, 'type': 'wood'}, 'road': 0}, {'road': 0}, {'road': 0}, {'road': 0}, {'road': 0}, {'resource': {'amount': 381, 'type': 'coal'}, 'road': 0}], {'resource': {'amount': 381, 'type': 'coal'}, 'road': 0}]], map: 12x12のマップなので、 12x12分の各タイルの情報が 記載されている teamStates: 各チームごとにユニッ トの位置、状態や研究情報などが記録 されている。 cities: 各都市の状態が 記録されている
  6. まずは学習データの作成。replay.jsonを学習に利⽤できるように、インプットとGround Truthに 加⼯。 3. AIモデルを作る(模倣学習) Step 2: モデルを作る 収集した対戦データ (replay.json)

    … 観測値[状態](インプット) … 各ユニットのaction(Ground Truth) 読み⽅仕様は ここ: URL 読み⽅仕様は ここ: URL リソースがどこにどれ だけあるか、ユニット がどこにあって状態は どうか、などが記載さ れている。
  7. メジャーなnotebookとして、UNetを⽤いた模倣学習が紹介されている。Workerのアクションを これで決める。積極的に⼿の内を公開する神々に感謝。RLのpre-trainedモデル⽤途が動機。 (https://www.kaggle.com/c/lux-ai-2021/discussion/289540) 3. AIモデルを作る(模倣学習) 都市はルールベースで アクションを決定 「味⽅ユニット」「⽯炭資源」など 1つ1つを32x32にマッピングし 13チャンネルで⼊⼒

    … … 都市建設 東に移動 ⻄に移動 南に移動 東⻄南北、都市建 設、動かないの6種 workerがいるとこ ろだけ適⽤ 勝利した7つのsubmitから 1711episode、スコア1780以上を抽 出して学習に利⽤ globalな特徴をここで付加しているのが defaultのUNetからのカスタマイズポイント (research point, step数, ユニット総数、リソース総数など)
  8. 価値 max! 𝑄"#$%& , (𝑆'() , 𝑎) バッファ (現在の状態、選択したアクション、 得られた報酬、次の状態)を記録

    記録 RLを⽤いた公開notebookで⼀番voteが多いものがDQNベースだったので、Lux AI 1にDQNを適⽤ した時のイメージを図⽰。(https://www.kaggle.com/code/aithammadiabdellatif/lux-ai-reinforcement-learning) 3. AIモデルを作る(強化学習) プレイヤー アクション 𝐴! 各ユニット 次の状態 𝑆!"# 報酬 𝑅! ⼀定間隔で コピー ミニバッチ モデル学習 現在の状態情報 𝑆! NNでアクションを評 価、良いものを選択 (ε-greedyも採⽤) 環境 価値 𝑄(𝑆!, 𝐴!) 価値 max"𝑄#$%&'!(𝑆!(), 𝑎) ニューラル ネットワーク (target) ニューラル ネットワーク 現在の状態情報 𝑆! 次の状態情報 𝑆!"# 報酬 𝑅! 選択したアクション 𝐴! 𝑙𝑜𝑠𝑠* = 𝑄 𝑆!, 𝐴! − (𝑅!() + 𝛾 max" 𝑄#$%&'# (𝑆!(), 𝑎)) ⇒ ∑+,-,.$#/0 (𝑙𝑜𝑠𝑠*)1 Experience Replay Target Network
  9. 優勝したToad Brigadeチームのソリューションを紹介。 1st place Solution : Toad Brigadeʼs Approach -

    Deep Reinforcement Learning ソリューションコードは https://github.com/IsaiahPressman/Kaggle_Lux_AI_2021 ü Haliteでルールベースが強かったので試したが、RLの⽅が強かったのでルールベースは捨てた。 ü RLの報酬設計 ü 最後のタイムステップで、ゲームに負けると-1、勝つと+1の報酬が与えられ、それ以外の時 間では0とした。(ただし学習の初期段階は他の報酬体系も採⽤)
  10. 優勝したToad Brigadeチームのソリューションを紹介。 1st place Solution : Toad Brigadeʼs Approach -

    Deep Reinforcement Learning ü RLアルゴリズム ü 強化学習には、分散強化学習アルゴリズムIMPALA(Importance Weighted Actor- Learner Architecture)を採⽤。 ü Facebook Researchの https://github.com/facebookresearch/torchbeast がベース。 ü ただし、Google Researchの2020年3⽉のブログ Massively Scaling Reinforcement Learning with SEED RLで「The previous generation of distributed reinforcement learning agents, such as IMPALA, 」と⾔われており既に古い︖(このブログを⽇本語 意訳してくれているものあり※) ü 損失項 ü UPGOとTD-lambdaの損失項を追加。 ü 全状態の推論は、パラメータ固定した教師モデルが推論。教師モデルの⽅策と、現在のモ デルの⽅策のKL損失項を追加。 https://arxiv.org/pdf/1802.01561.pdf ※ SEED RLによる⼤規模強化学習 https://webbigdata.jp/post-5307/ ここでは「歴史の教科書送りとなりつつあるようです、進化早すぎ。」と 書いてありますが、本当に・・・
  11. 1st place Solution : Toad Brigadeʼs Approach - Deep Reinforcement

    Learning ⼊⼒データは下記のように多種の特徴量を2次元データとして作成し積み上げる。 ü ⼊⼒ ü サイズは32 x 32で固定。⼩さい盤⾯はパディングで処理。 ü 下記の32項⽬1つ1つに32 x 32の2次元配列を作成。 ü 研究ポイントのようなグローバルな情報は、ボードのすべてのタイルに値をブロードキャス ト。 変数名 説明 worker workerの位置 cart cartの位置 worker_COUNT 盤⾯のworkerの総数 cart_COUNT 盤⾯のcartの総数 worker_cooldown workerのcooldown値 cart_cooldown cartのcooldown値 worker_cargo_WO OD workerが持つ⽊材量 worker_cargo_CO AL workerが持つ⽯炭量 worker_cargo_UR ANIUM workerが持つウラン量 cart_cargo_WOOD cartが持つ⽊材量 変数名 説明 cart_cargo_COAL cartが持つ⽯炭量 cart_cargo_URAN IUM cartが持つウラン量 worker_cargo_full 積載量フルのworkか cargo_cargo_full 積載量フルのcargoか city_tile 都市の位置 city_tile_nights_of _fuel 都市の燃料所持量 city_tile_cooldown 都市のcooldown値 road_level 道路の整備レベル WOOD 該当タイルの⽊材量 COAL 該当タイルの⽯炭量 URANIUM 該当タイルのウラン量 変数名 説明 research_points リサーチポイント researched_coal ⽯炭採掘可能か researched_uraniu m ウラン採掘可能か night 該当ターンが夜か否か day_night_cycle 1⽇の中の経過時間 phase 何⽇⽬か turn 何ターン⽬か board_size 12x12などの盤⾯サイズ dist_from_center 盤⾯中⼼からの距離
  12. 報酬設計は段階的に変化させる作戦を採⽤。 1st place Solution : Toad Brigadeʼs Approach - Deep

    Reinforcement Learning ゲームの勝ち負けだけでなく、都市やユニットの建設・敗北、研究、燃料補給などにも報酬としてポイントを与えることで、 最初の2,000万ステップで報酬シェーピングを⾏い、学習のスピードアップとエージェントの初歩的な⾏動の発達を促した。 シェーピングされた報酬で8ブロックの⼩さなネットワークを訓練した後、勝ち負けのみの疎な報酬で16ブロック、最終的 には24ブロックを訓練し、その都度、前の⼩さなネットワークを教師として使⽤しました。訓練はすべて、8コア/16ス レッドのデュアルGPUシステムである私個⼈のPCで⾏いました。 ソリューションより ゲームの勝敗のみの報酬 都市の増加 ユニットの増加 研究ptの増加 燃料の増加 積み込み可能な worker数 コード︓ それぞれの報酬 項⽬のウェイト
  13. ユニットのアクションは基本的には可能な⾏動を制限せずに⾏動空間を設計。資源の転送は離散⾏動 とするため、転送するなら保持しているすべての資源を転送するか、何もしないかの2択にした。 1st place Solution : Toad Brigadeʼs Approach -

    Deep Reinforcement Learning ü ワーカー︓ 19個のアクション ü 何もしない、4⽅向の移動、3つの資源ごとに4⽅向の転送、都市建設、略奪 ü カート︓17個のアクション ü ワーカーと同じで、都市建設と略奪がない ü 都市︓4個のアクション ü 何もしない、調査、worker作成、cart作成
  14. 推論時の⼯夫としてデータaugmentationや、後処理としてのルールベースの結果補正も⼊れてい る。 1st place Solution : Toad Brigadeʼs Approach -

    Deep Reinforcement Learning ü Augmentation ü 180度盤⾯を回転させて推論し、結果を平均するというアンサンブルを適⽤。 ü https://github.com/IsaiahPressman/Kaggle_Lux_AI_2021/blob/main/lux_ai/rl_agent/rl_agent_config.yaml#L15-L20 ü https://github.com/IsaiahPressman/Kaggle_Lux_AI_2021/blob/main/lux_ai/rl_agent/data_augmentation.py#L135 ü ⾏動の衝突回避 ü ユニットの⾏動の優先順 ü 下記のルール ü 該当アクション確率の⾼い順にユニットを並べる ü 都市以外のタイルではユニットは重複できないため、先に該当タイルへの移動を決めたも のが優先される。 ü 都市の⾏動の優先順 ü 下記のルール ü 該当アクション確率の⾼い順にユニットを並べる ü 建設や研究のアクションがユニットや研究の上限に達するほどキューに⼊ったら、残りの都市 タイルは別のアクションを選択する。 ü https://github.com/IsaiahPressman/Kaggle_Lux_AI_2021/blob/main/lux_ai/rl_agent/rl_agent.py#L235
  15. EOF