見出し画像

ポーカーAI開発 part6 ~17万試合を学習したAIと対戦してみた~

こんにちは!ナガメ研究所です。ポーカーAI開発の記事もpart6になりました。これまでの記事へのスキやフォロー、本当にありがとうございます!引き続きポーカーAIの開発を頑張りたいと思います。

さて今回は、最近やっていたパラメーターの探索(AIモデルを作るために人が決定すべき数値を探す)が落ち着いたのと、今のアプローチではもうこれ以上強くできないなあと考えたので、これまでの内容を一旦記事にまとめます。よろしくお願いします。

はじめに

初めて筆者の記事を読む方に簡単に説明します。現在、ノーリミッドテキサスホールデム(NHL)のヘッズアップを想定したポーカーAIナガメの開発を行っています。目標は、近年発達しているAIがポーカーを行うことで、人が楽しめるコンテンツを作ることです。ポーカーのプレイはもちろんのこと、実況・解説できるようなAIの開発を目指しています。

学習したAIと勝負!

さっそく本題です。タイトルにも書いた通り、17万試合という、人間には膨大な試合を経験してきた、ポーカーAIナガメと筆者が対戦してみた結果と考察をお知らせします。ちなみに、筆者のポーカー歴は2ヶ月ほどで、ど素人です。勝負の内容ですが、いくつか注意点があります。

1.
実装の都合上、常にSBを筆者(人間側)とし、BBをAI(ナガメ)側に固定します。
SBとBBを交互に変えるプログラムの実装に手こずっています。公平性を保つため、SBの初手はコール・レイズとし、ブラインドを必ず払います。
2.
バンクロールは100BBに設定。
3.
バンクロールをゼロにするまでを1試合とし、先に10勝したら終了。
4.
ショーダウン時、人間側はAIのハンドを確認するが、AI側はこちらのハンドを確認しない。
AIの仕様の問題です。観測(ゲーム状況を入力)→行動をひとまとめにしているので、観測(ショーダウン時の相手のハンド)だけをして自分の行動を省みることはできません。相手のハンドが何かは関係なく、最終的に相手のBankRollをゼロにするよう学習しているためこうなっています。
5.
上の4.に関係していますが、
AIは過去の行動を考慮して行動を変えたりしません。なので、”さっき降りたからここはべットしよう”や”連続でオール・インは怪しいぞ!”といった読みはなく、常に現在のゲーム状態のみに依存しています。

勝負の結果

先に10勝という勝負で、筆者とAIナガメのスタッツと勝率は以下のようになりました。

各スタッツの数値と勝率

ナガメ(AI)の勝率:0.47(9勝10敗)
筆者(人間)の勝率:0.53(10勝9敗)

なんとか勝利🎉!

スタッツとは

・WTSD(オリジナル)
フロップまで進んだ場合に、ショーダウン(最後までゲームが進み、役の強さで勝負を決定する段階)になる割合です。言い換えると、フロップ後にどれくらいフォールドしているのか?を示す指標となります。今回はそのままフロップ後のフォールド率を出しているので、WTSDの正しい定義?とは異なります。
VPIP
VPIPは、プリフロップ(カードが場に配られる前の状態)からチップを払ってゲームに参加する割合のことです。BBのチェックは除くので、BBはこの値が小さくなる点に注意です。(※本来、SBの筆者は全てコールする予定なので1になるはずですが、誤ってフォールドボタンを押してしまいました。すみません)
PFR
プリフロップでレイズをする割合です。
平均ゲーム数
1試合で何ハンド行ったかの数値です。
・総ハンド数
全試合の合計ハンド数です。

感想

ポーカーAIナガメと対戦した感想です。
・べットに対するフォールドが多い
ナガメのWTSDをみると、0.4とかなりの割合でフロップ後にフォールドしていることがわかります。手堅いプレイだと思います。逆に、コールやレイズを返してきたときにショーダウンまでいくと、殆どの場合筆者は負けていましたね。
・PFRがお互い低い
これは先程述べましたが、ほとんどフォールドされてしまうため、序盤以降こちらからレイズすることはありませんでした。ブラインド分もらえるので得ではありますが、今回はナガメの他のプレイもみたかったのと、バンクロールをゼロにするまで時間がかかりすぎたので断念しました。これは対策する必要がありますね。
・ナガメのべット・レイズ傾向
試合序盤の
ナガメのべット・レイズは、いわゆるバリュー過多と呼ばれる状態だと思います。ブラフが殆どなく、強い手でしかアクションしない傾向にあります。これは、BBというポジションのせいなのかは不明です。しかし、ナガメのバンクロールが多い場合はべット頻度が多くなることも確認しており、かなりプレッシャーを感じました。余裕があるときはブラフも増えているようです。
・勝敗について
筆者のプレイスキルはルールを知っているだけのど素人で、プリフロップレンジも知りません。正しい知識はほとんどないと言って良いでしょう。じゃあなぜ勝てたのかというと、べット・レイズの傾向がそこそこ強い時(ブラフが少ない)という打ち筋をこちらが把握できたので、強いハンドが来るまでチェック、べットにはフォールドするという戦術をとったからだと思います。その中で、強いハンドがかち合ったときに勝負が決まるといった流れが多かったように感じます。ナガメは過去のプレイを考慮しないため、時系列の情報を処理できる人間側に軍配が上がったんだと考察します。

