ラビットチャレンジ学習レポート：深層学習day2

# Section1：勾配消失問題
・誤差逆伝播法が階層に進んでいくについて勾配がどんどん緩やかになっていく。そのため、勾配降下法による更新では下位層のパラメータはほとんど変わらず訓練は最適値に収束しなくなる
・シグモイド関数は大きな値では出力の変化が微小なため、勾配消失問題を引き起こすことがあった。
・勾配消失の解決策
　1.活性化関数の選択
 　　→ReLU
```math
     f(x) = \begin{cases}
     1 & (x > 0) \\
     0 & (x \leqq 0)
     \end{cases}
```
　　-今最も使われている活性化関数
　　-勾配消失問題の回避とスパース化に貢献することで良い成果をもたらしている。

　2.重みの初期値設定
　　→Xavier
  　　　→初期値を設定する際の活性化関数：ReLU、シグモイド関数、双曲線正接関数
  　　　→重みの要素を、前の層のノード数の平方根で除算した値
　　→He
  　　　→初期値を設定する際の活性化関数：ReLU
  　　　→重みの要素を、前の層のノード数の平方根で除算した値に対して√2を掛け合わせた値

　3.バッチ正規化
　-バッチ正規化とは
 　　→ミニバッチ単位で、入力値のデータの偏りを抑制する手法
　-バッチ正規化の使い所
 　　→活性化関数に値を渡す前後に、バッチ正規化の処理を孕んだ層を加える
   　　　バッチ正規化の入力値：$u^{(l)}= w^{(l)}z^{(l-1)}+b^{(l)}$ or $z$

## 実装演習
活性化関数：シグモイド関数、重みの初期化：ガウス分布
→学習が進まず、勾配消失問題に直面していることがわかる
![スクリーンショット 2024-06-17 16.41.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/e36bb4df-9dc4-27bf-4d1c-a047f3907e1c.png)

活性化関数：ReLU、重みの初期化：ガウス分布
→正解率が右肩上がりで、勾配消失問題に陥らずうまく学習が進んでいることがわかる
![スクリーンショット 2024-06-17 16.44.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/e2ad8530-8166-edbc-ce9b-aa4b017c508f.png)

活性化関数：シグモイド関数、重みの初期化：Xavier
→正解率が右肩上がりで、勾配消失問題に陥らずうまく学習が進んでいることがわかる。
　ReLUよりも正解率の立ち上がりが早い
![スクリーンショット 2024-06-17 16.49.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/8b10c963-3cec-d516-84e8-c06671c7bd38.png)

活性化関数：ReLU、重みの初期化：He
→正解率が右肩上がりで、勾配消失問題に陥らずうまく学習が進んでいることがわかる。
　Xavierよりもさらに正解率の立ち上がりが早い。
　活性化関数と重みの初期化、どちらも正解率の向上に重要な要素であることがわかった。
![スクリーンショット 2024-06-17 16.52.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/979b2a09-e17a-b4b3-e204-87b4c4297cc2.png)



## 確認テスト
Q：シグモイド関数を微分した時、入力値が0の時に最大値を取る。その値として正しいものを選択肢から選べ。(1)0.15、(2)0.25、(3)0.35、(4)0.45
A：シグモイド関数は、$f(x)=\frac{1}{1+e^{(-x)}}$
 　　微分すると、$f'(x) = f(x)(1-f(x))$
   　　x=0の時、$f'(0) = \frac{1}{1+1}(1-1/2) = 0.25$
     　→(2)

Q：重みの初期値に0を設定すると、どのような問題が発生するか。簡潔に説明せよ。
A：初期値を0にすると、場合によって学習にかなり時間がかかる可能性がある。

Q：一般的に考えられるバッチ正規化の効果を2点挙げよ
A：1.各層の入力の分布が安定するため、より高い学習率を維持できる。
　　2.過学習を抑制できる。


# Section2：学習率最適化手法
・学習率の値が小さい場合、最適値にいつまでも辿り着かず発散してしまう
・学習率の値が小さい場合、発散はしないが、収束まで時間がかかる。大域局所最適値に収束しづらくなる
・学習率を最適化させるための考え方
　-初期の学習率を大きく設定し、徐々に学習率を小さくする。
　-パラメータ毎に学習率を可変させる。

■学習率を最適化させるための手法
・モメンタム
　-誤差をパラメータで微分したものと学習率の積を減算した後、現在の重みに前回の重みを減算した値と慣性の積を加算する
 　-局所最適解にならず、大域的最適解となる。
  　-谷間についてから最も低い位置（最適値）にいくまでの時間が早い。
   
・AdaGrad
　-誤差をパラメータで微分したものと再定義した学習率の積を減算する
　-勾配の緩やかな斜面に対して、最適値に近づける
  
