TadaoYamaokaの日記

山岡忠夫 Home で公開しているプログラムの開発ネタを中心に書いていきます。

将棋でディープラーニングする その28(学習の高速化その2)

学習の高速化のため先日作成したPythonから使えるC++の将棋ライブラリ(cppshogi)に、RL policy networkも対応させました。

以前は将棋ライブラリとしてpython-shogiを使用していましたが、全てcppshogiに置き換えました。
これによって、学習がかなり高速化しています。

RL policy networkの学習

RL policy networkの学習の自己対戦が、以前は16ゲームをミニバッチとした1回のイテレーションに1分半かかっていましたが、4秒で終わるようになりました。
これでRL policy networkの学習をまともに行うことができるようになります。

また、今回は学習時にelmoの評価関数で各局面の評価値を求めて、その値をシグモイド関数で推定勝率に変換して、下記式のv(s_t^i)に使用しています。
\displaystyle
\Delta \rho = \frac{\alpha}{n} \sum_{i=1}^n \sum_{t=1}^{T^i} \frac{\partial \log p_\rho (a_t^i \mid s_t^i)}{\partial \rho} (z_t^i - v(s_t^i))
これにより、すでに評価値が高い局面で勝利した場合は報酬が少なくなり、評価値が低い局面から勝利した場合には報酬が多くなるように学習できるようになります。
つまり、勝敗に影響がある手をうまく学習できるようになります。

elmo_for_learnで1億局面を生成し、SL policy networkで学習させたモデルを使って、RL policy networkを学習させたところ、一応学習が進むことを確認しました。
f:id:TadaoYamaoka:20170602225632p:plain

しかし、途中から勝率が1.0になってしまい、必ず勝つ手順を覚えてしまっています。
まだ、モデルの精度がよくないため、大駒を序盤で捨ててしまい、評価値3000以上で勝ちとしているため、すぐに勝ちとなってしまいます。
モデルの精度がある程度高くないと、うまく学習できないようです。

使用したSL policy networkの精度

1億局面を学習したSL policy networkは、40%の一致率になっていますが、まだ序盤で大駒を捨てることが良くあります。
f:id:TadaoYamaoka:20170602225940p:plain
elmo_for_learnのデータは初期局面集から生成しているので、初手からの序盤の精度が落ちている可能性があります。

別のRL policy networkの学習方法

SL policy networkは局面を増やしても精度が上がらなくなっているので、別の方法を試そうと考えています。

elmo_for_learnで生成したデータは、勝敗データと評価値、指し手を含んでいるので、上記式のそれぞれz_t^iv(s_t^i)a_t^iとして使用可能です。
したがって、自己対戦を行わなくても、elmo_for_learnのデータで強化学習が可能です。
こちらの方法の方がうまく学習できる見込みがあります。
勝敗データを使うので、SL policy networkの精度を改善できると考えています。


次回は、elmo_for_learnのデータを使った強化学習を試す予定。

cppshogiに対応したコードをGitHubに公開しました。
python-shogiに依存したコードは削除しました。
github.com