目次
- 過学習の抑制手法「Weight Decay」
- Neural Network Console(NNC)で確認
- Weight Decayの係数の適切な値とは
- Weight DecayとOptimizerとの相性
- まとめ:SGDと相性が良く、Adamと良くない
過学習の抑制手法「Weight Decay」
過学習というのは、学習(訓練)データに適合しすぎて、学習(訓練)データと異なるデータでの正解率が低くなってしまうことです。
正解率をあげるためには、過学習をなんらかの方法で抑制する必要があります。
Weight Decayはその過学習の抑制手法のひとつです。
Weight Decay は直訳すると「荷重減衰」です。
過学習は重み(Weight)が大きな値をもつことで発生することが多いということから、学習過程で重み(Weight)が大きくならないようにペナルティ(なんらかの値を加算するなど)を課す方法で抑制しようとするのが、Weight Decayの考え方です。
Weight Decayのペナルティの値は係数をかけ合わせたもの
じゃあ、そのなんらかの値は何か。
いくつか方法はあるみたいですが、よく使われているのが「重みの各要素の二乗を足し合わせたもの」に任意の係数をかけ合わせたものです。
この「重みの各要素の二乗を足し合わせたもの」をペナルティに使う方法を「L2ノルム正規化=L2正規化」と呼びます。
Weight Decayの係数の適切な初期値は?
書籍とかによっても、この係数についてはバラバラです。
0.1くらいを設定・・という人もあれば、0.0000001位が最適だったなんて人もいる。
仕方ないので、ちょこちょこ試しながら、様子を見てます。
僕は、「0.0001」から始めることが、最近は多いです。
経験的にベストでないにしても、割合ベターな結果が期待できる感じだからというだけのうすーい根拠しかありませんが。
本格的にやるなら、ベイズ最適化などハイパーパラメータの自動最適化で求めるなどの手法があるみたいですが、趣味でやってる人間にとっては大げさです。
Neural Network Console(NNC)で確認
今回はNeural Network Console(NNC)を使って確かめてみようと思います。
NNCリファレンスの記載
リファレンスを確認します。
Weight Decayという項目は、Neural Network ConsoleのConfigタブのOptimizerのところにあります。
リファレンスを見てみると説明はあります。
書いてあるのはたったの2行。
4 Weight Decay(L2正則化)の強度を設定するにはWeight DecayにWeight Decayの係数を指定します。
まんまです。
Weight Decayの係数の適切な値とは
Neural Network ConsoleのConfig画面で、係数を指定します。
とりあえず、今までの説明を参考に、僕の目安値「0.0001」を設定します。
Weight DecayとOptimizerとの相性
Neural Network Consoleで実行するとき、気になるのはのOptimizerとの相性です。
Neural Network Consoleのデフォルトは「Adam」です。
Adamは収束が速く、とりあえず選択して問題がないOptimizerです。
でも、「学習データと異なるデータでの正解率をあげる=汎化」目的で、Weight Decayを使うときには、Adamはベストチョイスといえないようです。
こちらのTweetに貼ってあるリンク(論文のPDF)にその理由が説明されています。
AdamがSGDに比べて汎化性能が低い原因の検証。一般的な実装だとL2正則=Weight Decayとして扱われており、これは単純なSGDの場合そうなるがAdamのように学習率を自動調整する場合意図したWDの値にならない。これは学習率への依存が生じているためで、これを解消すると結果良好https://t.co/r3E1CezwKg
— piqcy (@icoxfog417) 2017年11月17日
簡単に言うなら、Weight Decayの係数を0以外に変更しても、Adamを使っている限り、過学習の傾向があまり改善しないようなのです。
実際に足ししていきます。
Optimizer「Adam」で確認する
学習した結果が、こういうグラフになっているCNNのネットワークを題材にします。
Traiingエラー(赤の実線)がきれいに収束しているのに、Validationエラー(赤の点線)が途中から逆に増加して、どんどん離れていってます。
もう、典型的な過学習の状態です。
なので、評価した結果のAccuracyも「97.65%」と、かなり低めです。
ここに、OptimizerはAdamのままで、Weight Decayの係数を「0.0001」にしてみます。
結果はどうかというと、改善はされます。
でも、形的にあまり変わりませんし、過学習の傾向は残ったままです。
Optimizer「Sgd」で確認する
OptimizerのUpdaterを「sgd」に変更してみます。
それ以外はまったく同じです。
そうすると学習結果のグラフの形が劇的に変わります。
traiingエラーとValidationエラーの差がほぼありません。
かなりいい感じで汎化できていると期待できます。
ただ、残念ながら「SGDは収束が遅い」ので、50epochでは収束しきっていません。
そのため、epoch数を増やして再チャレンジして、最終的にはここまでいきました。
いまいちですけど、過学習抑制効果は確認できた気はします。
まとめ:SGDと相性が良く、Adamと良くない
まとめると。
Weight decayの値を0以外(例えば 0.0001等)にすると、L2正規化が働いて、過学習の抑制効果がありますが、Optimizerタブで「Adam」を選択していると、相性の問題で、あまり過学習抑制効果がないように見えました。
他はまったく同じ状態で、mOptimizerタブを「sgd」に変更するだけで、Weight decayの汎化効果が有効に働いているように見えるのも確認できました。
なので、Weight decayによる過学習抑制という手法は、SGDと相性が良く、Adamと良くないということは言えるだろう。
それが、今回の僕の結論です。
あくまで、個人的にちょっと試しただけの結論ですけどね。
ただ、こういうのも「引き出し」にはなるので、まあOKかなと思います。
今回はこんなところで。
ではでは。