・RMSProp
　-誤差をパラメータで微分したものと再定義した学習率の積を減算する
 　-局所的最適解にならず、大域的最適解となる
  　-ハイパーパラメータの調整が必要な場合が少ない。
 
・Adam
　-モメンタムの過去の購買の指数的減衰平均
 　-RMSPropの過去の購買の2乗の指数関数的減衰平均
 　-モメンタムおよびRMSPropのメリットを孕んだアルゴリズムである

## 実装演習
最適化手法：SGD
→正解率が向上せず、学習がうまく進んでいないことがわかる。
![スクリーンショット 2024-06-17 23.13.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/1249e7bb-27ed-2917-02ab-d2159faa3806.png)

最適化手法：モメンタム
→グラフが右肩上がりで、SGDより効率的に学習できていることがわかる。
![スクリーンショット 2024-06-17 23.14.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/c8c1f3af-c77d-9ea4-3891-27e6eafdb99c.png)

最適化手法：AdaGrad
→グラフが右肩上がりで、SGDより効率的に学習できていることがわかる。
　後半の最後の方は、モメンタムよりさらに精度が向上しているように見える
![スクリーンショット 2024-06-17 23.15.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/3735d473-bb66-5148-996c-9def5aa373f1.png)

最適化手法：RMSProp
→グラフが右肩上がりで、効率的に学習できていることがわかる。
　モメンタムやAdaGradよりグラフの立ち上がりが早い。正解率もさらに向上している。
![スクリーンショット 2024-06-17 23.16.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/eb9f12c8-5fa8-3259-ca54-f6dc73959edf.png)

最適化手法：Adam
→グラフが右肩上がりで、効率的に学習できていることがわかる。
　モメンタムやAdaGradよりグラフの立ち上がりが早い。さらに効率的な学習がされていると思われる。　正解率もさらに向上している。
![スクリーンショット 2024-06-17 23.17.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/ee908315-7d11-eb8c-bca4-fa3bc54edd45.png)


## 確認テスト
Q：モメンタム・AdaGrad・RMSPropの特徴をそれぞれ簡潔に説明せよ
A：モメンタム→SGDの単に勾配方向に学習を進める非効率な欠点を改善した手法。現在の重みに前回の重みを減算した値と慣性の積を加算することで、より効率的に学習が進む。
　　AdaGrad→学習係数の減衰という方法を採用している。学習が進むにつれて学習係数を小さくする。最初は大きく学習し、次第に小さく学習する方法。
 　　RMSProp→AdaGradの改良版。過去の勾配を徐々に忘れて新しい勾配の情報が大きく反映されるように加算する

# Section3：過学習
・過学習とは、テスト誤差と訓練誤差とで学習曲線が乖離すること。特定の訓練サンプルに対して、特化して学習してしまっている。
・過学習の原因
　-ネットワークの自由度(層数、ノード数、パラメータの値など)が高いこと
・正則化手法を利用して過学習を抑制する
　-正則化とは、ネットワークの自由度を制約すること

■Weight decay（荷重減衰）
・Weigit decayとは、学習の過程において大きな重みを持つことに対してペナルティを課すことで、過学習を抑制しようというもの。
・過学習の原因
　 -重みが大きい値を取ることで、過学習が発生することがある
 　　→学習させていくと、重みにばらつきが発生する。重みは学習において重要な値であり、重みが大きいと過学習が起こる。
・過学習の解決策
　-誤差に対して、正則化項を加算することで、重みを抑制する
 　　→過学習が起こりそうな重みの大きさ以下で重みをコントロールし、かつ重みの大きさにばらつきを出す必要がある。

■L1、L2正則化
・誤差関数に、pノルムを加える。P=1の場合、L1正則化、p=2の場合、L2正則化と呼ぶ。
$E_n(W)+\frac{1}{p}λ||x||_p$
```python
weight_decay += weight_decay_lambda*np.sum(np.abs(network.params['W'+str(idx)]))
loss = network.loss(x_batch, d_batch) + weight_decay
```
・pノルムの計算
$||x||_p = (|x_1|^p+...+|x_n|^p)^\frac{1}{p}$
```python
np.sum(np.abs(network.params[`W`+str(idx)]))
```
■ドロップアウト
・過学習の課題
　-ノードの数が多い
・ドロップアウトとは、ランダムにノードを削除して学習させること
・データ量を変化させずに、異なるモデルを学習させていると解釈でき、過学習を抑制できる

## 実装演習
学習結果が途中で頭打ちになった。過学習を起こしていると考えられる。
![スクリーンショット 2024-06-18 17.55.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/4fc006ee-ee79-8cc8-6229-c7d8ec55af8b.png)

L2正則化を適用。過学習が改善された。
![スクリーンショット 2024-06-18 17.57.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/36e2ad76-6257-414a-57ba-2e6de80714c5.png)

