深層学習Day2　ラビットチャレンジ

深層学習Day2
Section 0
深層学習全体の復習
・入力層、中間層、出力層。出力層の値と正解地の誤差を誤差関数を用いて、誤差を小さくするように重みやバイアスを更新していく。
・中間層を増やすことで勾配消失問題が生じてしまう。

Section 1 勾配消失問題
誤差逆伝播法復習
・誤差逆伝播法　計算結果から誤差を微分して逆算することで、不要な再帰的計算を避けて微分を算出できる。
・入力層に近づくと、層が厚くなる分、連鎖律の計算、すなわち微分の計算量が増える。
・誤差関数はE=二乗誤差関数として、重みwに関してｄE/dwを求めることで、もっとも導関数が小さなwを求めることができる。
勾配消失問題の復習
・誤差逆伝播法が下位層に進むにつれて、勾配がどんどん緩やか雨になっていく。そのため、勾配降下法による更新では下位層のパラメータは殆ど変わらず、訓練は最適値に収束しなくなる。
・各関数を微分した値が0-1を取るので、それらをどんどんかけることになり、それにより小さくなってしまう。
・シグモイド関数は勾配消失問題の代表。f=1/1+exp(-u) ０を境に、マイナスを入力すると０，プラスを入力すると１をに近い値を出す。
・シグモイド関数を微分すると最大値は0.25しかとれない。ｆ’＝（１－ｆ）・ｆ。なのでこれが連鎖率に含まれると値がどうしても小さくなる。
・勾配消失を解決するには：１活性化関数の選択　２重みの初期値の設定を変える　３バッチ正規化
１活性化関数の選択
・ReLU関数。０より小さいときは０を出力、０を超えたときはその値を出力。勾配消失問題の回避およびスパース化(０以下の出力の場合は微分値も0になり、計算がしなくて良くなる)に貢献する。
２重み初期値の設定方法
・重みを設定するときの乱数をなんかしらの方法で決める。Xavierでは正規分布(平均０分散１)に則って決めた値を、前の層のノード数の平方根で除した値を用いる。
・重みをすべて０としてしまうと、正しい学習が行えない。すべての重みの値が均一に更新されるため、多数の重みをもつ意味がなくなるため。
３バッチ正規化
・ミニバッチ単位で入力値のデータの偏りを抑制する方法
・バッチ正規化の使い所は活性化関数に値を渡す前後に、バッチ正規化の処理を孕んだ層を加える。
・ミニバッチ学習を画像でするとしたら、１バッチはGPUなら1－６４枚、TPUなら1-256枚。
・バッチ正規化の数学的式は、平均の算出（μ=(1/N)*∑x)、分散δ^2=(1/N)＊∑(x-μ)^2を求め、z normalizationのような式変形 x = x-μ/(δ^2+θ（バイアス))-(-2)をして正規化したｘhutを求める。最後にニューラルネットワークで使いやすいように、Γ倍してバイアス項βを足す。

勾配消失問題ハンズオン
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/handson2_1_network_modified.ipynb
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/handson2_2_1_vanishing_gradient.ipynb
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/handson2_2_2_vanishing_gradient_modified.ipynb
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/handson2_3_batch_normalization.ipynb

勾配消失問題テスト
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/20210704NNDay2%E5%8B%BE%E9%85%8D%E6%B6%88%E5%A4%B1%E5%95%8F%E9%A1%8C%E7%A2%BA%E8%AA%8D%E3%83%86%E3%82%B9%E3%83%88.ipynb

Section 2 学習率最適化手法　Optimizerをもちいて
・学習を通して誤差Eを最小化するパラメータwを見つけることが深層学習の目的。w(t+1)=w(t)-e⊿Eの、学習率eをどうするかを考える。
・学習率が小さすぎると時間がかかる、また大域局所最適値に収束しない。大きすぎると発散して収束しない。
・初期の学習率を大きく設定し、学習率を徐々に小さくしていく。また、パラメータごとに学習率を可変させる。このような学習率最適化手法を用いて学習率を最適化していく。
モメンタム
・誤差をパラメータで微分したものと、学習率の積を減産したあと、現在の重みに前回の重みを減産した値と完成の積を加算する。加算するのがポイント。
・局所的最適解にならず、大域的最適解となる。
・谷間について最も低い位置に行くまでの時間が早い。
・Vt=μVt-1 - ε⊿E
wt+1 = wt + Vt 
慣性がμ
・前回の重みを使って学習率が決まっていくので、後半になり収束が速くなる。
・ジグザグSDGのようには動かず、株価の移動平均のような動き方をする。
AdaGrad
・h0 = θ
・ht = ht-1 + （⊿E）^2　計算した勾配の２条を保持
・wt+1 = 1t - ⊿E * ε1/(rootht + θ) 現在の重みを、適応させた学習率で更新
・誤差をパラメータで微分したものと、再定義した学習率の積を減算する。
・勾配の緩やかな斜面に対して、最適値に近づける。
・学習率が徐々に小さくなるので、鞍点問題を引き起こし、大局的最適解に至らない。
RMSProp　AdaGradにαを用いて、前回の購買情報をどれくらい使うか。
ht = αhtt-1 + (1-α)(⊿E)^2
w(t+1) = w(t) -⊿E * ε1/(rootht + θ)
誤差をパラメータで微分したものと、再定義した学習率の積を減算する。
・局所的最適解にはならず、大域的最適解になる。(AdaGradでは見つけづらい)
・ハイパーパラメータの調整が必要な場合は少ない。(AdaGradではシータの値によって色々変わってしまう)
Adam
・モメンタムの過去の勾配の指数関数的減衰平均
・RMS propの過去の勾配の二乗の指数関数的減数平均
・それぞれを孕んだ最適化アルゴリズム。モメンタムとRMSpropどちらのメリットも孕んだアルゴリズム。


