深層学習前編2　勾配消失問題～学習率最適化手法 講義課題視聴レポート (現場で潰しが効くディープラーニング講座)

# 深層学習前編2
### 勾配消失問題
- 勾配消失問題とは誤差逆伝播法が下位層に進んでいくにつれて、勾配がどんどん緩やかになっていく問題。つまり、下位層のパラメータを更新してもほとんど値が変わらず最適値に収束しなくなってしまう
- 特にシグモイド関数を使っている場合に起きやすい。その理由はシグモイド関数の微分は最大値が0.25であるためパラメータの更新値が必然的に小さくなってしまうからである

##### 勾配消失問題の解決法1　活性化関数の選択
- ReLU関数を使用する(ReLU関数については活性化関数の項で説明済み)

##### 勾配消失問題の解決法2　初期値の設定
- ReLU関数、シグモイド関数、双曲線正接関数を使う場合にXavierという手法をつかって重みの初期値を設定すると勾配消失問題の解決につながる
- Xavierとは標準正規分布でランダムに生成した値を前の層のノード数で除算し、各パラメータの初期値とする方法

```python
    network['W1'] = wieght_init * np.random.randn(input_layer_size, hidden_layer_1_size)
    network['W2'] = wieght_init * np.random.randn(hidden_layer_1_size, hidden_layer_2_size)
    network['W3'] = wieght_init * np.random.randn(hidden_layer_2_size, output_layer_size)
```

- またReLU関数にはHeという設定方法もある
- Heとは標準正規分布でランダムに生成した値を前の層のノード数で除算し、√2を掛けたものを各パラメータの初期値とする方法

```python
    network['W1'] = np.random.randn(input_layer_size, hidden_layer_1_size) / np.sqrt(input_layer_size) * np.sqrt(2)
    network['W2'] = np.random.randn(hidden_layer_1_size, hidden_layer_2_size) / np.sqrt(hidden_layer_1_size) * np.sqrt(2)
    network['W3'] = np.random.randn(hidden_layer_2_size, output_layer_size) / np.sqrt(hidden_layer_2_size) * np.sqrt(2)
```

- 重みの初期値を0に設定してしまうとすべてのデータが同じ値で次の層に渡されるのでパラメータの更新がされなくなってしまう

##### 勾配消失問題の解決法3　バッチ正規化
- ミニバッチ単位で入力値のデータの偏りを抑制する手法。活性化関数に値を渡す前後に、バッチ正規化の処理を行う層を加える。
- バッチ正規化を行うことで、計算の高速化や勾配消失問題の解消などの効果がある

![無題9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/d65c06df-109c-034d-6af2-ad61ac394401.png)

#####  実装演習
- 初期値ランダム　シグモイド関数
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/ff92ea9d-3738-3de1-bce8-5fcb6b4e0010.png)
![無題1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/7b2e9a20-40e4-7484-3bda-482cc081df7b.png)
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/f6f5ce4c-d7d2-5b61-a9c4-56dd5431e496.png)
![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/f0c38ad2-2270-cd8b-aacc-14e596d019b9.png)
![無題4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/55e62e44-a401-d0dc-eb6c-eab78b4ff2d3.png)
![無題5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/c58d601e-8c49-4ba6-ceb1-df83568011be.png)
![無題6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/fa7abb72-7edd-2170-9573-c62772f3d596.png)

- 初期値ランダム　ReLU関数
![無題7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/dcd77a14-e18f-7b30-9b73-1d02933ea8af.png)
![無題8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/87c150f3-2876-1151-c75d-7244861f10bc.png)
![無題9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/42f520f6-2b48-1909-08d5-eeee6b55eeeb.png)
![無題10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/61113533-1f7b-4820-8daf-dcc2331a85f0.png)
![無題11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/5d46ec64-8cad-05b0-f059-2aa6046e8cae.png)
![無題12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/519d4710-49a3-af08-3acd-1e18296ca8c5.png)
![無題13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/209a0865-5e41-5577-3d49-6cec305a8b10.png)

- 初期値Xavier　シグモイド関数
![無題14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/16258732-d288-5338-434c-27766a030786.png)
![無題15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/10fd9a9c-f9ba-9756-952b-064e3964d1f2.png)
![無題16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/89d2f039-e778-9995-30f6-fa4360155fb2.png)
![無題17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/59fd266f-595f-80c6-ea0a-d974681164ef.png)
![無題18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/6b07beea-eb4a-d963-2966-0b383ee468a3.png)
![無題19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/9ffade06-b7d9-901f-dd02-ae71b042db8e.png)
![無題20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/75450cc7-6929-2680-178b-ca2d198ed77f.png)