L1正則化を適用。L1正則化ではスパース性の高い解が得られるためか、曲線がジグザグになった。
![スクリーンショット 2024-06-18 18.00.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/348089c8-8325-bd5d-f23b-a8b94397af72.png)

Dropoutを適用。訓練データとテストデータの認識制度の隔たりが小さくなった気がする。
![スクリーンショット 2024-06-18 19.33.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/71c867bb-d05a-6c86-5f5c-945d769412d1.png)

DropoutとL1正則化を適用。前半部分の曲線は滑らかになった。訓練データとテストデータの認識精度の隔たりはあまり変わらなかった。
![スクリーンショット 2024-06-18 19.38.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/227d1124-9955-6834-54bf-ea193d5b3e93.png)



## 確認テスト
Q：機械学習で使われる線形モデル（線形回帰、主成分分析…etc）の正則化は、モデルの重みを制限することで可能となる。前述の線形モデルの正則化手法の中にリッジ回帰という手法があり、その特徴として正しいものを選択しなさい。
(a) ハイパーパラメータを大きな値に設定すると、すべての重みが限りなく0に近づく
(b) ハイパーパラメータを0に設定すると、非線形回帰となる
(c) バイアス項についても、正則化される
(d) リッジ回帰の場合、隠れ層に対して正則化項を加える
A：(a)


Q：下図について、L1正則化を表しているグラフはどちらか答えよ。
![スクリーンショット 2024-06-18 17.20.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/f099206e-b2b5-729b-6ecd-9c6d15ec4a58.png)
A：L1正則化は右側。L1正則化は四角形の頂点で誤差の等高線と正則化項の等高線が接する。

# Section4：畳み込みニューラルネットワークの概念
・畳み込み層とは、3次元の空間情報も学習できるような層のこと。
・画像の場合、縦、横、チャンネルの3次元のデータをそのまま学習し、次に伝えることができる。

■畳み込みの演算概念
![スクリーンショット 2024-06-18 21.57.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/02114762-429d-fefd-d651-80e0183302a9.png)
入力画像の要素とフィルターの要素を乗算し、その和を求める。
→3×3 + 4×1 + 4×2 + 0×8 + 8×7 + 9×5 + 0×5 + 4×4 + 3×1 = 141

・バイアス
![スクリーンショット 2024-06-18 22.01.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/5401b91b-73b8-e080-126c-40da833fc150.png)
演算結果に加える値のことをバイアスという。上記画像ではバイアス4。

・パディング
![スクリーンショット 2024-06-18 22.05.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/c8d59255-5d12-ea3b-6f8a-3d8561a5e96f.png)
畳み込み層の処理を行う前に、入力データの周囲に固定データを埋めることをパディングという。上記画像では、０で周囲を埋めている。

・ストライド
![スクリーンショット 2024-06-18 22.08.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/55902c70-1df6-ee3f-e50b-fbc01bd32be8.png)
フィルターを適用する間隔のことをストライドという。上記画像はストライド2。

・チャンネル
![スクリーンショット 2024-06-18 22.12.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/3e299047-5778-b403-4422-98e55b5068b2.png)
3次元のデータを扱う場合は、奥行き方向も合わせて演算を行う必要がある。この奥行き方向のことをチャンネルという。上記画像ではチャンネル3。

■全結合で画像を学習した際の課題
・全結合層のデメリット
→画像の場合、縦、横、チャンネルの3次元データだが、1次元のデータとして処理される。
　→RGBの各チャンネル間の関連性が、学習に反映されない。

■プーリング層の演算概念
・プーリングとは、縦、横方向の空間を小さくする演算のこと。
![スクリーンショット 2024-06-18 22.22.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/b3827498-3919-256c-1153-33a14ee8def3.png)
→上記は3×3のMAXプーリング（もしくは平均値プーリング）を、ストライド1で行った場合の処理。

## 実装演習
・image to column
4×4の入力画像に3×3のフィルターを適用
処理結果は行8、列9になる。
![スクリーンショット 2024-06-18 22.52.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/90396081-ad04-7d20-82f6-1088b3e7d695.png)

・CNNを適用
![スクリーンショット 2024-06-18 23.30.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/ecdcf0e1-3648-1da7-82e9-94f33c61d499.png)


## 確認テスト
Q：サイズ6×6の入力画像を、サイズ2×2のフィルタで畳み込んだ時の出力画像のサイズを答えよ。なお、ストライドとパディングは1とする。
A：7×7

# Section5：最新のCNN
・LeNet
-CNNの元祖。手書き文字認識を行うネットワークとして1998年に提案された。
-要素を間引くだけのサブサンプリング層を連続して行い、最後に全結合層を経結果が出力される。
-活性化関数はシグモイド関数。

