*All archives* |  *Admin*

<<07  2017/08  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  09>>
麻雀AI開発その55・評価値関数を局収支に変換
前回の続きです。

今よりもっと鳴き寄りにするために、鳴き可能ボーナスをつけて再度準ニュートン法でパラメータ推定をやったのですが…。
鳴き可能ボーナス係数…0.05
しょぼいっ。評価値が0.05増えたところで大勢に影響は全然でないです。

なので、鳴き可能ボーナスは却下して、今のままにしておきます。


というわけで(若干不安要素はあるが)、2シャンテン以上の牌姿については評価値によって打牌ごとの手牌価値の優劣だけはできるようになりました。
逆に言えば自分の手牌(と場に見えてる枚数)しか見ていないので、他家の挙動(リーチと副露)には対応できていません。
評価値と他家への牌の危険度(具体的には放銃率×放銃時失点の危険度指数、単位は「点」。)を結びつけるために、評価値を局収支に変換することを考えます。
基本的には評価値がいいほどいい手牌であることがほとんどなので、評価値と局収支は正の相関があると考えられます。

具体的な理論は以下の通りです。(ただし、ところどころ端折っている。)

まずは以下のデータを実際の牌譜から取ってきます。
(前回取ったパラメータから計算した)評価値・現在巡目・親の位置・下家の攻撃度合・対面の攻撃度合・上家の攻撃度合、の組xに対してこの局の収支yを対応させる。
攻撃度合についてはリーチ・非リーチ面前と1~4副露×通常副露or染め余りなしor染め余りありorドラポンの18種類で分類する。

このとき、推定の局収支の値を次式でモデル化する。
170814-01b.png
p_1は評価値に対する倍率のパラメータで巡目と自分が親かどうかで分類します。つまり、18×2で36種類のパラメータになります。
p_2は他家攻撃の強さに関して補正するパラメータ(基本的に負の値を取る。)で、該当他家の攻撃度合と親の場所(自分or該当他家orそれ以外の他家)で分類します。18×3で54種類で、p_1、p_2合わせて90種類のパラメータがあります。

この推定局収支と実際の局結果との誤差(正値にするために2乗する。)の和が最小となるようなパラメータの組p_1とp_2たちを求めます。
最小化する目的関数は次のものです。
170814-02.png

あるパラメータ(90種類のうちの1つ)p_jで偏微分するとこうなるので、
170814-03.png
これ=0となるようなパラメータ群(のうち目的関数が最小となるもの)を準ニュートン法で探していきます。

試合数を増やしたり、繰り返し回数を増やしたりして工夫しながら(なかなか思うような結果が出なくて苦労した)出したパラメータはこんな感じ。

170814-04.png
p_1の方は巡目が遅くなると評価値が高い効果が薄まる(評価値に比例する成分が少なくなる)、自分親の方がより評価値が大きい効果が高い、
というのはいいです。
p_2については攻撃度合が強いほど(例えば0副露→リーチとか)マイナス補正が大きい、自分親の方が(たぶん被ツモ失点の関係で)マイナス補正が大きいというのはいいです。
問題は相手親のケースです。
子VS子よりマイナス補正が大きくなってほしいところなのですが、特に染め副露についてはうまいことマイナスが大きくなってくれていません。染め副露ならリーチでの損失がない分、親が攻めてくる損失が大きくない?とか親は遅い手なので、子の安い上がりが誘発されやすいとか?
ここはよくわかりません。

なんか準ニュートン法のヘッセ行列の逆行列の初期値次第ではうまく収束しないことがある、とか書いてたからその影響なのだろうか?もしくはコードの書き間違いか。
麻雀AI開発その54・評価値関数をAIに搭載(鳴き判断)その2
前回の続きです。

手役不確定について評価値にペナルティを課そうと、いろいろいじくってたら、かなり重篤なバグ(副露時にタンヤオ限定シャンテン数と一色限定シャンテン数が過大評価されることがある)を見つけてしまいました。

