世界コンピュータ選手権も終わったので、feature/hcpe3やfeature/hcpe3_averageに分かれていたブランチをmasterに統合して整理した。
リファクタリング
重複局面の平均化や、評価値の補正をオプション(それぞれ--use_averate、--use_evalfix)で有効/無効化できるようにした。
また、hcpeとhcpe3の2つのフォーマットで学習スクリプトを分けていたが、train_hcpe3でどちらも読み込めるようにした。
重複局面の平均化などは、train_hcpe3のみに実装している。
また、train_hcpeのみにあったアクタークリティックとエントロピー正則化を、train_hcpe3でも使用できるようにした(--use_criticと--beta)。
各手法の精度比較
オプションで有効無効を切り替えられやすくなったので、今までちゃんと比較していなかったので、各手法の精度を比較した。
比較対象
条件 | 説明 |
---|---|
hcpe | これまでのtrain_hcpeのデフォルト |
hcpe3 | train_hcpe3のオプションなし |
hcpe3_critic | train_hcpe3の--use_critic --beta 0.001※hcpeと等価 |
hcpe3_evalfix | train_hcpe3の--use_evalfix |
hcpe3_average | train_hcpe3の--use_average |
hcpe3_average_evalfix | train_hcpe3の--use_average --use_evalfix |
hcpe3_average_evalfix_critic | train_hcpe3の--use_average --use_evalfix --use_critic --beta 0.001 |
テストデータ
テストデータには、2017年~2018年6月のfloodgateのR3500以上の棋譜からサンプリングした856,923局面(重複なし)を使用した。
シャッフルにより結果が変わるため8回測定して平均を求めている。
精度は、方策、価値(勝率)のテスト損失で比較する。
学習データ
dlshogiの自己対局で生成した4千万局面(重複局面は0.14%)を、既存モデルに追加学習を行った結果を比較する。
比較結果
条件 | policy | value |
---|---|---|
hcpe | 1.835472639 | 0.529408829 |
hcpe3 | 1.81209377 | 0.534351326 |
hcpe3_critic | 1.833132198 | 0.53397902 |
hcpe3_evalfix | 1.812563669 | 0.525772249 |
hcpe3_average | 1.816512931 | 0.534330776 |
hcpe3_average_evalfix | 1.807865608 | 0.529676239 |
hcpe3_average_evalfix_critic | 1.83458015 | 0.536404066 |
考察
hcpeとhcpe3_criticは等価だが、8回測定の平均でも結果には誤差が出ている。
policyとvalueがトレードオフの関係にあり、片方の損失が低くなった場合はもう片方が高く学習される場合がある。
critcの有り無しでは、有りの方がpolicy、valueともに損失が高くなる傾向がある。
アクタークリティックは、方策勾配法で用いられる手法であるため、MCTSの自己対局で生成した教師をオフポリシーで学習する場合には効果がないことが分かった。
averageの有り無しでは、policy、valueともに傾向が見えない。
使用した教師データには、重複がほとんどないデータを用いたためと考えられる。
重複の多い教師データを使用すると、averageなしではpolicyの損失がnanになり学習できない問題があるため、averageは有効にしておいて良いだろう。
まとめ
今までブランチで学習手法を分けていたが、masterに統合しオプションで切り替えられようにした。
オプションでオンオフできるようになったので、あらためて各手法の比較を行った結果、MCTSの自己対局ではアクタークリティックは逆効果であることがわかった。
また、重複局面の平均化は重複局面が少ない場合はどちらでもよく、評価値の補正はvalueの損失を下げる効果があることがわかった。
重複が多い場合は、重複局面の平均化がないと学習できないため、常にオンにしておいてよい。
よって、おすすめ設定は、「--use_average --use_evalfix」となる。
あと、今回の結果を受けて、policyのテスト損失にクリティックを使用していたが削除した。
これまでよりも数値が高くでるようになっているので注意(上記の実験結果にも適用されている)。