機械学習周りのプログラミング中心。 イベント情報
ポケモンバトルAI本電子書籍通販中

技術書典6 ヤマブキ計算所(こ35) おしながき

技術書典6での当サークル「ヤマブキ計算所」の頒布物をお知らせします。

f:id:select766:20190405131320p:plain
技術書典6おしながき

新刊として「PokéAI #2:初代3vs3編」を発行します。ポケモンバトルの戦略を人工知能に考えさせるというテーマで技術開発を行った成果を掲載しています。 第1巻との違いはバトルのルールが1vs1から3vs3に拡張され、より一般的に遊ばれているルールに近づいたことです。技術・結果ともに新規の内容となっています。 第1巻から読むことを推奨しますが、第2巻だけでも必要な基礎は解説しています。

技術書典5の既刊「PokéAI #1:初代1vs1編」は完売していますが、増刷の上頒布いたします。

いずれも紙の本は1冊500円です。電子版(PDFダウンロードカード)は1冊300円です。 第1巻については、電子版のみとなりますがBOOTHで今すぐ購入可能です。PokéAI #1:初代1vs1編 - select766 - BOOTH

支払いは現金と技術書典かんたん後払いに対応します。

※かんたん後払いアプリの初期設定は当日だと困難な場合があるので、前日までにお願いします。

イベント公式サイトの当サークルの情報はこちら: techbookfest.org

それでは4月14日、池袋サンシャインシティ、配置「こ35」でお会いしましょう。

「ポケモン」のアクセント記号【PokéAI】

技術書典6向けの本の執筆をつづけているのですが、重大なことに気づきました。

英語版ポケモンの公式ロゴがこちら。公式ページより

f:id:select766:20190323153044j:plain
ポケモン英語公式ロゴ
(ロゴ部分だけの大きな画像が公式サイトになかった)

ところで、技術書典5で発行した本の表紙の上部がこちら。

f:id:select766:20190323153403p:plain
技術書典5表紙

…おわかりいただけただろうか。

アクセント記号のついた「e」が「é」と「è」で異なっています。

表紙の4文字目で間違うやつおる???

点が右上から左下に向かうアクセント「é」が「アキュート・アクセント」でポケモンの「e」に使う記号。左上から右下へのアクセント「è」は「グレイヴ・アクセント」という別物らしい。違いを認識しておらず、誤植になってしまいました。違和感を持たれた方がいれば失礼しました。

今後は「PokéAI」で統一していきます。旧刊は完売していますが、誤植訂正版を技術書典6で若干数増刷して頒布しようと考えています。 頒布物情報は技術書典6のサークルページで更新していきますのでご確認ください。

CNNの複雑さとnpsと棋力【コンピュータ将棋】

CNN (Deep Learning)ベースの評価関数を使った将棋AIをチューニングするにあたり、難しい点の1つが評価関数の複雑さ(計算量)の調整です。

層やチャンネルの数を増やせば静的評価の精度は上がるものの、計算時間が増加するため探索に組み込んだ時の評価局面数(nps=node per second)が下がってしまうトレードオフにあります。

そこで、いくつかのモデルを学習させ、同じ探索ノード数又は探索時間における強さの比較を行うことにしました。

モデル構造は、3x3 convolutionを2つ重ねたResidualブロックを基本ブロックとして、19ブロックまたは39ブロック重ねたものです。ブロック数*2がconvolution層の数ということです。チャンネル数は128,192,256としました。AlphaZeroと類似の方式で、盤面を入力として評価値と各指し手の確率を出力します。探索はMCTSで行います。

モデルの学習はやねうら王のサイトで配布されていたshuffle_sfen1.7zを用いて教師あり学習としました。

強さの評価は、探索込みで詰むまで対戦させた勝敗で行います。対戦開始局面は互角局面集2017-05-19を使い、100局で統計を取りました。

まずはノード数を固定し、モデルを変更した場合の結果です。

チャンネル数 ブロック数 ノード数 基準に対する勝率[%]
128 19 4096 (基準)
128 39 4096 74
192 19 4096 75
192 39 4096 80
256 39 4096 91

モデルが複雑になるほど勝率が上がる傾向が見て取れます。

次に、モデルの計算量に反比例してノード数を減少させた場合の結果を示します。一定の制限時間で指す場合の強さに相当するものです。 計算量ですが、理論値で扱います。チャンネル数がN倍になればN2の計算時間、ブロック数がN倍になればN倍の計算時間がかかると考えます。 チャンネル数1.5倍の場合は2倍の計算時間とみなしました。

