見出し画像

ポーカーAI開発 part9 ~自作した簡易GTOモデル開発の途中経過~

こんにちは!ナガメ研究所です。人を楽しませるポーカーAIの開発をしています。前回 part8 DeepCFRを使ってみる では、AIによる簡易的なGTOモデルを作成して対戦してみました。今回はその続きです。

この記事では、対戦のログを記録する機能プレイのGUI画面を作成したのでご紹介します。
後半は今現在学習中のポーカーAIと対戦し、ログを分析していきます。

対戦画面の作成

前回は文字情報だけのコンソール画面からAIに情報を送り対戦していました。

対戦の様子

しかし、これではマークの見間違いが起こったり、ゲームのリアル感がないと感じたため、Unityを使用してゲーム画面を作成しました!

AIと対戦する画面

左下のHero(ヒーロー)が筆者です。右下のVillain(ヴィラン)がAIです。ポーカーではよく自身をヒーロー(主人公)とし、対戦相手をヴィラン(悪者)と呼んだりするそうです。今回はその呼称を使っています。

ハンドが配られるとこんな感じ
AIからレイズ20点がきたとき。こちらのアクションになるとアクション可能なボタンが表示されます。

前回記事でも触れましたが、ノーリミットホールデムとリミットホールデムの中間のようなルールとなっており、ベットサイズは現状のポットと二人のベット額で決定されます。プリフロップがポットの1/1, 2/1, 3/1、それ以外のラウンドでは1/3, 1/2, 1/1の3パターンのみとなっています。
多すぎると非常に学習に時間がかかるため簡易的なGTOモデルとなっています。

ショーダウン時の様子。左上にアクションの履歴、右上に勝敗がカウントされます。
(AがHero、BがVillainです。呼称がバラバラですみません。。。)

対戦ログの分析

さて、ここからは作成したゲーム画面とAIモデルを使用して筆者と100ハンド行った記録を分析したいと思います。1BBが10点の200BB持ちのヘッズアップで、毎ハンドで持ち点をリセットする特殊ルールとします。100ハンド勝負し最終的にどれくらいBBを獲得したかを競いたいと思います。

対戦結果

AIモデルは前回からさらに学習を進め、新たに記録を取りました。勝敗は以下の通りです。

各ハンドの勝敗
筆者:45勝、AI:55勝、引き分け:0
獲得BB
筆者:+254.1BB AI:-254.1BB

ハンド自体の勝敗数では筆者が負けておりますが、254BBほど獲得できました。前回は負けていたので、雪辱を果たしました。
ただ、AIの挙動が分かってきたのでエクスプロイトできた感じもあります笑

次に、前回記録していなかったログからいろいろ見ていきます。

バンクロールの推移

player_A:筆者
addition:積算

グラフですが、100ハンドのなかで筆者のバンクロールがどの程度増減した化を示します。特殊ルールによりハンドごとにバンクロールは2000からスタートしますが、additionの線は積算を表しているのでそちらのが分かりやすいかと思います。序盤と中盤でマイナスになっていますが、後半はオール・インに2回かって大きく増やしています。
ポーカーは分散の大きいゲームのため100ハンドではどちらが強いなどは言えませんが、ゲームを通してかなりの期間プラスの状態をキープしていたといえます。

プリフロップのハンドレンジ分析

100ハンドと少ないですが、SBポジションでのプリフロップの最初のアクションを各ハンドごとに可視化してみました。0がフォールド、1がコール、2がチェック、3~5がレイズに対応します。

筆者のアクション分布
0:フォールド 1:コール、2:チェック、3~5:レイズ
AIのアクション分布
0:フォールド 1:コール、2:チェック、3~5:レイズ

これを見ると、AIは様々なハンドを参加していますが、A2,A3oや77のようなハンドをフォールドしています。
予測ですが、学習するなかでAxのハンドがボードで絡むとポットが大きくなりがちで分散が大きくなるため、よい戦略を獲得するのが難しいのかもしれません。実際筆者のアクションではAxはコール以上ですが、アグレッシブな相手にはフロップ以降での戦い方が難しいハンドだと感じました。

BBでのSBからのコール以上のアクションに対しての分析

BBでの筆者のアクション分布
0:フォールド 1:コール、2:チェック、3~5:レイズ
BBでのAIのアクション分布
0:フォールド 1:コール、2:チェック、3~5:レイズ

この図から、コールよりレイズ頻度が高く、最も大きいポット3倍を選択していることがわかります。ペアやA,Kあたりが含まれている場合に多いと感じました。スートが揃っているハンドのサンプルが少ないためスート、オフスートの違いは判断できませんが、微妙なハンドではよくフォールドしているようです。27oはしっかりフォールドのようです。正直、フロップをみたいマンの筆者からすると参考にすべき点もあるなと思いました。

感想

AIモデルはすべてのアクションの確率を出力し、その確率でアクションを選択するようにしています。モデルの計算上、出力される数字が0ということはほぼなく0.1%など頻度があればそのアクションが選ばれる可能性があります。しかし、実際はAAをプリフロップで降りるべきではないのである程度ルールベースのしきい値などを設けて選ばないようにするなど調整すべきかなと思いました。
また、プリフロップのベットサイズ設定を調整すべきだと感じました。序盤はポットが小さいため倍率を大きく設定していますが、そのせいでプリフロップでポットが膨らんでしまうことが多かったようです。
まだまだ荒削りですし強いと言えるかは微妙ですが、ハンドや状況に応じてアクションを変えてくるので飽きません。引き続きポーカーAIの開発を続けて行きたいと思います!


この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?