ナガメとの対戦の様子

別撮りでナガメのハンドを見せてもらったときの様子を載せます。ナガメのセリフが画像上にありますが、ハンドの強さとは関係ありません。

例1

1-1.フロップまでcall, checkで周り、ターンでナガメ(奥)がべットしてきた
1-2.筆者(手前)がフォールドすると、9のスリーカードがでてきた

例2

2-1. フロップで筆者がべット45,ナガメコール
2-2. ターンで筆者べット105, ナガメコール
2-3. リバーは筆者280べットに対してナガメがリレイズ554!
2-4. 筆者コールで勝利
見返してみると、フラッシュ主張されてるので上級者には苦しい場面?
こういった2ペアを降りれない筆者に対してはブラフがうまく効いていません笑

おわりに

勝負を避けるのも一つの戦術です。しかし、もう少しブラフをしたり、相手から搾取する度合いを強くするプレイも見てみたいです。
やはり、過去のプレイを考慮して行動を変化させて欲しいところです。こちらが一人で心理戦を繰り広げても(といっても、大したテクニックはありませんが笑)、全く意に関しませんし、面白みがないなと感じました。相手の癖や傾向を自身の戦術に取り入れるようなAIモデルを考えたいと思います。

補足:AIの学習に関して

図1:AIの学習の様子

AIの学習って何?何が難しいの?といった話をします。
ML-agentsというライブラリを使って、AI同士を対戦させて強いAIをつくる手法をとっています。どういうことかというと、二人のエージェント(AI)によるヘッズアップを行い、勝敗(報酬)とアクションを記録します。最初は良い選択が分からないので、ランダムな行動をします。次に、勝敗に結びついてそうなアクションをトライ・アンド・エラーします。これを繰り返すことで、勝てるアクションを学習するのです(図1)。
どれくらい繰り返すかというと、17万試合(1試合は一方のバンクロールがゼロになること。ハンドにして約100万!)ほどでそこそこのモデルができます。
NHLをAIに学習させる一番の問題は、恐らくゲーム状態数を大きさでしょう。一番の原因となっているべット・レイズのパターン数に加え、場のカードの組み合わせだけでも260万通りあり、これに自分と相手のアクション、バンクロールの状態も考えると・・・膨大です。とても全てのパターンを学習はできないので、ある程度似た状況はまとめて対応してもらいたいですが、似た状況をAIが認識するのはなかなか難しいようです。
また、もう一つの問題はポーカーが不完全情報ゲームだということです。囲碁や将棋などの場が全て見えている完全情報ゲームと違い、相手のハンドや山札が不明で運も絡むため、正しいアクションをしても負けるなどのパターンが学習を難しくさせていると感じます。

AIモデルへの入力情報を追加

part1でも書きましたが、AIへの入力方法は様々で、学習しやすい・しにくい数値があります。バンクロール(持ち点)を1000としたとき、1000をそのまま入れるよりも、-1から1の間で正規化という処理をすることが有効です。また、カードを認識させる際は、52個のベクトルを用意し、場や手札にあるカードの種類に対応したベクトルだけを1,他を0とするワンホットベクトルと呼ばれる方式をとるなど、入力を工夫しています。
今回はさらに、プリフロップ(場にカードが出る前の段階)時の手札の強さ(AA>KKなど)と、場のカードと組み合わせてできる役の強さ(ワンペア<ツーペアなど)を入力に加えました。
本来、これらの強さは学習の中で認識できるようになるのですが、カードとゲーム状態の組み合わせが大きすぎることから初めての場面で対応できなかったり、学習に時間がかかるといった問題があったので、最初から入力に加えました。
その結果、カードの強さを入力を加えた場合と加えてない場合のAIモデルで対戦をさせた結果、前者が圧勝したため、このアプローチも有効であることが分かりました。


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