ゼロから作るDeep Learning(22日目)

こんにちは、筋肉めがねです。

 

本日は、2018年最後の、そして平成最後の出勤日でしたね。会社によっては納会をされたところもあるんではないでしょうか。日本で仕事をしていた数年前、あるお客様の会社で、一年の最終出勤日にビールを開け、同僚と皆で納会をした事を思い出しました。勿論、ドイツでは納会なるものはございませんが、今年もお疲れ様でした、と、来年もよろしく、と挨拶してまわる習慣はありますね。仕事納めをし、これから31日まで残り3日、粛々とブログを書いていこうと思います。

f:id:KinnikuMegane:20181229080432j:plain

 

それでは、本日も「ゼロから作るDeep Learning」を進めていきましょう。

前回の記事では、アクティベーションの分布を「強制的」に調整してあげる手法であるBatch Normalizationを紹介しました。

本日は、過学習を抑制するための技術を1つ紹介します。

まず過学習とは何なのか。それは、13日目の記事で書いた通り、例えば訓練データが少ない事により、データ群の中にある外れ値にまでも適合したモデルをニューラルネットワークが作ってしまい、汎化なモデルではなくなってしまう事でした。

kinnikumegane.hatenablog.com

過学習を抑制する手法として、本記事では2つ紹介しています。

Weight DecayとDrop outですね。本記事では、それぞれを実装した結果、実装していない場合よりも、訓練データとテストデータの認識精度が近づいている事が報告されています。本日は先ずWeight Decayについて、その手法を実装するよりも、そもそもWeight Decayとは何なのか理解に努めましょう。


Weight Decayとは、本書によると、 大きな重みを持つ事に対してペナルティを課す事とあります。なぜなら、過学習は、重みパラメータが大きな値を取る事によって発生する事が多くある、との事です。

方法としては、「重みの2乗ノルムを損失関数に加算する」、とあります。

1つ1つ理解していきましょう。

そもそも、ニューラルネットワークで「学習」を進める、という事は、「合ってなさ加減」を最小化する、という事でした。それはつまり損失関数を小さくしていく事という事でした。そして、盆地のある地点(重みパラメータ)の傾き(勾配)を求め、そして損失関数が小さくなる方向(勾配方向)に重みパラメータを更新していく、という事でした。重みパラメータを更新する、という事を数式で表すと:

w ←  w - η * (∂L/∂W)

wは重みパラメータ、ηは学習率、∂L/∂Wは重みに関する損失関数の勾配です。重みパラメータを微少量だけ小さくするんですね。

それで、重みの2 乗ノルムを損失関数に加算する、つまり何らかの値を損失関数に加算していくと、重みパラメータから引かれる値が大きくなるので、重みパラメータは小さくなっていきますね。「合ってなさ加減」を小さくしていく、という事なので理にかなっています。

では、2乗ノルムとは何なのか。これはピタゴラスの定理を想像して頂ければ何となくわかりますが、「普通の意味での長さ」という事です。

mathtrain.jp

そして、2乗ノルムを損失関数に加算する、という事はどういう事か、とても分かりやすく解説しているブログがあったので紹介します。

tjo.hatenablog.com

 

ノルムにしろ正則化にしろ、統計学をどこかのタイミングできちんと理解する必要がありそうです。明日は、Dropoutという手法について書きます。

それでは、本日は以上でございます。

 

にほんブログ村 IT技術ブログへ
にほんブログ村



Pythonランキング