深層学習 day2

### 復習

####確認テスト p.10
連鎖律の原理を使い、dz/dxを求めよ。
$z = t^2$
$t = x + y$

$\frac{dz}{dx} = \frac{dz}{dt}\frac{dt}{dx} = 2t \times 1 = 2t = 2(x+y)$


####確認テスト p.18
シグモイド関数を微分した時、入力値が0の時に最大値をとる。その値として正しいものを選択肢から選べ。
（2）0.25

$f(x) = sigmoid(x)$
$f'(x) = (1-f(x))f(x)$
$f'(0.5) = (1-f(0))(f(0))=(1-0.5)\times 0.5 = 0.25$

## 勾配消失の解決方法
### 活性化関数
ReLU関数の利用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/600d7158-1ade-094e-a12d-32a25c501b76.png)

### 重みの初期値設定
重みの初期値設定に手を加えることで勾配消失に対処
#### 重みの初期値：Xavier
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/2f363847-7f91-c5b5-723e-48444a3b5d01.png)

#### 重みの初期値：He
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/3ae478aa-9f4c-71a4-c931-e50b389f897c.png)

####確認テスト p.25
重みの初期値に0を設定すると、どのような問題が発生するか。簡潔に説明せよ。
順伝播時に全て同じ値が伝達されてしまうため、全ての重みの値が均一に更新されてしまい、たくさんの重みパラメータを持つ意味がなくなる。

[参考　重みの初期値0について](https://www.takapy.work/entry/2018/06/14/221633)

### バッチ正規化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/927582e6-3a70-e1a8-3ee9-4f2d6711f1bf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/c792ba36-45ce-3ab4-4c4a-425c5ed4bac9.png)

#### 確認テスト p.29
一般的に考えられるバッチ正規化の効果を2点挙げよ。

1. 計算高速化
1. 勾配消失を防ぐ

#### 勾配消失問題 実装演習
##### 隠れ層のサイズ比較
Sigmoid-Xavier （隠れ層1層目：40、隠れ層2層目：20）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/522e4bb3-1656-875c-26be-3de0461574a3.png)

Sigmoid-Xavier （隠れ層1層目：100、隠れ層2層目：50）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/2d5e5160-fbed-2526-a939-60d81f374a17.png)

ReLU-He （隠れ層1層目：40、隠れ層2層目：20）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/7c869b45-5a2d-53d4-ca43-1877cdb39581.png)

ReLU-He （隠れ層1層目：100、隠れ層2層目：50）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/4bb1d2fe-a1f7-1483-4b1a-2550dfd5c633.png)

＜考察＞
隠れ層のサイズが大きい方が、accuracyが早く上昇していることから学習が早いことがわかる。
隠れ層のサイズが大きい方が、実行時間が長くなることから、計算量が多いことがわかる。

##### HeとXavierの比較
sigmoid - He
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/17324f18-4e62-4ccc-2db6-0cf6f28890ef.png)

ReLU - Xavier
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/dbd31884-ac2d-8845-d41b-7ec55e229e8e.png)

＜考察＞
sigmoid - Heは、sigmoid - Xavierに比べ、学習が早い。
ReLU - Xavierは、ReLU - Heに比べ、学習が早い。


## 学習率最適化手法
### モメンタム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/bc396ff8-3f99-f414-11e2-847897d0b1bb.png)

### AdaGrad
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/729afa98-23b6-b050-a063-df7f63911188.png)

### RMSProp
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/16aaa52a-5d68-c839-9016-5269b4b7ba40.png)

### Adam
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/b310e07d-56ec-4f9c-c612-fb7cd553be5f.png)


####確認テスト P.44
モメンタム・AdaGrad・RMSPropの特徴をそれぞれ簡潔に説明せよ。

モメンタム：前回の更新量を引き継ぐことで、収束が早くかつ鞍点に陥る問題を解消
Adagrad：誤差が小さくなっている重みはそれほど大きく更新せず、誤差が大きい重みは大きく更新がされるよう調整
RMSProp：AdaGradは一度更新量が飽和した重みは更新されないという欠点があったが、それを解決