チャンネル数 ブロック数 ノード数 基準に対する勝率[%]
128 19 4096 (基準)
128 39 2048 49
192 19 2048 53
192 39 1024 24
256 39 512 12

基準とした128チャンネル、19ブロックのモデルに対し、計算量2倍のモデルは強さがほとんど変わらないことがわかりました。「仕事の原理」みたいで面白いですね。 一方で2倍より複雑なモデルでは明らかに弱くなってしまっています。モデルの予測性能が頭打ちになり、探索量の不足による影響のほうが大きくなっているものと思われます。

ここまでの結論としては、モデルを複雑にした場合、計算量を無視すれば棋力が上がるが、計算量を考慮するとあまり大きくするのは得策でない、ということが言えます。

ただし、実際のGPUで計算する場合、小さなモデルは計算コアが余ったり制御部分のレイテンシが相対的に大きくなったりして、理論値ほど大きなモデルは不利ではないという実情があります。 本番マシンは高価なため強さの測定までやることは現実的ではありませんが、純粋なnpsを測定しながらパラメータ調整を進めたいと思います。

2019-03-09 20:19 読者の指摘によりチャンネル数とブロック数が逆になっていた誤植を訂正。

技術書典6 当選しました

2019年4月14日に開催される技術書オンリーイベント技術書典6」に当選しました。 サークル名は「ヤマブキ計算所」です。

2019-02-20追記: 配置は「こ35」に決定しました。

前回に引き続き、ポケモンバトルの戦略を人工知能技術を用いて開発する本を頒布する予定です。 今回の目玉は、ポケモンを3体ずつ出し合う3vs3ルールへの対応です。 1vs1の時と比べ、パーティ編成の自由度が大きく増加、行動選択にも「交代」という要素が加わります。

今までの成果は過去の記事で紹介しています。行動選択部分が不十分なので、2月中は技術開発を続行し、執筆に臨もうと考えています。

前作はPDF販売中ですのでよろしければご覧ください。 select766.booth.pm

最良優先探索ベースのパーティ生成【PokéAI】

以前の記事で、バトルなしにパーティの強さを予測する関数(以下では静的評価関数と呼ぶことにします)を学習しました。今回はこれを山登り法によるパーティ構成の最適化に組み込みます。

select766.hatenablog.com

山登り法でのパーティ構築は次のような手順でした。

  1. ランダムなパーティXを生成する
  2. Xのポケモンや技を1つ変更した近傍パーティY1,...,Ynを生成する
  3. Y1,...,Ynを評価用パーティ群と対戦させ、強さ(レーティング)を計算する
  4. 最も強いパーティをXに代入し、2に戻る

ここでの問題は、ステップ3でパーティの評価に多数のバトル(今は100回でやっています)が必要で、時間がかかるということです。 例えば、「ふぶき」を「たいあたり」に変更した明らかにダメそうなパーティにも時間を割く必要が生じ、時間効率が悪いです。 そこで、有望なパーティに限ってバトルでの評価を行うことで改善を試みます。改良後のアルゴリズムは次のようになります。

  1. ランダムなパーティXを生成する
  2. Xのポケモンや技を1つ変更した近傍パーティY1,...,Ym (m > n)を生成する
  3. Y1,...,Ymに静的評価関数を適用し、上位nパーティをY1,...,Ynに代入する
  4. Y1,...,Ynを評価用パーティ群と対戦させ、強さ(レーティング)を計算する
  5. 最も強いパーティをXに代入し、2に戻る

これは最良優先探索の考え方を応用したものになっています。

実装して実験してみました。ランダムなパーティを初期値として、近傍生成数はm=100,n=10、山登り法の繰り返し10回としました。比較対象は、静的評価関数を使わないで山登り法を行ったもの(n=10とし、バトルでの評価を行うパーティ数を同数とする)、ランダムなパーティ、静的評価関数自体を最大にするパーティを用いました。

静的評価関数自体の最大化は、同様に山登り法で実現できます。対戦によって強さを測定する代わりに静的評価関数の結果をそのまま強さとして使えば実装できます。他と合わせて繰り返し10回のものと、とにかく評価関数を最大化するということで繰り返し1000回のものを作成しました。

