SNKが6月27日に発売予定の格闘ゲーム『サムライスピリッツ』。初代『サムライスピリッツ』のリメイクであり、既に「EVO 2019」のメイントーナメント種目に選出されているなど、格闘ゲームとして期待が寄せられる作品だ。新生『サムライスピリッツ』には、格闘ゲームとしての基本的なシステム以外に、「道場モード」と呼ばれるAIとの対戦システムが実装されているという。

公式サイトによれば、AIがプレイヤーの行動パターンを学習し、分身が自動生成される。特許も出願されているようであるが、この「道場モード」の仕組みはどのようなものなのか。大阪インターナショナルコンベンションセンターにて3月30日に行われたゲームクリエイターズカンファレンス’19では「道場モード」の開発を担当したSNKの泊久信氏が登壇し、どのように格闘ゲーム上へニューラルネットワークを用いたAIが実装されたのか、その過程や苦労について語った。

 

規模を調整し機械学習を導入

最近になりAIはますます浸透してきており、画像認識や翻訳を代表例に、AIを活用した便利な機能が多数登場している。これは計算機の処理速度向上や、ニューラルネットを最適化する技術によって実現されたものだ。泊氏によると、実は1980年代にもAIが大いに流行し、その後数年で下火になったそうだ。そうした変遷を踏まえ、今あらためてAIが浸透しつつある現状を受けて泊氏は「機械学習の動作を体感できたら楽しい」と考え、「ニューラルネットをゲーム本体に、機械学習をおもちゃとしてゲームに組み込みたかった」のだという。

そのためには、ゲームの中でリアルタイムに学習する仕組みを、ゲーム機の上で実現する必要がある。既存のゲームにも機械学習をテーマにしてものが存在し、例えば『Dota 2』の「OpenAI FIVE」では、12万8000個のCPUコアと256個のGPUを使用し、1日かけて180年分のプレイ経歴を集めて非常に高いレベルのものが実現されている。しかしこれはあまりに大掛かりで、泊氏が目指しているものとは方向性が大きく異なり、あまり参考にならなかったそうだ。そこで氏は、プロジェクトとゲームの規模にあわせた機械学習の導入を試みた。

今回機械学習が実装されるのは、1993年に発売された『サムライスピリッツ』のリメイク版。対戦格闘ゲームらしく勝負は1対1で行われ、相手のライフを削り切ることで勝利となる。格闘ゲームには、ランダム性がない。対戦になれば勝敗は全てプレイヤーの責任だという事実は心理的に重く、ハードルが高い側面がある。少なくとも泊氏はそのように感じていたそうで、実際に人と戦っているわけではないものの、多彩な動きをする相手と対戦できる機能が欲しかったと語る。そこで人間が対戦中行っていることを、画面の状況を判断しキー入力をしていると解釈し、ゲームステートが入っていて、押したいキーを出力する箱をプレイヤーとして定義。このプレイヤーが行っている動作を、機械学習に置き換えることを目指し、開発が進められた。

 

TCPによるネットワーク経由での接続

ゲームへの実装を目指すにあたり、まずはTensorflowという標準的な機械学習のライブラリを採用し、プロトタイプの作成が行われた。泊氏が配属された時には、既に『サムライスピリッツ』はゲームエンジンにUnreal Engine 4を採用して開発が進められていたが、Unreal Engine 4はC++で書かれている。一方Tensorflowは、Pythonで使用するのが一般的で、異なる言語で動いている両者を直接繋ぐのは難しい。そこで、PCとコンソールで接続可能なことも考慮し、TCPによるネットワーク経由での接続が採用された。ゲーム本体の中には、60fpsで動き続けるバトルシステムがある。そこからゲームステートを機械学習の学習スレッドへ送り、学習スレッドからキー入力をバトルシステムへ非同期で送り返す。そうすることでバトルシステム側のタイミングに干渉することなく、Tensorflowを外側に置き、手軽にテストできる環境が作られた。

ニューラルネットの方式は、格闘ゲームには時系列があることから、時系列のデータを扱うのが得意なRNNという方式を採用。プロトタイプの段階では、RNNの中からより適したものを探るべくテストが行われた。最初に試されたのはLSTMによる4段構成だ。画面状況の時間偏移を知る1段目。ここから状況を把握する2段目。入力する技を決定する3段目。実際にキーを入力する4段目で構成されており、自信があったそうなのだが入力と出力が遠すぎたために、安定して学習させることができず実際には上手く動作しなかった。他にGRU、GRUにフィルターを追加したものなど、いくつかテストしてみたもののうまく動作せず。最終的には、Clockwork RNNという音声認識で使われ、時間的に長いデータでも扱える方式が採用された。また、最適化のアルゴリズムについてもTensorflowに多様な実装があったことから、複数の構成が試された。こちらは十分な結果を得ることができたAdamという方法が採用されている。

 

続く調整

ゲームシステムから入手できるデータは膨大だ。そこで、キャラクターの位置やゲージの状態、判定のデータやモーションの状態、残り時間や最終ラウンドか否か、など項目を絞って入力が行われている。出力については、それぞれのキーをどれだけ押したいか、学習データに基づく確率分布を作成。例えばA+Bの同時押しを押す確率が高いと判定されたなら、A+Bの同時押しをゲームシステムへ出力するようになっている。今回の目標は、プレイヤーに似た動作をするAIを作ること。学習レートなど、大量のパラメーターがニューラルネットの学習には絡んでくるが、数値が大きすぎるといつまでも収束せず、小さすぎると局所解となってしまうなど、どのパラメーターを弄ればよくなるのか、調整するのが非常に難しかったと語られた。