####確認テスト P.53
プログラムの実装学習率最適化手法

#### 学習率最適化問題 実装演習
##### MomentumをもとにAdaGradを作ってみよう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/7d720efa-6529-c1b3-4ee3-49f82c0637ec.png)

<学習率 = 0.01>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/cfcbe417-3218-1d56-d966-4fe346341dd9.png)

##### 学習率を変えてみよう
<学習率 = 0.1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/a8c1c081-59ed-f815-696b-8ba76519273c.png)
学習率が0.01の場合は1000回繰り返しても正解率が大して上がらないが、0.1にすることで早く学習することが確認できた。

#### 活性化関数と重みの初期化方法を変えてみよう
ReLU, He, 学習率 = 0.1, バッチ正規化 = なし

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/1e614c5f-075d-2974-c22e-ce4c3c10bc88.png)

#### バッチ正規化をしてみよう
ReLU, He, 学習率 = 0.1, バッチ正規化 = あり
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/9a641e29-6e8c-4c42-d9ba-2dc24bacdb81.png)

バッチ正規化をすることで、学習が早くなっている。


## 過学習

### 正則化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/ea6a2eca-7865-469a-502a-8c49c4c49da2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/911a0de9-35bd-075f-be64-797f2f008838.png)


##### 確認テスト P.59
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/c59439e9-c982-a212-c967-94513551a54b.png)
答え）a

##### 確認テスト P.64
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/3bf8c32f-9669-baf4-39bf-805b22ffd775.png)
答え）右側のグラフがL1正則化を表している

### ドロップアウト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/b6a9a903-96ed-ff2c-38e1-6921d7ce8f6f.png)

#### 実装演習：weigth_decay_lambdaの値を変更して正則化の強さを確認しよう

L2: weight_decay_lambda = 0.1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/20caebff-681e-9bb0-cf92-207c977a4605.png)

L2: weight_decay_lambda = 0.5
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/c42fac53-1d99-d444-a92a-2a6326106f70.png)

L1: weight_decay_lambda = 0.005
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/3c612258-20d9-fe7a-57ad-a94d7b5bd913.png)

L1: weight_decay_lambda = 0.1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/5574ef3e-3df9-d1b1-3adb-7856a4be7719.png)

#### 実装演習：dropout_ratioの値を変更してみよう
dropout_ratio = 0.15
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/fd3583de-d907-131a-0593-67e8589557cf.png)

dropout_ratio = 0.001
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/dff8c1cd-8484-73ca-c33b-af7562938a9e.png)

#### 実装演習：optimizerとdropout_ratioの値を変更してみよう
dropout_ratio = 0.001 & optimizer = Adam
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/ad990b31-8bc8-66b4-206c-c847099fe299.png)

dropout_ratio = 0.08 ＋ L1正則化 weight_decay_lambda=0.004
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/9143ccc2-168d-27ad-3c8a-6bc2d253cac2.png)


## CNN
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/4df45fbf-79d5-8100-de99-7f26371b5f90.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/ca41cbcf-b82a-ec1c-af95-0893116684f9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/e54f20cd-53fa-4160-f7f0-9b96692822b9.png)

#### 確認テスト p.95
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/a2975bb1-6a43-e93e-e916-780a9da2cfb7.png)

#### 実装演習：im2colの処理を確認しよう
フィルタ=3×3、ストライド=1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/5ac2593d-da99-f22b-9170-8cf433b8ac6d.png)

フィルタ=4×4、ストライド=1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/f3de9de0-67b4-e2cc-49bf-a61d9eefce06.png)

フィルタ=2×2、ストライド=2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/521d3809-d53e-2d30-28ba-9e33110c078e.png)

#### 実装演習：col2imの処理を確認しよう
Imange➡Collumnへの変換
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/33e4c4cd-d79a-91b3-a501-a8b285f87761.png)
Collumn➡Imageへの変換
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619163/d83fc00e-c626-dbf5-0edc-55e0a1c75945.png)