過学習の防止
重みの初期化でも確かに過学習を防げる道にはなるが、
そのほかでもいくつか方法がある。
個人的には、Dropoutにお世話になっております。
過学習
過学習自体の話はもういいね笑
けど、要因について、書いとく。
①パラメータを大量に持ち(ノードがたくさんある)、表現力の高いモデルであること(複雑なモデル)
②訓練データ自体が少ないこと
まぁ、せっかくなので、過学習を起こす。
今回は、300個のデータで(少ないデータ量)、にも関わらず、7層のネットワークに各層のノードを100とする。
結果はこんな感じ。
完全なるオーバーフィッティング。
まず、トレーニングデータの精度が100なんて確実にあり得ない。
あと、テストデータの精度の乖離が激しい。
この状態をどげんかせんといかんぜよ。
Batch Normalization
こちらは活性化関数の出力後のデータに無理やり半強制的に広がりとバリエーションをもたせるようにする。
メリットとしては↓
①学習を早く進行させることができる
②初期値にそれほど依存しない
③過学習をよくせいする。
名前の通りやけど、ミニバッチを単位として、ミニバッチごとに正規化を行う。
では、実行。
うん。まずまず。学習データも精度90%で、
テストデータとの乖離も狭まった。
Weight decay
これは荷重減衰といって、学習の過程において、大きな重みをもったら、
ペナルティを与えて過学習を抑えようとしたもの。何やらWeight decayはドSらしい。
手法としては、L2ノルムを無理やりぶち込んで、逆伝播の値を小さくするって手法。
確かに、これでも過学習は抑えられそう。
Dropout
きました。我らがDropout。
Weight decayは複雑なネットワークには対応が困難になってくる。
Dropoutについては図で見たほうが早い。
隠れ層に潜むニューロンをまさかのランダムに消去しながら学習させる方法。
学習させるたびに違うニューロンを消去していくので、毎回違うニューラルネットワークにかけてるみたいな感覚になる。
以上が過学習防止策の一例。
では、また。