学習率最適化手法ハンズオン
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/handson2_4_optimizer.ipynb
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/handson2_4_optimizer_after.ipynb

学習率最適化手法テスト
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/20210704NNDay2%E5%AD%A6%E7%BF%92%E7%8E%87%E6%9C%80%E9%81%A9%E5%8C%96%E6%89%8B%E6%B3%95%E3%83%86%E3%82%B9%E3%83%88.ipynb

Section 3 過学習
・テスト誤差と訓練誤差で学習曲線が乖離すること。特定の訓練サンプルに対して特化しすぎてしまい汎化性能が落ちている結果。
・原因として、パラメータ数が多すぎる、パラメータ数が適切でない、ノードが多いなど。
・ネットワークに関しても、層があつすぎたりして自由度が高すぎるとなりやすい。重みが大きくなると過学習になる。正則化項を追加して、重みが大きくならないようにコントロールする。
正則化
・ネットワークの自由度(層数、ノード数、パラメータの値など)を制約すること。
・L1正則化　Lasso回帰、マンハッタン距離(P1ノルム) 二次元平面に落とすとあるパラメータが0になるようなある軸上のパラメータを出してくれるのが特徴であり、スパースになる。
・L2正則化　Ridge回帰、ユークリッド距離(P2ノルム)　二次元平面に落とすと円になるので、軸上ではない点で誤差関数と接する、そのためスパーズではない。
★練習問題 変数の勾配＝係数x正則化項目の微分。
問題1 L2正則化の微分を聞かれている。答えはparam。paramの二乗を微分するので、2paramになるが、係数の2はそもそもの係数に内包されれば良いので、paramとなる。
問題2 L1正則化の微分を聞かれている。答えはparamを微分した定数になるため、正数もしくは負数の定数となる。sign関数は符号を返してくれる関数なので、符号＋定数を返すsign(param)関数。
・ドロップアウト
ノード数が多い場合には、ランダムにノードを削除して学習をさせる。データ量を変化させずに、異なるモデルを学習していると思わせることができる。
・Weight decay荷重減衰
重みが大きい値は学習において重要な値であるが、重みが大きいとそれに引っ張られてoverfittingが起きる。
overfittingが起きそうな重み以下で重みをコントロールし、かつ重みの大きさにはばらつきを出す必要がある。

過学習ハンズオン
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/handson2_5_overfiting.ipynb
過学習テスト
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/20210704NNDay2%E9%81%8E%E5%AD%A6%E7%BF%92%E3%83%86%E3%82%B9%E3%83%88.ipynb

Section 4 畳み込みニューラルネットワーク
・次元的なつながりのあるデータに用いることができる。画像、音声、CT画像など。
・ 畳み込み演算は、特定の重みが設定されたフィルターを用意し、入力画像からフィルターと同サイズの領域データ（部分行列）を切り出して重みやバイアスを計算して出す。切り出した行列の左上から右下までの要素のうち、何を引き出すかは活性化関数による。このフィルタをスライドさせて順番に計算させることで、圧縮した画像データが生成される。この計算過程で得られたデータは特徴マップと呼ばれる。この計算の過程は次元間の繋がりは保たれている。
・最終的には特徴マップを並べて結合して１次元におとし、全結合層として処理をする。
・すなわち、全体の構造＝次元のつながりを保つ特徴抽出＋人間が最終的にほしい結果を求める全結合層　に分かれる。
・畳み込み層のパラメータについて
フィルター　全結合で言う重み
バイアス　畳み込みでも加えるバイアス項がある
パディング 畳み込み演算をするにあたり周囲を埋めて画像が小さくならないようにする。
ストライド　フィルターを動かす幅
チャネル　フィルターの数
・プーリング層　切り出した領域の代表値(最小、最大、平均などを取得する。
・畳み込み演算の利点。畳み込み演算によって高次元のデータを保持できる。例えば画像のRGBなどの関連性。

畳み込みニューラルネットワークハンズオン
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/handson2_6_simple_convolution_network.ipynb
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/2_6_simple_convolution_network_after.ipynb

畳み込みニューラルネットワークテスト
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/20210704NNDay2CCN%E3%83%86%E3%82%B9%E3%83%88.ipynb

Section 5 最新のCNN
AlexNet　比較的初期の小さなニューラルネット。２０２１年のILSVRC (ImageNet Large Scale Visua; Recognition Challenge)
モデルの構造；５層の畳み込みおよびプーリング。それに続く３層の全結合層。4096の全結合層の出力にドロップアウトを使用して過学習を防いでいる。

最新のCNNハンズオン
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/2_7_double_comvolution_network.ipynb
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/2_7_double_comvolution_network_after.ipynb
https://github.com/MasahitoKatsuki/RabbitChallenge/blob/main/2_8_deep_convolution_net.ipynb
最新のCNNテスト　なし