しばらく前に、他家染め手をAIで考慮できるようにしようと、いろいろパラメータ取りの牌譜解析をしていました。
確率系統(染め手者の聴牌率とか危険度とか)はパラメータをほぼ取り終えたのですが、打点関連をどうしたものかなーと思って途中でストップしていました。
通常副露とは違って、使える牌が限られてるので、ドラの枚数とか赤ドラ枚数とかを独立とみなして後付けでハン数UPする方式がちょっとまずそうかなーと思いました。
チンイツやトイトイの可能性がどの程度あるかによってもだいぶ打点分布は変わってくるだろうし、役牌の見え方とかもかなり重要と思われます。
そのへんを全部独立扱いにするのはかなり無理があるし、かといってそれらの要素を全部分類すればとてもじゃないけどサンプル数が足りなくなるのは明らかです。
次に考えたのが、ニューラルネットか何かで、他家染め手の手牌構成を読むことをしようかと。
これは思いついただけで、私の能力的にはかなり無理そうで実現可能性が低かったので、ここで思考がストップしてました。
やるとするなら、
単騎待ちかどうか、
単騎待ちなら雀頭は1通り(アガリ牌と同じ牌)、面子(4-副露数個分)がなにかを推測。
非単騎待ちなら、雀頭が何か、アガリ牌を含む面子が何か、それ以外の面子が何かを推測。
メンツ同士の相互依存関係(手役狙いなど)とか複合形をどう考えるか、
などで相当難しそう。
ここ最近思いついたのは、和了形をすべて推測できなくても打点に関係ありそうな情報をつまみぐいで入力してニューラルネットにぶちこんで、分類問題に似たような形でうまいことごにょごにょすれば打点分布だけならうまいこと推測できるんじゃない?というものです。
具体的にどんな感じかは↓の表を見てもらった方が早いと思います。

列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万とかになる)になってるのですけど、これって普通なんですかね?
パラメータ表のテキストファイルのサイズがもりもり増えたお。
スポンサーサイト