各条件で初期値を変えて各100パーティ生成し、これらを混ぜてレーティング戦を行いました。行動戦略はすべてランダムで、強化学習は入っていません。

最適化条件 平均レート
(A)ランダム 1162
(B)バトル 1381
(C)静的評価関数+バトル 1655
(D)静的評価関数のみ(繰り返し10) 1588
(E)静的評価関数のみ(繰り返し1000) 1711

BとCを比較すると、静的評価関数を使うことで、バトルでの評価部分についてほぼ同じ計算コストでより強いパーティが生成できています。 また、CとDは途中で生成されるパーティ候補の数は同じですが、バトルで強さを評価したほうが強い傾向にあるといえます。 一方、最も強かったのはEでした。バトルを一切せず、静的評価関数の値が最大となるようなパーティを生成すれば十分強いという結果です。

対戦で上位レートを得たパーティをグループごとに示します。

↓(A)ランダム

1479.7354283838638
* シードラ (LV 50 HP 162/162)
  こうそくいどう バブルこうせん にらみつける みずでっぽう 
  ゲンガー (LV 55 HP 182/182)
  サイコウェーブ じごくぐるま さいみんじゅつ 10まんボルト 
  フーディン (LV 50 HP 162/162)
  ロケットずつき サイコキネシス トライアタック すてみタックル 

1447.0239174401538
* ニドキング (LV 55 HP 205/205)
  ちきゅうなげ じしん にらみつける ふぶき 
  ペルシアン (LV 50 HP 172/172)
  すてみタックル ひっかく どくどく かげぶんしん 
  カメックス (LV 50 HP 186/186)
  あわ メガトンキック あなをほる ハイドロポンプ 

1443.0889755952132
* ゲンガー (LV 55 HP 182/182)
  ねむる したでなめる サイコウェーブ サイコキネシス 
  スリープ (LV 50 HP 167/167)
  さいみんじゅつ トライアタック どくどく のしかかり 
  ダグトリオ (LV 50 HP 142/142)
  じしん ねむる いあいぎり いわなだれ 

↓(B)バトル

1644.178954863615
* ゴースト (LV 55 HP 166/166)
  ナイトヘッド 10まんボルト サイコキネシス 
  ニョロボン (LV 50 HP 197/197)
  じしん ふぶき さいみんじゅつ かいりき 
  プテラ (LV 50 HP 187/187)
  かみつく つばさでうつ はかいこうせん 

1632.4251737361622
* リザードン (LV 55 HP 202/202)
  じしん きりさく だいもんじ 
  フシギバナ (LV 50 HP 187/187)
  ソーラービーム やどりぎのタネ のしかかり ねむりごな 
  ジュゴン (LV 50 HP 197/197)
  なみのり れいとうビーム 

1607.3417191119063
* ラプラス (LV 55 HP 259/259)
  りゅうのいかり うたう サイコウェーブ れいとうビーム 
  ニドクイン (LV 50 HP 197/197)
  いわなだれ なみのり れいとうビーム ひっかく 
  サンダース (LV 50 HP 172/172)
  かみなり のしかかり どくどく 

↓(C)静的評価関数+バトル

1864.7585210905622
* ゲンガー (LV 55 HP 182/182)
  サイコキネシス ちきゅうなげ さいみんじゅつ ナイトヘッド 
  ライチュウ (LV 50 HP 167/167)
  のしかかり 10まんボルト はかいこうせん かみなり 
  フリーザー (LV 50 HP 197/197)
  ふぶき れいとうビーム そらをとぶ かげぶんしん 

1861.053481729282
* プテラ (LV 50 HP 187/187)
  はかいこうせん そらをとぶ ゴッドバード だいもんじ 
  ルージュラ (LV 50 HP 172/172)
  バブルこうせん のしかかり メガトンキック ふぶき 
  ゲンガー (LV 55 HP 182/182)
  さいみんじゅつ サイコキネシス ナイトヘッド 10まんボルト 

1852.1999935932283
* ルージュラ (LV 55 HP 188/188)
  ふぶき あくまのキッス れいとうビーム 
  ウインディ (LV 50 HP 197/197)
  かえんほうしゃ はかいこうせん だいもんじ あなをほる 
  ゲンガー (LV 50 HP 167/167)
  10まんボルト さいみんじゅつ ちきゅうなげ サイコキネシス 

↓(D)静的評価関数のみ(繰り返し10)

