ディープラーニングについてディープにラーニング。

思いっきり、自分が学んだことのアウトプットしていきますが、何分初心者。もし何かアドバイス等頂けましたら幸いです!

過学習の防止

重みの初期化でも確かに過学習を防げる道にはなるが、
そのほかでもいくつか方法がある。
個人的には、Dropoutにお世話になっております。

過学習

過学習自体の話はもういいね笑
けど、要因について、書いとく。
①パラメータを大量に持ち(ノードがたくさんある)、表現力の高いモデルであること(複雑なモデル)
②訓練データ自体が少ないこと


まぁ、せっかくなので、過学習を起こす。

今回は、300個のデータで(少ないデータ量)、にも関わらず、7層のネットワークに各層のノードを100とする。

結果はこんな感じ。
完全なるオーバーフィッティング。

f:id:kawam0t0:20191221175547p:plain

まず、トレーニングデータの精度が100なんて確実にあり得ない。
あと、テストデータの精度の乖離が激しい。

この状態をどげんかせんといかんぜよ。

Batch Normalization

こちらは活性化関数の出力後のデータに無理やり半強制的に広がりとバリエーションをもたせるようにする。
メリットとしては↓
①学習を早く進行させることができる
②初期値にそれほど依存しない
過学習をよくせいする。

名前の通りやけど、ミニバッチを単位として、ミニバッチごとに正規化を行う。

では、実行。
f:id:kawam0t0:20191221175717p:plain

うん。まずまず。学習データも精度90%で、
テストデータとの乖離も狭まった。

Weight decay

これは荷重減衰といって、学習の過程において、大きな重みをもったら、
ペナルティを与えて過学習を抑えようとしたもの。何やらWeight decayはドSらしい。

手法としては、L2ノルムを無理やりぶち込んで、逆伝播の値を小さくするって手法。
確かに、これでも過学習は抑えられそう。

Dropout

きました。我らがDropout。
Weight decayは複雑なネットワークには対応が困難になってくる。
Dropoutについては図で見たほうが早い。

f:id:kawam0t0:20191221180454p:plain

隠れ層に潜むニューロンをまさかのランダムに消去しながら学習させる方法。
学習させるたびに違うニューロンを消去していくので、毎回違うニューラルネットワークにかけてるみたいな感覚になる。


以上が過学習防止策の一例。

では、また。