*All archives* |  *Admin*

<<09  2017/10  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  11>>
麻雀AI開発その72・染めパラメータ(カベ効果放銃率・ツモ和了率)
染め手パラメータ取りの続きです。

↓染め聴牌者へのカベ効果放銃倍率(染め色数牌のみ)
171004-01.png

↓染め聴牌者の1順当たりツモ和了率
171004-02.png
愚形聴牌が多いためか、リーチや通常副露とかよりはツモ和了率控えめですね。

Next牌譜解析
染め者が切る牌分布(リーチ者なし・リーチ者あり)
麻雀AI開発その71・染めパラメータ(聴牌率・放銃率)
前回の続きです。

前回までで、他家の染め手割合の見積もり関数ができたので、今回からは実際に染めに向かった者(非染め色の枚数が1枚以下になった瞬間があったという条件)での、各種パラメータを取っていきます。

とりあえず必要そうなものはかたっぱしから牌譜解析で調べてみます。

まずは、実際に染めに向かった者の初期聴牌率です。
カテゴリ分けはだいたい従前局収支シミュレーションと同じです。(巡目・副露数・染め色余りありなし・リーチ者有無と切ってる無筋現物枚数)
最初は初期聴牌率も機械学習の手法でやろうと思ったけど、なんかうまいこといかなかった(染め色が切られたのに聴牌率が下がった)ので、いつもの雑いやり方(各分類ごとの相互作用はないものとして、単純に掛け算補正するやり方)にします。
171003-01.png

次に染め聴牌者に対してある牌を切って当たる確率です。
従前では副露数と余りあるなしで分けていましたが、今回は染め手模様の条件でなく、実際に(ほぼ)染め手に向かった者なので、
副露数による放銃率の違いはそんなに大きくなかったので、全部一緒くたにまとめちゃいました。
171003-02.png

Next牌譜解析予定
数牌放銃率カベ効果倍率
染め聴牌者ツモ和了率
麻雀AI開発その70・染め手率と機械学習その4
前回の続きです。

ニューラルネットで染め手率を予測しようといろいろアルゴリズムとかをいじっています。

まず、パラメータの数値の選定方法として使っている、遺伝アルゴリズムがどうも胡散臭い感じがしたので、そこを疑うことにしました。
次元の数が数万クラス(入力層200前後、中間層200)のものに対して、損失関数の低さ的に優勢なものが生き残りやすい構造にしているとはいえ、基本的によさげなものをしらみつぶし的に調べる方式に近いので、次元のでかさ(パラメータの取り得る幅)に対して十分探索できていないのではないか、という疑惑です。

ちょうどいいところに確率的勾配降下法というのを勉強してなんとか使えそうだったので、そっちに移行することにしました。
こっちなら損失関数の勾配をだんだん下っていく感じなので、全探索的な方法じゃなくていいかなーと思ったので。
ただ微分を計算しないといけなくて、なかなか理論微分値と実測微分値が合わなくて苦労しましたが。
「おぷてぃまいざー」とかいうなんか確率的勾配降下法の中でもいろいろアルゴリズムの種類があるらしかったのですが、「AdaDelta」というものを採用しました。理由はなんか収束が早い部類らしくてわりかしコード書くのが簡単めだったから。後はノリ。

後は、サンプル数の偏り(非染め手の方が10倍くらい多い)があったので、染め手と非染め手の偏微分の計算を1件ずつ交互にする(染め手と非染め手で別のリストを作って全件調べ終わったらまた先頭に戻る)ことでサンプル数をそろえる的なことをやってみました。

ただ、これでもなかなか狙った通りの予測染め手率になってくれませんでした。(かなり上目の数値が出る傾向があった。)
あくまでトータルの損失関数が最小値を取るパラメータ群を求めてるだけなので、必ずしも実際の染め手率とは合わないのかもしれません。

出てきたパラメータを実際の牌譜(訓練データとほぼイコール)に当てはめて、ニューラルネットの関数にぶちこんだものを柱状グラフみたいなので分析してみたのが↓のグラフみたいな感じです。
170929-01.png
捨て牌と鳴き方から求めた予測染め手率が45%~50%の間に入ってるのが2426件(全体は1000試合までのデータで113160件)あって、そのうち訓練データの答えが「染め手」と判断した(つまり、終局までの間に手持ち非染め色が1枚以下だった瞬間があった)件数は204件なので、実際に染め手だった割合は8%くらいしかないので、実際と予測がだいぶずれています。