1789.8176242017867
* フシギバナ (LV 50 HP 187/187)
  ねむりごな はっぱカッター やどりぎのタネ のしかかり 
  ラプラス (LV 55 HP 259/259)
  ハイドロポンプ れいとうビーム かみなり ふぶき 
  ゲンガー (LV 50 HP 167/167)
  10まんボルト サイコキネシス ナイトヘッド さいみんじゅつ 

1778.564922781992
* ラプラス (LV 50 HP 237/237)
  ハイドロポンプ かいりき バブルこうせん れいとうビーム 
  フシギバナ (LV 50 HP 187/187)
  のしかかり メガドレイン はっぱカッター ねむりごな 
  スターミー (LV 55 HP 182/182)
  サイコキネシス ねむる じこさいせい ふぶき 

1778.3059349935693
* サンダー (LV 55 HP 215/215)
  かみなり はかいこうせん ドリルくちばし 10まんボルト 
  プテラ (LV 50 HP 187/187)
  そらをとぶ ゴッドバード だいもんじ すてみタックル 
  ニョロボン (LV 50 HP 197/197)
  ふぶき さいみんじゅつ れいとうビーム のしかかり 

↓(E)静的評価関数のみ(繰り返し1000)

1924.0833346696368
* サンダー (LV 55 HP 215/215)
  10まんボルト かみなり はかいこうせん ドリルくちばし 
  ラプラス (LV 50 HP 237/237)
  ふぶき ハイドロポンプ れいとうビーム バブルこうせん 
  ゲンガー (LV 50 HP 167/167)
  メガドレイン ナイトヘッド さいみんじゅつ サイコキネシス 

1866.9876553669278
* サンダー (LV 55 HP 215/215)
  かみなり ドリルくちばし でんきショック 10まんボルト 
  ケンタロス (LV 50 HP 182/182)
  かいりき れいとうビーム ふぶき はかいこうせん 
  ゴースト (LV 50 HP 152/152)
  サイコキネシス ナイトヘッド さいみんじゅつ メガドレイン 

1864.5993017504716
* ドククラゲ (LV 50 HP 187/187)
  ふぶき ハイドロポンプ なみのり れいとうビーム 
  ゲンガー (LV 50 HP 167/167)
  メガドレイン ナイトヘッド サイコキネシス さいみんじゅつ 
  サンダー (LV 55 HP 215/215)
  ドリルくちばし かみなり 10まんボルト はかいこうせん 

select766.hatenablog.com

前回はランダムに生成した100,000パーティのうちから静的評価関数が高いものを表示し、最強ではなさそうという結果でした。その時の予測レートは最大で2100程度(対戦相手が違うので、上の表との数値の互換性はありません)でした。しかし、静的評価関数が最大となるようパーティを最適化した結果、2400程度のパーティが得られています。実際、(E)の上位パーティはかなり強そうといって差し支えないのではないでしょうか。

ランダムに行動する条件下では、静的評価関数を学習したうえでそれを最大化するパーティを探索するという手法がかなり良さそうということがわかりました。 パーティ特徴量が1万次元ほどあり、それを1万種類のパーティで学習しているため、このパーティ数を増やすともう少し改善するかもしれません。

行動を強化学習する手法との組み合わせは悩みどころです。ランダムな行動では無意味な技の組み合わせが、強化学習した場合は有効なコンボとなる可能性があり、今の静的評価関数でそのような候補を弾いてしまうのは良くない可能性があります。しかし1万種類のパーティの行動をそれぞれ強化学習するというのは計算時間的に不可能で、その強さをベースに強化学習での戦略を考慮した静的評価関数を学習するのは困難かと思われます。引き続き手法を検討していきます。

パーティ強さの予測モデルに基づくパーティ候補の生成【PokéAI】

以前、パーティ構成のポケモンや技の組み合わせから、バトルなしに強さを予測するモデルを学習しました。

select766.hatenablog.com

今回はこのモデルを使い、ランダムに生成した大量のパーティから強そうなパーティを抽出してみました。

3体構成のパーティを100,000個ランダムに生成し、そのworst 10, top 10を抽出して表示します。処理は1分程度でした。

まずはworst 10。

predicted rate: 960.1960846745668
* コイキング (LV 50 HP 127/127)
  はねる たいあたり 
  コクーン (LV 50 HP 152/152)
  いとをはく どくばり かたくなる 
  ヒトカゲ (LV 55 HP 159/159)
  なきごえ ひのこ ロケットずつき ねむる 

