
ポーカーAIを作るための強化学習入門
ナガメ研究所 (@2c7f08445fde)
AIを使った面白いコトを探してます。今はポーカーAIの開発をしており、強化学習や自然言語処理に興味があります。難解な数式や英語は記事に出てきません。AIことが分からなくても大丈夫です!ぜひフォローよろしくお願いします!
AKQゲームで考える「AIが駆け引きを学ぶ仕組み」
こんにちは。ナガメ研究所です。
今回は、ポーカーAIを作るうえで理解しておきたいAI技術のひとつ、強化学習について解説します。
AIを作るといっても、その学習方法にはいくつか種類があります。代表的なものには、次のようなものがあります。
教師あり学習
教師なし学習
強化学習
これらは、AIにどのように学ばせるかによって分類されます。
たとえば、現在よく知られているChatGPTのような生成AIでは、教師あり学習だけでなく、自己教師あり学習や、人間のフィードバックを使った強化学習など、さまざまな技術が組み合わされています。
この記事では、その中でも特にポーカーAIと相性のよい 強化学習 に絞って説明していきます。
強化学習とは何か
強化学習とは、AIが試行錯誤を繰り返しながら、報酬が大きくなる行動を学んでいく仕組みです。
人間がAIに対して、
「この場面では必ずこうしなさい」
と細かく教えるわけではありません。人間が用意するのは、主に次の2つです。
AIが行動するための環境
行動の結果として返ってくる報酬
そのうえでAIは、自分で何度も行動を試しながら、「この行動をすると得をしやすい」 「この行動をすると損をしやすい」という傾向を学んでいきます。
ポーカーはこの強化学習と非常に相性がよいゲームです。なぜなら、ポーカーでは常に「どの行動が最も期待値が高いか」を考える必要があるからです。
AKQゲームとは
ここで、ポーカーを極限までシンプルにした AKQゲーム を考えてみます。AKQゲームとは、名前の通り、AKQ の3種類のカードだけを使った、非常にシンプルなポーカーゲームです。
2人のプレイヤーに1枚ずつカードを配り、カードの強さは次のようになります。
A > K > Q
A が最も強く、K がその次、Q が最も弱いカードです。
役やボードは存在しません。スートも関係ありません。手札1枚の強さだけで勝負します。
ただし、ポーカーなので、単純に強いカードを持っている人が必ず大きく勝つわけではありません。
なぜなら、ポーカーには次のようなアクションがあるからです。
チェック、ベット、コール、フォールド
たとえば、弱いQ を持っていても、ベットによって相手を降ろせる可能性があります。 反対に、強いA を持っていても、相手にコールしてもらえなければ大きく勝つことはできません。
つまりAKQゲームは、ポーカーの複雑な要素を極限まで削ぎ落とし、ベットの駆け引きだけを学ぶのに適したゲームです。
AKQゲームをAIに学習させる
このAKQゲームをAIにプレイさせるとします。まず、AIにAKQゲームを何度もプレイさせます。AIには、たとえば次のような環境情報を与えます。
自分のカード 相手の行動 現在のポット 自分が選べるアクション
AIはその状況ごとに、
チェックする ベットする コールする フォールドする
といった行動を選びます。
最初のうちは、AIはどの行動が強いのかわかりません。そのため、ランダムにベットしたり、意味の薄い場面でフォールドしたりします。
しかし、ゲームを何度も繰り返すことで、少しずつ次のような傾向を学んでいきます。
「この場面でベットすると期待値が高い」 「このカードでコールしすぎると損をする」 「この状況ではフォールドしたほうが損失を抑えられる」
このように、AIは経験を通じて、よりよい行動を選べるようになっていきます。
報酬をどう決めるか
強化学習では、行動の結果としてAIに 報酬 を与えます。AKQゲームの場合、報酬はシンプルです。
勝てばプラス。 負ければマイナス。
より正確には、チップを多く獲得できる行動ほど高い報酬となり、チップを失う行動ほど低い報酬になります。
たとえば、次のように考えます。
報酬 = 獲得したチップ - 失ったチップ
1チップ勝てば、
r = +11チップ負ければ、
r = -1となります。
ここで r は reward、つまり報酬を表します。
AIはこの報酬をもとに、
「どの行動を選ぶと、長期的に得をしやすいか」
を学習していきます。
状態・行動・報酬で考える
強化学習では、AIが見ている状況を 状態 と呼びます。
AKQゲームでは、状態sはたとえば次のように表せます。
s = (自分のカード, 相手の行動, 現在のポット)ここで s は state、つまり状態を表します。
そして、その状態でAIが選べる選択肢を 行動 と呼びます。
a = チェックor ベットor コールor フォールドここで a は action、つまり行動を表します。
AIは、ある状態 s にいるとき、行動 a を選びます。 その結果、ゲームが進み、最終的に報酬 r を受け取ります。
整理すると、強化学習の流れは次のようになります。
状態 s を見る → 行動 a を選ぶ → ゲームが進む →報酬 r を受け取る → 次回以降の行動を改善するこれを何度も繰り返すことで、AIは少しずつ強い行動を覚えていきます。
Q値とは何か
AIが学びたいのは、
「ある状態で、ある行動を選ぶと、どれくらい得をしそうか」
です。
これを数値で表したものを Q値 と呼びます。
Q(s, a) = 状態 s で行動 a を選んだときの期待値たとえば、次のようなQ値があったとします。
Q(Aを持っている, ベット) = 0.8これは、
「Aを持っているときにベットすると、平均して0.8チップ得をしそう」
という意味です。
一方で、次のようなQ値も考えられます。
Q(Qを持っている, コール) = -0.4これは、
「Qを持っているときにコールすると、平均して0.4チップ損をしそう」
という意味です。
AIは、このQ値を少しずつ更新しながら、どの行動が得なのかを学習していきます。
Q値の更新
AIは最初、各行動のQ値を知りません。
そのため、最初は適当に行動します。 しかし、実際にプレイして報酬を受け取るたびに、Q値を少しずつ更新していきます。
更新のイメージは、次のように表せます。
新しいQ値 = 古いQ値 + 学習率 × (実際の報酬 - 古いQ値)記号で書くと、次のようになります。
Q(s, a) ← Q(s, a) + α × { r - Q(s, a) }ここで α は学習率です。
学習率とは、新しく得た結果をどれくらい強く反映するかを表す値です。
たとえば、ある状態でベットした結果、大きく勝てたとします。 その場合、その行動のQ値は少し上がります。
Q(Kを持っている, ベット) が上がる
反対に、ある状態でコールした結果、何度も負けるようであれば、その行動のQ値は下がります。
Q(Qを持っている, コール) が下がる
このようにしてAIは、
「このカードでは強気にベットしたほうがよい」 「この状況ではコールしすぎると損をする」 「この場面ではフォールドしたほうがよい」
といった判断を、経験から学んでいきます。
探索と活用
ここで、もうひとつ重要な問題があります。
AIが常に一番Q値の高い行動だけを選んでいると、新しい戦略を試せなくなります。
たとえば、最初のうちにたまたま「Qでは必ずフォールドしたほうがよい」と学んでしまった場合、Qでブラフする可能性を試さなくなってしまいます。
しかしポーカーでは、弱いカードでも一定の頻度でブラフすることが重要です。 そのため、学習中はAIにランダムな行動も選ばせます。
この考え方を、探索と活用 と呼びます。
探索:まだ試していない行動を試す
活用:これまでの学習で良いとわかっている行動を選ぶ
たとえば、次のように行動を選ばせます。
一定の確率 ε で、ランダムな行動を選ぶ それ以外の確率 1 - ε で、Q値が最も高い行動を選ぶ
記号で書くと、次のようなイメージです。
ε の確率 → ランダムな行動を選ぶ 1 - ε の確率 → Q(s, a) が最大になる行動を選ぶ
ここで ε は、どれくらい探索するかを表す値です。
学習の初期は ε を大きくして、いろいろな行動を試します。 学習が進むにつれて ε を小さくし、だんだんとQ値が高い行動を選ぶようにします。
AKQゲームでAIが覚える戦略
このような学習を繰り返すと、AIは少しずつポーカーらしい戦略を覚えていきます。
たとえば、次のような判断です。
Aを持っているときは、積極的にベットする。
Qを持っているときでも、一定の頻度でブラフする。
Kを持っているときは、相手の行動に応じてコールやフォールドを使い分ける。
重要なのは、AIに対して、
「Aなら必ずベットしなさい」 「Qなら必ずフォールドしなさい」
と直接教えているわけではないという点です。
AIは大量の試行錯誤を通じて、自分で期待値の高い行動を見つけていきます。
AKQゲームにおける強化学習の流れをまとめると、次のようになります。
AIにカードを配る
現在の状態 s を確認する
方策にしたがって行動 a を選ぶ
ゲームを進める
勝敗によって報酬 r を受け取る
Q(s, a) を更新する
これを何度も繰り返す
この繰り返しによって、AIは単に「強いカードなら勝つ」という判断ではなく、
「相手を降ろせる場面ではベットする」 「コールされやすい場面では強いカードでベットする」 「期待値が低い場面ではフォールドする」
といった、ポーカーらしい駆け引きを学んでいきます。
強化学習とナッシュ均衡
このように、強化学習では、AIが試行錯誤を通じて期待値の高い行動を学んでいきます。
そして、この考え方を突き詰めていくと、最終的には ナッシュ均衡 と呼ばれる状態に近づいていきます。
ナッシュ均衡とは、すべてのプレイヤーが最適な戦略を取っている状態のことです。
もう少し噛み砕くと、
「自分だけが戦略を変えても、それ以上得をできない状態」
です。
相手も最適にプレイしているため、自分が一方的に戦略を変えても、期待値を上げることができません。
ポーカーの文脈では、この考え方は GTO にもつながります。
GTOとは、Game Theory Optimal の略で、日本語では「ゲーム理論的に最適な戦略」と言われます。
ポーカーにおけるGTOとは、相手に大きくエクスプロイトされにくい、理論上バランスの取れた戦略のことです。
たとえば、強いハンドだけでベットしていると、相手に簡単に降りられてしまいます。 反対に、ブラフが多すぎると、相手に簡単にコールされてしまいます。
そのためGTOでは、
バリューベットの頻度 ブラフの頻度 コールの頻度 フォールドの頻度
などを、バランスよく組み合わせます。
AKQゲームのようなシンプルなゲームでも、この「バランス」の考え方は非常に重要です。
ノーリミットホールデムでは一気に複雑になる
ナガメ研究所が目指しているのは、この考え方をノーリミットホールデムに応用し、ポーカーAIを開発することです。
ただし、AKQゲームと違って、ノーリミットホールデムの計算量は膨大です。
まず、プレイヤーに配られる2枚のハンドだけでも、組み合わせは1,326通りあります。
さらに、フロップ・ターン・リバーの5枚のボードまで含めると、1人のハンドとボードの組み合わせだけでも約28億通りになります。
そして、6人でプレイする場合は、各プレイヤーに2枚ずつカードが配られ、さらにボードが5枚出ます。 カードの配られ方だけでも、およそ次のような規模になります。
約 10 の 24 乗通り
これだけでも非常に大きな数ですが、実際のポーカーではさらにアクションが加わります。
プリフロップ フロップ ターン リバー それぞれの場面で、
ベット チェック コール レイズ フォールド オールイン
といった選択肢があります。
さらにノーリミットホールデムでは、ベットサイズを自由に選べます。
小さいベット ハーフポット ポットベット オーバーベット 小さいレイズ 大きいレイズ オールイン
このように考えると、ノーリミットホールデムで最適戦略を求めることが、どれほど大変かがわかります。
AKQゲームでは数えられる程度だった状態や行動が、ノーリミットホールデムでは一気に天文学的な数になります。
それでも、現在はこの膨大な計算の一部をうまく抽象化しながら、ナッシュ均衡に近い戦略を求めるソルバーやサイトが存在しています。
これは本当にすごいことです。
まとめ
今回は、ポーカーAIを作るうえで重要な技術である 強化学習 について、AKQゲームを例に解説しました。
強化学習では、AIに正解を直接教えるのではなく、AI自身が試行錯誤しながら報酬の高い行動を学んでいきます。
AKQゲームでは、AIは次のような流れで学習します。
状態を見る 行動を選ぶ 報酬を受け取る Q値を更新する また次のゲームで試す
これを何度も繰り返すことで、AIは少しずつポーカーらしい駆け引きを覚えていきます。
そして、この考え方はナッシュ均衡やGTOにもつながります。
もちろん、実際のノーリミットホールデムでは、カードの組み合わせもアクションの数も膨大です。 そのため、AKQゲームのように単純にはいきません。
しかし、まずはAKQゲームのような小さなゲームで考えることで、ポーカーAIがどのように学習していくのかを直感的に理解しやすくなります。
次回予告
次回は、この強化学習の仕組みを一部使って、実際にポーカーAIを開発している様子をお見せします。(まだまだ初期段階で期待した動作はしてくれていませんが)
将来的には、開発したAIを公開して、みなさんに遊んでもらったり、ライブ配信でAI同士の対戦や、人間との対戦を見せたりしていきたいと考えています。
「こんな機能があったら面白そう」 「こんなコンテンツを見てみたい」 「AI同士の対戦を見たい」
などありましたら、ぜひコメントしてください!
クリエイターの人気記事

ポーカーAIの開発日記
コメント (0)
まだコメントはありません
ログインすると、コメントできます