*All archives* |  *Admin*

<<03  2018/04  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30  05>>
麻雀AI開発その84・他家染め手和了時の打点分布予測
しばらく前に、他家染め手をAIで考慮できるようにしようと、いろいろパラメータ取りの牌譜解析をしていました。
確率系統(染め手者の聴牌率とか危険度とか)はパラメータをほぼ取り終えたのですが、打点関連をどうしたものかなーと思って途中でストップしていました。

通常副露とは違って、使える牌が限られてるので、ドラの枚数とか赤ドラ枚数とかを独立とみなして後付けでハン数UPする方式がちょっとまずそうかなーと思いました。
チンイツやトイトイの可能性がどの程度あるかによってもだいぶ打点分布は変わってくるだろうし、役牌の見え方とかもかなり重要と思われます。
そのへんを全部独立扱いにするのはかなり無理があるし、かといってそれらの要素を全部分類すればとてもじゃないけどサンプル数が足りなくなるのは明らかです。

次に考えたのが、ニューラルネットか何かで、他家染め手の手牌構成を読むことをしようかと。
これは思いついただけで、私の能力的にはかなり無理そうで実現可能性が低かったので、ここで思考がストップしてました。
やるとするなら、
単騎待ちかどうか、
単騎待ちなら雀頭は1通り(アガリ牌と同じ牌)、面子(4-副露数個分)がなにかを推測。
非単騎待ちなら、雀頭が何か、アガリ牌を含む面子が何か、それ以外の面子が何かを推測。
メンツ同士の相互依存関係(手役狙いなど)とか複合形をどう考えるか、
などで相当難しそう。

ここ最近思いついたのは、和了形をすべて推測できなくても打点に関係ありそうな情報をつまみぐいで入力してニューラルネットにぶちこんで、分類問題に似たような形でうまいことごにょごにょすれば打点分布だけならうまいこと推測できるんじゃない?というものです。

具体的にどんな感じかは↓の表を見てもらった方が早いと思います。
180420-01.png
列1個分が一色手かつ非門前で和了した、という状況を切り取った、サンプル1個分です。
黄色(正解打点)から上がニューラルネットに入力する要素(?というのかはわからないけど)です。
考慮する内容は一番左の列のラベルの通りです。
主にチンイツ・トイトイ・ドラ・赤・役牌の可能性にまつわる内容です。
一通・チャンタ・タンヤオ・混老頭・四喜和・字一色あたりは関連する入力値として入れてないので考慮されてないです。
小三元・大三元はギリギリ考慮されてる…はずです。白発中それぞれ別の重みパラメータを使ってるからそのへんの相互作用でごにょごにょできてたらうれしいなー程度。

黄色が実際の和了打点(ただし、子のロンでの換算)です。

黄色から黄緑(予測平均打点)の間がニューラルネットの出力値です。これはあるハン数符数になる確率分布を表しているつもりです。
出力層の活性化関数をソフトマックス関数にして、出力値から子のロン換算で平均打点の予測値を求めたのが、黄緑の行です。
損失関数は(「正解打点」-「予測平均打点」)^2として、損失関数の最小化(損失関数を重みパラメータで偏微分したものが0)となる点を確率的勾配降下法(ミニバッジ法、AdaDelta法)で求めました。

一番下の青色(誤差)は各サンプルにおける「正解打点」-「予測平均打点」の値です。

平均すると1件当たり約2000点の誤差(損失関数÷サンプル数、の平方根を取ったもの)で収まっています。
2000点も誤差があるというとでかいように思いますけど、「正解打点」は1ハンの差だけで、3900点とか7700点みたいに大きく動いてしまうので、個人的にはまずまず特徴を捉えられてるかなーと思っています。

例えば1件目(左から2列目)でチンイツ可能性ありだと2ハンの確率と跳満倍満の確率が高めに出ているようになっています。(正解打点は跳満の12000点)
予測平均打点は2ハンと跳満倍満の中間あたりで7607点となってますが、正解打点が2ハン側に振れるか、跳満倍満側に振れるかだけでこの1件の誤差は4000点クラスまで膨れてしまいます。
なので、誤差2000点というのはまぁそれなりには頑張ってるほうじゃない?と思うのはそういうわけです。

上で掲載したのは最初の20件分だけですけど、見た感じ、正解打点が高いものは予測平均打点も高めに出ていたりして、ある程度は「高そうな仕掛けは高く予測している」ことはまずまず実現できてるかなーと思っています。

もちろん、3ハン40符予測確率のところがほとんど0に近くて息してない、とか変なところもありますが、
目指してるのは百発百中で染め副露者打点をスパッと言い当てるところではなく、単にシミュレーションの一部で被和了時失点の予測で使いたいだけですので、まぁ今回はこんなところで十分でしょう。

