ポーカーソルバーの「収束」とは?Kuhn PokerでExploitabilityを再現する
1,000反復の時点で、平均戦略同士を対戦させた先手P0の期待値は、Kuhn Poker(クーン・ポーカー)の厳密な理論値と0.000001664アンティ/ハンドしか違いません。それでも、厳密なベストレスポンスは0.007269アンティ/ハンドのExploitabilityを検出します。見かけ上の収支は、戦略全体より先に「解けた」ように見えることがあります。
この食い違いがなぜ起きるのかを、途中の計算をブラックボックスにせず10万反復まで追います。決定論的なvanilla CFR(Counterfactual Regret Minimization)で全ゲーム木をたどり、反復直後の現在戦略と到達確率で重み付けした平均戦略を比較します。さらに、両プレイヤーについてルールと情報制約を守るベストレスポンスを全列挙し、データと2つの実装を公開します。
開示:これはGTO Geckoが制作した、3枚のカードだけを使う人工的な小規模実験です。GTO Gecko製品の出力、ホールデムのソルバー計算、他社ソルバーのベンチマークではありません。また、ここで使う反復回数が別のゲームにも適切だとは主張しません。
期待値が理論値に近くても「収束」とは限らない
このゲームで先手P0の厳密な期待値は、−1/18 = −0.055555556アンティ/ハンドです。1,000反復後の平均戦略を両者が使うと、P0の期待値は−0.055557220。絶対差は0.000001664です。
ただし、これは同じ学習途中の戦略同士をぶつけた結果にすぎません。「片方だけ戦略を変えたら、どこまで得を増やせるか」は測っていません。情報制約を守る厳密なベストレスポンスで調べると、両者の一方的な改善余地の合計はまだ0.014538213です。本記事の定義では、その半分に当たる0.007269106アンティ/ハンドがExploitability(エクスプロイタビリティ、被搾取可能量)です。
同じチェックポイントで、質問は2つ
期待値の確認:P0の期待値は既知の理論値に近いか。はい。差は0.000001664アンティ/ハンドです。
ベストレスポンスの確認:片方だけ戦略を変えたとき、どれだけ改善できるか。両席で平均すると、まだ0.007269106アンティ/ハンドです。
期待値が理論値に近いことは、有用な整合性チェックです。しかし、それだけでは収束の証明になりません。
ゲーム全体を1枚の木に収める
Harold Kuhnの原論文「A Simplified Two-Person Poker」は、非公開情報とブラフを残しながら、最適戦略を解析できる大きさまでポーカーを縮約しています。本実験の2人版では、強さが J < Q < K の3ランクだけを使います。
- 2人が1アンティずつ出し、各自に1枚のプライベートカードを配ります。残り1枚は見せません。
- 先手P0はチェックか、1アンティ分のベットを選びます。P0がチェックしたら、後手P1もチェックか、1アンティ分のベットを選びます。
- どちらかがベットしたら、相手はフォールドかコール。レイズはありません。
- チェックでショーダウンなら、勝者の純収支は+1、敗者は−1。ベットがコールされてショーダウンになれば、勝者が+2、敗者が−2です。
- 順序を区別した6通りの配札(JQ、JK、QJ、QK、KJ、KQ)を各1/6で評価します。
狭い画面では、横にスクロールしてベッティングツリー全体を確認できます。
ゲームが小さいため、評価を曖昧にしがちな要因を2つ排除できます。まず、ランダムサンプリングは使いません。毎回6つの配札をすべてたどります。次に、ベストレスポンスを近似する必要もありません。各プレイヤーが持つ「2択の情報集合」は6個なので、純粋な対抗プランは 26 = 64通り。両者について全件を調べられます。
ベストレスポンスは相手のカードを見てはいけない
ベストレスポンスとは、相手の戦略を固定したときに、自分の期待値を最大にする対抗戦略です。ただし、実際に知り得る情報しか使えません。ある情報集合で見えるのは、自分のカードと公開されたアクション履歴です。相手の伏せたカードがJならコール、Kならフォールド、という選び分けはできません。
JavaScriptの生成プログラムと独立したPython検証プログラムは、いずれも応答を player | 自分のカード | 公開履歴 だけで管理します。P0の64プランとP1の64プランを別々に全列挙します。両方の配札をキーに入れれば数値は計算できますが、それはカードを透視した対抗策であり、ポーカーのベストレスポンスではありません。
各プレイヤーが自分の戦略だけを変えたときの改善量を、それぞれ Δ0、Δ1 とします。本記事では次の2つを区別します。
NashConv = Δ0 + Δ1
Exploitability = NashConv ÷ 2
2行目は、2人定和ゲームについてOpenSpielの固定コミットにあるExploitability実装と同じ定義です。そこでは、情報制約を守る最悪ケースの相手に対する値を両席で平均します。別のソフトはNashConvをそのまま表示したり、ポットで正規化したりするかもしれません。ラベルだけを見て比較してはいけません。
10万反復の平均戦略では、P0の改善余地が0.000784906、P1が0.000567533アンティ/ハンドです。合計したNashConvは0.001352439、それを2で割ったExploitabilityは0.000676220アンティ/ハンド。いずれも期待純収支の単位で、パーセントではありません。
なぜ平均戦略と現在戦略が離れるのか
CFRの原論文は、各情報集合で反実仮想後悔値(counterfactual regret)を定義し、2人ゼロサム・完全記憶ゲームで、平均後悔値の減少を近似均衡へ結び付けています。この保証が対象にするのは、各反復の戦略を平均した戦略です。
固定した実装では、1反復ごとに次の処理を行います。
- 累積した正の後悔値から、regret matching(後悔マッチング)で現在戦略を作る。
- その戦略で全ゲーム木をたどり、各アクションの価値と現在戦略の期待値との差を情報集合ごとに累積する。
- 各情報集合へ自分が到達する確率で重み付けし、その反復の戦略を平均へ加える。
6つの配札をすべて評価してから、後悔値を同時更新します。下表の「現在戦略」は、その更新直後に後悔マッチングで得た戦略です。「平均戦略」は、1反復目から実際に使った戦略を到達確率で重み付けしたものです。サンプリングも乱数シードもありません。
表はすべて、OpenSpiel方式のExploitabilityをアンティ/ハンドで示します。パーセントではありません。狭い画面では横にスクロールできます。
| 反復回数 | 平均戦略のExploitability | 現在戦略のExploitability | 平均戦略のP0期待値 |
|---|---|---|---|
| 1 | 0.458333 | 0.333333 | +0.125000000 |
| 100 | 0.025675 | 0.228304 | −0.055987212 |
| 1,000 | 0.007269 | 0.215050 | −0.055557220 |
| 10,000 | 0.002318 | 0.149500 | −0.055546396 |
| 20,000 | 0.001633 | 0.333333 | −0.055536440 |
| 100,000 | 0.000676 | 0.267496 | −0.055554701 |
選んだチェックポイントでは、現在戦略のExploitabilityが1万反復の0.149500から2万反復の0.333333へ増えます。その間も平均戦略は0.002318から0.001633へ改善しています。10万反復では、現在戦略のExploitabilityは平均戦略のExploitabilityの約395.6倍です。これは今回の決定論的vanilla CFRと更新手順についての結果であり、別のアルゴリズムでも現在戦略が同じ動きをするという主張ではありません。
最終頻度は照合材料であって、収束スコアではない
10万反復後の平均戦略は、OpenSpielの固定コミットにあるKuhn Pokerの均衡戦略族とも整合します。たとえば、P0はJを20.5332%でブラフベットし、Kを62.4364%でバリューベットします。後者は前者のおよそ3倍です。P1はP0のチェック後にJを33.5669%でベットし、P0のベットにQで33.3412%コールします。
| 情報集合 | 対象アクション | 頻度 |
|---|---|---|
| P0がJ、最初のアクション | ベット | 20.5332% |
| P0がQ、チェック後のベットに直面 | コール | 54.1156% |
| P0がK、最初のアクション | ベット | 62.4364% |
| P1がJ、P0のチェック後 | ベット | 33.5669% |
| P1がQ、P0のベットに直面 | コール | 33.3412% |
| P1がK、P0のベットに直面 | コール | 99.9995% |
このゲームには解析された均衡戦略の族があるため、頻度の照合は有用な検算になります。ただし、頻度そのものが収束スコアになるわけではありません。複数の均衡戦略が同じゲーム価値を持つことがあります。また、目立つセルの数字がもっともらしくても、別の分岐に改善余地が残る可能性があります。両者それぞれに厳密なベストレスポンスを当て、戦略全体を評価します。
ソルバーの収束値を読む前に確認したい6項目
- ゲーム:どのレンジ、アクション、確率分岐、収支、レーキ、ICMを含むか。
- 戦略:平均戦略か、現在戦略か、途中保存した戦略か、後処理後か。
- 対抗戦略:ベストレスポンスは厳密か、上限付きか、サンプリングか。情報集合を守っているか。
- 集計:片方の改善量か、両者の合計NashConvか、両席の平均か。
- 単位:チップ、アンティ/ハンド、bb、mbb(1/1,000 bb)、どのポットを基準にした割合か。
- 範囲:ゲーム全体、部分木、ストリート、ノード、1ハンド、1アクションのどれか。
ゲーム全体の値を、個別ハンドの頻度誤差を保証する値に変換しないでください。スート別頻度を検証する記事(英語)では、アクションEVと入力の同型性を別に調べる理由を説明しています。製品チームがソリューション周辺の入力と成果物をどう検証するかは、GTO Geckoのソリューション作成工程を参照してください。均衡の入口はGTOポーカーとは何かで整理しています。
Kuhn実験からは言えないこと
Kuhn Pokerは、各自1枚のプライベートカード、ベットサイズ1つ、ボードなし、次のストリートなし、レーキなし、トーナメントの賞金構造なしのゲームです。ここでは全ゲーム木を簡単に走査できます。ホールデムの木には、レンジ、カード除去、多数のランアウト、複数サイジング、近似方法が加わり、トーナメントにはスタック価値の非線形性も加わります。
したがって、10万反復は今回の入力であり、推奨停止値ではありません。最終値0.000676は商用ソルバーの収束を保証するものではなく、特定ハンドの頻度精度も示しません。CFRの方式、平均化を始める時点、更新順、収支の尺度、Exploitabilityの定義が変われば、軌跡と表示値も変わります。
GTO Geckoとの関係
現在のGTO Gecko日本向けApp Store掲載情報は、プランに応じて利用できる、あらかじめ計算されたポーカー局面のライブラリ、アクション頻度、EV、レンジ構成、およびシミュレーション形式の練習を説明しています。この公開Kuhnプログラムはそれらの製品出力とは別で、製品を検証するものではありません。
持ち帰れるのは、数値の読み方です。混合頻度やEVを復習するときは、ゲーム定義と単位を残し、戦略全体の精度ラベルを1ハンドの保証に置き換えないでください。GTO Geckoはテーブル外で使う教育用ポーカー学習ソフトウェアで、賭け、賞金、リアルマネープレイは提供しません。
方法・ダウンロード・独立検算
公開配布一式に非公開のソルバー計算や顧客データは含まれません。決定論的に再生成でき、公開対象のファイルをあらかじめ限定しています。
- 方法と再現手順
- 実験条件・全チェックポイント・最終戦略JSON
- 1,006行の収束CSV
- 最終の現在戦略・平均戦略CSV
- JavaScript生成プログラムと厳密ベストレスポンス
- 独立したPython検証プログラム
- SHA-256マニフェスト
Python実装は、10万回の完全木更新を最初から繰り返し、保存した16チェックポイント、最終戦略24行、両者64通りずつのベストレスポンス、マニフェストに記録された全SHA-256ハッシュを照合します。Pythonを通常モードと最適化モード(-O)の両方で実行することを検証手順に含めています。
よくある質問
- Exploitabilityが0なら、画面上の全頻度が一意になりますか?
- いいえ。1つのゲームが複数の均衡戦略を持つことがあります。定義した厳密な評価で0というのは、片方だけ戦略を変えても改善できないという意味で、頻度表が1種類に決まるという意味ではありません。
- なぜ平均戦略同士の期待値だけでは不十分ですか?
- 2つの不完全な戦略のずれが相殺され、両者をそのまま対戦させたときのP0の期待値だけが理論値に近づくことがあるためです。本実験の1,000反復では、期待値の誤差は約0.000001664でも、厳密なExploitabilityは0.007269106アンティ/ハンド残っています。
- なぜ現在戦略は上下動し続けるのですか?
- 累積した正の後悔値が変わると、後悔マッチングが確率を大きく動かすことがあるからです。ここで使う古典的CFRの保証対象は平均戦略です。この結果を、すべてのソルバーやCFR方式の現在戦略へ一般化することはできません。
- 0.000676を別のソルバーの数値と直接比べられますか?
- ゲーム、評価戦略、ベストレスポンス、集計、単位が一致するときだけです。同じ最終平均戦略でも、NashConvを表示するなら約0.001352になり、ポット正規化ならさらに別の値になります。
出典
- H. W. Kuhn, “A Simplified Two-Person Poker” — ゲーム定義と最適戦略の原論文。
- Zinkevichほか、“Regret Minimization in Games with Incomplete Information” — CFRと平均後悔値に関する原論文。
- OpenSpielのKuhn Poker実装、コミット4840189 — 独立したゲーム定義と均衡解の照合。
- OpenSpielのExploitability実装、コミット4840189 — NashConvと2人ゲームの定義。