ポケモン対戦エージェントを改良してみた
note初投稿になります。
今回は、2月に発表されたポケモン対戦エージェントの論文を勝手に改良していきたいと思います。
「PokéLLMon」とは、ポケモンバトルにおいてLLM(大規模言語モデル)を利用して人間と同等のパフォーマンスを達成したAIエージェントです。
PokéLLMonについて簡単な説明はしますが、技術的な詳細や対戦ルールなどについては記載していないので気になった方は元の論文または、その他の記事などを参照してください。
本記事ではそのPokéLLMonに改良を加えて、PokéLLMonの弱点の克服したり、さらなる勝率の向上を目指してみます。
PokéLLMonとは
Abstruct
これだけではイメージしにくいと思うので3つの戦略を中心にもう少しだけ説明します。
1分で分かる説明
PokeLLMonはLLMを用いてポケモンバトルを行うAIエージェントであり、人間と同等のパフォーマンスを示しています。
その設計には以下の3つの重要な戦略が組み込まれています。
In-context reinforcement learning(ICRG)
LLMは言語を理解してそこから良し悪しを判別することができます。それを利用して、従来の強化学習とは違うテキストベースのフィードバックという新しい報酬を使います。
このフィードバックは常に過去のターンから提供され続けているため、誤った行動を選択し続けるということがなくなります。
Knowledge-augmented generation(KAG)
LLMによるテキスト生成に外部知識を統合する技術です。外部知識ベースから関連情報を取得してテキスト生成に利用できます。これにより正確性の高い高度な回答の生成ができます。
上記のICRLで対応できない致命的なミスをしてしまう可能性を減らせます。
Consistent action generation(CAG)
複数の独立した出力を生成し、その中で多数決を行い答えを選択します。LLMの出力のばらつきによる影響を最小限に抑えることができ、出力の安全性、信頼性を向上させます。
エージェントが強力なポケモンと対峙したときにポケモン交換を繰り返してしまう現象(パニックスイッチ)を減らせます。
上記の3つの戦略を取り入れることによってPokeLLMonはBot相手に60%、ランク対戦49%、招待したポケモン経験者相手に56%という優れた成績を示すことができました。
問題点
PokeLLMonは論文内で複数の問題点が指摘されています。
1つ目は長期的な戦略に対応することができないということです。
PokeLLMonは短期的な利益を優先する傾向にあり、長期的な努力を必要とする人間プレイヤーの消耗戦に対してとても弱くなっています。
(消耗戦は自己回復技などを用いて能力値を上昇させ続ける戦術のこと)
消耗戦に対する勝率は19%となりそれ以外の戦いとの差が顕著です。
2つ目は、経験豊富なプレイヤーには次の行動を予想されることがあることです。それにより交換がリスクなしで簡単にされてしまう恐れがあります。
これらの問題を解決するために2種類の改善を行ってみました。
改善していく
既存手法での実験
実際に環境構築をし、GPT-4-TurboとGPT-4oを用いてBot対戦実行してみました。
結果はGPT-4-Turboは勝率56%、平均スコア(自身の残存ポケモン+撃破したポケモン)は6.86、平均ターン数は17.81となりました。
GPT-4oは勝率46.6%、平均スコアは6.11、平均ターン数は19.69でした。
エージェントが強力なポケモンと対峙したときにポケモン交換を繰り返してしまう現象(パニックスイッチ)がみられたため、こちらについてもさらなる改善を目指していきます。
また、これ以降の実験は4oを用いて行っていきます。
元の実験では、大きく分けてSystemプロンプトとUserプロンプトという2つのプロンプトを組み合わせて利用していました。
Systemプロンプト:バトルの基本知識や戦術
実際の文章はこんな感じ
system_prompt = (
"You are a pokemon battler that targets to win the pokemon battle. You can choose to take a move or switch in another pokemon. Here are some battle tips:"
" Use status-boosting moves like swordsdance, calmmind, dragondance, nastyplot strategically. The boosting will be reset when pokemon switch out."
" Set traps like stickyweb, spikes, toxicspikes, stealthrock strategically."
" When face to a opponent is boosting or has already boosted its attack/special attack/speed, knock it out as soon as possible, even sacrificing your pokemon."
" if choose to switch, you forfeit to take a move this turn and the opposing pokemon will definitely move first. Therefore, you should pay attention to speed, type-resistance and defense of your switch-in pokemon to bear the damage from the opposing pokemon."
" And If the switch-in pokemon has a slower speed then the opposing pokemon, the opposing pokemon will move twice continuously."
)
色々と改善の余地がありそうですね…
Userプロンプト:ICRLとKAGからのデータ、出力に関する指示
Systemプロンプトは基本的に固定でUserプロンプトのみ対戦状況によって変更されていきます。
src/player/gpt_player.pyに記載がされているので気になる人は見てみてください。
改善案1
従来の手法では、交換をするときの判断に問題がありました。具体的には
体力の少ない味方ポケモンを生かすために無理矢理交換する
交換を連続して行う
といった2つの問題が発生していました。これらから、交換をする際に次のターンにどのような被害を受けるのか十分に考慮することができていないのではないかという考えに至りました。
そこで、交代時には次のターンに受けるダメージ、攻撃時には与えるダメージと受けるダメージについて考慮してからそれぞれの行動を選択するようにUserプロンプト内で促してみました。
結果1
実験の結果は勝率61%、スコア6.77、平均ターン19.25となりました。
既存手法と比べ14%以上の勝率の向上がみられ、スコアの向上、平均ターン数の減少がみられました。
プロンプトを少し追加するだけで結構変わりましたね。狙い通りに、交換する際の判断ミスが減らせたことが優れた結果につながったと思います。
改善案2
改善案2では、相手がどのような行動をとってくるのか事前に予想してから自身の選択を考えるという2段階推定を導入してみました。
人間が戦うときには相手が何をしてくるのか予測してから行動をとっています。そんな人間らしさを取り入れることで、よりエージェントが自身の行動について深く考慮できると考えました。
画像にするとこんな感じです(上:既存手法、下:改善案2)
既存手法では一度にかなり長めのプロンプトを使っていたので十分な推論ができていなかったのかも?そこについても解決できるはず。
結果2
実験の結果は勝率72%、スコア7.41、平均ターン21.34となりました。
既存手法と比べ25%以上の勝率の向上がみられ、スコアの向上、平均ターン数の増加がみられました。
ターン数が増えた要因としては相手の技を予測したことにより交換を含めた様々な選択肢をとることができるようになったということが考えられます。
一度に推論しなければならない要素が減ったことと、どのような技を出してくるか推論するプロセスを与えて明確に未来の行動について推論できるようになったことがこの結果につながったのではないでしょうか。
まとめ
改善案1と2どちらでも既存手法でのGPT-4oの勝率を上回ることができました。また、改善案2では元の論文の64%をも超える結果となりました。機会があれば改善案1と2の組み合わせも試してみます。
プロンプトエンジニアリングはLLMを利用する上でとても重要となってきますね。
今回はBot対戦のみだったのでそのうち人間との対戦も試してどの程度人間相手に戦えるのかも追記していきたいと思います!
見ていただいてありがとうございました。
この記事が気に入ったらサポートをしてみませんか?