強化学習
ReinforcementLearning
ゲーム理論
CFR
不完全情報ゲーム
51
どのような問題がありますか?

この記事は最終更新日から1年以上が経過しています。

投稿日

更新日

【ゲーム理論】展開型ゲームのナッシュ均衡を計算しよう:Counterfactual Regret Minimizationの解説

はじめに

ボードゲームやカードゲームにおけるAIといえば囲碁やチェスなどの完全情報ゲームにおける成功が印象的ですが,ポーカーを中心とした不完全情報ゲームも着々と攻略されてきています.

不完全情報ゲームではナッシュ均衡戦略を最適戦略として求めるというアプローチがしばしば取られます.実際,2人プレイヤのポーカーでプロに匹敵する強さを見せたLibratus[1]でもナッシュ均衡戦略を求めることが行われています.このときにナッシュ均衡戦略を求めるためにしばしば用いられるのがCounterfactual Regret Minimization (CFR)[2]と呼ばれるアルゴリズムであり,Libratusや6人プレイヤのポーカーAIであるPluribus[3]もCFRを基礎としたアルゴリズムによって戦略を計算しています.

私が以前に書いた記事では,花札「こいこい」にCFRアルゴリズムを適用した実例について紹介しました.今回は,CFRのアルゴリズムについての解説と,そのアルゴリズムの実装方法についての紹介を行います.

Notation

ナッシュ均衡についての定義やCFRで出てくる数式の定義を行うために,いくつかの用語を定義します.

まず,有限の展開型不完全情報ゲームは以下の要素から構成されます.

  • N={1,,n}n人のプレイヤの集合.
  • h:ゲーム中の意思決定点(ノード).そこに至るまでのプレイヤの行動の履歴によって定義される.
  • H:全ノードの集合.
  • Z(H):それ以上行動を取ることができない終端ノードの集合.
  • A(h)={a | haH}:ノードhで取ることが可能な行動の集合.
  • P(h)N{c}:ノードhで行動を取るプレイヤ.P(h)=cの場合,チャンスプレイヤが確率σc(h,a)で行動aを選択する.
  • ui:ZR:プレイヤiNの利得関数.二人零和ゲームの場合,すべてのzZについてu1(z)=u2(z)が成り立つ.
  • Ii:プレイヤiの情報分割,すなわち,Hi={hH | P(h)=i}の分割.
  • IIi:情報集合,すなわち,プレイヤiに属するノードの部分集合.h,hIであるとき,これらのノードはプレイヤiからは区別できない.

また,戦略やノードへの到達確率を以下のように定義します.

  • σ(I):プレイヤが従う戦略.A(I)上の確率分布として定義される.ただし,A(I)は情報集合Iで取ることが可能な行動の集合.
  • σi:プレイヤiの戦略,すなわち,各情報集合IIiからA(I)上の確率分布への関数.
  • Σi:プレイヤiの戦略の集合.
  • πσ(h):全てのプレイヤが戦略σに従って行動したとき,ノードhに到達する確率.
  • πσ(hz):全てのプレイヤが戦略σに従って行動したとき,ノードhに到達した状態からノードzへと到達する確率.
  • πiσ(h):プレイヤiが戦略σに従って行動し,それ以外のプレイヤが必ずノードhに向かうように行動するときに,ノードhに到達する確率.
  • πiσ(h):プレイヤi以外が戦略σに従って行動し,プレイヤiが必ずノードhに向かうように行動するときに,ノードhに到達する確率.
  • πσ(I)=hIπσ(h):戦略σに従った際に,情報集合Iに含まれるいずれかのノードに到達する確率.また,同様に,πiσ(I)=hIπiσ(h)πiσ(I)=hIπiσ(h)とする.
  • ui(σ)=zZui(z)πσ(z):戦略σに従った際のプレイヤiの期待利得.

ナッシュ均衡

定義

ナッシュ均衡は以下の式を満たす戦略の組み合わせσ=(σ1,,σn)として定義されます.

iN,ui(σi,σi)maxσiΣiui(σi,σi)

また,ϵ-ナッシュ均衡はナッシュ均衡の近似であり,以下のような式を満たす戦略の組み合わせσ=(σ1,,σn)として定義されます.

iN,ui(σi,σi)+ϵmaxσiΣiui(σi,σi)

なぜナッシュ均衡戦略に従うことが良いのか??

