dlshogiでは、ニューラネットワークの重みの初期化はChainerのデフォルト(LeCunNormal)を使用している。
モデルをSEResnetに変える予定なので、どの初期化が良いか実験してみた。
すべてデフォルトの場合と、活性化関数がReLUの場合はHeNormalが良いとされているので畳み込み層と全結合層の初期化をすべてHeNormalにした場合と、SENetは2層目と最終層はSigmoidなのでそれらの前の層をデフォルトのLeCunNormalにした場合と、すべてGlorotNormalにした場合を比較した。
おさらい
- LeCunNormalは、HeNormalを1/√2にスケールした関数(Chainerのデフォルト)。標準偏差
のガウス分布で初期化される。
は、畳み込み層の場合、入力チャネル数×フィルタ幅×フィルタ高さ。
- HeNormalは、標準偏差
のガウス分布。活性化関数がReLUの場合、負の値が0となることを考慮して、LeCunNormalを
だけスケールしたもの。
- GlorotNormalは、Kerasのデフォルト。CaffeではXavierと呼ばれている。標準偏差
のガウス分布で初期化される。
測定条件
先日のSENetのモデルの測定結果と、同じデータで初期化を変更した場合の測定結果を比較した。
測定結果
損失
初期化 | 訓練損失 (合計) | テスト損失 (Policy) | テスト損失 (Value) | テスト損失 (評価値) |
---|---|---|---|---|
LeCunNormal | 1.5167899 | 1.0261396 | 0.5962995 | 0.6469054 |
HeNormal | 1.5568473 | 1.0442668 | 0.59593064 | 0.6480267 |
HeNormal(ReLUの前のみ) | 1.5600953 | 1.0449593 | 0.59660757 | 0.6493638 |
GlorotNormal | 1.5095649 | 1.0290614 | 0.59567547 | 0.6469674 |
テストaccuracy
初期化 | テスト accuracy (Policy) | テスト accuracy (Value) |
---|---|---|
LeCunNormal | 0.37059274 | 0.66360927 |
HeNormal | 0.36606634 | 0.6646332 |
HeNormal(ReLUの前のみ) | 0.3656447 | 0.6607967 |
GlorotNormal | 0.37014192 | 0.6625231 |
考察
活性化関数がReLUなので、HeNormalにすると精度が上がると予測していたが、テスト損失はHeNormalにするとPolicy、Value、評価値ともに悪くなっている。
Sigmoidの前の層をLeCunNormalにした場合でも傾向は変わっていない。
LeCunNormalとGlorotNormalでは、テスト損失は誤差程度の違いしかない。GlorotNormalは、Policyのエントロピーが下がっているため方策が決定論的な傾向になっている。
この結果からは、重みの初期化は、ChainerのデフォルトのLeCunNormalのままで良さそう。
活性化関数がReLUの場合でも、必ずしもHeNormalが最適ではないということが分かった。