TadaoYamaokaの開発日記

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

麻雀AIを深層強化学習で作る

Pythonの麻雀ライブラリができたので、麻雀AIの開発を試そうと思う。

深層強化学習を使ってゼロから強い麻雀AIを作ること目標にしたい。

先行研究

日本ルールのリーチ麻雀で、強化学習を使用して成功している麻雀AIには、テンセントが開発した「LuckyJ」がある。
論文が書かれていないため詳細は分からないが作者のブログによると強化学習と後悔値最小化に基づくセルフゲーム技術が採用されて、ゼロから学習したと書かれている。

マイクロソフトの「Suphx」でも強化学習が使用されているが、教師あり学習とルールベースの勝利モデルも使用しており、ゼロからの学習ではない。
ゲームプレイ時には、探索は用いていないが、配牌からランダムにシミュレーションしてモデルを微調整するという手法を使っている。

現在、「LuckyJ」が最も強いAIであるが、ゲームプレイ時に探索を行っていることが強さに効いているのかもしれない。

他、中国ルールの麻雀AIでは、北京大学の「Speedup Training Artificial Intelligence for Mahjong via Reward Variance Reduction」がある。
この論文では、ゼロから深層強化学習を行い、上級プレイヤーレベルになっている。
アルゴリズムにPPOを使用して、ランダム性の影響を低減するためにグローバル情報を使用した報酬予測モデルを使用するという工夫を行っている。

方針

まずは、ベースラインとしてシンプルな方法から実装していきたい。
おそらく探索することは強さに重要と考えるが、効率的な枝刈りを行う後悔値最小化アルゴリズムの実装は難易度が高そうなので、一旦保留しておく。
まずは、PPOで、価値モデルにグローバル情報を使う方法を試したい。

麻雀は、ランダム性が強いゲームのため、勝敗は配牌の影響が強い。
上記の北京大学の論文で言及されているように、強化学習アルゴリズムをそのまま使うと、配牌の良さで勝ったゲームを、選択した行動の良さと勘違いして学習することになる。
これを低減することは麻雀AIでは必須と考える。
上記論文では、価値モデルをゼロサムゲームの特性を利用して4人のプレイヤー視点で予測して合計が0になるように損失関数を設計しているが、この部分は一旦後から検証することにして、まずはシンプルにプレイヤー視点から相手の非公開情報を使って勝敗を予測して学習してみる。

まとめ

麻雀AIの開発を始めるにあたりまずは先行研究を調査した。
まずは、アルゴリズムにPPOを使ったシンプルな方法から試す方針を立てた。
次は、モデルの特徴量、モデル構造の設計あたりを行いたい。