そのバグを直した上で、手役不確定ペナルティを加味させた評価値で再度鳴き判断を確かめてみます。
170813-01.png
バグを直した影響(パラメータがだいぶ変わった)で今度はかなりスルー寄りに傾きました。
誤答になってるのはすべて私は鳴いた方がいいと思うところ、AIがスルーと答えた状況です。

まぁ、役なしなどから鳴いてしまうよりは、慎重にスルーに寄りすぎる方がまだ実害は少ないような気がしますが、
私の考える最善と比較すると22個の鳴くべきと思われる手に対してAIは10回もスルーしてるので、副露率は相当下がりそうです。
鳴きすぎになったりスルーしすぎになったりと、なかなか思う通りに調整ができないですね。

というわけで、もうちょっと鳴き寄りに傾くように調整をがんばってみます。
今回は鳴き可能な手牌に対してボーナスを単純加算で付与する方向でやってみようと思います。
麻雀AI開発その53・評価値関数をAIに搭載(鳴き判断)
前回の続きです。
今度は鳴ける牌が出た時の評価値を同様に調べていきます。


170812-05.png
出5m。
役が見込めないのでスルー。
170812-06.png
出1m。
発対子。どうあがいても鳴くことになりそうなので、1mから仕掛けで問題なさそう。
170812-07.png
出白。
8s対子落としでホンイツ一直線の手もあるけど、2pが苦しいのでまぁAIの回答通り、とりあえず打1pでよさそう。
170812-08.png
出7s。
タンヤオ確定なので、たぶん鳴いた方がいいと思うのですが…。AIはスルーと言ってます。
170812-09.png
まだあまり数はチェックできていませんが、ちょっと気になる点があるのでいったんチェック作業を止めました。

正答率自体はそこまで悪くないですが、ツモへの打牌時と比べて、致命的なミスがちょくちょく見受けられます。
誤答になってるとき、人間(私)が考える最善手とAIの最善手との評価値の開きがかなり大きめになってるケースが多いです。

従前の役なしなのに鳴いてしまってるケースはかなり減ったけれど、まだたまーに散見されます。
全体的に鳴きすぎな感じはあるので、もうちょっとスルー寄り(面前側に有利)に調整した方がいいかもしれません。

具体的には、副露役なしフラグを少し変えようかと思っています。
今だと、手役「あり」と「なし」の2択のみで、
以下の条件のいずれかにあてはまっているときはすべて手役「あり」と判定しています。
・役牌対子以上がある。
・タンヤオ限定シャンテン数が全シャンテン数+1以下
・一色限定シャンテン数が全シャンテン数+2以下
・トイトイ限定シャンテン数が3以下
・三色or一通の出来パーツが7以上
・チャンタ限定シャンテン数が全シャンテン数+1以下

これを手役「確定」、「不確定」、「なし」の3択に変えようかと思っています。
「不確定」の条件は、↑の条件を満たしていてかつ、
・役牌刻子なし役牌対子あり
・タンヤオ限定シャンテン数=全シャンテン数+1
・一色限定シャンテン数=全シャンテン数+2
・チャンタ限定シャンテン数=全シャンテン数+1
のいずれかを満たす場合。

手役「不確定」の場合、単純減算で評価値にマイナス補正をかける方向で考えています。
(手役「なし」なら「シャンテン数と一次有効牌枚数」・「牌エネルギー」・「ドラエネルギー」を完全に0にしているのは変わらず。)

これで鳴きすぎを是正できればいいかな…と。

なので、学習データの取り直しとパラメータの選定(準ニュートン法)からやり直しになります。
まぁ強くするためにはしょうがないですね。
プログラム的にはそこまで大きな変更にはならないですが、単に計算時間(待ち時間)がかかるのが少し気分が盛り下がります。
麻雀AI開発その52・評価値関数をAIに搭載(打牌forツモ)
前回の続きです。

昨晩、1万試合分のcsvファイルで準ニュートン法しようとしたら、OutOfMemoryExceptionが出て止まっていました。
10000試合で3GBもあるcsvファイルを一度に内部変数に落とそうとするのは無理がありましたね。
いちいち手直しするのがめんどうだったので、昨日のうちに終わっていた1000試合分のパラメータでいいことにしておきます。