というわけで、他家染め手に対するパラメータはこれで一通りそろったことになります。
これで第一段階のパラメータ取りまでできたことになるので、第二段階としてAIの思考に染め手を搭載するところに移ろうと思います。
パラメータの種類数がえらい多くて、ここから先もだいぶ大変ですけど、ぼちぼちやっていきますかー。

どうでもいいですけど、今回の染め和了時打点のニューラルネットの重みパラメータの次元数が24万とか(入力層100弱、中間層200、出力層12で、3つ掛け算すると24万とかになる)になってるのですけど、これって普通なんですかね?
パラメータ表のテキストファイルのサイズがもりもり増えたお。
スポンサーサイト
リーチがチートイかどうか読み…両面落としとドラ切り
前回は、リーチのチートイ割合が40%以上あれば、チートイを意識した字牌止め無筋切りができる、という話でした。

というわけで、チートイ読みについて、より精度の高い捨て牌の特徴をとらえたいと思います。

今日目を付けたのは、
・両面落とし
・ドラが切られていない。
です。
いずれもチートイ狙いにありがちな捨て牌の特徴です。

牌譜解析の取り方として、
・ドラが切られていない。
については、そのままなので、説明するまでもないですが、
・両面落とし
については、次のような条件で取りました。
・2~8牌の手出しがあった場合に、すでに両面塔子を構成できる±1の距離にある牌(2(8)牌については3(7)牌のみ)が切られている場合、「両面落とし」フラグをオンにする。
・リーチ宣言されたときの「両面落とし」フラグのオンオフの別で場合分けする。
この仕様なので、両面落としの1枚目については手出しツモ切りは問わないが、2枚目は手出しに限定されています。

それで、リーチ巡目別、切ってる3~7牌別、両面落とし別、ドラ切りor not別で牌譜解析でリーチ時チートイ割合を集計しました。
結果がこちら↓です。
180326-01.png
両面落としがされてるかつ、ドラが切られていない場合(両〇ド×の項)は確かにチートイ率が高まってるのが分かります。

ちょうど、今日実戦でいい感じのリーチを受けたので、例で挙げてみます。
180326-02.png
10巡目リーチで、切れてる3~7牌枚数7枚、両面落とし〇(ツモ切り6p→手出し5pが該当)、ドラ切り×
というわけで、チートイ率38.3%ということになる感じです。

このくらいのチートイ率なら(ベタオリするならば)、生牌字牌を止めて無筋を先に切る打ち筋もありかなーとは思います。
実戦では超愚形とはいえ、役有り筋待ち聴牌だったので、中と北はプッシュ、中筋のドラ5mでギブアップでした。

中筋ドラ5mの危険度はチートイに対しては20%くらい(サンプル数が多くなくて統計的にはアバウトな数値)、面子手に対しては5.1%で、トータル(40%チートイで計算)で、11%の放銃率です。
点棒的にリードしてるのもあるので、5mを止めたことについては悪くないと思ってます。
ただ1枚切れ中はともかく、生牌の北を押したのはちょっと疑問だったかもしれません。


というわけで、運よく(?)タイムリーなリーチが来たので、あれですけど、
今回の例のようにチートイを強く意識できる、チートイ率40%~30%のラインの読みができる捨て牌は現実的に存在しなくはないということです。

うん、まぁこれでチートイ読みについては満足いく結果が出たので、このテーマはこれでおしまいということにします。
チートイリーチの危険度その2
昨日のチートイリーチの危険度で、
・字牌について手持ち枚数別の分類を加える。
・ドラかどうかを分類する。
の修正して牌譜解析をやり直しました。

結果はこちら↓です。
180325-01.png
この部分は主題ではないので、軽く流すとして、ここからが本題。

一昨日のチートイ読みと今回の結果を組み合わせて、各牌の危険度比較をしてみます。
巡目は9巡目固定にします。
180325-02.png
左から2列目3列目の「チートイ危険度」と「面子手危険度」はそれぞれ100%チートイ(面子手)のリーチであると仮定した場合の放銃率(今日の結果)で、
4列目以降はリーチがチートイである確率がn%である、と読めた場合の危険度(内分計算による)です。

チートイの可能性が極めて低い場合、例えば3~7枚の切れてる枚数が0~1枚でチートイ割合が1%の場合(4列目の「1%チートイ」)だと、ほぼ面子手の危険度と同じです。

20%の確率でリーチがチートイである、と読める場合、これは前々回の結果から9巡目リーチで、切れてる3~7牌が7枚以上の場合です。
9枚中7枚以上真ん中牌とかあからさまに怪しすぎる捨て牌ですね。
これほど異彩を放つ捨て牌の場合ですら、孤立の生牌字牌(1見1持字牌)の危険度が5.0%で、無筋19とかの危険度が6.3%なので、まだ生牌字牌を止めて、無筋を先に打つようなベタオリ法はできない、ということですね。

仮に何らかの方法で、40%の確率でリーチがチートイである、と読める場合になると、ようやく1見1持字牌が無筋の危険度を上回るので、字牌を止めて無筋の数牌を打つ余地が生まれてきます。
孤立生牌字牌ですら、これなので、対子持ち字牌(2見2持字牌)とかなら、普通に対子字牌に手をかけるところでしょう。

