Magic: The GatheringのドラフトでMistral 7Bをファインチューニングする実験
(substack.com/generallyintelligent)- Magic: The Gatheringのドラフトでのカード選択を課題に、LLMの学習コーパスに含まれていない可能性がある最新カード環境で、ファインチューニングが推論性能をどれほど引き上げるかを実験
- 17landsのドラフト記録をプロンプトに変換し、勝率の高いプレイヤーの選択を正解シグナルとして、モデルが現在のパックと既存のカードプールを見てカードを選ぶようにした
- ファインチューニングされた7Bパラメータモデルはこの課題でGPT-4を明確に上回り、人間または実験者レベルに近い性能を示した。fine-tuned GPT-3.5ならさらに良い可能性はあるが、コスト負担がはるかに大きい
- データ形式とプロンプト形式は長い学習ループのため素早く検証しにくく、約40時間の実験後も最適なプロンプト形式への確信は残らなかった
- 実務的には、まず評価セットを作り、学習スクリプトを自作するよりaxolotlのようなツールを使う方がよい。小規模なOSS LLMでもGPUメモリとストレージの面では侮れない
実験課題: Magicドラフト
- 実験では、LLMが分布外データでどの程度推論できるかを見るために、Magic: The Gatheringのドラフトを使用した
- Magic: The Gatheringはクリーチャーや呪文カードで相手と戦う戦略トレーディングカードゲームで、ドラフトはランダムなカードの束から順番にカードを選び、デッキを作る方式である
- ドラフトは2つの点で実験に適していた
- 推論: これまでに選んだカードと現在のパックのカードをあわせて理解しなければ、良い選択ができない
- 分布外データ: 新しいMagicのカードは年4〜6回リリースされ、最新カードはLLMの学習コーパスに含まれていない可能性がある
- データには17landsのドラフト追跡記録を使用した
- 17landsはデジタル版Magicクライアントのドラフトデータを追跡するサービスである
- 勝率基準で上位のプレイヤーの選択を見て、「正解」に近いシグナルを作れる
- Magicプレイヤーの間でも正しい選択について議論は多く、このシグナルは完全に明確ではないが、新しい課題を学習しているかをテストするには十分である
データセット構成とプロンプト形式
- 17landsのドラフトデータは、おおよそ次の情報を含む大きなCSVファイルである
- 現在のパックで選択可能なカード
- ドラフターがこれまでに選んだカード
- そのパックで実際に選んだカード
- 言語モデルのファインチューニングに合わせるため、このデータをテキスト会話形式に変換した
- systemメッセージでは、モデルを「DraftGPT」として設定し、ドラフトピックを求められたらカード名を先に答えるよう指示する
- userメッセージには、現在のパック番号とピック番号、これまでのカードプール、直近5パックで見た色別のカード数、現在のパックのカード説明を含める
- assistantメッセージは、選択したカード名だけを出力する
- データ変換の例は、17landsデータをLLMプロンプトに変換した例とChatML形式の完全なドラフトプロンプトとして提供されている
- 最も難しかったのは、望む結果が出るようにデータをフォーマットする作業だった
- ファインチューニングでは、プロンプト変更を試すには通常、数時間かかる学習ジョブを走らせる必要がある
- そのため、一般的なプロンプトエンジニアリングより実験ループが100倍遅いレベルに感じられる
- 実験した項目は、約5種類のプロンプト形式、カードごとの詳細情報量、直近何ピック分の文脈を追加するか、新カード情報を覚えさせる「カード常識」学習行を含めるか、などだった
- 約40時間の実験後も、この課題に最も適したプロンプト形式が何かは確定できなかった
ファインチューニング実行環境
- GPUはRunpodで時間単位でレンタルした
- 使用したGPUはRTX 4090、VRAM 24GBモデルである
- コストは約**$0.7/時間**
- 当初はHuggingFace transformersとPEFTで学習スクリプトを自作しようとし、限られたGPU環境のためQLoRAを選んだ
- スクリプトを自作する方法は試行錯誤が多かった
- FlashAttentionのように知っていれば簡単な最適化から、LoRAパラメータのように論文を読まないと理解しにくい選択肢まで多かった
- 1つずつ解決することはできるが、自分で把握するには時間がかなりかかる
- 最終的にaxolotlを使用した
- 複数の最適化をデフォルトで実装しており、より簡単に実行できた
- ドキュメントも悪くなく、LLMのファインチューニングを始める大半の人にとって適切な出発点だと評価される
モデルサイズとコスト
- 「小さい」OSS LLMでも、過去の基準では非常に大きい
- 2019年ごろによく学習されていたBERTは約1億1000万パラメータだった
- 7Bモデルはそれより約70倍大きい
- 7Bモデルは実運用の面でも負担が大きい
- 重みが約16GBあるため、ストレージが問題になる
- QLoRAのような手法を使っても、GPUメモリは依然として難しい
- GPT-3.5のファインチューニングは、より良い結果を出せる可能性があるように見えたが、コストが大きかった
- Mistralをベアメタルでファインチューニングするより約100倍高い
- 推論にもプレミアム価格がかかる
- Mistral-7Bで最大規模だった学習実行と同程度のGPT-3.5ファインチューニングは、約**$500**かかったはずだと計算された
評価方法と結果
- 実験前に良い評価セットを先に作ることが重要である
- この課題では、学習データから一部のドラフト全体をホールドアウトし、モデルが人間と同じカードを選ぶかを確認した
- 評価セットがあったため、ファインチューニング結果を判断しやすかった
- カード選択の正解率は比較的定義しやすかったが、次の基準はより曖昧だった
- モデルが別の選択をする場合、その選択が正当化可能である必要がある
- モデルがなぜそのカードを選んだのかを合理的に説明できるとよい
- 曖昧な基準は、複数の例を直接確認する目視評価で確かめたが、この過程は遅かった
- GPT-4はファインチューニングされた小型モデルよりも奇妙な選択が少なく、選択を正当化する能力も高かった
- ファインチューニングされた7Bモデルは、このカード選択課題で、GPT-4とインコンテキスト学習を正解率とコストの面で容易に上回った
- ある実験では、1つのカードセットでモデルをファインチューニングした後、未見のカードセットで評価した
- モデルは単に良いカードを暗記したのではなく、ドラフトの概念をある程度一般化しているように見えた
Magic Copilotとドラフトボット
- ファインチューニングされたドラフトピックモデルをMagic Arenaのログに接続し、簡易なElectronアプリとして「Magic Copilot」を作成して、数回のドラフトに使用した
- カード選択はファインチューニングモデルが生成し、解説はGPT-4が担当した
- ほとんどはうまく動作したが、ときどきGPT-4がファインチューニングモデルの選択に同意せず、すぐに反論することがあった
- 8つのドラフトAIを接続し、ボット同士のシミュレーションドラフトも実施した
- ボット同士だけでカードを回す場合は、単色デッキを選ぶ傾向が強かった
- 人間が別の選択を混ぜると、はるかに通常に近い形のデッキへ収束する傾向があった
- 全体として、このドラフトAIは現在存在するものの中でも、より強力で人間らしいドラフトAIに近いように見えた
- Magic Arenaのquick draftボットと比較すると、ヒューリスティックなボットよりも高品質な人間ドラフターに近い選択をする
1件のコメント
Hacker News のコメント
この記事は、概念的には単純に見えるアイデアでも LLM のファインチューニングで実装するのがどれほど難しいかをよく示していてよかった
かなり良い初期データセットと出発点となるモデルがあっても、簡単な課題ではなかったようだ。こうしたモデルは、自然で確定的な正解がない作業に向いているように見える。たとえば、与えられた選択肢の中から完璧なカードを選ぶのは組合せ的に解くのが難しいだろうが、良いカードを選ぶことは可能で、LLM も人間レベルの性能に近づける。現在の LLM をファインチューニングして解ける問題群が、ここに表れている気がする
たとえば今月は、友人や子どもたちへのプレゼント探しを手伝ってもらっている。問題を解くのに最高の選択が必要なわけではなく、良い選択で十分だからだ
日常にとって最も革命的な変化ではないだろうが、Magic: The Gathering のようなゲームで、興味深いプレイスタイルを持つボット対戦相手が登場するのを本当に楽しみにしている
研究開発チームが、さまざまなプレイレベルで新しいメカニクスを作成・テストする能力を大きく改善できる明確な事例に見える
「そのデータからサービス内のトッププレイヤーたちが行ったドラフトピックを見て正解を抽出する」という部分は、https://www.17lands.com/leaderboard のドラフトピックを見て勝率で並べたという意味なのか?
本来は Match Wins や Trophies を選ぶべきではないかと思う。そうでないと、サービス内の最高プレイヤーを測っているのではなく、大半の選択が非常に良かったドラフト、つまり運の良かったプレイヤーを学習することになる。検証やテストにもその影響がそのまま出るはずだ。
LLM のベースラインではなく、17lands のデータからカードごとに他のカードに対する「Elo」式のスコアを計算したベースラインと比較すべきではないかと思う。2色が決まる前はスコアが最も高いカードを推奨し、色が決まった後はその色の中、または土地の中でスコアが最も高いカードを推奨する、という形だ。
LLM がルール知識をある程度持つことは可能だろうが、初見のカードではカードのレアリティ、コスト、「大きい」といったシグナルをより多く拾っているように見える。ドラフトの「正確度」も低く見えるし、それが意図した意味なのかよく分からない。高勝率の選択のように、どれもおおむね良い選択である状況で、元データのプレイヤーと違う選択をしたという意味なら、むしろ良い選択肢の中から選ぶ方が難しそうだ
基準はダイヤモンド以上。ただし、そのプレイヤーたちのドラフトは、成績が悪かったものも含めてすべて見ている。
ここでの正確度は、与えられたパックで優れたプレイヤーの一人と同じ選択をしたかどうかを意味する。当然主観的なので完璧な指標ではないが、高レベルのドラフターを模倣する能力を見る用途には悪くない
プロンプトの損失を 0 にする代わりに、Axolotl で重み付き損失も試したのか気になる
以前 Microsoft の GPT-3 文書では、応答が短い場合、ここでの「Cut in.」のようなケースではこの方式が有利だとしていたように思う。ファインチューニング前に subreddit やフォーラムでドメイン適応を行うのも役立つかもしれない
ドメイン適応も考えていたし、ドラフトの YouTube 動画を文字起こしすることもあわせて検討中だ。どれくらい役立つのか、かなり気になっている
著者の文章を正しく読めているなら、各選択時点でエージェントに与えるプロンプトには、これまでのカードプールについてはカード名だけが入り、渡されたパックのカードだけ全文テキストが入るように見える
おそらくコンテキストウィンドウのサイズのせいで、選択間の文脈が維持されていないのだろう。
そうで、このセット群がボットの学習カットオフ後のものだという前提が正しいなら、優れたドラフターになるのは純粋に偶然ではないか? ボットには、以前のピックとどのカードが相性が良いのか、ここまでどんなシグナルを送り、受け取ってきたのかなどを知る方法が文字通りない。最高の人間プレイヤーでも、例のプロンプトにある「Gadwick's First Duel -- {1}{U} (uncommon)」だけを見て、そのカードを見たことがなければ何と相性が良いのか分からない。
結局、以前のピックと色が重なる、一般的に良いドラフトカードを選ぶことになるだろうが、それは既存のピック順ベースのヒューリスティックがずっとやってきたことだ
モデルはカードクイズ補完データでも学習されており、ここではカードの全文テキスト、タイプ、CMC などの情報を補完させている。また、パック内のカードについても次トークン補完を学習する必要があるため、ドラフトピックを作る間にカードの全文テキストを予測する方法も学ぶ。総合すると、ボットは新カードのテキストをかなり包括的に身につける
見ていないなら https://news.ycombinator.com/item?id=38525978 も、この読者層には興味深いかもしれない
「I hacked Magic the Gathering: Arena for a 100% win rate」という記事で、調査者が MTGA の擬似 AI である Sparky は、外から疑われていたほど愚かで複雑ではないようだと発見した点だけでも読む価値がある
初めてゲームに触れ、ルールも知らない新規プレイヤーに間抜けなコンピュータと遊んでみる体験を与えるもの、あるいは作ったデッキがどう引けてどうコンボになるか確認するために「金魚相手にプレイ」することのコンピュータ版に近い。チェス CPU のようなものではない
ドラフトを LLMで表現できるという点がとても興味深い
私が見た中で最高性能のドラフトAIは、何らかの形で表現学習を活用していた。参考: https://arxiv.org/pdf/2107.04438.pdf
「表現学習」と言ったのが別の意味なら、私の誤解かもしれない
それでもLLM表現には面白い点がある。たとえばシステムプロンプトでボットに 好みや性格を与えられるので、かなり楽しい
各カードを1つの トークンとして扱い、ドラフト状態を入力として与え、予測トークンが選ぶカードになるようにすれば、より小さいモデルを使えたり、より良い結果が得られたりするのか気になる
カスタムトークナイザーで最初から学習する必要があるはず
<|post_author|>username<|post_title|>title here...だった結果のモデルは、すべて通常のテキストとしてフォーマットした場合よりはるかに悪かった。MPT-30B、特殊トークン15個、学習トークン3億個、フルファインチューニングという条件だった。
私がミスした可能性もあるが、オープンソースのファインチューニングで多数のトークン追加に成功した例も、まだ見たことがない
「一度も見たことのないカード」には機能しないだろうし、間違えるときはあり得ない選択をする可能性があるが、精度90%までは行けそうだと思う
Mistralを出発点にせず、ドラフト用ニューラルネットワークを学習する場合と比べると面白そうだ。エポック基準とコスト基準の両方で見てみたい
なぜLLM要素が関係するのかは明確ではない。インターネット上にデッキリストや模擬ドラフトが十分多くあり、それが影響したのかもしれないし、あるいは「LLMファインチューニング」側のインフラが「ニューラルネットワークを作る」より整っているからかもしれない。これを簡単にしてくれる nnfiddle のようなものが必要なのかもしれない
ファインチューニングは比較的安価で、データを流し込むだけでこの種のタスクをかなりまともに実行できるようにできる。基盤チェックポイントを作るには大量の計算が必要だが、その中に大半の「知識」が入っている。
ゼロからニューラルネットワークを作るなら、まずカードを入力としてどうマッピングするかから解決しなければならない。MTGには詳しくないが、ほとんどのトレーディングカードゲームにはテキスト説明と複雑な効果がある。テキストをロジックにマッピングするのはLLMが本当に得意なことで、そうでなければゼロから始め、まともな振る舞いが出るまで比較的多くの計算も必要になる。
ほとんどのソフトウェア開発者にとっても、こちらのほうが簡単だ。ファインチューニングはたいてい、テキストを集めてファインチューニングスクリプトに入れる作業で済む。線形代数や「畳み込み」が何かを知らなくてもできる
「Mistralなしでドラフト用ニューラルネットワークを学習する」というのは、入力層をパック内カードのビットマップベクトルにするという意味だと仮定している。この実験の核心的な機能は、モデルが一度も見たことがなく学習データがゼロのセットでも、カードテキストだけで動作する点だ。LLMなしではそれは難しいと思う
この記事はとても良かった。実は今週、Magic: The Gathering向けのLLMファインチューニングを調べていたところだった
カードの 意味埋め込みで、機能的にも雰囲気的にも似たカードを探せる小さなカード類似度ブラウザーを作っている。
今はInstructorXLだけを使っているが、Instructorにゲームについての先天的知識が不足しているのか、それともプロンプトをもっと良くするべきなのか分からない。これまで9つのプロンプトを試したが、埋め込み生成の性能はあまり良くなさそうだった: https://github.com/HanClinto/MtgMatrix/blob/main/data/create...
次の段階は似たカードのデータセットをダウンロードすることで、これを使って大きな埋め込みモデルに三つ組損失学習のようなことができるか見ようとしていた。まだ実際にどうつなげるかは分かっていないが、この記事にはとても刺激を受けた