$30 off During Our Annual Pro Sale. View Details »

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

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

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

kenmatsu4

March 30, 2023
Tweet

More Decks by kenmatsu4

Other Decks in Technology

Transcript

  1. 2023.3.9
    Kenʼichi Matsui
    AI技術開発部 データサイエンスグループ
    株式会社 Mobility Technologies
    (株式会社ディー・エヌ・エー より出向)
    AI技術共有会
    Lux AI Season 2が始まったので
    Season 1を振り返る。

    View Slide

  2. 2
    項⽬
    01|⾃⼰紹介
    02|Lux AIとは
    03|上位ソリューションの紹介

    View Slide

  3. 3
    項⽬
    01|⾃⼰紹介
    02|Lux AIとは
    03|上位ソリューションの紹介

    View Slide

  4. 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 ⇒ ⼤⼿通信キャリア (ソフトバンク)⇒
    外資系コンサルティングファーム(アクセンチュア) ⇒ 現職

    View Slide

  5. 5
    項⽬
    01|⾃⼰紹介
    02|Lux AIとは
    03|上位ソリューションの紹介

    View Slide

  6. これらを読むだけでも⼗分、というかより良いかもしれない・・・。本資料を作るにあたっても⾮
    常にお世話になりました。
    既に良い資料がたくさんあるのでまずは紹介
    • MoT 宇都さんのブログ「思考の本棚」Lux AIコンペの振り返り
    (https://kutohonn.hatenablog.com/entry/2021/12/14/100303)
    • ゲームのルールやご⾃⾝の解法として模倣学習や強化学習について紹介
    <社内資料なので以下略>

    View Slide

  7. いわゆるKaggleのシミュレーションコンペの1つ。下記の1st seasonは2021年8⽉に開始された。
    ゲームのAIを作成し、対戦相⼿に勝つことを⽬的として順位を争う。
    Lux AIとは
    https://www.kaggle.com/competitions/lux-ai-2021

    View Slide

  8. 360ターンの間でユニットと都市に指令を出し、最終的に都市の数が多い⽅が勝ち。夜には燃料を
    ⼗分貯めておかないとユニットや都市が壊れてしまう。下記の例は⻩⾊チームの勝ち。
    Lux1 デモ
    動画

    View Slide

  9. 実は先⽉からLux AI season2が始まり、過去の復習をしようと⾔う意図です。
    なぜ今それを取り上げたのか︖

    View Slide

  10. 下記のようなルールを頭に⼊れる必要がある。すごく簡単に⾔うと2ページ前に書いたルールにな
    る。
    ルールは結構複雑

    View Slide

  11. 松井は最近になってこのLux AI season 2から始めたので、下記⼿順以外にもっとやれることがあ
    るかもしれません。コメント・ご指摘あれば是⾮もらえると嬉しいです︕(private shareにならな
    い範囲で)
    このコンペでやること
    1. ルールを理解する
    2. 開発キット、プラットフォーム、データの理解
    3. AIモデルを作る(基本的には、盤⾯情報を⼊⼿してユニットへの指⽰を出⼒
    するもの。よくあるのは下記の3つの⼿法。)
    1. ルールベース
    2. 模倣学習
    3. 強化学習
    4. モデルをサブミット

    View Slide

  12. 数ページ前に記載の通り、360ターンの間でユニットと都市に指令を出し、最終的に都市の数が多
    い⽅が勝ちと⾔うゲーム。
    1. ルールを理解する。
    ⽊、⽯炭、ウランの
    3種の資源を集めて
    燃料とする。
    ユニット(Worker)を動か
    して資源を集めたり都市を
    建設する。
    ユニット(Worker)が都市を建設、都市は
    Workerを作れる。都市は研究を⾏い⾼度な
    資源を扱えるようになる。
    ⽇中🌞 夜⭐
    夜を凌ぐために必
    要な燃料の量
    燃料の⾜りないユニッ
    トや都市は破壊される

    View Slide

  13. 開発キットがGithub上で公開されている。これをダウンロードして改良することで各ターンの指
    令を出すことができる。シミューレーション環境のインストールによりローカルで対戦させること
    もできる。
    2. 開発キット、プラットフォーム、データの理解
    シミュレーション環境の準備
    インストール
    対戦実⾏
    対戦結果はjson形式で
    出⼒される。(説明後述)

    View Slide

  14. 開発キットがGithub上で公開されている。これをダウンロードして改良することで各ターンの指
    令を出すことができる。シミューレーション環境のインストールによりローカルで対戦させること
    もできる。
    2. 開発キット、プラットフォーム、データの理解
    agent.pyで指令
    を実装
    このmain.pyを前⾴
    の対戦実⾏時に指定
    agent関数の引数observation
    で盤⾯情報などの状態を⼊⼿
    この辺りに情報を処理した上で判断
    した⾏動を決定する処理を書き、
    関数の戻り値とする。

    View Slide

  15. ローカルで対戦実⾏を⾏うと結果の情報が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毎に記録されている

    View Slide

  16. ローカルで対戦実⾏を⾏うと結果の情報が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: 各都市の状態が
    記録されている

    View Slide

  17. 与えられた観測値からagentのアクションを、コーディングして決める。下記は⼀例。
    3. AIモデルを作る(ルールベース)
    資源のあるセルを記録
    所有する都市それぞれ60%
    の確率でWorker作成。
    40%の確率で研究実施。
    Workerのアクションを決定。20%の確率で移動
    (東⻄南北stayの5択でランダム)、20%の確率で
    都市建設、60%の確率で資源探索と都市への補給を
    ⾏う。
    上記で定めた各ユニットのア
    クションのリストをリターン

    View Slide

  18. 模倣学習は、過去の対戦履歴から、現在置かれている状況をインプット、その時取った⾏動を
    Ground Truthとして教師あり学習でアクションを決めるモデルを構築する⼿法。
    3. AIモデルを作る(模倣学習)
    ここをクリックすると
    参加者の対戦が⾒れる
    ここから対戦データがjson形式でdownloadできる。
    https://www.kaggleusercontent.com/episodes/<replay_id>.json
    のようにするとスクレイピングもできる。
    Step 1: 参加者の過去の対戦データを取得
    これらの対戦データをまとめてダウンロードするコードも公開されていた。
    https://www.kaggle.com/code/robga/simulations-episode-scraper-match-downloader

    View Slide

  19. まずは学習データの作成。replay.jsonを学習に利⽤できるように、インプットとGround Truthに
    加⼯。
    3. AIモデルを作る(模倣学習)
    Step 2: モデルを作る
    収集した対戦データ
    (replay.json)

    観測値[状態](インプット)

    各ユニットのaction(Ground Truth)
    読み⽅仕様は
    ここ: URL
    読み⽅仕様は
    ここ: URL
    リソースがどこにどれ
    だけあるか、ユニット
    がどこにあって状態は
    どうか、などが記載さ
    れている。

    View Slide

  20. メジャーな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数, ユニット総数、リソース総数など)

    View Slide

  21. 価値 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

    View Slide

  22. 22
    項⽬
    01|⾃⼰紹介
    02|Lux AIとは
    03|上位ソリューションの紹介

    View Slide

  23. 優勝した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とした。(ただし学習の初期段階は他の報酬体系も採⽤)

    View Slide

  24. 優勝した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/
    ここでは「歴史の教科書送りとなりつつあるようです、進化早すぎ。」と
    書いてありますが、本当に・・・

    View Slide

  25. Actorにてモデルが推論を⾏い。環境、アクションなどの結果を⼀定量蓄積したのち、結果をまと
    めてTrajectoryとしてLearnerに送信、集めたTrajectoryを⽤いてモデルの学習を⾏い、モデルの
    パラメータをActorに配布する。
    IMPALAアーキテクチャ
    Massively Scaling Reinforcement Learning with SEED RLより
    https://ai.googleblog.com/2020/03/massively-scaling-reinforcement.html

    View Slide

  26. 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 盤⾯中⼼からの距離

    View Slide

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

    View Slide

  28. ユニットのアクションは基本的には可能な⾏動を制限せずに⾏動空間を設計。資源の転送は離散⾏動
    とするため、転送するなら保持しているすべての資源を転送するか、何もしないかの2択にした。
    1st place Solution : Toad Brigadeʼs Approach - Deep Reinforcement
    Learning
    ü ワーカー︓ 19個のアクション
    ü 何もしない、4⽅向の移動、3つの資源ごとに4⽅向の転送、都市建設、略奪
    ü カート︓17個のアクション
    ü ワーカーと同じで、都市建設と略奪がない
    ü 都市︓4個のアクション
    ü 何もしない、調査、worker作成、cart作成

    View Slide

  29. 推論時の⼯夫としてデータ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

    View Slide

  30. EOF

    View Slide