それで、今日は評価値を計算するパラメータ群をAIに搭載するところ(ツモ→打牌のところだけ)までできました。
実際の手牌に当てはめてみてこのパラメータが妥当かどうかをチェックしてみます。
170812-01.png
孤立役牌より孤立の9mを先に切る。これは正答。
170812-02.png
国士とチャンタが本線なので、4sから切りたいが、AIは7pだと言っている。
たぶんシャンテン数的にチャンタより国士の方が近いので、7pはいらないという判断をしていると思われます。
これは誤答。
170812-03.png
9pを残せば三色が見えるのでオタ風の南を切る。誤答。


という感じで、1試合分の牌譜について、5巡目までの2シャンテン以上の手牌について、AIの答えと人間(私)が考える答えが一致する割合を見てみます。
170812-04.png
サンプルの数(92手牌)が少なくてあれですけど(手作業で評価値とかを書き写してたのでめんどくさい)、正答率76%とまぁまぁいい感じです。思ったよりぽんこつではなかったです。
誤答についても多くの場合は私の答えはAIの次善手となっていることが多く、AIの最善手も人間の感覚と比べて、大きく損をしているようなことは多くはなかったです。
少なくとも手替わり0回再帰計算(2シャンテン)とか1次有効牌の枚数のみ(3シャンテン以上)よりはよっぽど精度は高いです。
うむ、よかったよかった。

次は鳴き判断についても同じようにチェックしてみようと思います。
麻雀AI開発その51・手牌情報と評価値関数作りその5
前回、評価値の正答率が66%はちょっとびみょう、と思ったのですが、
よく考えてみたら2シャンテン以上の手だと孤立字牌が複数とかあってどちらを切るかは指運によるところがある手牌もそれなりに多くありそうなので、正答率80%~90%を望むのはほぼ無理なような気がしてきました。
なので、この数値でまぁいいかと思いました。

ただ、改善した方がよさそうな部分もあったので、微調整を入れます。

・一次有効牌枚数の復活
シャンテン数ごとに係数を分ければ、異なるシャンテン数の有効牌枚数が混じらないからいけるんじゃない?と思いました。
170811-01.png
いまいちよくわかんないけど、シャンテン数が多いほど評価値が下がりそうなのでこの部分はいいことにしておきます。
5シャンテン・6シャンテンはなんか係数がマイナスになってる(有効牌枚数が多いほど評価値が下がる)けど、まぁそんなに遠い手は出現頻度が多くないから放置でいいことにしておきましょうか。

・字牌の牌エネルギーについて
枚数とオタ風役牌を独立扱いにしていたけれど、それに見えてる枚数も加えて分類を増やした。

・晒し牌エネルギーについて
鳴きの種類で分類を増やした。
170811-03.png


それで1000試合分で100回準ニュートン法をやった(約数時間かかる)のですが、まだ不審な点がありました。
一番やばそうなのが、孤立字牌の牌エネルギーの評価。
170811-02.png
普通ならオタ風<役牌<ダブ風の順に手に残されやすいので、牌エネルギーもこの順に大きくなってくれるのが望ましいのですが、1枚見え孤立ダブ風の係数がオタ風の係数にすら負けてるというありさまです。2枚見えシングル役牌もオタ風に負けてます。
さすがにこれはちょっと…ねぇ。
一番比較することが多い孤立字牌どうしの比較なので、あんまりよろしくないですねぇ。
まぁでも、個別のパラメータをひっかき回すよりは、実際にこれらパラメータをAIに搭載して、実際の手牌で評価値を比較して確かめるのがよさそうですが。

1000試合でダメなら10000試合に増やしてみようか。準ニュートン法の繰り返し回数は20回とか50回くらいに抑えればたぶん一晩とかいうレベルで終わりそうなので。
計算時間さえ許せば試合数が多くなることは数値の安定性とかの面で正義でしょうから。

プロフィール

nisi5028

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

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

この人とブロともになる

QRコード
QRコード