二人零和不完全情報ゲームではナッシュ均衡戦略を最適戦略として求めることがしばしば行われますが,これはなぜでしょうか??一般的なシングルプレイヤー設定の強化学習で行われるように利得(報酬)を最大化するような戦略を求めることはできないのでしょうか??

これに関しての説明を行うために,まず最初に,自分以外のプレイヤ全員の戦略が何かしらの戦略に固定されていて学習時にも実際のプレイ時にもその戦略に従っているケースを考えます.強化学習的に考えると,このケースでは相手のプレイヤは強化学習環境の一部であるとみなすことができるため,自分の期待利得は自分の戦略のみに依存していると考えることができます.なので,このケースではその環境のもとで利得を最大化するような戦略を求めれば良い,ということになり,この目的関数は一般的な強化学習の目的関数である報酬の最大化と一致することになります.

しかし,実際のプレイでは相手は学習時と同じ戦略を取ってくるかどうかはわかりませんし,色々なプレイヤと対戦することを考えると,相手の単一の戦略に対してだけでなく様々な戦略に対して強そうな戦略というものを考えたほうが良さそうです.なので,単一の戦略に対して利得を最大化する戦略を求めるようなアプローチでは良い戦略は得られないかもしれない,ということになってしまいます.

そこで代わりに最適戦略として定義されるのが,ナッシュ均衡です.ナッシュ均衡は,上述した定義から,どのプレイヤも自分だけが戦略を変えることによって,期待利得を上げることができないような戦略の組合せであることがわかります.特に,二人零和ゲームの場合,ナッシュ均衡戦略に従うことで相手の戦略に関係なく自分の期待利得をu1(σ1,σ2)以上にすることができます.これは利得の損失を最小限に抑えられることを意味しており,さらにこれに加えて対称性があるゲームの場合1,相手のどんな戦略に対しても期待利得が0以上になるため,ナッシュ均衡戦略は期待利得的に考えると負けない戦略である,ということが言えます.

これまでの説明をまとめると,ナッシュ均衡戦略は,二人零和不完全情報ゲームでは利得の損失を最小限に抑えられる(特にゲームに対称性がある場合は期待利得が0以上になる)という性質を持ちます.したがって,ナッシュ均衡戦略は相手の様々な戦略に対して安定して強い戦略であると考えられるため,二人零和不完全情報ゲームではナッシュ均衡戦略を最適戦略として求めることがしばしば行われます.

Counterfactual Regret Minimization

CFRは,反復的に戦略を更新することでナッシュ均衡を近似的に求めるアルゴリズムです.CFRでは,「この行動を取ったほうが良かった」という後悔 (regret) を小さくするように戦略を更新します.

Counterfactual Regret

CFRにおいて戦略の更新に用いられるregretは以下のようにして定義されます.

まず,CFRの反復tにおけるプレイヤの戦略をσtとします.また,情報集合Iに含まれるいずれかのノードから到達することができる終端ノードの集合をZIとし,ある終端ノードzZIへと到達することができるI中のノードをz[I]と定義します.情報集合Iにおけるプレイヤicounterfactual value viσtを以下の式で定義します.

viσt(I)=zZIπiσt(z[I])πσt(z[I]z)ui(z)

この式は,情報集合Iに到達したときのプレイヤiの期待利得に,プレイヤiが必ずIに向かうように行動したときにIに到達する確率を重み付けしたものとなっています.同様にして,viσt(I,a)をプレイヤiが情報集合Iにおいて必ず行動aを選択するように戦略σtを変更した場合のcounterfactual valueと定義します.

counterfactual value viσt(I),viσt(I,a)を用いて,反復tにおいて情報集合Iで行動aを取ることに対するinstantaneous regret rit(I,a)は以下の式で定義されます.

rit(I,a)=viσt(I,a)viσt(I)

この式は「情報集合Iで行動aを取るように戦略σtを更新したらどの程度期待利得が増えるのか,ということを定式化したregretとなっています.

最後に,反復Tにおいて情報集合Iで行動aを取ることに対するcounterfactual regret RiT(I,a)は,それまでの反復t (=1,,T)におけるinstantaneous regretを用いて以下の式で定義されます.

RiT(I,a)=t=1Trt(I,a)

counterfactual regretはこれまでの反復のregretの累積になっているという点がポイントです.これでCFRの戦略の更新に必要なcounterfactual regretの定義ができましたので,次は戦略の更新式の説明に移ります.