予測と実測はイコールではないけれども、↑のグラフを見るとなんとなく正の相関(線形ではなさそうだけど)があるように見えます。

ためしに予測染め手率と実測染め手率のロジスティック変換(y=log(x/(1-x)))を噛まして散布図を描いてみると…
170929-02.png
なんかよくわからんけど、かなり強い正の相関があって、しかも直線で回帰式っぽいものができそうでした。
(実際は各ラベルごとのサンプル数が異なるので、単純に回帰式の公式に当てはめるのはちょっとやばいんですけど、もう勢いでそのままにしちゃった。)

…というわけで、次のような形で染め手率を予測します。
(1)捨て牌と鳴き方を入力値として、確率的勾配降下法で求めたパラメータを使って中間的な予測染め手指数的なのを出す。(ただし、次のステップに渡すのは出力層の活性化関数(シグモイド関数)を噛ます前の値)
(2)回帰直線(1次式)で中間的な予測染め手指数を変換する。
(3)最後にシグモイド関数を噛ませて最終的な予測染め手率とする。

実際の牌譜で確かめてみます。
170929-03.png
東ポンで1p8pの切り出し。
マンズとソーズの染め手率が8%ずつ。

捨て牌的にはやや染め手っぽいけど、役牌ポンなのでその点では染め手っぽくない。
なので、両方合わせて16%くらいというのは、そこまで感覚とかけ離れてる、というわけではないように思います。
170929-04.png
続いて打発。
字牌なので、染め手っぽさが少し薄れて、予測染め手率4%+4%。これもいいでしょう。
170929-05.png
次の例。

789pチーで4m2mの切り出し。相当染め手っぽいけど、予測値は30%くらい。うーん、ちょっと予測値が低いように感じるけど、まぁ役牌後付とか三色一通チャンタ系もあり得るので、著しく不合理まではいかないか。
170929-06.png
白ポンで打東。
染め手っぽさはちょっと薄れて10%くらいまで予測染め率が下がる。まぁこれもいいでしょう。


結局のところ、重要なのはシミュレーションでの挙動なので、染め手割合が10%単位で違うということでなければ、まぁそこまで細かく染め手率が1%2%違うからといって、目くじら立てなくてもいいような気がします。
実際、こういう予測染め手割合の求め方をデータ面から一般に出してる人は今のところいないでしょうし、今のところはこれでいいことにしましょう。
なにより、同じテーマでとどまり続けるのに飽きてきました。

なんで、予測染め手率についてはこれでいいとして、次は実際に染め手に向かった者の挙動についてパラメータを取得する作業に移ろうと思います。
ただ、これについてもけっこういろいろ取るべきパラメータの種類は多いです。
単純に今までリーチと副露(+ダマ)のパラメータを取ってたものに新たに染めが加わるに等しいので、今までの作業の半分くらいの分量を新たにやる必要があります。

また、シミュレーションの難易度も染め手かどうかの分岐が入るので、より難しくなります。

まぁ、次の段階に進めただけでもよしとしましょうか。
麻雀AI開発その69・染め手率と機械学習その3
前回(麻雀AI開発その68・染め手率と機械学習その2)の続きです。

続きなんですけど、染め手率の予測関数を作るのがかなり難航しています。
パラメータらしいものは取れるんですけども、なかなか実際の感覚と適合してくれない状況です。

例その1
170926-01.png
役牌ポンで3巡目発以外は全部ピンズの捨て牌。
まだマンズかソーズかは分からないですけど、この局面のマンズ染め手率とソーズ染め手率の予測値として、
0.75%という結果を返してきます。両方合わせて1.5%。
いくらなんでもそれは低すぎじゃないですかね?

副露手のうち染め手に向かっている割合は1割前後なので、役牌ポンで初手が端牌であることを考慮したとしてももうちょい高いのを出してほしいところですが。体感的には少なくともこの手の染め手率5%くらいはあると思うんですけど、どうでしょう。

