dlshogiを初期値から学習を開始すると、lossがinfやnanになる場合がある。
初期値からの学習以外でも勾配爆発を防ぐために、勾配クリッピングのオプションを追加した。
KataGoでも勾配クリッピングを追加している。学習が安定してからは特に効果はないようだ。
勾配クリッピングにより同じデータを学習した場合に結果が変わるか確認した。
勾配クリッピング
PyTorchのclip_grad_norm_を使用する。
これは、勾配のノルムが閾値以下になるようにクリッピングを行う。
値でクリッピングするよりも勾配の方向が変わらないから良いのだとか、大差ないとか*1。
なお、AMPを使用している場合は、クリッピングを適用する前にスケールを戻す必要があるので注意が必要である。
Automatic Mixed Precision examples — PyTorch 1.10 documentation
測定方法
dlshogiの強化学習で生成した8,939,266局面を使用して、初期値から学習する。
テストデータには、floodgateのレート3500以上の対局の棋譜からサンプリングした856,923局面を使用した。
測定結果
訓練損失
勾配クリッピング | 訓練平均方策損失 | 訓練平均価値損失 |
---|---|---|
なし | 0.91759841 | 0.41159116 |
max_norm=2 | 0.96313657 | 0.41694899 |
max_norm=10 | 0.91871473 | 0.41199293 |
テスト損失
勾配クリッピング | テスト方策損失 | テスト価値損失 |
---|---|---|
なし | 1.04227679 | 0.58552035 |
max_norm=2 | 1.05631246 | 0.58615224 |
max_norm=10 | 1.04086553 | 0.58512790 |
テスト正解率
勾配クリッピング | テスト方策正解率 | テスト価値正解率 |
---|---|---|
なし | 0.38140064 | 0.67416036 |
max_norm=2 | 0.37752943 | 0.67332306 |
max_norm=10 | 0.38164004 | 0.67416620 |
考察
max_norm=2は、なしに比べて学習が遅くなっている。
max_norm=10となしはほとんど変わっていない。
まとめ
初期値からの学習を安定化させるため勾配クリッピングを試した。
小さめの値にすると学習が遅くなることがわかったため、通常の学習に影響がない適当な値(10くらい)に設定しておくことにする。
KataGoでは学習率に合わせてスケーリングしているが、そこまでの調整は必要ないだろう。