*All archives* |  *Admin*

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

コメントの投稿

Secret
(非公開コメント受付中)

コメント

No title
ニューラルネットを使った打点予測に関して教えてください。
ニューラルネットの打点予測の公式を用いて、人間の分かる形で打点予測をする(「打点はこう読め」みたいに具体的に書くこと)ことは可能だと思いますか?
Re: No title
>ニューラルネットの打点予測の公式を用いて、人間の分かる形で打点予測をする(「打点はこう読め」みたいに具体的に書くこと)ことは可能だと思いますか?

ニューラルネットの計算式から導くには重みパラメータの数が多すぎて、直接解析するのはかなり困難だと思います。

可能性があるとするならば多数の牌譜(URL+局数+誰視点で見るか)と予測打点分布(もしくは予測平均打点)の出力値の組を手作業で見ていっておおよそこういう傾向があると人間の目で判断する、
もしくは、入力値と出力値の組自体はcsv形式ですでにあるので、エクセルのフィルターか何かで、ある1個の要素について特定の条件に当てはまるときの平均打点を見るとか、ですかね。

まったく不可能ではないけれど、新たに汗水たらしてがんばるくらい価値のあるテーマではない(ぶっちゃけやる気が出ない)感じです。
No title
ありがとうございます。
なお、nisiさんにやってくれというつもりはありません。
変な誤解を与えたなら申し訳ありませんでした。

前々から、「我々は、ニューラルネットワークの研究から個別具体的な結果しか受け取ることができないのか。公式があるならばそこから抽象的な法則を直接導き出すことができるのではないか」という疑問がありまして。
nisiさんがニューラルネットワークを使って調べられたということを見たので、それについて質問させていただきました。

どうもありがとうございました。
大変楽しく記事を拝読させて頂きました。
気になった点について、質問させて下さい。
softmaxを噛ませずに直接打点を予測した方が精度自体は高くなるように感じたのですが、softmaxを噛ませたのはやはり打点の分布を計算するためでしょうか。
それとも、もしかして精度自体もsoftmaxを噛ませた方が高くなるのでしょうか?
Re: タイトルなし
> softmaxを噛ませずに直接打点を予測した方が精度自体は高くなるように感じたのですが、softmaxを噛ませたのはやはり打点の分布を計算するためでしょうか。

後で、麻雀AI内部のモンテカルロシミュレーションの中で、染め手者の打点分布を使いたい(各シナリオごとにnハンm符というのを決定する必要がある)のが今回の研究の第一目的であるため、回りくどくsoftmax関数を入れています。

後、コメントが来てたのを忘れてて、返信が遅れてすみませんでした。
ご回答ありがとうございます。合点がいきました。

次の開発記事も楽しみにしております。
プロフィール

nisi5028

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

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

この人とブロともになる

QRコード
QRコード