DNN_前編 2 (要点)

#Section1：勾配消失問題について
誤差逆伝播法は、連鎖律を使って、出力層→入力層に向かって、勾配の計算が行われる。
入力層に向かうに連れて、勾配がどんどん緩やかになっていく。	
そのため、勾配降下法による更新では、入力層側に近い層のパラメータ（重み、バイアス）は
ほとんど変わらず、訓練は最適値に収束しなくなる。
この事を、勾配消失問題と呼ぶ。

活性化関数にシグモイド関数を使った場合、確認テストでも行ったように、
シグモイド関数の勾配の最大値は0.25と、最大値でも小さな勾配になっている。

連鎖律では、微分を掛けていくが、0～1の値ををかけ続けると、値はゼロに近づいて行って、結果勾配がなくなっていく事になる。

この勾配消失問題について、下記の解決策がある。
・活性化関数の選択
・重みの初期値設定
・バッチ正規化


###1-1　活性化関数
シグモイド関数ではなく、ReLU関数を使う。
シグモイド関数と違い、微分した値は、0か1になり、
1の場合は、掛け続けても、勾配がゼロになる事はない。


###1-2　初期値の設定方法
重みの初期値を単純なランダムな数ではなく、Xavierの初期値やHeの初期値などを設定する。

Xavierの初期値：
各重みの要素を、前の層のノード数の平方根で割った値。

Xavierの初期値を設定した場合の活性化関数は以下の通り：
・ReLU関数
・シグモイド関数（ロジスティク関数）
・双曲線正接関数


Heの初期値：
各重みの要素を、前の層のノード数の平方根で割った値に対し√2を掛けた値（Xavierの初期値に√2が掛けられた値）。

Heの初期値を設定した場合の活性化関数は以下の通り：
・ReLU関数


###1-3　バッチ正規化
バッチ正規化とは、ミニバッチ単位で、入力値のデータの偏りを抑制する手法。2015年あたりに提唱された最近の手法。

バッチ正規化を使うタイミング：
活性化関数に値を渡す前後のどちらかに、バッチ正規化の処理を孕んだ、バッチ正規化層を加える。
即ち、重みと入力の乗算の総和u、または、uを活性化関数に掛けた後の値z=f(u)のどちらかの値を、バッチ正規化層に渡す。


#Section2：学習率最適化手法について
学習率は、値が大き過ぎると最適値にいつまでもたどり着けずに発散してしまう。
逆に値が小さ過ぎると、発散はしないが、収束するまでに時間が掛かったり、大域局所最適値に収束しづらくなる。
→
では学習率はどのように決めるのがいいのか？

・初期の学習率は大きくして、学習を繰り返しながら、徐々に値を小さくしていく。
・パラメータごとに学習率を可変させる。
などのアプローチがある。

これらの学習率の最適な値を自動的に求めるには、次のような方法がある：
・モメンタム
・AdaGrad
・RMSProp
・Adam

###2-1　モメンタム
イメージ的には、勾配降下法で、慣性の法則を考慮したような方法。
勾配降下法では、今現在の勾配に対して、誤差が少なくなる方向にパラメータを調整するが、モメンタムは、1つ前の勾配も考慮する。

そうする事で、大域的最適解ではない、小さな谷(局所的最適化)の部分で収束してしまう事を防ぐ事が出来る。
また谷間についてから、最も低い位置（最適値）にたどり着くまでの時間が早い。


| モメンタム | 勾配降下法 |
|:-----------|------------:|
| 誤差をパラメータで微分したものと学習率の積を減算した後、<br>現在の重みに前回の重みを減算した値と慣性の積を加算する。| 誤差をパラメータで微分したものと学習率の積を減算する。 |
| $V_t = \mu V_{t-1} - \varepsilon \nabla E$ <br> $w^{(t+1)} = w^{(t)} +V_t$ <br> μ：慣性（ハイパーパラメータ）[値の例：0.5～0.9] | $w^{(t+1)}=w^{(t)}- \varepsilon \nabla E $ |

###2-2　AdaGrad
勾配が小さいほど、学習率が大きくなる。

メリット：
・勾配の緩やかな斜面に対して、最適値に近づける。
課題：
・学習率が徐々に小さくなるため、鞍点問題を引き起こす事がある。

| AdaGrad | 勾配降下法 |
|:-----------|------------:|
| 誤差をパラメータで微分したものと <br> 再定義した学習率の積を減算する。| 誤差をパラメータで微分したものと学習率の積を減算する。 |
| $h_0 = \theta$ <br> $h_t = h_{t-1} + (\nabla E)^2$ <br> $w^{(t+1)} = w^{(t)} - \varepsilon \dfrac{1}{\sqrt{h_t} + \theta}\nabla E$ <br> θ：（ハイパーパラメータ）[ゼロにならない、非常に小さな値] | $w^{(t+1)}=w^{(t)}- \varepsilon \nabla E $ |


###2-3　RMSProp
AdaGradの鞍点問題を改善するために生まれた手法。

メリット：
・局所的最適解にはならず、大域的最適解になる。
・ハイパーパラメータの調整が必要な場合が少ない。

| RMSProp | 勾配降下法 |
|:-----------|------------:|
| 誤差をパラメータで微分したものと <br> 再定義した学習率の積を減算する。| 誤差をパラメータで微分したものと学習率の積を減算する。 |
| $h_t = \alpha h_{t-1} + (1- \alpha)(\nabla E)^2$ <br> $w^{(t+1)} = w^{(t)} - \varepsilon \dfrac{1}{\sqrt{h_t} + \theta}\nabla E$ <br> θ：（ハイパーパラメータ）[ゼロにならない、非常に小さな値] <br> α：（ハイパーパラメータ）[値の例：0.9など] | $w^{(t+1)}=w^{(t)}- \varepsilon \nabla E $ |



