ベイズ推定を用いた
ポーカーハンド推定
自己紹介
名前:津田伸秀
サイト: http://vivi.dyndns.org/ twitter:vivisuke
facebook:https://www.facebook.com/nobuhide.tsuda
ぼちぼちソフト作家、年齢不詳のおじさん、自宅研究員(主席)
趣味:テニス、オセロ、思考ゲーム・パズル類
C++/Qt/Cocos2d-x 使い, 一応webアプリ(PHP, JS, jQ, SQL)も出来るよ
Windows用テキストエディタ ViVi を延々開発中
世界最速「さくさくエディタ」 も開発中だよ
迷走中、お仕事募集中でござるぞ
通常の研究開発報告
- 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,260