例その2
170926-02.png
ピンズ端の仕掛けで、4m2mの切り出し。
この情報でピンズ染め手率56.6%というのはまぁいいとしましょう。
170926-03.png
ここから白ポンして打東で、染め手率が一気に10.7%まで低下。
確かにホンイツ以外に役ができたとはいえ、そういうもんですかね…。

課題
・入力情報として副露の情報が「その他仕掛け」「タンヤオ仕掛け」「役牌仕掛け」の3パターン+副露数のみで、かなりお粗末なのが原因か。→仕掛けのパターン(ポンカンが役牌・オタ風・染め色19・28・37・46・5、チーが123・234・345・456で計11パターン)ごとに重みパラメータを変える。
・染め手に向かった割合が全データのうちの1割くらいしかないので、多数派の染め手に向かってないデータのかたまりにパラメータが引っ張られる傾向があるかもしれない。(この前の鳴き判断のときみたいにほぼ全部スルーと答える、みたいな事態に近いことが発生している可能性がある。)→データ数をそろえるために、染め手に向かったデータの総数よりも多い非染め手のデータをカットする。


今すぐ関係ある話ではないですけども、機械学習についての情報収集をしていたところ、パラメータ選定の手法として、確率的最急降下法という方法があるらしいです。
なんでも、学習データ1件ごとの勾配を使ってパラメータの修正を図っていく的なものらしいです。
(この前東京行ったときに聞いた話はこれかー、と遅ればせながら納得しました。)
これだと、全データについて毎回目的関数を計算しなくていいから楽そうな感じに見えました。それと全データについてメモリを確保しなくて済むのもかなりのメリットっぽいです。

ただ、今だと微分を使わないごりごり脳筋の遺伝アルゴリズムでやってるので、新たに微分を計算しないといけないようです。
全部の重みパラメータについて、ニューラルネットで合成関数の偏微分するって…。
活性化関数も途中で噛むから3つくらいの合成関数の微分の積になるからぷにゃーってなりそう。

計算時間が超長くて耐えられなかったり、入力情報が多くてメモリが足りないという事態になったらそれを検討しましょうか。
新しくコード書いたり手計算したりするのがめんどうなものぐさモードです。
カンチャンVSシャボ論争
今回のネタは先制面前聴牌でカンチャンかシャボか待ち選択ができるときに、どちらに取るのが有利か、というお題です。

一般的にはカンチャンよりシャボ、とはよく言われますが、ただしシャボが中寄りでカンチャンが端寄りならカンチャンというのも聞きます。
そのへんを細かく見ていこうかと思います。

方法は製作中の麻雀AIで、自分の手牌と4人の捨て牌をてきとうに決めて、シミュレーションパートの局収支で判断します。

手牌を変えていろいろやってみたのがこちら↓。
170925-02.png
2段あるうちの上段がシャボ待ち、下段がカンチャン待ちとなる打牌です。

・愚形複合塔子が688だったら、だいたいシャボ有利。例外はシャボが1枚少ないかつ雀頭が3~7のとき。(6切りリーチにより、6がたくさん場に切られて8待ちがカベになるケースがあるためか、かなりシャボ寄りのところが多い。)
・愚形複合塔子が668だったら、雀頭28でシャボ寄り、雀頭37が微妙、雀頭46ならカンチャン寄り。
・愚形複合塔子が133だったら、雀頭28で微妙、雀頭3~7でカンチャン寄り。
・愚形複合塔子が335、355だったらシャボ有利。
・愚形複合塔子が446だったら、雀頭28で微妙。(赤5受けがある分だけ割とカンチャン寄りになってる感じ。)

てきとうにやっただけなので、全部網羅できてるわけではないですが、まぁこんなところで。
全体的にはシャボの方がいいところがやや多そうですが、思ったよりはカンチャンも健闘している印象を受けました。

これは特定牌姿に限定した話で、一般論ではないので、場況とかそのへんはてきとうに各自で補正してください。(最後は投げやり)
プロフィール

nisi5028

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

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

この人とブロともになる

QRコード
QRコード