###2-4　Adam
モメンタムとRMSPropのメリットを組み合わせたような方法。
・モメンタムの、過去の勾配の指数関数的減衰平均
・RMSPropの、過去の勾配の二乗の指数関数的減衰平均
を含んだ最適化アルゴリズム。



#Section3：過学習について
特定の訓練データに特化して学習された状態で、テストデータとの誤差が期待した値にならない状態（テスト誤差と訓練誤差とで学習曲線が乖離する事）。

原因：
パラメータ数が多い
パラメータの値が適切でない
ノード数が多い
など。
つまりNNのネットワークの自由度（階層、ノード数、パラメータなど）が高い場合に起こりやすい。

過学習を防止するための方法として、以下の方法などがある：
・L1正則化
・L2正則化
・ドロップアウト

###3-1　L1正則化、L2正則化
正則化とは：
過学習の原因となる、ネットワークの自由度に制約を加える事。

過学習の原因：
・重みが大きい値を取る事で、過学習が発生する事がある。
　学習を繰り返す事で、重みにばらつきが発生する。
　重みが大きい値は、学習において、重要な値。
　重みが大きいと過学習が起きる。
そこで・・・

過学習の対策：
・誤差関数に対して、正則化項を加える事で、重みが大きくなり過ぎないように、抑制を行う。
　過学習が起こりそうな、重みの大きさ以下で、重みをコントロールする。
　但し、重みの重要度がなるべく変わらないように、重みの大きさにはばらつきを出す必要がある。

L1,L2正則化は、誤差関数E(x)に、pノルムxpを加える事で行われる。具体的には、以下の式になる：
$E_n(w) + \dfrac{1}{p} \lambda \left\|| x \right\||_p$

$\left\|| x \right\||_p = (\sum _{i=1}^{n} {\left\| x_i \right\| ^p})^{\dfrac{1}{p}}$

p=1:　L1正則化
p=2:　L2正則化



###3-2　ドロップアウト
過学習が起きる原因のひとつに、ノード数が多い事がある。
ドロップアウトとは、ランダムにいくつかのノードを削除して学習させる手法。

ドロップアウトのメリットとしては、データ量を変化させずに、異なるモデルを学習させていると解釈出来る。


#Section4：畳み込みニューラルネットワークの概念
CNNは、画像データに特化したニューラルネットワークだが、データの加工の仕方によっては、音声データなどにも使う事が出来る。

ネットワークの構造としては、
入力層→
畳み込み層→プーリング層の組み合わせをを何度か繰り返し、
全結合層→出力層
という作りになる。

畳み込み層は、何層か続けて繰り返す事がある。
　畳み込み層→畳み込み層→プーリング層　など。
最後の全結合層についても、複数繰り返す事がある。


全結合層のニューラルネットワークの場合、
画像の場合に、オリジナルの情報としては、縦、横、チャンネルの3次元データにも関わらず、それらを1次元のデータ（数値を一列に並べる）として処理される。
つまりRGBなどの各チャンネル間の関連性を考慮せず学習を行う事になる。

このような画像の情報を考慮したまま学習出来るものとして、CNNがある。

###4-1　畳み込み層
畳み込み層の全体処理としては、入力値に対して、フィルターと呼ばれる、重みを掛け合わせ、バイアスを加えて、活性化関数を通す。
フィルターと呼ばれる重みに該当するところが、畳み込み層の特徴になる。

画像データの場合、畳み込み層では、
入力データ（画像）の特徴を、個々のピクセル値ごとに学習するのではなく、
縦x横xチャンネルの3次元データをそのまま学習し、次の層に伝える事が出来る（つまり、3次元の空間情報も学習出来るような層が畳み込み層）。


####　4-1-1　バイアス
バイアスについては、フィルターを通して出力された値（総和）に、バイアス項を加えて出力値とし、その値を、次に伝播させる。

####　4-1-2　パディング
通常フィルターを通すと、元のオリジナルの画像サイズに対して、出力が小さくなってしまう（フィルターが3ｘ3の場合は、縦横2ピクセル分、出力のサイズが小さくなる）。
その小さくなる事を回避するための処理として、パディングがある。

パディングは、入力画像に対して、枠を付ける処理を言う。枠のところの値は、0などの固定データを割り当てる。
枠を付ける事で、フィルターを通した後も、オリジナルの画像サイズで出力する事が出来る(フィルターが3x3の場合は、上下左右、それぞれ1ピクセルの枠を付ける)。

####　4-1-3　ストライド
入力画像に対して、フィルターを掛ける際の、フィルターの移動量。ストライドが大きいと、出力画像のサイズは小さくなる。
例えば、
入力画像5x5
フィルター3x3
ストライド2
パディングを行わない場合は、
出力画像は、2x2になる。

####　4-1-4　チャンネル
入力画像に対して、例えば、RGBなどで分解したものがチャンネルの概念。
1つの画像に対して、RGBで分解すれば、チャンネル数は3になる。
画像のサイズが28x28で、RGBで画像を分解すれば、入力値は、28x28x3=2352個になる。

フィルターについては、チャンネル数分だけ必要になる。


###4-2　プーリング層
プーリングの方法には、最大プーリングと、平均プーリングの2つがある。
方法としては単純で、畳み込み層で処理した画像に対して、指定したエリアの平均を取るか、最大値を取るかになる。


#Section5：最新のCNN
###5-1　AlexNet
AlexNet：2012年の画像認識コンペティション（ILSVRC）で2位に大差を付けて優勝したモデル。ディープラーニングの火付け役になったモデル。
モデル構造は、5層のCNN。
過学習を防ぐための対策として、サイズ4096の全結合層の出力に、講義のSection3でも紹介した、ドロップアウトを使用している。