以前にRL policy networkをelmoの自己対戦でデータを使ってREINFORCE algorithmで学習させたが、うまく学習できなかった。
昨日の日記でマルチタスク学習を実装したので、RL policy networkをバリューネットワークと同時に学習させることで、RL policy networkの学習がうまくいくか試してみた。
学習方法
RL policyの出力のバッチごと損失(交差エントロピー)に報酬を乗じた値を平均したものと、バリューネットワークの損失(交差エントロピー)の和を損失とした。
勝敗(0か1)をz、局面の価値(0から1)をvとしたとき、z-vを報酬として使用する。
勝敗はelmoの自己対局の結果、局面の価値はelmoの評価値をシグモイド関数で勝率に変換したものを使用する。
検証結果
1億局面から学習済みのモデルを使用して、elmo_for_learnで生成した1千万局面を学習させた。
バッチサイズ64で、10000イテレーション学習したところで、損失がnanになってしまった。
バリューネットワークを同時に学習してもうまくいかなかった。
policyのtest accuracyが0になっていることから、教師データの指し手を選ばないことが最も損失が小さくなるので、そのように学習してしまったためと思われる。
モデルの一致率が40%程度なので、勝ちのゲームで正しい指し手を選んで得られる場合が少なく、負けのゲームで指し手が一致しているとマイナスの報酬となるため、全ての手で指し手を選ばないことが最小の損失となってしまう。
追試1
ChainerRLのソースを眺めていると、GradientClippingを使用したので、GradientClippingを試してみた。
発散するまでのイテレーションが少し伸びたが結果は同じとなった。
WeightDecayも試したが同じだった。
対策
全て指し手と一致しない方が損失が小さくなるようではうまく学習できないと考えられるため、報酬の与え方を工夫する必要がある。
プラスの報酬が多くなるようにするには、勝ちの局面の割合を多くすればよい。
しかし、一致率が40%程度なので、勝ちの局面の割合を負けの局面の倍以上にする必要があり、教師データが有効に活用できなくなる。
別の方法として、報酬にベースラインを加えて、全体的にプラスの報酬を多くすることが考えられる。
そうすることで、勝ちの局面で負けたゲームの指し手にはマイナスの報酬となり、それ以外では少なくともプラスの報酬とすることができる。
重み付きの教師あり学習に近くなる。
負けの局面から勝ちのゲームとなった指し手は高い報酬となるので、効果的な手を重視して学習できる。
ベースラインに0.5を使用して、elmo_for_learnで生成した1千万局面を学習させたところ、以下のようになった。
バッチサイズ128で、1千万局面を学習できた。
train lossは下がり続けており、うまく学習できている。
policyのtest accuracyは上がっていないが、勝ちの局面で負けたゲームでは指し手が一致しない方が良いので、test accuracyが上がっていないことは必ずしも問題ではない。
value networkのtest accuracyは、上がり続けており、うまく学習できている。
効果測定
ベースラインを加えて学習したモデルと、学習前の1億局面を学習したSL policyのモデルで対局を行った。
100回対局した結果以下の通りとなった。
SL policy | 勝ち48(49%) |
RL policy(ベースラインあり) | 勝ち49(50%) |
あまり変わっていないが、少なくとも弱くはなっていない。
学習局面をさらに増やした場合や、他のソフトとの対局でも検証してみないとはっきり効果は分からない。
検証は時間がかかりそうなので、別途効果の検証を行う。
今回、elmo_for_learnの自己対戦データを使用して学習したが、AlphaGoのRL policy networkと同じように自己対戦でも、ベースラインを調整することでうまく学習できるようになると思われる。
検証には以下のコードを使用した。
https://github.com/TadaoYamaoka/DeepLearningShogi/blob/master/dlshogi/train_rl_policy_with_value_using_hcpe.pygithub.com
2017/6/9 追記
3千万局面、上記の方法で学習させたモデルと学習前のモデルで対局を行った結果、以下の通りとなった。
SL policy | 勝ち43(45%) |
RL policy(ベースラインあり) | 勝ち51(54%) |
学習に効果があることが確かめられた。
ただし、3千万局面以上学習させるとtest accuracyが急に下がる現象が起きて学習できなくなった。
この辺がこのモデルの限界かもしれない。