深層学習-CNN

#深層学習-CNN
- 連鎖率の復習
- 勾配消失問題
- 学習率最適化手法
- 過学習
- 畳み込みニューラルネットワークの概念
- 最新のCNN

##連鎖率（確認テスト）
連鎖率の原理を使い、dz/dxを求めよ。

```math 
z = t^2\\
t = x + y
```
####解答

```math
\frac{dz}{dx} = \frac{dz}{dt}\frac{dt}{dx}\\
\frac{dz}{dt} = 2t,
\frac{dt}{dx} = 1\\
\frac{dz}{dx} = 2t・1 = 2t
```

##勾配消失問題
ニューラルネットワークにおいて勾配が消失することによって、学習が進まなくなる技術的な問題のことを勾配消失か問題という。
勾配消失問題を解決するためには、三つの解決法がある。
- 活性化関数の選択
- 重みの初期値設定
- バッチ正則化

###活性化関数の選択
ReLU関数を選定することで勾配消失やスパース化を回避することができる。

###確認テスト
シグモイド関数を微分した時、入力値を０にした時に最大値を取る。
その値はなにか？

```math 
f(u) = \frac{1}{1 + e^{-u}} = 0.5\\
\frac{∂z}{∂u} = (1 - sigmoid(x))*sigmoid(x) = (1-0.5)0.5 = 0.25\\
```

###重みの初期値設定
####Xavier
初期値の設定方法は、重みの要素を前の層のノード数の平方根で徐算した値。
Xavierの初期値を設定する際の活性化関数は→

- ReLU関数
- シグモイド関数
- 双曲線正接関数

```python 
network['W1'] = np.random.randon(input_layer_size, hidden_layer_size) / np.sqrt(hidden_layer_size)
netrowk['W2'] = np.random.randon(hidden_layer_size, output_layer_size) / np.sqrt(hidden_layer_size)
```
####He
初期値の設定方法は、重みの要素を前の層のノード数の平方根で徐算した値に対し、√2を掛け合わせた数値。
Heの初期値を設定する際の活性化関数はReLU関数である。

###確認テスト
重みの初期値に０を設定するとどのような問題が発生するか？

重みの初期値を０に設定すると、全ての値が同じ値に伝わるため、パラメータのチューニングが行われなくなる。
#####シグモイド関数
![シグモイド関数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/2c0c3754-3a1e-90c9-7dce-cc21f735f067.png)

#####ReLU関数
![ReLU関数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/c9ec146a-3d78-f657-e10d-9094d286d3ce.png)

#####シグモイド関数 - Xavier 
![シグモイド関数 - Xavier.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/b4883960-406f-0f0a-5d54-7787c37f29f0.png)

#####シグモイド関数 - He
![シグモイド関数 - He.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/2e4c0081-7277-10b1-db96-d095b495a6b3.png)

#####ReLU関数 - Xavier
![ReLU関数 - Xavier.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/41bcbedc-cece-550e-2997-9d6b86c1ecb5.png)

#####ReLU関数 - He
![シグモイド関数 - He.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/60378868-092f-8ddc-a899-1524ae0fbb9e.png)


###考察
シグモイド関数については、Heの方が安定的に学習できている。
一般的にReLU関数とHeの相性が良いとされているが、今回の結果を見るとXavierとの相性も良いことがわかる。

###バッチ正規化
ミニバッチ単位で入力値のデータの偏りを抑制する手法。活性化関数に値を渡す前後にバッチ正則化の処理を学んだ層を加える。
###確認テスト
バッチ正規化の効果は？

効果は、計算の高速化や勾配消失が起きづらくなる。




```math 
µ_t = \frac{1}{N_t}∑x_{mi} \\
σ^2_i = \frac{1}{N_t}∑(x_{mi} - µ_t)^2　\\
x_{mi} = \frac{x_{mi} - µ_t}{\sqrt{σ^2_t + θ}} \\
y_{ni} = rx_{ni}  +β
```
##学習率最適化手法
- モメンタム
- AdaGrad
- RMSProp
- Adam