本番ではプロトタイプでTensorflowが担っていた処理を、泊氏自身が実装する必要があった。Eigenというテンプレートライブラリを使用して実装が行われたが、通常のゲームプログラムと異なり、数値計算であるためコンパイラの最適化でかなり高速化した。しかし、後にこれがデバッグビルドで遅くなる原因に。ゲームでは非同期でさまざまな処理が行われているが、処理が終わるタイミングが大きくずれるとバグになる。それが非常に辛かったのだそうだ。また、非常に小さな数字、非正規化数をMXCSRというレジスタを設定し、0にすることで高速化が行われている。これはゲーム全体に影響のある処理なので、問題が起こる可能性もあったのだが、その設定を入れてみたところ特に問題も発生せず、デバッグもそのまま通ったので、そのままになっているのだとか。

 

そして最適化

ニューラルネットの構成は、ゲームステート76項目をClockworkRNNへ渡し、Softmaxで二股に分け、9とおりの方向キーと、16とおりのキーコードが出力される。推論の処理では1フレームごとにゲームステートを送ってもらい、16ミリ秒以内にキーコードをゲームシステムへ出力。こうした処理によってAIにキャラクターを操作させるのだが、学習結果は押したいキーの確率分布で、毎フレーム結果が出てくるようになっている。そのため、初期段階では毎フレームキーを入力することになり、どのキーを押したいのか、迷いが発生しているような際にはガチャプレイのような動作に。それがプランナーに不評だったことから、出力される確率分布が均一に近いときは、キーを押さないように修正された。

また、学習の処理では、Backpropagation Through Timeというアルゴリズムを採用し、LSTMに時系列のデータを学習させている。ゲームプレイ中は、常に押したキーと画面の履歴が溜まっていき、ラウンド終了時に学習スレッドへ送り、次のラウンド中に学習の処理を実施し、モデルの更新が行われる。更新されたモデルデータはネット上にアップロードされ、このモデルと「道場モード」を使って対戦できる、というわけだ。

機械学習を作ってみて、わかった苦労についても紹介された。今回の場合、実験するには人間によるプレイデータを取得する必要があり、プランナー2名による1セット50ラウンドの対戦が行われた。言うまでもなく、50ラウンドもの対戦は大変な労力がかかる。しかしこの大規模対戦を、ゲームステートから取得する項目が増えたり、ゲーム本体で技の変更が行われたりする度に行ったので、“変更の都度”対戦をお願いすることになったようだ。それが心苦しく、人間を使うのは大変だと漏らした。なお、ゲーム本体の更新が行われないオリジナル版『サムライスピリッツ』でテストしなかったことについては、「ソースコードが残っていない」からだと語られている。

 

人の動きに寄せる難しさ

「とても大事なこと」という前置きと共に「ニューラルネットは細かい調整が効かない」ことが語られた。「ステージの端でキャラが離れている時、キャラがジャンプし続けないようにしてほしい」「この技を確実につかえるように、とても大事な技なので」「もっとガードするようにしてほしい」というようなことを、泊氏はプランナーから言われたそうだ。これらは一般的には共感できる内容だが、今回のニューラルネットの仕組みで実現するのは難しい。最初は強化学習的なアプローチ───学習した結果、勝ったほうが生き残るような手法も試したそうなのだが、とにかく覇王丸の大斬りが強く、覇王丸が大斬りを撃つだけで勝ってしまうため、この手法は打ち切られた。

評価関数を工夫することによって実現できる可能性はあるが、細かい調整をするのはどうしても難しいのだそうだ。また、できなかったこととして、より人間の動きに似せることが挙げられた。泊氏は今回できたものより、もっと人間の動きに似せた出力が出来ると感じているそうなのだが、リアルタイムで学習するために先例した『Dota 2』のものより大幅に小さな構成が採用されていることや、ネットワークで共有できるファイルサイズの問題、プラットフォームの共有システムによる制限、ゲーム機の性能など、さまざまな制限により実現できなかったという。クラウドで学習処理を行う方法が解決策として考えられるが、GPUが高いため売り切りのタイトルで費用を捻出するのは難しい。今後、学習処理も高速化できるようなアクセラレーターの実装など、ハードの性能向上によって解決出来る可能性があると期待を寄せる。最後に、開発チームへの感謝の言葉を述べて講演は締められた。

苦労と過程を持って開発が行われた『サムライスピリッツ』の「道場モード」。泊氏がやりたかったという、ニューラルネットでリアルタイムにプレイヤーから学習する仕組みはしっかり実現されており、機械学習と一緒に遊べるようなゲームに仕上がっているのだそうだ。機械学習の性質上いきなり学習結果を元に動き出したりはしないが、ある程度の期間遊ぶことで、プレイヤーそれぞれの癖を学んだり、良くなっていくという。格闘ゲームの一人用モードというと、どうにも対人戦に比べて味気ないイメージがある。しかし、見知らぬ誰かや、プロプレイヤーの手元で学習したAIと対戦が楽しめたり、自分の癖を学んだAIが誰かの元で対戦しているのは、とても楽しそうだ───少なくとも、そんな風に思わせてくれる講演だった。