TadaoYamaokaの開発日記

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

麻雀AIを深層強化学習で作る その10(自己対局で特徴量記録)

電竜戦があったりで先月は麻雀AIの開発に手を付けられれず、前回から1か月近く空いてしまったが、麻雀AIの開発を再開したい。

自己対局で特徴量記録

前回、自己対局で牌譜を生成するところまで実装した。
自己対局で生成した牌譜を元に、Learnerで特徴量を生成する処理を実装するつもりであったが、PPOの学習にはアドバンテージの計算に、各ステップで推論したValueが必要になる。
また、学習の各エポックで、エピソードを生成した時点のモデルで出力した各ステップのPolicyの分布が必要になる。
そのため、牌譜のみを記録した場合、牌譜を再生しながら、Learnerで再度推論する必要がある。

それでは、Learnerがボトルネックになるため、Actor側で推論した結果を記録するように変更する。
牌譜の形式はやめて、特徴量、報酬、アドバンテージ、補助タスクの教師も含めてActor側で計算して記録するようにする。

データ量の課題

各ステップの特徴量を記録する場合、特徴量は疎なテンソルになるため、1000ゲームあたり300MB近くになる。
各サイクルで、データを消していけば、ディスク容量があふれることはないが、データの再利用ができなくなるため、できれば残しておきたい。

特徴量を密な情報に変換して、記録してもよいが、Learner側のPythonプログラムで逆に変換する処理が必要があり実装が大変なため、単にzip(Deflate)で圧縮するようにした。
C++でzlibを使って圧縮してファイルに保存して、Python側でもzlibで解凍するようにする。
1000ゲームあたり、7.5MBくらいになった。

アドバンテージ計算、補助タスクの教師

Actor側で、1ゲームごとにアドバンテージをGAEで計算する処理、補助タスクの教師として和了した役や和了したプレイヤー、他家の待ち牌、得点を記録する処理を実装した。

dlmahjong/collect_rollouts/collect_rollouts.cpp at 803612ab1654ff11592ac379264ef8b6cad10e79 · TadaoYamaoka/dlmahjong · GitHub

まとめ

PPO学習時のアドバンテージの計算に各ステップの推論が必要なため、Actor側でアドバンテージの計算をするようにした。
また、特徴量、報酬、アドバンテージ、補助タスクの教師も含めてActor側で計算して記録するようにした。
疎なテンソルを保存するとファイルサイズが肥大化するため、zipで圧縮して保存する方式にした。

次は、Learnerの学習部分を実装したい。