###モメンタム
誤差をパラメータで微分したものと学習率の積を減算した後、現存の重みに前回の重みを減算した値と慣性の積を加算する。
メリットは、局所的最適解にならず、大域的最適解となる、
谷間についてから最も低い位置（最適値）にいくまでの時間が早いことが考えられる。

```math 
V_t = µV_{t-1} - ξΔE \\
\\
W^{(t+1)} = w^{(t)} + V_t\\
慣性：µ
```
###Momentum-LearinngRate=0.1
![momentum- learning rate0.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/f86841cf-f5c1-4fd8-1fe6-2070fc813070.png)


###AdaGrad
誤差をパラメータで微分したものと再定義した学習率の積を減算する。
勾配の緩やかな斜面に対して最適値に近づけるというメリットがある一方で、
学習率が徐々に小さくなるので、鞍点問題を引き起こすことがあった。
鞍点とは、ある方向で見れば極大値だが、別の方向で見れば局所うちになってしまう、つまり、極地を持たない停留点のことである。

```math 
h_0 = θ\\
\\
h_t = h_{t-1} + (ΔE)^2\\
\\
W^{(t+1)} = w^{(t)} - ξ\frac{1}{\sqrt{h_t} + θ}ΔE
```
###AdaGrad-LearningRate=0.05
![AdaGrad - learning rate0.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/fd8f36b4-0cb2-d314-eba0-a499f5563291.png)

###RMSProp
誤差をパラメータで微分したものと再定義した学習率の積を減算する。
メリットは２つあって、
→局所的最適化にはならず、大域的最適解となる。
→ハイパーパラメータの調整が必要な場合が少ない。

```math 
h_t = ah_{t-1} + (1-a)(ΔE)^2\\
W^{(t+1)} = w{(t)} - ξ\frac{1}{\sqrt{h_t} + θ}ΔE
```
###RMSProp-LearningRate=0.01
![RMSProp - learning rate0.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/0db4f582-987b-f6c1-e115-46674039b8cd.png)



###確認テスト
モメンタム・AdaGrad・RMSPropの特徴は？
・モメンタムー局所的最適解にならず、大域的最適解となる。また、谷間についてから最も低い位置（最適値）にいくまでの時間が早いことが考えられる。
・AdaGradー勾配の緩やかな斜面に対して最適値に近づける。
・RMSPropー局所的最適化にはならず、大域的最適解となる。また、ハイパーパラメータの調整が必要な場合が少ない。
###Adam
モメンタムとRMSPropの一部を含んだ最適化アルゴリズムである。

- モメンタムの過去の勾配の指数関数的減退
- RMSPropの過去の勾配の２乗の指数関数的減衰平均
を孕んでいる。
特徴としては、モメンタムとRMSPropのメリットを孕んだアルゴリズムである。
→谷間についてから最も低い位置に行くまでの時間が早い。
→ハイパーパラメータの調整が必要な場合が少ない。

###Adam-LearningRate=0.01
![Adam - learning rate0.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/2e85002b-07e5-c6e2-5bf2-5f31fba99f6d.png)


###考察
学習率の値を大きくすることで正答率が上がった。
モメンタムとAdaGrandに関しては、学習率が0.01の場合、学習しなかった。そのため、学習率を大きくすることで学習させたが、モメンタムが正答率９０％になるのが学習率＝0.5、AdaGradは学習率＝0.3であった。
一方、RMSPropは0.02、Adamは0.01で正答率９０％を超える結果となった。

##過学習
テスト誤差と訓練誤差とで学習曲線が乖離することを過学習という。
つまり、特定の訓練誤差に対して特化して学習してしまうと言い換えることもできる。
その原因は、
→パラメータの数が多い
→パラメータの値が適切でない
→ノードが多い　
→→総じて、ネットワーク自由度が高いことが考えられる。

解決策として、<b>L1正則化・L2正則化・ドロップアウト</b>が考えられる。
正則化をすることで、ネットワークの自由度を制約し、過学習を抑えることができる。