- 初期値He　ReLU関数
![無題21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/fb5c49ee-a974-e48c-f3e8-6d7346a5ef89.png)
![無題22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/388ae80f-db0f-46c2-e553-29c4dedee714.png)
![無題23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/f6aae464-bd76-2c77-c60b-efbb0bb4d45d.png)
![無題24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/db120558-7cb2-a712-ded1-2067bcc9f578.png)
![無題25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/f0a5e302-b59b-dcba-d481-fa282a9dc2c6.png)
![無題26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/e834dbe2-1379-3e1c-50c5-09ccd978f108.png)
![無題27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/adc4b96a-e9d8-0489-d8f4-56ce753ff1b6.png)

- 初期値He　シグモイド関数
![無題28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/138164b4-20d2-643a-bbf0-f76bc7262cce.png)
![無題29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/350bf730-d1b1-c2e1-97df-453f5d06ca5c.png)

- 初期値Xavier　ReLU関数
![無題30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/2da39a6d-1dd4-e309-cde1-ceac8249bfd3.png)
![無題31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/c5a834b7-eacc-a02f-ca1a-3d6997dba2dc.png)

##### 考察
- 予想通り初期値ランダムでシグモイド関数を使った場合は勾配消失を起こし学習が進まなかった
- 初期値ランダムでReLU関数を使うと、時間はかかるが学習が進み最終的な精度も高くなることが確認できた
- 初期値をXavierで決めシグモイド関数を使うと、勾配消失は起こらなかったがReLU関数ほど良い結果は得られなかった
- 初期値をHeで決めReLU関数を使うと、初期値をランダムで比べた時に比べ学習が早く進み、同程度に良い結果が得られた
- 初期値をHeで決めシグモイド関数を使うと、初期値をXavierで決めたときと同じような結果になった
- 初期値をXavierで決めReLU関数を使うと初期値をHeで決めた時と同じような結果を得られた
- 全体的にReLE関数を使ったほうが良い結果を得ることができた。学習データの性質によってはシグモイド関数のほうが良い結果を出すことも考えられる。


### 学習率最適化法
- 勾配降下法を行うとき、学習率の大小により学習の結果が左右される。
- 最適な学習率を求める方法としてモメンタム、AdaGrad、RMSPrp、Adamなどがある

##### モメンタム
- モメンタムとは重みの修正量に、前回の重みの修正量を加算する方法

![無題10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/15d05e95-9fa2-62b2-439b-64e8107f8268.png)

- μは前回の重みの加算量を決めるハイパーパラメータで通常0.5～0.9の範囲から選ばれる
- モメンタムの利点は局所的最適解ではなく、大域的最適解を得ることができる点や勾配が急な点から、なだらかな点に行くまでの時間が早いなどがあげられる。
- pythonで記述すると以下の通りになる

```python
v[key] = momentum * v[key] - learning_rate * grad[key]
network.params[key] += v[key]
```

##### AdaGrad
- AdaGradとは誤差をパラメータで微分した値の二乗和を使って学習率の値を調整する方法

![無題11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/494d632b-664d-55d2-16bd-bf4f0cf7aead.png)

- θは分子が0にならないようにするための微小な値
- モメンタムと違い、勾配の緩やかな斜面に対して最適値に近づけることができる
- 学習率が徐々に小さくなる(増加することはない)ので鞍点問題を引き起こすことがある
- 鞍点問題とは多次元データを扱っているとき、ある次元から見た場合は極小値だが別の次元から見た場合は極大値になる点で学習が止まってしまう現象である
- pythonで記述すると以下の通りになる

```python
if i == 0:
  h[key] = np.full_like(network.params[key], 1e-4)
else:
  h[key] += np.square(grad[key])
network.params[key] -= learning_rate * grad[key] / (np.sqrt(h[key]))
```

##### RMSProp
- RMSPropとはAdaGradを改良したもので、勾配の二乗和ではなく勾配の指数移動平均を使って学習率を更新する方法である

![無題12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/32292f90-4206-5bf6-f83a-a4fa3a4b65c5.png)

- 利点として、局所的最適値にならず大域的最適値となる点やハイパーパラメータの調整が必要になる場合が少ない点があげられる
- pythonで記述すると以下の通りになる

```python
if i == 0:
  h[key] = np.zeros_like(network.params[key])
h[key] *= decay_rate
h[key] += (1 - decay_rate) * np.square(grad[key])
network.params[key] -= learning_rate * grad[key] /(np.sqrt(h[key]) + 1e-7)
```

##### Adam
- Adamとは勾配の和と勾配の二乗和を使って学習率を更新する方法
- pythonで記述すると以下の通りになる

