*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開発その50・手牌情報と評価値関数作りその4
前回の続きです。

前回で、評価値関数の理論とプログラムを組めたので、最急降下法で繰り返しをやってみました。
しかし、最急降下法の欠点(収束が遅い)が露呈して、損失関数の減り方が遅かったです。

なので、準ニュートン法のBFGS公式を前に作ったエクセルマクロから移植して、プログラムを組みなおして使うことにしました。
BFGS公式でそれなりに収束速度が速く、局所的な停留点に行くことは保証されますが、ヘッセ行列の逆行列を計算するパートが新たに発生します。
これにかかる時間はO(M^2)≒1000^2なので、100試合のO(N)≒10万回に比例よりも時間がかかります。
また、M次元行列の情報を保持したり、出力したりしないといけないので、O(M^2)のスケールで容量をすごく食うというのもあります。(今のところは問題は顕在化してませんが。)

これでとりあえず100回繰り返したらこんな感じになりました。
損失関数(losssum)が最小となるようなパラメータを見つけるのが目的ですが、これでは具体的にどの程度合ってるかが体感でわかりにくいので、
学習データと評価値を比較した正答率(選択された打牌・鳴き等の評価値が他の取り得る選択の評価値のどれよりも高い時に「正答」とみなす。)を測定することにしました。
170810-01.png
損失関数の具体的な値はよくわからんのでおいておくとして、正答率66%というのはちょっとびみょうではないですか?(まぁランダム打牌の14分の1よりかははるかにマシですが。)
80%~90%くらいは正答してほしいイメージがあったので、ちょっとがっかりです。

具体的に出てきた最終のパラメータについても
ダブ風対子の役牌力がなぜか負の値になってるとか、不審な数値が多数出てきています。


まず、対処法として思いついたのが、あくまでBFGS公式は局所的な停留点を見つけることしかできなくて、最小値とは限らないので、与えた初期パラメータの値によって最小ではない停留点に引っかかっている恐れがある、
なのでいろんな初期値(ランダムに決める)からスタートしてみて複数の停留点っぽい点の損失関数(と正答率)を調べて、同じ点に収束しそうかどうか、とか、具体的に最小の損失関数を与えるパラメータ群を採用する、とか。

全パラメータについて[-2,2]の一様分布から選んだ乱数を初期値として与えてみてとりあえず20回繰り返してみたのがこちら↓。
170810-02.png
まだ収束しきってなさそうですが、劇的に改善する感じは今のところなさそうです。

後は、学習データそのものの問題もあるかもしれません。
学習データをcsvに出力する条件は
・シャンテン数が2以上(鳴きがからむときは鳴く前のシャンテン数が2以上)
・他家最大攻撃が2以下、つまりリーチやドラポンや染め副露や3副露がいない。
でやってたのですが、
終盤とかだと2副露以下とかでも安全度を重視するケースがあるかもしれない(自分が聴牌や一向聴ではないのでなおさらそういうケースが多発するかも。)ので、例えば10巡目以降の場合はばっさりカットしてしまうのもありかなーとは思っています。

それとコメントで教えてもらったのですが、ニューラルネットなる手法があるみたいです。
情報を漁ってみたけど、いまいちよくわからなかったです。(中間層?みたいなやつへの出力の方法とか。シャンテン数とか牌エネルギーみたいな全然関係ない特徴量的なものも重み?とやらを付けてで一括で処理していいものなのか、とか。中間層に排出された出力値を新たに重みを付けて関数に入れて評価値とする、的なところもいまいちよくわからなかった。)

というわけで今のところ若干手詰まり気味です。正答率66%で満足できるならこれでもいいのですが。
とりあえずプログラムを走らせて微修正していじってるうちにいいアイデアが浮かぶor教えてもらえばいいなぁ。
スポンサーサイト

コメントの投稿

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

コメント

完成面子数を使った評価の提案
応急処置的な手法として向聴数と一次有効牌枚数を使う代わりに数順後の完成面子数の確率分布を使ってみてはいかがでしょうか。
麻雀の性質上孤立牌がターツ化する受け入れはターツが面子化する受け入れよりずっと多く、面子手では向聴数より完成面子数が重要になることが多いと考えています。(統計による裏付けはないので完成面子数および向聴数ごとの和了率を調べてもらえるとありがたいです。)
実装としては、前に提案した手法と同様にモンテカルロシミュレーションをやるか、局終了時までにある牌をツモる確率を求めておき、手牌のパーツごとに面子化する確率を計算するという方法がありそうです。
Re: 完成面子数を使った評価の提案
提案していただきありがとうございます。今のところは現状のままでもうまいこといきそうです。
プロフィール

nisi5028

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

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

この人とブロともになる

QRコード
QRコード