###weight decay（荷重減退)

重みが大きい値を取ることで、過学習が発生することがある。
→学習させていくと、重みにばらつきが発生する。
 重みが大きい値は学習において重要な値であり、重みが大きいと過学習が起きる。

解決策
誤差に対して正則化項を加算することで重みを抑制する。
→過学習が起こりそうな重みの大きさ以下で重みをコントロールし、かつ重みの大きさにばらつきを出す必要がある。

###L1、L２正則化

```math 
||x||_p = (|x_1|^p + ... + |x_n|^p)^{\frac{1}{p}}  : pノルムの計算
```

```python
np.sum(np.abs(network.params['W' + str(idx)]))

```

```math 
E_n(W) + \frac{1}{p}λ||x||_p  : 誤差関数にpノルムを加える
```

```python 
weight_decay += weight_decay_lamda
*np.sum(np.abs(network.params['W' + str(idx)]))

loss = network.loss(x_batch, d_batch) + weight_decay
```

###確認テスト
下図についてL1正則化を表しているぐらふはどちらか？
![スクリーンショット 2020-12-23 20.37.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/2520625c-8c0b-7ea5-e5f0-1a42069100ea.png)

答えは、左のRidge推定量！
pノルム＝１だったらRidge推定量、pノルム＝２だったらLasso推定量だよ！

###ドロップアウト
ランダムにノードを削除して学習させる。
過学習の課題の一つであるノード数が多いことに対応している。
メリットは、データ量を変化させずに異なるモデルを学習していると解釈できる点である。

##畳み込みニューラルネットワーク（CNN）について
###CNNの構造
####例
入力層（入力画像）→畳み込み層→畳み込み層→プーリング層→畳み込み層
↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←↓
畳み込み層→プーリング層→全結合層→出力層（出力画像）

###畳み込み層
画像の場合、縦・横・チャンネルの３次元のデータをそのまま学習し、次に伝えることができる。
つまり、３次元の空間情報も学習できるような層が畳み込み層である。
####全体像
![IMG_5757.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/34c11f14-5fa2-0e54-22e1-94edde991d3e.jpeg)
####演算概念
![IMG_5758.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/efe65375-af96-66cf-af22-75494676cb94.jpeg)
#####バイアス
![IMG_5759.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/4be3d7ec-8997-b5a0-64dc-7606b572fdf6.jpeg)
#####パディング
パディングを使うことで、出力画像のサイズを変えることができる。
![IMG_5760.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/0739e215-eb77-b309-6fa3-cfcb775bbb94.jpeg)
#####ストライド
![IMG_5761 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/228f4612-1b54-c183-5261-afa64679ebce.jpeg)
#####チャンネル
奥行きの層分だけチャンネルを数える。フィルターもチャンネルの数分ある。
畳み込み層はチャンネルによって、全結合層のデメリットをカバーしている。
全結合層→画像の場合、縦・横・チャンネルの３次元データだが、１次元のデータとして処理される。
つまり、RGBの各チャンネル間の関連性が学習に反映されないということである。
RGB=色の表現法の一種
![IMG_5762.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/f5294ec7-6e8a-2b3e-856f-1950949c0c6e.jpeg)
###プーリング層
![IMG_5763.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906331/6ad784b1-bcfb-7779-b30d-badbfe50f4a4.jpeg)

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

```math
OH = \frac{H+2P - FH}{S} + 1 = \frac{6+2*1-2}{1}+1 = 7\\
OW = \frac{W+2P - FW}{S} + 1 = \frac{6+2*1-2}{1}+1 = 7\\
H:Height\\
W:Width\\
P:Padding\\
S:Stride\\
F:Filter
```


##最新のCNN
###AlexNet
2012年の大会で2位以下に圧倒的な大差をつけて勝利したCNNモデル。
####モデルの構造
５層の畳み込み層およびプーリング層
それに続く３層の全結合層から構成される。

過学習を防ぐ施策として、
サイズ４０９６の全結合層の出力にドロップアウトを使用している。