機械学習的な手法による麻雀AI開発の試行

戻る

1.はじめに

機械学習的な手法で麻雀AIの開発を試行する。このテキストはそのメモ書きである。

2.関連研究

※一致率とは学習データ以外のデータとの、ツモ局面時の一致率のこと。 ・ディープラーニング麻雀 -オートエンコーダとドロップアウトの有効性- https://ipsj.ixsq.nii.ac.jp/ej/index.php?active_action=repository_view_main_item_detail&page_id=13&block_id=8&item_id=145797&item_no=1 一致率:43.7% ・麻雀の牌譜からの打ち手評価関数の学習 http://www.logos.ic.i.u-tokyo.ac.jp/~kitagawa/papers/gpw07.pdf 一致率:56% ・牌の有無や点棒の数等の原始的な特徴を用いた麻雀評価関数の性能解析 http://entcog.c.ooco.jp/entcog/contents/symposium/date/2015/3-3-p.pdf ・ニューラルネットワークを用いた麻雀の打牌選択方法の提案 https://ipsj.ixsq.nii.ac.jp/ej/index.php?active_action=repository_view_main_item_detail&page_id=13&block_id=8&item_id=142572&item_no=1 一致率:31.3% ・降りるべき局面の認識による1人麻雀プレイヤの4人麻雀への適用(天鳳のレートが1507だった時の爆打) http://www.logos.ic.i.u-tokyo.ac.jp/~mizukami/paper/GPW_paper_2013.pdf 一致率: Rank 1 Rank 2 Rank 3 53% 77% 85% (参考)上級者=筆者=人間 Rank 1 Rank 2 Rank 3 62% 85% 93% RankNは打牌の第N候補以内の一致率という意味。 ・期待最終順位に基づくコンピュータ麻雀プレイヤの構築(天鳳のレートが1844だった時の爆打) http://www.logos.ic.i.u-tokyo.ac.jp/~mizukami/paper/GPW_paper_2015.pdf 一致率: Rank1 Rank2 Rank3 62.1% 82.9% 90.9% 上記の2論文について、レートが全く違うのに、一致率はさほど上昇していない。 という事は牌譜との一致率という指標は微妙なのか?と思ったら爆うち先生曰く

強さを測定する方法として、牌譜一致率や自己対戦だけで十分で対人戦は必要ないと考える人はいるかもしれません。 牌譜一致率で測定する問題点として、ある程度強くなると牌譜一致率と実力が比例しないことがあります。1

— 爆打(旧麻雀を打つ機械) (@ai_mahjong) 2015, 12月 28

理由としてはAIが強くなると牌譜よりもいい手を指して牌譜との一致しないからです。これは将棋AIなどでも見られる現象です。最新の論文ではレーティングが100以上も上昇したにも関わらず、牌譜一致率は低下しています。 爆打の手は人間のお手本を超えることもあるということです。2

— 爆打(旧麻雀を打つ機械) (@ai_mahjong) 2015, 12月 28
との事なのであがらないのが悪いとは限らない。そりゃそうか。 じゃあ全然低くていいかと言われるとそうでもないはず。 当然人間が打つ牌譜なので100%正解とは限らないし、 麻雀にはどっちを打っても正解のような打牌もあるので どう頑張っても100%にはならない。まあある程度には参考になる指標だと思う。 (天鳳で実測するのが一番いいかもしれないが時間がかかり過ぎる) とりあえず七段R2000到達前の爆打ニキの数字である62%を目標にしてみたい。

3.実験

