TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

DeepNash(R-NaD)でクーン・ポーカーを学習する

DeepMindArxivで発表したDeepNash(R-NaD)OpenSpielに実装されたので試してみた。
※2022年12月にScienceにも掲載されました。

DeepNash(R-NaD)

DeepNash(R-NaD)は、不完全情報ゲームで探索なしでナッシュ均衡に収束するモデルフリーの深層強化学習アルゴリズムである。
海外で人気があるStrategoで人間のエキスパートレベルに達している。

クーン・ポーカー

キング・クイーン・ジャックの3枚のカードで行う単純なポーカーで、混合戦略ナッシュ均衡の解が解析されている。
プレイヤーには1枚ずつカードが配られ、残り1枚は未使用で、交互にベットかパスかを選択する。
利得表は以下の通りである。最大3手で勝負が付く。

OpenSpiel

DeepMindが開発しているオープンソース強化学習フレームワークである。
様々なゲームと強化学習アルゴリズムが実装されている。
R-NaDも最近追加された。
クーン・ポーカーでのテストコードも用意されている。

テスト

用意されているテストコードでは、学習の結果は表示されないので、損失と平均報酬、学習した方策を表示するようにコードを追加した。

--- a/open_spiel/python/algorithms/rnad/rnad.py
+++ b/open_spiel/python/algorithms/rnad/rnad.py
@@ -928,6 +928,9 @@ class RNaDSolver(policy_lib.Policy):
         "actor_steps": self.actor_steps,
         "learner_steps": self.learner_steps,
     })
+    logs['rewards'] = timestep['actor']['rewards'][9,:,:].mean(axis=0)
+    logs['states'] = timestep['env']['obs'][0]
+    logs['policy'] = timestep['actor']['policy'][0]
     return logs
--- a/open_spiel/python/algorithms/rnad/rnad_test.py
+++ b/open_spiel/python/algorithms/rnad/rnad_test.py
@@ -28,8 +28,12 @@ class RNADTest(absltest.TestCase):

   def test_run_kuhn(self):
     solver = rnad.RNaDSolver(rnad.RNaDConfig(game_name="kuhn_poker"))
-    for _ in range(10):
-      solver.step()
+    for _ in range(10000):
+      logs = solver.step()
+      data = {}
+      for state, policy in zip(logs['states'], logs['policy']):
+        data[int(state.dot(np.arange(11).T))] = policy
+      print(_, logs['loss'], logs['rewards'], data[2], data[3], data[4])

テスト結果

10000ステップ学習を行った結果、損失と平均報酬、1手目の方策は以下の通りとなった。

損失


平均報酬(移動平均100)


1手目の方策
カード アクション 確率
ジャック パス 0.824698
ジャック ベット 0.175302
クィーン パス 0.687148
クィーン ベット 0.312852
キング パス 0.478646
キング ベット 0.521354

※プレイヤーは、自分のカードのみで判断することに注意

考察

損失は、500ステップくらいで下がりきっている。

平均報酬は、理論値は、−1/18(≒−0.055)になる。
グラフを見ると、−0.04あたりに収束しており、理論値よりは高めの値になっている。

1000ステップ後に学習された1手目の方策は、キングのベットの確率/ジャックのベットの確率=2.97となっており、最適戦略の3に近づいている。
しかし、クィーンは常にパスが最適戦略であるが、パスの確率は0.687148で1からは離れている。

まとめ

OpenSpielに実装されたDeepNash(R-NaD)をクーン・ポーカーで試してみた。
結果、最適戦略に近づくことが確認できたが、理論値には収束しなかった。
ただし、モデルの構成(テストコードは中間層2層のMLP)やハイパーパラメータの調整で変わる可能性はある。

DeepNashは、行動空間が広く、手数の長い不完全情報ゲームでも適用できるアルゴリズムであり、適用できるゲームは広そうである。
大会が開催されているガイスターAIにも適用できそうなので、試してみたい。

余談

テストしているときにOpenSpielのR-NaDの実装にバグを発見したので、issueで報告したら修正された。
github.com