前回までは麻雀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の開発では、ほとんどテストコードを書いていなかったが、部分的な動作確認が楽になるのでテストコードを書いていくことにする。