面白いのは40%チートイの場合で無筋19・28・37の危険度がほぼ横並びのところですね。後は面子手の当たりやすさ(序盤外側など)とかで、字牌や端牌よりも37牌を打つケースもあるということかもしれません。
なお、両無筋46はチートイに当たる率は低いですけど、面子手の危険度が段違いなので、ベタオリから切ることはなさそうです。


というわけで、以上まとめると、
「チートイ率20%ではまだ危険度がひっくり返るまではいかない、できればチートイ率40%(最低でも30%)くらいの精度で読めないときつい」
という感じです。

まぁ実戦的に使える目安はできたので、後は「目指せチートイ率40%以上読み」ですね。
明日は両面落としリーチのチートイ率読みをやってみようかと思います。
チートイリーチの危険度
前回のチートイ読みについて、
リーチ者が切ってる3~7牌の枚数である程度チートイかどうかを読める、という話でしたが、
そもそもチートイリーチに対する放銃率が分からないのでは危険度比較がどうこうという話もできないので、
今日は放銃率(危険度)のデータを取ってみます。

集計時点はリーチされた瞬間に、リーチの当たり牌かどうかを調べます。(よって、後筋ひっかけとかは考えない。)
チートイのリーチ(チートイのシャンテン数が0。二盃口両面待ちとかも含まれる)については牌の種類と被リーチ者から見た当該牌の見えてる枚数別と筋か無筋か別。
非チートイのリーチ(国士以外は面子手)についてはいつもと大体同じ分類。
180324-01.png
180324-02.png
まぁ、面子手についてはそんなにいつもと変わりはないので、特にいうことはないです。

100%チートイを聴牌しているという条件付きでの危険度は面子手とは大きく違うのが分かります。
筋牌や字牌の危険度が高いです。1枚見え筋19で10%くらい、1枚見え字牌で10%~15%。
高いには高いですけど、図抜けて高いとかはないですね。チートイの待ち候補になるような筋牌とか字牌は通常複数あるから1牌当たりの危険度はまぁ常識的な範囲に収まると。

無筋の危険度もまったくゼロというほどではないなー、とこの文章を書きながら気づいたのですが、ドラは分類した方がよかったなーと思いました。ドラ単騎は無筋だろうと待ちとして選好されるので。(まぁ、それは明日やることにしよう。)

具体的な、牌の危険度比較についてのケーススタディは今日は時間がないので、また明日にしましょう。
リーチがチートイかどうか読み…3~7牌が切られた枚数別
今日は久しぶりに牌譜解析でもやって遊ぶことにしました。

テーマはチートイ読みです。
リーチがチートイかどうかを読むことができれば、実戦でも役に立つんじゃないかなーとか思ったり。

とりあえずは一番シンプルに、「リーチ者が切った3~7牌の枚数別」でリーチがチートイになってる確率を牌譜解析で取ってみます。
いっぱい真ん中を切ってたらチートイリーチの割合が上がるのでは?という仮説です。
180323-01.png
左の1~18は巡目、上の0~18がリーチ者が切った3~7牌の枚数です。

まずは1巡目リーチ(だいたいダブリー)のチートイ割合が高いなーと思いました。
特に宣言牌が3~7牌だとチートイ割合が20%とかまで増えるので、相当高いような気がします。

2巡目以降のリーチについても、3~7牌の枚数が増えるのに従って、チートイ割合が単調増加で増えてくのが分かります。
つまり先ほどの仮説はわりと当たっていると。
予想してたよりもけっこうチートイ割合が大きく違っててびっくりです。

例えば、7巡目リーチで3~7牌が0枚とか1枚だけしか切れてないとチートイ割合は1%とか2%とかしかないのに対し、
4枚とか切られてくるとそれが10%とかまで増えると。

割といい結果が出て満足なところですけど、
冷静に考えてみたら、チートイ割合が10%とか20%あると読めたところで、果たして戦術的に使えるか、というと微妙な気がします。
仮にチートイなら無筋牌は100%通るという荒っぽい仮定を置いたとしても、他の90%とか80%は普通の面子手なわけなんで、無筋の危険度はせいぜい1割とか2割減くらいにしかなってくれません。(無筋数牌待ちのチートイも存在することも考えれば、もっと差は小さい。)
無筋1牌の放銃率が例えば8%から1~2割減の7%に下がります!って言われて、実戦的に役立つかはちょっと自信がないです。少なくとも私レベルでは無理そう。チートイ臭い捨て牌でも字牌や筋を止めて無筋を切れるほど読みに自信がない。

まだチートイリーチの危険度を調べてないので、なんなんですが、
明日以降それも調べてみて分析してみたら、またおもしろいのかなーとか思ってます。
プロフィール

nisi5028

Author:nisi5028
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
フリーエリア
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード