*All archives* |  *Admin*

<<08  2017/09  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  10>>
麻雀AI開発その67・染め手率と機械学習
今回からは染め手について考えてみようと思います。

従前の局収支シミュレーションだと、ある一定の条件(6巡以内の捨て牌に染め色がない、など7条件)に当てはまる仕掛けを入れている他家を「染め模様者」として、別のパラメータを使っていました。

ただ、この方式だと「染め模様」の定義に当てはまるかそうじゃないかの、0か1かしかないのがネックです。
捨て牌が1枚だけ違って「染め模様」の定義に入るか、入らないかで大きく挙動が異なるのは、実際の牌を使ったシミュレーション(逆に言うと従前の局収支シミュレーションでは、全部確率処理で、具体的に牌を使ってるわけではない。)ではちょっとよろしくないです。

できれば、この捨て牌・晒し牌から見て、実際に染め手である確率○%である、というのを(短時間で)計算できる評価関数を作ることができればベストです。

例えば初期状態(シミュレーション開始時点)で染め手である確率40%という予測値が分かれば、10000回シミュレーションのうち40%を染め手に向かっているものとして、そういう挙動(例えば非染め色を多く切る傾向にある、とか非染め色の仕掛けは入れないとか、上がった時の打点が染め手で高いとか)をさせ、残りの60%は染め色でない通常の仕掛けとして、それ相応の挙動をさせる、というような使い分けをさせることが可能になると思われます。

というわけで、課題は2つあります。
・染め手率を求める評価関数を作る。
・染め手に向かった者の挙動の元になる各種パラメータを取って、実際にシミュレーションに組み込む。

とりあえずは1個目の染め手率から考えてみることにします。
まず一つ問題になるのは、どのようなときに「実際に染め手に向かった」と判断するかです。
これは簡単そうに見えて実はそんなに単純な問題ではないです。

「上がった時に実際に一色手の和了である」という定義では、上がりまでたどりつかなかったケースがすべて非染め手と判断されてしまいます。
次に「局終了時に手牌が一色になっている」という定義も考えられますが、これも例えば途中でリーチが入って降りに回った場合が染め手でないと判断されてしまいます。
「手牌中の非染め色の枚数が単調非増加(つまりイコールか減少)」でも、途中で降りた場合が該当しないのでダメ。

今のところ自分の中で有力と考えているのは、「局終了までに非染め色の枚数が1枚以下である状態が1巡でもあった」という定義です。
1枚以下ならば非染め色で塔子や対子を構成できない(もちろん面子やポン・チー・カンも排除できる)ので、確実に染め手に向かっているだろうと判断できるだろうと思います。
これでも、非染め色を落としきる前に早いリーチがかかって染め手を諦めた場合が集計から漏れますが、まぁそういうケースは大して重要でないと思うのでいいことにしましょう。

これで、学習データで実際に一色手に向かったかそうでないかの判別がつけられる(と思う)ので、
今度は入力値としてどのようなものを入力すればいいか、という点を考えてみようかと思います。

○基本情報
・巡目
・副露数
・染め色はどの色か
・ドラ色か
・リーチ者有無(あるいは先制リーチ巡目)

○副露関連
・役牌のポン・カンがあるか
・タンヤオの可能性があるか

○捨て牌関連
・k巡目の牌区分(役牌・オタ風・染め色19・28・3~7・非染め色19・28・3~7)

特に処理が大変そうなのが、捨て牌関連ですかね。
9巡目あたりまでに絞ったとしても、9×8で72次元用意しないといけないので、ぷにゃー、となりそう。
OutofMemoryの影もちらついてきそうです。

まずはこれで学習データを準備するところから始めてみましょうか。
スポンサーサイト
麻雀AI開発その66・近況報告
麻雀AIの話の続きです。

あまり目立った進展はないですが、近況報告だけしておきます。

まずは鳴き判断の評価値関数の計算について、ニューラルネットに変更してパラメータを取り直しました。
あんまり従前と大きく変わることはなかったです。

それで、まだ染め手を入れてないですが、一応一区切りはついたので、
floodgate for mahjongで多数試合対局して、今のところの実力を測ろうかと思っています。

…なんですけど、現在、閑散としていて、自分以外誰もいません…。
全くマッチングしませぬ。(だれかきてほしいなぁ、と期待をこめたまなざしで見つめるわたし。)

「麻雀AIやってる人が全然いなくてうんぬん」みたいな話はよくされますが、ここでそれが露見して、つまづくとは思わなかったです。
誰か来るまで気長に待ちましょうかね。

とりあえず、1試合だけでも完走させて、ちゃんと正常に対局できるかどうかだけでも確かめたいところです。

もしfloodgateが頼れないなら自前で前バージョン(おそらく天鳳レートで1800くらい)と新バージョンを対戦させるプログラムを書かないといけないのかなぁ。
オフ会(麻雀AI開発者・麻雀研究者の集い)に参加して
先日、東京にて麻雀AI開発者・麻雀研究者の集いに参加してきました。

いろいろお話を聞かせていただいたうえで、自分のAI研究について思ったことをつらつらと書いていきます。


私の場合、最初に作ったのがモンテカルロ式の局収支シミュレーションからで、そこで得た知見を下地にしてAIに仕立て上げてるので、AIとしては正統派ではないらしいなーというのを感じました。
シミュレーションだと計算時間的に難があって、小手先のテクニックではどうにもならずに機械学習的な理論を取り入れた結果、シミュレーションと機械学習的なのが魔融合したなんかよくわからんごった煮みたいなのができてる感じです。

牌譜解析とシミュレーションを捨てて全部機械学習で設計していく方がスマートで、強いAIになるんでしょうけど、
今まで作り上げてきたものが全部崩れることになりかねないので、ちょっと抵抗感はありますね。
機械学習についてはちょっと前に勉強を始めたひよっこなので、その分野のみで先駆者に追いつくのはかなり困難というのもあります。

最初はシミュレーションが基本とした独自路線でやっていけばいいかなーと思ってはいたのですが、どうやらそうはいかなさそうだなーと感じました。
細かいアルゴリズムのことが分からない外部の人にとっては機械学習だろうが、牌譜解析とシミュレーションだろうが、アプローチの仕方が異なるとはいっても、そんなの区別はつかないからどうしても同じようなものとして見られるのは避けられないだろうとは思います。
そうなると、ソフトの性能、つまりAIの強さや考慮時間の短さで優劣がつけられ、劣っている方は誰からも見向きもされなくなってしまうのだろうと、かなり悲観的になっています。
競争とか成果主義とか成長戦略みたいなことは非常に苦手なんですが、社会というものはそういうものなんでしょうね…。
世界に一つだけの花のフレーズ、ナンバーワンにならなくてもいい、もともと特別なオンリーワン、というのが恋しいですねぇ…。

勉強になったのは待ち牌読みとか聴牌率読みとか染め手読みなど、個別のものも機械学習でもできるらしい、というところです。(ていうか、それが普通の感覚らしい。)
牌譜解析結果をパラメータとしてそのままべたっと使って後は個々の特徴量について独立性を仮定して単純掛け算するみたいな合ってるかどうかよくわからんのよりはスマートそうな気がします。少なくともその部分は伸びしろがありそうです。
なんですけど、まだ染め手の実装すらやってないので、まだスタートラインにすら立ててないのがあれです。

後はソフトのネーミングセンスの話とか。
今は仮に「麻雀添削くん」と命名してますが、現状そんなに強くないくせになんか先生みたいな上から目線なのはなにを偉そうに、とか言われそうです。
女の子とか、萌えキャラ?みたいな方が受けがいいという説があるらしいのですが、
個人的にはそういうのより動物系のかわいいキャラ(ピカチュウとかしろたんとか)のが好きなんですが、そういうところに私情を挟んでもしょうがないかもです。
既存のキャラ名とかぶらず、かつ麻雀と関係があるネーミング。
とりあえず、「まーちゃん」とか「まあたん」とか「じゃんのすけ君」とかしか思いつかない時点でセンスがないのがバレバレです。
なんかひらがなの方が柔らかい感じがして親しみやすいかなぁとは思ったけど気のせいでしょうか。
絵心がないので、自分でかわいいキャラを描けないのも一つ悩みの種かも。(そんなこと考えてる暇あったらさっさと研究しろ、と怒られるかもしれないけれども。)


というわけで、優秀な方とお話ができて、とても刺激になって得るものが大きかったですけど、少しセンチメンタルな気分になったそんなオフ会でした。
麻雀AI開発その65・1順当たりロン率補正その2
前回(麻雀AI開発その64・1順当たりロン率補正)の続きです。
ここ1週間くらいいろいろ牌譜解析しながらAI計算の和了時ツモ割合が高すぎ(出上がりが少なすぎ)問題を考えてみましたが、ようやく原因っぽいものにたどり着きました。

まずはひとつ特大バグがみつかりました。
AIと従前のシミュレーションの両方で、他家総副露数を調べてみたところ、AI側の鳴き発生率が極端に少なくなってることが判明しました。
170908-01.png
先制無筋カン28待ちの実測を取ってみたところ、従前シミュレーションの方が実測と大体合っています。
170908-02.png

AIの内部計算の鳴きのうち、間違ってたのはチーの方でした。無筋or筋or現物の変数を参照する際、今打たれた牌が同順フリテンで現物扱いになってしまっていて、チー発生率を極端に下げてしまっていた(現物→一度切った牌はほぼ鳴かれることがない)というミスでした。


後は他家→他家横移動率について、当たり牌が切られる補正(1より小さい値を掛ける)を入れていたものが実態に合っていない(むしろそれがない方が実際横移動率に近かった)ので、その補正を削除しました。

それで修正後のAI計算結果がこちら。
170908-03.png
他家チーが正常になったので、自手リーチへの押し返しが増えてツモ割合微減、被和了率増になったのと、
横移動率を上方修正した分が入っています。

肝心のツモ割合はあんまり変わっていませんが、以下の考えにより、今のままでも大問題ではないと結論付けました。

・今回の牌姿ではマンズの258mについてはカベ効果・序盤外側効果がない。
・非序盤外側と非カベの影響により、258mが切られる確率がAI内部計算で約3割くらい減になる計算になっているのを確認。
・従前局収支シミュレーションでは序盤外側やカベの待ちも1順当たりロン率の計算に入っているので、今回よりは高めの値が出やすい。
・出る率3割減なら全体ロン率も同じ程度の割合で動くので、和了時ロン割合も3割減(5割前後→35%へ。ツモ割合なら65%)になることも、あってはおかしくはなかろうと。

えらく回り道しましたが、バグもつぶれたし、まぁ結果オーライということで。
さて、元のAI開発に戻ることにしましょう。
Next→鳴き判断ニューラルネット、実戦(floodgate)へ投入、染め手絡み判断。
麻雀AI開発その64・1順当たりロン率補正
今回は別のところから重要そうなバグ(のようなもの)が見つかったのでそれの対応をします。

発端となったのは8月30日にツイッターで出題したこの問題です。
170830_Q.png
先制聴牌の待ち選択なので、従前の局収支シミュレーションでも麻雀AIでもどちらでも計算するのが可能なので、両方ともやってみたところ…
170902-02.png
なんか全然上がり率が違うんですけど、どうなってるのでしょう。
誤差というには済まないレベルです。

和了時ツモ割合から考えると、明らかにAIの方が出上がりを低く見積もっています。
ここで思いついたのが「他家→自分リーチに当たり牌が切られる倍率」のパラメータです。
これは読みなどによって同じ無筋の中でも当たり牌になりそうな牌は止まりやすい傾向にある、というのを表現するために付けたのですが、このパラメータをつけた後にカベ効果・外側効果の切られやすさ倍率を入れたので、
もとの「他家→自分リーチに当たり牌が切られる倍率」と合わせると過剰に出上がり率を割り引きすぎ、ということなのかもしれません。

これを裏付けるために牌譜解析をやりました。
170902-01.png
左側がそれぞれの区分(牌を切った人が聴牌かどうか・牌を切った人の副露数・自分(リーチ者)からみて切られた牌の見え方・筋か無筋か)ごとの実際に当たり牌が切られる確率、
中央がそれぞれの区分の条件が与えられたときにAIが算出した当たり牌の切られる確率(同区分内の平均値)、
右側が実際の切られ率÷AI計算切られ率の値(比率)です。

(0副露聴牌のAI算出切られ率がやけに低いのはなんらかの牌譜解析上のバグだと思いますが、それ以外のところでは、)
比率を見ると1より大、つまりAIが算出した当たり牌切られ率は過小評価しているところが多いというのが実証されたと思います。
0副露聴牌のバグの原因究明はやらないといけないですが、それが終わったらもとの「他家→自分リーチに当たり牌が切られる倍率」のパラメータに今回の値を乗算して(多くは1より大なので倍率が上がる)パラメータ表の修正すればいいかと思います。

同じことは副露聴牌・ダマ聴牌・他家→他家横移動についても言えるので、同じように牌譜解析してパラメータの修正をかけていきます。
プロフィール

nisi5028

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

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

この人とブロともになる

QRコード
QRコード