predicted rate: 972.2634724955224
* カモネギ (LV 50 HP 159/159)
  ふきとばし かげぶんしん にらみつける こうそくいどう 
  トサキント (LV 55 HP 166/166)
  つのドリル こうそくいどう ねむる しっぽをふる 
  コイキング (LV 50 HP 127/127)
  はねる たいあたり 

predicted rate: 974.4966702093706
* コクーン (LV 55 HP 166/166)
  どくばり かたくなる いとをはく 
  オニスズメ (LV 50 HP 147/147)
  どくどく かげぶんしん かまいたち ふきとばし 
  ピカチュウ (LV 50 HP 142/142)
  でんこうせっか リフレクター とっしん こうそくいどう 

predicted rate: 988.8970502273767
* ビードル (LV 55 HP 160/160)
  いとをはく どくばり 
  キャタピー (LV 50 HP 152/152)
  たいあたり いとをはく 
  ケーシィ (LV 50 HP 132/132)
  フラッシュ テレポート とっしん リフレクター 

predicted rate: 997.5683222452317
* ビリリダマ (LV 50 HP 147/147)
  いやなおと どくどく だいばくはつ テレポート 
  ビードル (LV 55 HP 160/160)
  どくばり いとをはく 
  コイキング (LV 50 HP 127/127)
  はねる たいあたり 

predicted rate: 997.7929609782748
* ヒトカゲ (LV 50 HP 146/146)
  スピードスター なきごえ にらみつける ひのこ 
  トランセル (LV 50 HP 157/157)
  いとをはく かたくなる たいあたり 
  ズバット (LV 55 HP 160/160)
  かまいたち かげぶんしん かみつく つばさでうつ 

predicted rate: 1000.8366965109341
* ヒトデマン (LV 55 HP 149/149)
  かたくなる とっしん フラッシュ バブルこうせん 
  コイキング (LV 50 HP 127/127)
  たいあたり はねる 
  ビードル (LV 50 HP 147/147)
  どくばり いとをはく 

predicted rate: 1001.5095810479904
* コクーン (LV 55 HP 166/166)
  いとをはく どくばり かたくなる 
  ポッポ (LV 50 HP 147/147)
  リフレクター でんこうせっか ふきとばし ねむる 
  シェルダー (LV 50 HP 137/137)
  リフレクター ちょうおんぱ とっしん たいあたり 

predicted rate: 1002.0393486802535
* ズバット (LV 50 HP 147/147)
  かげぶんしん スピードスター ちょうおんぱ ふきとばし 
  マンキー (LV 55 HP 160/160)
  みだれひっかき じごくぐるま いわなだれ にらみつける 
  コクーン (LV 50 HP 152/152)
  かたくなる いとをはく どくばり 

predicted rate: 1003.5111618329934
* コイキング (LV 55 HP 138/138)
  たいあたり はねる 
  マダツボミ (LV 50 HP 157/157)
  せいちょう かげぶんしん しびれごな ねむりごな 
  ビードル (LV 50 HP 147/147)
  どくばり いとをはく 

順当にダメなパーティができています。

top 10はどうでしょうか。

predicted rate: 2136.761291977353
* ギャラドス (LV 50 HP 202/202)
  かみつく のしかかり なみのり どくどく 
  ゴースト (LV 55 HP 166/166)
  あやしいひかり かげぶんしん かみなり ねむる 
  ゲンガー (LV 50 HP 167/167)
  さいみんじゅつ すてみタックル はかいこうせん サイコキネシス 

predicted rate: 2113.2795838383868
* ゲンガー (LV 55 HP 182/182)
  どくどく したでなめる 10まんボルト さいみんじゅつ 
  ゴースト (LV 50 HP 152/152)
  サイコキネシス あやしいひかり ナイトヘッド したでなめる 
  ニドクイン (LV 50 HP 197/197)
  のしかかり かいりき れいとうビーム ロケットずつき 

predicted rate: 2112.1449667281267
* ケンタロス (LV 50 HP 182/182)
  つのドリル はかいこうせん だいもんじ かみなり 
  ハクリュー (LV 55 HP 183/183)
  なみのり でんじは りゅうのいかり ねむる 
  ゴースト (LV 50 HP 152/152)
  あやしいひかり サイコキネシス 10まんボルト ナイトヘッド 