今回はツモ局面における打牌について学習した。 入力ベクトルは麻雀の原始的な要素を2値ベクトル化したものを使用した。 原始的な要素とは点数や、牌の枚数など卓から分かる情報すべてである。 次元数は548になった。 出力には麻雀の合法手を以下のように分割した36要素を使用した ・ツモあがりする ・九種九牌倒牌する ・左から1牌目の手牌を切る ・左から2牌目の手牌を切る ・左から3牌目の手牌を切る ・左から4牌目の手牌を切る ・左から5牌目の手牌を切る ・左から6牌目の手牌を切る ・左から7牌目の手牌を切る ・左から8牌目の手牌を切る ・左から9牌目の手牌を切る ・左から10牌目の手牌を切る ・左から11牌目の手牌を切る ・左から12牌目の手牌を切る ・左から13牌目の手牌を切る ・ツモ切る ・左から1牌目の手牌を切ってリーチする ・左から2牌目の手牌を切ってリーチする ・左から3牌目の手牌を切ってリーチする ・左から4牌目の手牌を切ってリーチする ・左から5牌目の手牌を切ってリーチする ・左から6牌目の手牌を切ってリーチする ・左から7牌目の手牌を切ってリーチする ・左から8牌目の手牌を切ってリーチする ・左から9牌目の手牌を切ってリーチする ・左から10牌目の手牌を切ってリーチする ・左から11牌目の手牌を切ってリーチする ・左から12牌目の手牌を切ってリーチする ・左から13牌目の手牌を切ってリーチする ・ツモ切ってリーチする ・左から数えて1つ目のアンカン可能な牌を使ってアンカンする ・左から数えて2つ目のアンカン可能な牌を使ってアンカンする ・左から数えて3つ目のアンカン可能な牌を使ってアンカンする ・左から数えて1つ目の加カン可能な牌を使って加カンする ・左から数えて2つ目の加カン可能な牌を使って加カンする ・左から数えて3つ目の加カン可能な牌を使って加カンする この入力ベクトルと出力ベクトルを、多次元ロジスティック回帰(Softmax 回帰)で近似する。 多次元ロジスティック回帰についてはこちらの記事を参考にさせて頂いた。 http://seiya-kumada.blogspot.jp/2015/01/blog-post.html 学習率は0.1固定と、学習毎に5%減少させる方法を試した。 反復回数は10回と、100回を試した。 ・牌譜 学習する牌譜は天鳳で公開されている天鳳位段位戦4人打ちの牌譜を使用した。 http://tenhou.net/ranking.html この中から打牌可能局面をランダムに抽出して学習を行う。 打牌可能局面とは何かをツモった時とフーロ直後の選択局面の事である。 学習データの局面数は106485局面、 テストデータの局面数は1175局面になった。 牌譜のコンバートにはgimite氏作のmjai convertを使用させて頂いた。 http://www.rubydoc.info/gems/mjai/0.0.3/Mjai/FileConverter:convert mjai convertでmjsonというjsonファイルが出力される。 JSONをC++でパースするためにpicojsonを使用させて頂いた。 https://github.com/kazuho/picojson

4.結果

・反復回数10回、学習率更新無し 学習データとの一致率 42.1552% テストデータとの一致率 44.009% ・反復回数100回、学習率更新無し 学習データとの一致率 44.009% テストデータとの一致率 43.9149% ・反復回数10回、学習率更新有り 学習データとの一致率 41.8087% テストデータとの一致率 41.617% ? あんま変わってない・・・ ていうか40%もあってびっくりした。もっと低いと思ってた。 ・・・あ、全部ツモ切りに分類してやがる。てことは全然分類できてないじゃん・・・ あー、リーチ後は全部ツモ切りだからそのせいか? あと入力ベクトルの表現って、あるか、ないかでするのが常識っぽい。 要するに点数の25000点は二進数で25000を表現するんじゃなくて、 20000点であるか、20100点であるか、20200点であるか・・・みたいな感じでbooleanで表現しないとダメっぽい。 こういうのは自分一人でやってても誰も教えてくれないところだから辛いなぁ。 実は今回のような実験は既に関連研究の中で行われており、良い結果も出ていない。 まあ、ここから特徴要素をいろいろ変えてみたり、 学習機をゴニョゴニョしてみたり試行錯誤する下地を作ったという事で・・・。 TODO:多クラスロジスティック回帰で収束を判定するには? ↓ >尤度などの指標値があまり変化しなくなったら終了したり,あるいはあらかじめ学習の回数を適当に決めておきます http://gihyo.jp/dev/serial/01/machine-learning/0020?page=2 だそう。 ちなみにパーセプトロンはパラメータが更新されなくなるまで=完全に分類出来るまで行うらしい。 なぜなら線形分離出来るものなら必ず出来る事が保証されているかららしい。 てかすいませんこの方針のAI作るのははやっぱ無し。なぜなら入力、出力ベクトルの設計がめちゃくちゃだから。 いや将棋のKKPとか画像認識みたいに特徴量が単純な機械学習プログラムで成功事例があるじゃない? そんな感じに麻雀もikeru!(機械学習初心者並の発想)とか考えていたけど何か無理っぽそう。ちゃんと関係ある特徴量設計しないとダメすね。 余談だけど下は爆打ニキの一人麻雀の特徴量 ・通常手,七対子,国士無双の向聴数 ・4 色のうち n 色(n=1~3)の牌を 0 にしたときの n と向聴数 ・複数の色(1~4)と各色の向聴数(0~11 まで)の組合せ ・色の中で最も多い色の数 ・15 色の中で最も多い色の数+字牌の数 ・2 から 8 牌の数 ・メンツと 1,9 を含まない連続した 2 牌のターツの合計とメンツ候補の組合せ ・各字牌の枚数と役牌かどうかとドラの組合せ ・数牌の数字-5 の絶対値と枚数とドラの組合せ ・各色の 1~9 の有無の組合せ ・連続する n 種類の数牌の持っている枚数の組合せ(n=2~6) こんな発想、普通のエンジニアには絶対に無いですわ。非常に研究者っぽい発想。研究者プラス麻雀強い人の発想。すごいなあ。
inserted by FC2 system