ベイズ推定を用いた

ポーカーハンド推定

自己紹介

名前:津田伸秀

サイト: http://vivi.dyndns.org/    twitter:vivisuke

facebook:https://www.facebook.com/nobuhide.tsuda

ぼちぼちソフト作家、年齢不詳のおじさん、自宅研究員(主席)

趣味:テニス、オセロ、思考ゲーム・パズル類

C++/Qt/Cocos2d-x 使い, 一応webアプリ(PHP, JS, jQ, SQL)も出来るよ

Windows用テキストエディタ ViVi を延々開発中

世界最速「さくさくエディタ」 も開発中だよ

パズルアプリ(Androidtmlib)も公開中だよ

 

迷走中、お仕事募集中でござるぞ

通常の研究開発報告

  • Background
  • 問題点
  • オリジナルな解決方法の提案
  • 実装・結果検証
  • まとめ、今後の課題

今日のお話

  • Background
  • 問題点
  • オリジナルではない解決方法の解説 ← ここまで
  • 実装・結果検証
  • まとめ、今後の課題

Background

二人零和確定完全情報ゲーム

AI vs 人間トップ

  • chess(10^120): カスパロフ vs Deep Blue 1997
  • Othello(10^60): 村上九段 vs Logistello 1997
  • 将棋(10^220): 三浦九段 vs GPS将棋 2012
  • 囲碁(10^360): セドル九段 vs AlphaGO 2016
  • バックギャモン:二人零和不確定完全情報
    • 2000年台初期にAIが世界チャンピオンを破る?
  • ホールデムポーカー:N人零和不確定不完全情報
    • ​人数が多いほど、不確定なほど、状態数が多い
    • 全探索が得意なAIには不利になる
    • リミテッド ヘッズアップ:数年前?にAIが世界チャンピオンに勝利
    • 通常のN人アンリミテッドでは人間トップが強い
  • ​人間に残された唯一の希望?>ホールデムポーカー

Texas Hold'em Poker

  • ワールドワイドには一般的なポーカーのプレイ方法
    • カジノでは最もポピュラーで人気が高い
  • 2人(ヘッズアップ)~10人でプレイ可能
  • 手役の勝ち負けだけで競うのではなく、チップ額で競う
  • プリフロップ、フロップ、ターン、リバーの4ベットラウンド
  • リングゲーム、トーナメント等の形式がある
    • リングゲーム:
      • カジノでプレイされる。
      • 出入り自由
    • トーナメント:
      • 試合等で採用
      • バーストすると退場。
      • 上位に残ると賞金ゲット

AI Texas Holdem Poker Offline

AI Texas Holdem Poker Online

  • http://vivi.dyndns.org/games/Holdem/
  • Android/iOS/Windows/Mac 版があるよ
  • Google Play
    • 「テキサスホールデム」:検索1位
    • 「texas holdem poker」:検索36位

FCCR デシジョンアルゴリズム

  • 確率論的乱択アルゴリズム
    • Fold, Check, Call, Raise
  • モンテカルロ法により勝率を推測
  • ポッドオッズ・リターン率を計算し、行動を確率的に選択
    • 例:勝率が 1 (ナッツ)であれば 99%の確率でレイズ
    • 例:リターン率が 1 未満であっても、1%の確率でレイズ(ブラフ)
  • 特定勝率、リターン率の時のFCCR率を決めるのも難しい
    • 自己対戦で決める?
    • ナッシュ均衡理論を用いる?

AI Holedm Poker の課題

  • オンラインランキング
    • http://vivi.dyndns.org/games/poker/form/rank.php
    • トーナメントリターン率(総賞金額/総参加費):0.83
    • ヘッズアップリターン率(総獲得額/総ベット額):1.04
  • RRが1.0付近に調整
    • 強ければいいというものではない
    • 世界チャンピオンの勝つのが目標ではない
  • が、それにしてもヘッズアップが弱い傾向にある
    • ヘッズアップの勝率を少し上げたい
    • できるだけ不自然でないプレイをさせたい
  • 現状:プレイヤーのハンドレンジを全く考慮していない
    • ハンドレンジ:手札範囲のこと

ベイズ推定を用いた

ポーカーハンド推定

ベイズ推定(1)

  • ベイズ確率の考え方に基づき、観測事象(観測された事実)から、推定したい事柄(それの起因である原因事象)を、確率的な意味で推論すること (wikipedia より)
    • 主観確率推定とも呼ばれる
    • 事前、事後確率:プレイヤーの手札確率
    • 観測事象:プレイヤーの行動
  • 事象 A のとき 事象 B が観測される確率を P(B|A) と表記
  • 事象 A, B がともに起こる確率: P(B|A)*P(A) = P(A|B)*P(B) なので、
  • P(B|A) = P(A|B)*P(B) / P(A)   ← これがベイズ推定の式

  •  

ベイズ推定(2)

  • 仮説:H1, H2, H3, ...
    • ΣP(Hi) = 1.0
  • 発生した事象:D
  • 仮説 Hi の時に事象 D が発生する確率:P(D|Hi)
  • 事後確率:P(Hi|D) = P(D|Hi) * P(Hi) / P(D)
  • ΣP(Hi|D) ​= 1.0 なので、P(D) は予め計算せず、後で正規化してもよい
    • P(Hi|D) = P(D|Hi) * P(Hi) * C
    • Hi の事後確率 = Hi の時にDが起こる確率 * Hi の事前確率 * 正規化定数

ベイズ推定をポーカーに応用(1)

  • 最も簡単なノーリミテッド)ヘッズアップに応用
  • プレイヤーの手札を C1, C2 とする
    • CPUの手札を除くと、場合の数は 50*49/2 = 1225
    • 最初は何の情報もないので、各手札の確率は 1/1225
    • double 型、要素数 52*51/2 = 1326の配列を作り、上記で初期化
    • ただし、CPUの手札の部分は 確率 0
    • これがプレイヤー手札の事前確率となる

ヘッズアップ画面

ベイズ推定をポーカーに応用(2)

  • プレイヤーの行動により、手札の各確率を更新
    • Fold した場合は、計算する必要は無い
    • 各手札での実際に行った行動の確率を予め決めておく or 計算し、それを事前確率に乗じることで、事後確率を計算する
    • P'(C1,C2) = P(C1, C2) * P(CCR);
    • 事後確率を正規化 ΣP'(Ci, Cj) = 1.0
  • 手札の各確率を元に、勝率を計算
    • 各手札ごとにモンテカルロ法で勝率計算し、加重平均
    • Pwin = ΣPwin(Ci, Cj) * P(Ci, Cj)

ベイズ推定をポーカーに応用(3)

  • フロップ・ターン・リバーの場合は、コミュカードを含む手札確率を0に設定
  • 以上で、勝率をより正確に推定可能になり、勝率が向上すると考えられる

to be continued.

今後の課題

  • 実装
  • 自己対戦による強さ評価
  • ヘッズアップ以外にも適用

ベイズ推定を用いたポーカーハンド推定

By Nobuhide Tsuda

ベイズ推定を用いたポーカーハンド推定

  • 3,289