predicted rate: 2110.3082249596196
* ゴースト (LV 55 HP 166/166)
  ねむる ナイトヘッド したでなめる 10まんボルト 
  ラプラス (LV 50 HP 237/237)
  バブルこうせん のしかかり れいとうビーム どくどく 
  ゲンガー (LV 50 HP 167/167)
  かみなり かいりき ねむる サイコウェーブ 

predicted rate: 2088.8757321632183
* ゲンガー (LV 50 HP 167/167)
  かみなり すてみタックル ちきゅうなげ のしかかり 
  キングラー (LV 55 HP 177/177)
  はさむ なみのり はかいこうせん ふみつけ 
  ゴースト (LV 50 HP 152/152)
  さいみんじゅつ どくどく ナイトヘッド 10まんボルト 

predicted rate: 2084.959730607545
* ケンタロス (LV 50 HP 182/182)
  ねむる だいもんじ れいとうビーム のしかかり 
  ラプラス (LV 55 HP 259/259)
  つのドリル のしかかり あやしいひかり ハイドロポンプ 
  ゴース (LV 50 HP 137/137)
  かげぶんしん 10まんボルト メガドレイン ねむる 

predicted rate: 2083.8192483283756
* ポリゴン (LV 50 HP 172/172)
  とっしん サイコキネシス ふぶき トライアタック 
  ゴースト (LV 55 HP 166/166)
  ねむる さいみんじゅつ ナイトヘッド かみなり 
  ギャラドス (LV 50 HP 202/202)
  バブルこうせん はかいこうせん 10まんボルト かみなり 

predicted rate: 2061.375318388595
* ドードリオ (LV 50 HP 167/167)
  はかいこうせん そらをとぶ とっしん すてみタックル 
  ガルーラ (LV 55 HP 232/232)
  ピヨピヨパンチ のしかかり とっしん はかいこうせん 
  ゴースト (LV 50 HP 152/152)
  ナイトヘッド メガドレイン かげぶんしん したでなめる 

predicted rate: 2055.8270020078944
* ガルーラ (LV 55 HP 232/232)
  とっしん ピヨピヨパンチ 10まんボルト だいもんじ 
  ジュゴン (LV 50 HP 197/197)
  すてみタックル ふぶき かいりき オーロラビーム 
  カブトプス (LV 50 HP 167/167)
  はかいこうせん かげぶんしん みずでっぽう きりさく 

predicted rate: 2051.331277990781
* ニョロボン (LV 55 HP 215/215)
  なみのり れいとうビーム ねむる さいみんじゅつ 
  ギャラドス (LV 50 HP 202/202)
  バブルこうせん のしかかり かみなり だいもんじ 
  ケンタロス (LV 50 HP 182/182)
  じわれ つのドリル かげぶんしん 10まんボルト 

そこそこ順当な結果です。技単体としては最も強さへの寄与度が高い、ふぶきばかりが採用されるわけではないようです。 また、最上位のパーティで同系統のゴーストとゲンガー両方が入っており、相性補完がよろしくありません。 このように、予測のための特徴量やモデル学習の不完全さがあるため、これだけで最強のパーティを作ることはできないといえます。 この手法はあくまで(コストがかかる)バトルで強さを測定する前段階の候補生成に使うつもりですので、これで問題ありません。

次回、山登り法での最適化と組み合わせます。

3体構成での強化学習【PokéAI】

PokéAIで、従来の1vs1から3vs3バトルへの拡張を進めています。今回は、技を選択する部分の強化学習の仕組みを3vs3に対応させました。

エージェントの入出力の拡張

強化学習におけるエージェントとは、バトルの状態を入力として受け取り、行動を出力する関数です。勝率を高めるような行動がとれるよう関数のパラメータを調整することが強化学習の目的となります。

1vs1のときは、行動はポケモンが覚えている技4種類のうち1つを選択するものでした。今回は3vs3なので交代も可能にしたいです。また、1匹目のポケモンと2匹目のポケモンで、同じ1番目の技でも全く違う技なので、これも別の出力として表現したほうがよいでしょう。

index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
行動 ポケ0技0 ポケ0技1 ポケ0技2 ポケ0技3 ポケ0に交代 ポケ1技0 ポケ1技1 ポケ1技2 ポケ1技3 ポケ1に交代 ポケ2技0 ポケ2技1 ポケ2技2 ポケ2技3 ポケ2に交代