・AlexNet
-2012年に登場。ディープラーニングの火付け役。
-畳み込み層とプーリング層を重ねて最後に全結合層を経由。
-活性化関数はReLU。LRNという局所的正規化を行う層を用いる。
-Dropoutを使用する。
    
# [フレームワーク演習]正則化/最適化
■学習の安定化-未学習・過学習の回避
・過学習を抑制する方法
　・パラメータ正規化
　　-L1正規化、L2正規化、Elastic Net
 　・正規化レイヤー
　　-Dropout、Batch正規化、Layer正規化、Instance正規化

・過学習が起きる理由
→訓練サンプルにだけ適合した学習をした結果、本来の目的である汎化性能が得られない。

・過学習が起きる原因の例
　-パラメータの数が多すぎる
　-パラメータの値が偏っている
　-ノードが多すぎる
　　→上位３つはモデルが複雑すぎる可能性があるので、正規化を適用し過学習を回避する。
　-学習データが不足している。
　-学習データが偏っている

・正規化とは
→ネットワークの自由度を制約すること。Regularization。
　→正規化によりモデルの複雑さを抑制し、訓練サンプルに対する過剰適合を抑制する。

　▼パラメータ正規化
　・L1、L2正規化
　→誤差に対して正規化項を加算することで、重み（パラメータ）を抑制する
　　・L1正規化（Lasso回帰）
 　　　-パラメータ自体を削減する
　　・L2正規化（Ridge回帰）
　　　 -パラメータが発散することを抑制する
    ![スクリーンショット 2024-06-20 19.37.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/a503e2cc-4b4e-a346-1735-14c15288dccb.png)

　・Elastic Net
　　→L1、L2正規化を組み合わせたもの
```math
Elastic Net = \sum_{i=1}^{n}(y^{(i)}-\hat{y}^{(i)})^2+λ_1\sum_{j=1}^{m}w_j^2-λ_2\sum_{j=2}^{m}|w_j|
```
　　　※$λ_1$、$λ_2$はハイパーパラメータ。各正則化項の制約の強さを調整する。
   
　▼正規化レイヤー
 　・データの正規化。レイヤー間を流れるデータの分布を、何らかの単位で平均が0、分散が1になるように正規化する。
  ![スクリーンショット 2024-06-20 19.39.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/6e227b6e-000c-da82-4e46-1064ec7d6d8f.png)

  
　・Batch正規化
 　　→H×W×CのsampleがN個あった場合に、N個の同一チャネルが正規化の単位。ミニバッチのサイズを大きく取れない場合には効果が薄くなってしまう。
 ![スクリーンショット 2024-06-20 19.40.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/fbe9244d-c484-51a3-2ce5-efaf7a356e59.png)

　・Layer正規化
　　→N個のsampleのうち一つに注目。H×W×Cの全てのpixelが正規化の単位。ミニバッチの数に依存しないので、Batch正規化の問題を解消できていると考えられる。
 ![スクリーンショット 2024-06-20 19.42.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/01f49068-0aa6-7f0f-216a-acd863dc109a.png)

　・Instance正規化
　　→各サンプルの各チャネルごとに正規化。Batch正規化の際のバッチサイズが１の場合と等価。
  ![スクリーンショット 2024-06-20 19.41.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/eb1f156e-9481-2073-6c4c-4bc88af61efd.png)

　・Dropout
 　　→ランダムにノードを削除して学習させる。データ量はそのままで、より疎なモデルで学習することで過学習を抑制する。
   ![スクリーンショット 2024-06-20 19.38.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/db672f9e-5be1-2818-8364-216353fcd236.png)

## 実装演習
・L1正則化、L2正則化、Elastic Net
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/b60d5fa2-58f1-8440-64d9-e711ae8ca98d.png)
・何もしていないもの「None」はエポック数が8以降、val_lossで増加傾向が見られる。
・Elastic Netで、val_lossとlossの差が小さく、過学習に最も効果的であることが分かる。
・今回の場合、L2正則化よりL1正則化の方が過学習を効果的に防いでいる。L1正則化のスパース性を促進する効果によるものだろうか。

・バッチ正規化、レイヤー正規化、インスタンス正規化
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/2d3bb859-c543-5ed0-da40-57ff8871eeff.png)
・今回の例では、バッチ正規化が過学習に効果的であるように見える。
・レイヤー正規は過学習が悪化している。バッチ正規化ではチャンネルを分けて正規化しているのに対し、レイヤー正規化ではチャンネルを分けずに正規化しているため、過学習に悪化したのだろうか。チャンネルを分けるインスタンス正規化では、レイヤー正規化に比べ、過学習に効果的な結果が得られている。

・ドロップアウト
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817732/bb6f9627-22cb-0af4-bb13-ff562be64ff9.png)
・ドロップアウトを使用した方が、特に後半部分で過学習が抑制されている。ドロップアウトが汎化性能を向上させることが分かる。