ポケモン対戦AIを作りたい!
こんにちは、なおまると申します。
ポケモンとテクノロジーを掛け合わせておもしろいことができないかを日々考えています。
かねてよりポケモン対戦AIを作りたいと考えており、活動記録を残す意味でも現状を記事に書き起こそうと思います。
対戦AIについて
2017年にAlphaGoが囲碁世界王者を倒したニュースを見たときのワクワク感を今でも覚えています。手数の分岐が将棋より圧倒的に多い囲碁では、AIが人間に勝つには時間がかかると言われていましたが、思えばあの頃からディープラーニングによるAIブームが来ていました。
個人的には競技としてのポケモン対戦は将棋や囲碁にかなり近いと思っています。正確には駒に細工をできる将棋のような理解をしています。例えば、私の銀は斜め後ろには進めないが、横に進める等のように、私のハバタクカミはCSベースこだわり眼鏡、誰かのハバタクカミはHBベース甘える痛み分けと、同じポケモンでも育て方によって全く異なる駒になります。
ポケモン対戦は端的に言うと選択肢が10個(技選択4×テラスタル考慮2+交代2)と意外とシンプルです。しかしながら、ゲームの不完全情報性だったり、上述したポケモンの型の匿名性というところが、対戦AIの構築を難しくさせているのかなあとほんやり考えています。
さて、対戦AIについては、やはりニューラルネットワークを用いて構築することが必要と考えました。ポケモン対戦AIについては論文もあったり色んな方々が研究しているので、興味のある方はぜひ見てみてください。
データ集め
ニューラルネットワークの学習には大量の学習データが必要になります。ポケモン対戦は将棋や囲碁と違って正式な棋譜というのが残されていません。そこで今回はPokemon ShowdownのReplayという対戦ログを活用することを考えました。
Pokemon Showdownとは、Smogonという世界最大のポケモンコミュニティが運営している、Webブラウザでポケモン対戦ができるサイトです。ポケモンの育成が不要であり、常に数万人のアクティブユーザ、数千のアクティブな対戦が行われているため、海外ではかなり広く利用されています。
Pokemon ShowdownではVGCルールやシングル6vs6が主流であり、Regulation Dのシングル3vs3の対戦は少ないものの、7/22時点でも既に1500程度の対戦ログが公開されています。余談ですが、一時期対戦データ集めのためにくろこさんのメンバーシップに登録し、生放送のアーカイブから対戦ログを書き起こすことをしていました。(あまりに非効率なため挫折しました)
実際のPokemon Showdown Replayの対戦ログの例は以下のような見た目です。
これを後述するニューラルネットワーク学習データのフォーマットにパースする必要があります。Showdown ReplayについてはWeb APIが公開されており、Pythonプログラムによって条件をつけて機械的に取得することが可能になっています。
AIにどのように学習させるか?
ニューラルネットワークで肝になるのがインプットとアウトプットです。機械学習はインプットとアウトプットの相関モデルをプログラムに考えてもらうものだと思っています。学習のためにはある程度合理的なインプットとアウトプットを人間で定義する必要があります。
将棋や囲碁と同じく、ポケモン対戦AIでのインプットを対戦の戦況、アウトプットを行動選択と定義しました。具体的には以下になります。
<インプット>
- 自分/相手の対戦ポケモンの図鑑番号
- 自分/相手の対戦ポケモンのタイプ
- 自分/相手の対戦ポケモンの残りHP
- 自分/相手の対戦ポケモンの種族値(ランク補正込み)
- 自分/相手の対戦ポケモンの状態異常
- 自分/相手のベンチポケモンの図鑑番号
- 自分/相手のベンチポケモンのタイプ
- 自分/相手のベンチポケモンの残りHP
- リフレクター/ひかりの壁の有無
- テラスタル権の有無
- 天候
- フィールド
- トリックルームの有無
<アウトプット>
- 対面のポケモンに効果抜群の攻撃
- 対面のポケモンに効果普通の攻撃
- 対面のポケモンに効果いまひとつ以下の攻撃
- 対面操作攻撃
- 先制攻撃
- 積み技
- 回復技
- 積み技、回復技以外の変化技
- ベンチポケモン1への交代
- ベンチポケモン2への交代
※1~8はテラスタルあり/なし
課題がいくつかあります。
インプットについて、対戦ログからはアイテムが不明となっています。自分のアイテムは行動選択に大いに影響する要素と思われますが、泣く泣く含めることができていません。
アウトプットについて、上述したとおりポケモン対戦の行動選択はテラスタル含めても10通りと意外とシンプルです。しかしながら、大量の対戦ログの中ではそれぞれポケモンの採用技も違えば技配置も違います。そのためアウトプットにはかなり苦慮しています。現状上記のような18通りとしていますが、今後も試行錯誤を続けます。
学習状況
ニューラルネットワークのハイパーパラメータ(中間層の数、要素数、バッチサイズ、ドロップアウト、エポック数等)はよしなに設定しています。
学習が進むにつれて、訓練データに対する正答率は上がっているものの、検証データ(未知のデータ)に対する正答率は上がっておらず、頭を悩ませているのがいまいまの状況です。
今後の課題
- インプット/アウトプットを見直す
- ハイパーパラメータのチューニング