このように15個の候補から1つを選ぶ形式にしました。例えばポケモン0が出ているときは、ポケ0技0~ポケ0技3と、ポケ1に交代、ポケ2に交代の6種類が有効な選択肢です。 ただし、瀕死になっているポケモンには交代できません。 無効な選択肢も出力できてしまいますが、その場合は有効なものからランダムに実行することにします。

このようにどのポケモンが場に出ているかで有効な選択肢が変わるため、エージェントへの入力としてその情報を与える必要があります。

1vs1の場合、入力としては相手ポケモンのタイプ、{自分,相手}の{残りHP率、状態異常、ランク補正}の41次元の値を与えていました。 これに対し、自分の3匹のポケモンのうちどれが場に出ているか(3次元)、どれが瀕死でないか(3次元)という情報を追加します。 相手の残りポケモン数なども役に立つ可能性はありますが、複雑化するためまずは最低限の情報にとどめました。

報酬の改良、対戦相手の変更

上記の入出力変更だけで学習を試みたのですが、戦略があまり学習されず、そもそも無効な選択肢を選ぶ確率が60%近くあるなどうまくいきませんでした。

従来の報酬は、ゲーム終了時のみ勝ったら1、負けたら-1を与えていました。まず無効な選択肢を選ばないように誘導するため、無効な選択肢を選んだ場合は報酬として-0.1を与えるようにしたところ、この点は改善しました。

ポケモンが3匹瀕死にならないとバトルが終了しないため、1匹のときよりターン数が多く、行動と勝敗の因果関係を学習することが難しくなっています。そのため補助的な報酬として、ダメージに基づくものを加えました。 相手に与えたダメージ(HP割合)および、瀕死にした際に即時に0.1程度の報酬を与えます。逆に自分がダメージを受けたり瀕死になったら逆の符号の報酬を与えます。

また、強化学習の際に対戦する相手はランダムに行動していましたが、これだと簡単に90%以上の勝率となってしまい戦略の優劣がつきにくくなっていました。そのため、相手をすでに学習されたエージェントに従って行動させることにしました。パーティごとにエージェントのパラメータを学習しないといけないため、相手パーティの多様性は減ってしまいますが、まずは固定した20パーティを相手に何度も対戦させるようにしました。

定性的な結果

これらの改良を加えた結果、3vs3のバトルにおいてちょっと賢そうな戦略が見られるようになりました。

与えたパーティに対して学習された戦略をいくつか紹介します。戦略の意味付けは対戦ログから私が主観で判断しています。

* ゲンガー (LV 50 HP 167/167)
サイコキネシス すてみタックル 10まんボルト
カブトプス (LV 50 HP 167/167)
いあいぎり なみのり きりさく かげぶんしん
ルージュラ (LV 55 HP 188/188)
れいとうビーム あくまのキッス サイコキネシス

ルージュラは、相手が眠っていなければあくまのキッスを使い、眠っていれば攻撃技を選択します。相手としてフリーザーが出てきたら、ルージュラに交換するという行動も見られました。ふぶきで凍らされないための知恵といえます。

* カイロス (LV 55 HP 188/188)
ちきゅうなげ つるぎのまい のしかかり はかいこうせん
カイリキー (LV 50 HP 197/197)
いわなだれ だいもんじ あなをほる メガトンパンチ
フリーザー (LV 50 HP 197/197)
れいとうビーム ふぶき

カイロスは、つるぎのまいを積んでからのしかかりのコンボを狙っています。エージェントの入力としてランク補正が入っているので、積んでから攻撃という挙動は実現可能で、実際に学習されました。 しかしながら実際は積んでいる間に倒されたり、急所に当たって積んだ効果がなかったり(初代特有の仕様)する場面が多いようでした。

* サンダー (LV 55 HP 215/215)
ドリルくちばし 10まんボルト
ニョロボン (LV 50 HP 197/197)
かげぶんしん れいとうビーム さいみんじゅつ
ガルーラ (LV 50 HP 212/212)
のしかかり かいりき とっしん ちきゅうなげ

サンダーはサイドンに対して効果のない10まんボルトを選択してしまい、うまく学習ができていません。 ニョロボンはさいみんじゅつで相手を眠らせたうえでかげぶんしんを積み、その後れいとうビームを連打するという凶悪な戦法をとることもありました。

面白い例をいくつかピックアップしましたが、全体的にはうまくいかない例が多く、学習方法の改善が必要と思われます。