戦略の更新式

CFRでは各反復Tで各情報集合I,行動aに対してcounterfactual regret RiT(I,a)を計算し,それをベースに次反復の戦略σiT+1(I,a)2を計算します.

σiT+1(I,a)={RiT,+(I,a)aA(I)RiT,+(I,a)aA(I)RiT,+(I,a)>01|A(I)|otherwise

ただし,RiT,+(I,a)=max(RiT(I,a),0)とします.これは,counterfactual regretが正の値である行動に対して,その行動を取る確率をregretの比率で与えるという処理であると解釈することができます.

最終的な出力

CFRにおいて特に注意しなければいけないのが,CFRが最終的な戦略として出力するのは最終反復Tにおける戦略σiTではなく,以下の式で定義される平均戦略σ¯iTであるという点です.

σ¯iT(I,a)=t=1T(πiσt(I)σit(I,a))t=1Tπiσt(I)

これは,CFRにおいて平均戦略はナッシュ均衡へと収束が保証されている[3]からであり,逆に各反復の戦略はナッシュ均衡へと収束する保証はありません.ナッシュ均衡の近似解を求めるためにCFRを用いることがほとんどだと思いますので,そのようなときには平均戦略を最終的な出力とすることを忘れないようにしましょう.

なお,平均戦略がナッシュ均衡へと収束することは,各反復Tにおける平均戦略が2ϵ-ナッシュ均衡となることから導くことができます.ただし,ϵϵΔu,i|Ii||Ai|/Tを満たします3.この証明はこの記事では省略し,またの機会に行いたいと思います.

実装

前章ではCFRにおける戦略の更新方法や最終的な出力について説明しましたが,ここではCFRのアルゴリズムの実装について記述したいと思います.

CFRでは各反復ごとにすべての情報集合に対してinstantaneous regretを計算する必要がありますが,そのためにはすべての情報集合に対するcounterfactual value viσt(I),viσt(I,a)を計算する必要があります.その定義から,1つの情報集合Iのcounterfactual valueの計算には情報集合に含まれる各ノードを根とした部分木を探索する必要があります.これを愚直にやろうとして各情報集合のcounterfactual valueをいちいち一から計算すると,同じノードを何度も何度も辿らないといけないことになってしまいます.これでは計算量がとんでもないことになってしまうので,ノードを辿る回数をできる限り少なくすることを考えます.

強化学習におけるvalue functionを知っている方にとっては当たり前なことに思われるかもしれませんが,counterfactual valueは以下のように式を変更することで再帰的な形へと書き直すことができます.
まず,ノードhIから到達することができる終端ノードの集合をZIとすると,counterfactual valueは以下のように変形できます.

viσt(I)=hIπiσt(h)zZhπσt(hz)ui(z)

ここで,uiσt(h)=zZhπσt(hz)ui(z)としvalueと呼ぶことにすると,uiσt(h)は以下のように再帰的に書くことができます.

uiσt(h)=aA(h)σ(h,a)zZhaπσt(haz)ui(z)=aA(h)σ(h,a)uiσt(ha)

これはvalue uiσt(h)の計算には子ノードのvalueを計算すれば良いことを表しています.すべての終端ノードの利得が計算できればその親ノードのvalueが計算でき,それができればそのまた親ノードのvalueが計算でき,・・・,といった流れを繰り返すと,ゲーム木の根ノードを含めた全てのノードに対して再帰的にvalueを計算することができます.

この式を利用すると,ゲーム木の全ノードを一回ずつ辿るだけで,全ての情報集合に対するcounterfactual valueを計算することができます.以下の擬似コードはCFRのアルゴリズムであり,この擬似コードでも再帰的にvalueの計算を行っています.

image.png

関数CFRのパラメータは,行動履歴h,戦略を更新するプレイヤi,現在の反復数t,ノード到達確率πiσt(h),およびπiσt(h)です.変数vσはvalue uiσtに対応しています.
実装の仕方によっては各反復ですべてのプレイヤの戦略を同時に更新することもできますが,この擬似コードでは各プレイヤの戦略を交互に更新するようになっています.

実験

CFRのアルゴリズムがどの程度ナッシュ均衡に近い戦略を求められるかを調べるために,Kuhn Pokerと呼ばれるゲームにCFRを適用させる実験を行いました.実験に用いたコードはこちらに公開しています.

Kuhn Poker

Kuhn Pokerは非常に単純化されたポーカーであり,その単純さ故にゲーム理論を用いた完全な分析が可能な二人零和不完全情報ゲームです.

このゲームでは3枚(キング・クイーン・ジャックなどの3種類)のみのカードを用います.各プレイヤには3枚の中から1枚ずつカードが配られ,テキサスホールデムなどのようなポーカーと同様にベッドを行います.両方のプレイヤがベッドした場合,より高い数字のカードを持つプレイヤの勝利となり,利得2を得ます.両方のプレイヤがチェック(パス)した場合,より高い数字のカードを持つプレイヤの勝利となり,利得1を得ます.それ以外の場合(片方のプレイヤのみがベッドした場合),ベッドしたプレイヤの勝利となり,利得1を得ます.二人零和ゲームのため,負けたプレイヤの利得は勝利したプレイヤの利得に1をかけた値となります.

Exploitability

CFRの平均戦略とナッシュ均衡との近さを確認するために,exploitabilityと呼ばれる指標を用います.二人零和ゲームにおいて,ある戦略σ=(σ1,σ2)のexploitability ϵσは以下の式で定義されます.

ϵσ=maxσ1u1(σ1,σ2)+maxσ2u2(σ1,σ2)

戦略σがナッシュ均衡であるとき,このexploitabilityは0となります.逆にナッシュ均衡から離れた戦略となっている場合,maxσ1u1(σ1,σ2)maxσ2u2(σ1,σ2)は大きな値となるため,結果的にexploitabilityも0よりも大きな値となります.今回の場合はexploitabilityが0に近いほどナッシュ均衡に近い平均戦略が得られている,と考えてもらえれば良いと思います.

実験結果

各反復ごとの平均戦略のexploitabilityは以下のようになりました.

反復数が増加するにつれて平均戦略のexploitabilityが0に近づいていっており,平均戦略がナッシュ均衡へと近づいていっていることがわかります.

また,以下の図は,各反復Tごとの平均戦略σ¯T=(σ¯1T,σ¯2T)の期待利得u1(σ¯T)u2(σ¯T)です.

u1(σ¯T)118へと,u2(σ¯T)118へと近づいていることがわかります.これらの値はKuhn Pokerのナッシュ均衡の期待利得と一致しており,この観点からも平均戦略がナッシュ均衡へと近づいていっていることがわかります.

おわりに

今回は,展開型不完全情報ゲームのナッシュ均衡計算アルゴリズムであるCFRについての解説を行いました.次回は平均戦略がナッシュ均衡へと収束することの証明の解説を行おうと思います.

今回の実験で用いた内容も含め,CFRの実装コードをこちらに公開しています.CFRだけでなく,モンテカルロ近似を用いることで反復ごとに辿るノードの数を減少させたMonte Carlo CFR[4]の実装も含まれていて,今後も色々とアップデートをしていく予定です.よかったらスターやプルリク,宣伝などお願いします m(_ _)m

参考文献

[1] Noam Brown and Tuomas Sandholm. Superhuman ai for heads-up no-limit poker: Libratus beats top professionals. Science, Vol. 359, No. 6374, pp. 418–424, 2018.
[2] Noam Brown and Tuomas Sandholm. Superhuman ai for multiplayer poker. Science, Vol. 365, No. 6456, pp. 885–890, 2019.
[3] Martin Zinkevich, Michael Johanson, Michael Bowling, and Carmelo Piccione. Regret minimization in games with incomplete information. In Advances in neural information processing systems, pp. 1729–1736, 2008.
[4] Marc Lanctot, Kevin Waugh, Martin Zinkevich, and Michael Bowling. Monte carlo sampling for regret minimization in extensive games. In Advances in neural information processing systems, pp. 1078–1086, 2009.


  1. ゲームに対称性があるとは,自分と相手が同じ条件でプレイするゲームのことを指します. 

  2. 情報集合Iで行動aを取る確率 

  3. 収束の保証があるのは,完全記憶ゲームである二人零和ゲームのみです 

ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
ユーザー登録ログイン

コメント

この記事にコメントはありません。
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
Go強化月間~開発する上で知っておくべき知見を共有しよう~
~
エンジニア夏休み企画!~自由研究や読書感想文を発表しよう~
~
51
どのような問題がありますか?
ユーザー登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる
ユーザー登録ログイン
ストックするカテゴリー