TadaoYamaokaの開発日記

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

麻雀AIを深層強化学習で作る その4(特徴量作成とモデル実装)

前回までは麻雀AIの作成方針を書いたが、今回から実装に着手する。
まずは、特徴量作成とモデル実装を行った。

特徴量作成

以前に検討した通り、入力特徴量は複数チャンネルの9×4の画像で構成する。

特徴量作成をPythonで実装すると遅いため、C++で実装してpybind11でPythonから呼び出せるようにした。
特徴量作成は比較的共有的な機能なため、麻雀ライブラリcmajiangの機能として実装した。
cmajiang/src_cpp/feature.cpp at main · TadaoYamaoka/cmajiang · GitHub

実装しながら、以前に設計した特徴量にいくつか間違いがあったので修正した。
また、フリテンの判断に必要な特徴量(立直後の捨て牌、他家が直前に捨てた牌)が足りていなかったので追加した。

C++で実装するとPythonからデバッグが行いにくいため、GoogleTestを使ってC++側でテストを行うようにした。
麻雀ライブラリ作成時にGoogleTestを初めて使用したが、vectorなどのコンテナの値の比較もできて便利だった。
cmajiang/tests_cpp/feature_test.cpp at main · TadaoYamaoka/cmajiang · GitHub

モデル実装

以前に検討した方策ヘッドと価値ヘッドを持つResNetのモデルを、PyTorchで実装した。
dlmahjong/dlmahjong/model.py at main · TadaoYamaoka/dlmahjong · GitHub

価値ヘッドは、非公開情報を入力するため、共通部分の出力にチャンネル方向に連結している。

Pythonの実装は、pytestでテストコードを記述した。
将棋AIの開発では、ほとんどテストコードを書いていなかったが、部分的な動作確認が楽になるのでテストコードを書いていくことにする。

まとめ

深層強化学習で作成予定の麻雀AIの実装に着手した。
今回は、特徴量作成とモデル実装を行った。
次回は、初期局面の生成処理を実装したい。