MineCraft BASALT Challengeの解法の紹介
前書き・BASALTとは
初めまして、AI開発チームのK.Kです。
今回はNeurips2022で行われたMinecraftのAIを競うチャレンジーBASALT Competition 2022[1]の結果についてLeaberboardの上位の手法から紹介し、最後にLLMを活用したAIエージェントーVoyagerに少し触れたいと思います。
BASALTとはBenchmark for Agents that Solve Almost-Lifelike Tasks[2]の略で、明確で簡単に定義された報酬がないタスクをエージェントが探求できるように、ヒューマンフィードバックから学習することを目的としています。
実際の評価プロセスでもスコア値などの絶対指標ではなく、人間のスタッフが2組のAIのプレイ動画を見て「A is better than B」のように個人的な嗜好のみで評価します。
最後に、Xbox Liveなどのマッチングアルゴリズムとして開発されたTrueSkill[3]システムで最終的なランキングを行います。
BASALT Competitionのタスク定義
全てのチームに共通するBASALT Competitionで定義されているタスクを見ていきましょう。
① FindCaves task
洞窟探しタスク。洞窟を探して中に入った後、ESCキーを押してタスクを終了します。
初期位置: 平地 (plains)
初期Inventory: {} :無し
タイムリミット: 3600 steps (20fps)
補足: 自分で洞窟を掘るのはNG
② Waterfall task
滝を作るタスク。山岳地帯でバケツを使い滝を作ります。その後場所を移動し、滝がカメラに綺麗に写る位置でESCキーを押してタスクを終了します。
初期位置: 山岳 (Extreme Hills)
初期Inventory:
Dict({
"cobblestone": 20,
"stone_pickaxe": 1,
"stone_shovel": 1,
"water_bucket": 1
})
タイムリミット: 6000 steps
③ Village Animal Pen Task
動物を柵で囲うタスク。小屋付近に柵を作り、同じ動物を最低2頭柵に入れます。(囲う動物は鶏・羊・豚・牛のうち1種のみです。) ESCキーを押してタスクを終了します。
小麦を手に持って移動すると牛や羊がついて来てくれるようです。 https://minecraft.k2gw.net/98/
動画ではその動きを上手く利用しています。黒い動物も一緒に柵に入れてしまいましたが、あれは羊のようです。
初期Inventory:
Dict({
"carrot": 1,
"oak_fence": 64,
"oak_fence_gate": 64,
"wheat": 1,
"wheat_seeds": 1
})
タイムリミット: 6,000 steps
④ Village House Construction task
家造りのタスク。適切な場所に、villageを破壊しないように家を建てます。その後、家をぐるっと一周観察してESCキーを押してタスクを終了します。建設に必要な素材は初期に与えられます。
初期位置: anytype village
初期Inventory: 建造に必要なアイテムがそれぞれ64個程与えられる
タイムリミット: 14,400 steps
教師データについて
Basalt Competitionではこれら4つのタスク向けの教師データ(合計約640GB)を提供しています。
Size #Videos Name
--------------------------------------------------
146G 1399 MineRLBasaltBuildVillageHouse-v0
165G 2833 MineRLBasaltCreateVillageAnimalPen-v0
165G 5466 MineRLBasaltFindCave-v0
175G 4230 MineRLBasaltMakeWaterfall-v0
また、Behavior CloningのBaselineとして、OpenAIのVPT(Video Pre Training)モデルが提供されています。
VPTはfoundation modelという扱いで、具体的には契約プレイヤーに2000時間プレイしてもらい、収集した延べ70,000時間のYouTubeプレイ動画をIDM model(Inverse Dynamic model)で自動アノテーションし、学習したモデルです。
自動アノテーションに使用したIDM modelは、過去や未来フレームから現在のaction commandを予測する、すべての時系列の情報を与えられたモデルです。
VPT自体はIDMと同じ構造であるものの、将来のフレームを参照できないよう直前までの情報のみが与えられます。
各チームとも、オリジナルのVPTモデルを更にBasalt Competetonのデータでfine tuneしたものをfundation model(基盤モデル)とし、工夫を重ねています。
Leaderboard上位チームの手法の紹介
それでは振り返りレポート[9]の順位をもとに、上位の手法から見ていきましょう。
各チームの動画はこちらでご覧になれます。[9]
1位. Goupチーム
論文等は出ていないので、サブミッションコード[4]を参考に紐解いて行く形になります。
手法:
おおまかにまとめると、YOLOv5[5]でのdetectionや平地か否かを判定するmobilenetv2等、使える機械学習を際限なく使って有限オートマトン(FSM)で事前に定義されたmacro actionのスクリプトを実行していきます。
各タスク:
①Find cave :
前述のVPTをBasaltのFind Caveタスクのデータでfine tuningしたモデルを、ランダム探索時のaction生成に使います。
YOLOv5のクラスは”cave”と”hole”の2クラスで、データセット自体は自前でアノテーションしています。
試しに、学習したYOLOv5モデルを可視化してみます。
かなり遠くからでも洞窟を検出できるようですね。
Transitionsライブラリでプロットした状態遷移図は以下のようになります。
状態find_cave_and_rotateでは、計算ベースでcaveが真ん中に来るまで8°ずつ回転します。
状態go to caveにおけるpredefined actionsにより、位置計算:行動を行います。
・caveが画面の上半分に位置する場合は:jump x 2 + forward x 2
・画面中心に位置する際は:forward x 4
・画面下部の場合は:forward x 2
GoUp TeamのFind Caveタスクのスコアは2位と、一番高いわけではありません。
②animal pen
同じくAnimal Penのデータでfine tuneされたVPTモデルを、random探索時のaction生成に使います。
オートマトンの初期状態はPRE_RANDOM_COLLECTから始まり、woodを採掘する場所を探し当てたら次の状態へ遷移します。
is_plane_space:画面中心の領域に対しcanny edge検出をし、平地だと判断(edge countが一定範囲に該当)したら、RANDOM_COLLECTへと状態遷移します。
collect_itemの動作をattack x 30、forward x 10とし、template画像ベースでwoodを採掘していると判断したらRANDOM_WALKへ遷移します。
VPT foundation modelで走行しつつ、YOLOv5で動物をdetectし続けます。このタスクでのクラス数は['cow', 'duck', 'flower', 'people', 'pig', 'rabbit', 'sheep']の7つになります。
動物が検出できた時点でPURSUE状態へ遷移し、is_pursue:カウントが一番多い動物が'people'ではないことを確認した上で動物に接近します。
wait : 40フレーム動物の接近を待ち、後退しつつ反転
動物がrabbitだった場合は、別対応を行います。
柵の作成と動物を入れるactionはハードコーディングしています。
タスクwaterfallと Build houseについては割愛します。
2位. UniTeam[5]
UniTeamの手法は、一言でいうと、検索ベースで学習データから一番似たシチュエーションを検索し同じ行動を取るという手法です。
仮説は以下のように簡単なものです。
・似た状況では同じアクションを取る
・状況は潜在変数の距離空間で表現できる
・潜在変数の距離空間では、状況同士の距離が数値として計算できる
検索はVPTのembeddingのレベルで行われ、IMPARA CNN[7]モジュールと時系列モジュールを通過した後のcls tokenの出力をVPT embedding としています。
IMPARA CNNは、時系列のtime stepをbatch dimとすることでLSTMの計算効率を上げた手法です。
現在のシチュエーションがVPT embeddingレベルで、 学習データと乖離しない限り教師データと同じactionに沿ってプレイします。
また、同じTrajectoryをコピーしすぎないよう、以下の条件を満たすと新しい検索が開始されます:
・L1距離が閾値を超えた時
・同じtrajectoryを128 steps以上followした時
サンプリングするデータにダイバージェンスを与えることで、actionが実行できずスタックする局面、壁などに塞がれた場合などからの離脱を可能にします。
MineRLBasaltFindCave-v0の165G、5466個のvideosをVPT embeddingでnpy保存した場合、トータルサイズは585MB程となります。
L1計算は、全てのlatentsからcurrent embeddingを差し引いて、absが一番小さいindexを返す計算となっています。
UniTeamのスコアが一番高かったFindCaveの動画を載せておきます。
BuildVillageHouse :
3位. voggiteチーム
Behavior Cloneing Baselineを改良するアプローチで、事前に全てのVPT state embeddingを計算、保存しておき、その上に軽量のモデルを構築してイテレーションを速くしました。 建物の建造に着手したら移動の頻度を下げるなど、ヒューリスティックなルールも付け加えています。
以上がランキングの上位3チームですが、Basalt Competitionでは別途リサーチ優秀賞が設けられています。以下に概要のみ記述します。
リサーチ優秀賞 KABasalt チーム
報酬関数をモデリングする手法を用いました。このチームにおける最も大きな貢献は、インターフェースを統一し、Stable Baselines3[10]とImitation Library[11]からVPT backboneを呼び出せるようにしたことです。
リサーチ優秀賞 KAIROSチーム
敵対的学習を取るGAIL[12]などは、GAN同様に二つの要素間の均衡点を探す学習方法を取るため、色々な問題がありました[14]。
それに対して、Q関数が決まれば最適な方策(Policy)だけでなく報酬関数(reward function)も一意に決めれると仮定したのがIQ-Learnで、目的関数がQ関数のみに関わるため、均衡点探しによる学習の不安定を回避できたアルゴリズムです。
そのIQ-Learnをベースに新たなCritic lossを設計することで、人の好み(Human Preference)を取り込んで学習できるPIQL(Preference-Based IQ-Learning)を提唱したのが、本チームの手法のようです。
BC baselineとの比較
以上、Leaderboard上位手法の紹介と、リサーチ優秀賞の概要でした。改めてLeaderboardを見てみると、人間オペレーターに勝る手法はなく、3位以降はBC-Baselineに対しての向上も微微だったと感じました。
Voyager
近年ChatGPTが賑わいを見せているため、このブログではLLMを通じてマインクラフトの世界を自動で探索してくれるエージェント、Voyagerを紹介しようと思います。
Voyagerは主に3つの部分から構成されています。
①自動カリキュラム:次のタスクを提示してくれるエージェント
プロンプトは「貴方は有能なアシスタントです。MineCraftにおける次のタスクを私に提示してくれます...」から始まり、Inventoryと周囲オブジェクトの情報も渡して、LLM(gpt-3.5-turbo)に次のタスクを提示してもらう、またはPython listでタスクの小分けを返すよう要求できます。
task 分解例:
task : "Craft a diamond pickaxe"
****Curriculum Agent task decomposition****
["Mine 3 diamond", "Craft 1 wooden pickaxe", "Mine 3 cobblestone", "Craft 1 stone pickaxe", "Mine 3 iron ore", "Smelt 3 iron ore", "Craft 1 iron pickaxe", "Craft 2 sticks", "Craft 1 diamond pickaxe"]
②スキルライブラリ
GPT4のコード生成機能を利用して、再利用可能なmineflayer[8]のJavaScriptコードを生成します。タスクに関する記述をgpt-embeddingとして検索できるようにし、再利用可能にしています。
③反復プロンプト
更には②で生成されたコード実行後、実際にInventoryが増えたかどうかの環境フィードバックや実行エラーなどをもう一つのGPT agentに成功かを判断させ、反復的に改良して行きます。最後にタスクを成功させたスクリプトのみスキルとして保存します。
Voyagerは一番最初にLLMを活用したlifelong learningのagentで、Voyagerにおけるlifelong learningとは、勾配ベースでweightを学習するのではなく、skill libraryに生成されたJsコードを蓄積することでした。
更にVoyagerでは以下のAIエージェントと比較しています。
Baseline agent :
・ReaCT
・Reflexion
・AutoGPT
探索範囲はこれらに比べ2.3倍、ユニークアイテム数は3.3倍
更に15.3倍早い探索時間も実現しています。
以上、MineCraft Basalt Competitionの解法及びVoyagerの紹介でした。
APPENDIX :
Trueskill[3]:
XboxのゲームHaloで使われたランキング手法で、meanとstdでプレイヤーをランク付けるアルゴリズム。
引用:
[1] https://minerl.io/basalt/
[2] Stephanie et. Towards Solving Fuzzy Tasks with Human Feedback: A Retrospective of the MineRL BASALT 2022 Competition, 2023
https://arxiv.org/abs/2303.13512
[3] https://ja.wikipedia.org/wiki/TrueSkill
[4] https://github.com/gomiss/neurips-2022-minerl-basalt-competition
[5] F. Malato et al. Behavioral cloning via search in video pretraining latent space.
https://arxiv.org/abs/2212.13326
[6] Video PreTraining (VPT): Learning to Act by Watching Unlabeled Online Videos
https://arxiv.org/abs/2206.11795
[7] IMPALA: Scalable Distributed Deep-RL with Importance Weighted Actor-Learner Architectures
https://arxiv.org/abs/1802.01561
[8] https://github.com/PrismarineJS/mineflayer
[9] Stephanie Milani et al. Towards Solving Fuzzy Tasks with Human Feedback: A Retrospective of the MineRL BASALT 2022 Competition
link : https://arxiv.org/abs/2303.13512
[10] A. Raffin et al. Stable-baselines3: Reliable reinforcement learning implementations. JMLR, 22(268), 2021
[11] https://github.com/HumanCompatibleAI/imitation
[12] Jonathan Ho, Generative Adversarial Imitation Learning, 2016
https://arxiv.org/abs/1606.03476
[13] Divyansh Garg, IQ-Learn: Inverse soft-Q Learning for Imitation, 2022
https://arxiv.org/abs/2106.12142
[14] https://ai.stanford.edu/blog/learning-to-imitate/
[15] Guanzhi Wang et al. Voyager: An Open-Ended Embodied Agent with Large Language Models
https://arxiv.org/abs/2305.16291