```python
learning_rate_t  = learning_rate * np.sqrt(1.0 - beta2 ** (i + 1)) / (1.0 - beta1 ** (i + 1))    
for key in ('W1', 'W2', 'W3', 'b1', 'b2', 'b3'):
    if i == 0:
        m[key] = np.zeros_like(network.params[key])
        v[key] = np.zeros_like(network.params[key])
            
    m[key] += (1 - beta1) * (grad[key] - m[key])
    v[key] += (1 - beta2) * (grad[key] ** 2 - v[key])            
    network.params[key] -= learning_rate_t * m[key] /(np.sqrt(v[key]) + 1e-7)
```

##### 実装演習
- 以下は初期値を分散0.01のランダムな値、関数をReLU関数にした時の実装
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/ac985f4b-fc24-ad34-62fa-3958b524e20f.png)
![無題1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/ed1f240e-480d-dc99-deff-76e410d63715.png)
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/9ce939d6-0d4a-f517-1d1f-fb690aa548f5.png)

- モメンタム
![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/327e1657-834e-3af0-a1b0-381ae969ad25.png)
![無題4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/43a978ec-cf1c-7f62-abd8-7cc704115200.png)

- 慣性を0.8にした場合
![無題25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/f6886fff-1809-e0bc-7eb4-c399573f8a5a.png)

- 慣性を1にした場合
![無題6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/8cfc5f01-f548-ee53-edc8-24d9ee9e27f1.png)

- 慣性0.9で学習率を0.01から0.05にした場合
![無題7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/102ba3e1-2c9a-56f3-303c-e024d5e5fbbe.png)
![無題8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/757ff5ae-f079-c1ce-4c6a-4530524445f9.png)

- AdGrad
![無題9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/efb81e07-2fff-254c-5834-800d659a7184.png)
![無題10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/e2b5a630-0ad6-17af-881a-2cbbedb95a2d.png)
![無題11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/90dabdbd-6ec4-eef0-7005-d0ca873c87c4.png)

- RMSProp
![無題12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/ca7a55d3-4125-dffe-1a8f-e8608dd2080f.png)
![無題13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/0f832cf1-8269-e32e-a0d3-32ce8826fb15.png)
![無題14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/1afddbc8-8e54-ec6b-786f-7b1f3323935f.png)

- Adam
![無題15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/e99aee75-ccc7-eba0-71b3-edece68d49b8.png)
![無題16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/733b0ca9-846c-600f-e857-830e3c06c8d5.png)
![無題17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/b3ca0f0f-1e03-cbe0-5057-02c9de8cd946.png)

- シグモイド関数を使った場合(学習率最適化手法は未使用)
![無題18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/77b595e9-1bb3-16dd-5da4-12f5816dc533.png)
![無題19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/8159480e-aabe-8a40-20b9-027753dc0247.png)

- 初期値を分散1のランダムな値、関数はシグモイド関数を使用した場合
![無題20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/b71ed407-b3f2-3dc9-5420-20882602ead9.png)
![無題21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/c59af251-2b2f-dab7-1275-b68ff02f14a1.png)

- 初期値を分散0.01のランダムな値、関数はシグモイド関数を使用し、バッチ正規化を実行した場合
![無題22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/5d8b3e55-2f7e-602a-0327-6ebe1278adca.png)
![無題23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/83529b06-e11c-06d2-c1da-89c10fef5a7c.png)

##### 考察
- 初期値をランダムに決定し、ReLU関数を使った場合学習がうまくいかなかった
- 同じ条件でモメンタムを使用すると、学習は遅いが最終的に良い結果を得られた
- ここから慣性の値を変更してみたが学習はうまくいかなかった。今回の条件に関して言えば、慣性の値は0.9が最適のようだ
- そのため慣性の値を変えずに学習率を増やしてみると、早い段階でよい結果を得ることができた
- 今回の条件ではAdaGrad、RMSProp、Adamで学習した場合、パラメータの調整をせずに良い結果を得ることができた
- 通常の確率的勾配降下法をシグモイド関数で行った結果、勾配消失を起こし学習が進まなかった
- 学習率と初期値の分散の値を調整してみたところ、分散1、学習率0.5のとき比較的良い結果を得ることができた。しかしXavierや学習率最適化法を使ったほうが、手早く良い結果を得ることができると考える
- 最適化法を使わずにバッチ正規化だけ実行した場合、学習は少し進んでいるようだが良い結果を得ることができなかった。どれか1つの最適化手法を使うのではなく、複数の手法を組み合わせて使うことが望ましいと考える

[次へ(過学習～最新のCNN )](https://qiita.com/yuma-k105/items/fea69db99d892ec5b60d)