TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

麻雀AIを深層強化学習で作る その3(初期局面と補助タスク)

麻雀の役は14枚の牌を組み合わせて作る必要があるため、初期値のモデルからはじめて偶然役ができる確率は極めて低い。
人間が麻雀を覚える際もまずは役の形を覚えて、それを目指して手牌をそろえていく。
知識ゼロから偶然和了した場合の報酬のみで役を覚えさせることは、ほとんど不可能である。

初期局面

教師データを使わずに強化学習で麻雀を学習するには、和了に近い形から学習していくのが有効と考える。
そのために、聴牌直前のN向聴の状態から対局するようにする。
向聴数は、学習開始直後は、小さい値の割合を多くして、徐々に大きい値の割合を増やしていく。

向聴数が正確な状態を作るのは計算コストがかかるため、実際にはランダムに選んだ役の聴牌の形からN枚をランダムに牌山から入れ替える。

聴牌の手牌から何枚の牌を入れ替えるかは、平均値Nのベータ分布からサンプリングすると良い。
分布からサンプリングすることで4つのプレイヤーで、向聴数をばらけさせることができる。

ベータ分布は以下のような形になる。

平均値2のベータ分布


平均値8のベータ分布


立直を学習しやすくするため、立直の状態もランダムで生成する。
副露、ドラもランダムに生成する。カンとカンドラは矛盾しないようにする。

捨て牌の数もランダムにサンプリングする。
捨て牌の数が自然になるように、平均向聴数が小さいほど捨て牌の数を多くする。

捨て牌は和了形に対してフリテンにならないように選ぶ。

このように初期局面を生成して学習することで、すべての役をモデルに学習させることができる。

補助タスク

1局終了時の勝ち負けだけを報酬とした場合、どの役で和了したかが分からないため、特定の役を目指した行動を学習しにくいと考える。
また、捨て牌を見て他家の和了を予測することも学習を促進できると考える。
そのため、以下の補助タスクを同時に学習するようにする。

役を予測

自分が和了したときの役を予測する。

和了するプレイヤーの予測

和了するプレイヤーを予測する。
また、流局になるかも予測する。

他家の待ち牌

他家が聴牌している場合の待ち牌を予測する。
待ち牌なしは聴牌していない状態を意味する。

価値ヘッドでは、報酬の他に、4プレイヤーのそれぞれの点数を予測する。

これらの補助タスクは学習を促進する目的以外にも、AIが目指している役や、他家の待ち牌が分かるので人が見て状況を把握しやすくなる。
また、対戦して勝率を図らなくても補助タスクの正解率で学習の進み具合が確認できるメリットがある。

まとめ

麻雀を教師データを使わずに学習する際に効果的な方法を考察した。
役をランダムに選んで和了に近い状態を初期局面とすることで役を覚えさせることや、役や他家の待ち牌の予測を補助タスクとすることで学習を促進することを検討した。

次回は、モデルと特徴量の実装に着手したい。