*All archives* |  *Admin*

<<05  2018/06  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  07>>
麻雀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万とかになる)になってるのですけど、これって普通なんですかね?
パラメータ表のテキストファイルのサイズがもりもり増えたお。
スポンサーサイト
麻雀AI開発その83・レイアウトの変更とかの小細工
パソコンが変わって画像描画がずれたのが気になったのが前回の話。

まぁせっかくだからPictureboxの位置とサイズを再設計し直すかーと思って、今日はちまちま位置合わせとかの作業をしていました。
結果がこちら。
180306-01.png

ついでに手牌の位置が中央に来るように卓全体のサイズを広めに取ってみました。解像度がでかいパソコンなんでそれなりに画面の余裕ができましたし。
後は捨て牌の位置を完全に十字にするんじゃなくて、手牌と同様、卍っぽい感じでずらせば非リーチ時に対面どうしの牌のx座標が一致して牌の位置がきれいにそろうからそうしておこう。

今のPCと解像度が違うPCでどのように映るかはまだ未検証だけど、当分の間は一般に公開する予定はないので、まぁそこんところは今のところはいいことにしておこう。


後は、バージョン管理の仕組み(?)であるGitの扱いに悪戦苦闘していました。
あたいはただローカルでバージョン管理ができればそれでいいのに、非常にややこしくてつらいです。
リバートとかリセットとかブランチとかマージとかいまいちわからんとです。


記念すべき1000記事目なのに、本筋と関係ない、極めてどうでもいい話で終わってしまった…。
麻雀AI開発その82・解像度との闘い
年末に前のパソコンがぶっ壊れて、新しいパソコンを買ったのですが、
前のパソコンと新しいパソコンで画面解像度が違うみたいで、麻雀AIでディスプレイに描画するときに狙った通りにいかなくなってしまいました。
180302-01.png
牌の間がスカスカになってて、下家と対面の3段目の捨て牌がズレてる。

今まではAIの思考本体には影響はないので、これを放置してましたが、今日はちょっと時間ができたので、いろいろと試した結果がこちら。
180302-02.png
結局はPictureboxのサイズに拡大して画像を表示するというシンプルな方法に落ち着きました。
一応、牌のズレは収まりましたが、今度は牌の縦横の比率がおかしなことになっています。
自分と対面の捨て牌は横に太く、上家と下家の捨て牌は縦長になってるように見えます。

うーむ。
Pictureboxの位置とかサイズを再度設計し直そうか。ちょっとめんどうだけど。
麻雀AI開発その81・染め手パラメータその1
ここ何日かは染め手関連のパラメータを取るためにせこせこ牌譜解析しています。
その中で面白そうなデータがあったので1個紹介しておきます。

染め手聴牌に対してある牌が当たりになってる確率です。(一部抜粋)

180112-01.png

生牌(1枚持ち1枚見え)役牌の当たり率について。
場風や三元牌より(染め手者にとっての)自風の当たり率が2~3%くらい高くなっています。

おそらく場風や三元牌は染め者以外にとってもやや使いやすいので、絞られているケースが多くあって染め者以外が手牌に持ってる確率が上がって染め者が持ってる率が下がる、
一方、自風(染め者以外にとってはオタ風)は染め者以外にとっては使いづらい牌なので、先に切られることが多いが、
それがまだ場に出てないということは染め者が持ってる確率が上がる、
ということかなーと推測されます。

なお、この傾向は通常副露のケースにも当てはまるようです。(特に19オタ風仕掛けについては役牌の当たり率の絶対値がでかいので、影響も大きい。)
新年のあいさつとメモ
ちょっと遅いですが、あけましておめでとうございます。
今年もよろしくお願いします。

ここのところやる気とその他の都合で研究がご無沙汰だったのですが、
まぁ年も明けたし、重い腰を上げてAI作りを再開するかーと思っています。

やる気を出すために科学的に言われてることを実践してみようかと。
・とりあえずなんでもいいから始めてみる。
・目標を小分けにする。

次のでかい目標は染め手をAIで考慮できるようにすることです。
これができれば、いつもの何切る問題でわざわざ染め手関連を避けなくてもすむので、かなり作問の幅が広がってよりよくなるでしょう。
染め手のうち自手染め手狙いはいったん置いておいて他家染め手のケースを考えます。
踏むべきステップのうち、
①染め模様者が実際に染めに向かっている確率と聴牌率予測
についてはすでにできています。
一方、
②染め者の挙動を牌譜解析でパラメータとして取る
③パラメータをシミュレーションに織り込む
がまだできてないところです。

「とりあえずなんでもいいから始めてみる」、ということでまずは必要になりそうなパラメータの種類の書き出しからやってみます。
全体像の把握からしないとどうにもならないので。

・染め者聴牌時ある牌が当たり牌である確率
・染め者からある牌が切られる確率(リーチ者有無別・聴牌不聴別)
・染め者がいるときに別の他家からある牌が切られる確率
・染め者が牌を切った時に聴牌化する確率、聴牌を崩す確率(リーチ者有無別)
・染め者がある牌に対して鳴きを入れる確率
・染め者が鳴きを入れた後、ある牌が切られる確率
・染め者が鳴きを入れたときに聴牌化する確率
・染め者が和了した時の打点分布
 基本打点分布(役牌・ドラ・赤・清一色を除いたハン数符数)
 役牌暗刻数(副露数別、それぞれの役牌の場に見え方別)
 ドラ含有枚数(ドラ種類別)
 赤含み率
 清一色率(副露数別)

思わず、うへぇとため息が漏れますが、嘆いてばかりいても仕方ないので1個ずつ牌譜解析をこつこつやってくしかないですね。
プロフィール

nisi5028

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

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

この人とブロともになる

QRコード
QRコード