レポート_深層学習(前編2)

深層学習(前編1)の復習

勾配消失問題・・誤差逆伝播法で下位層に進んでいくと、勾配が緩やかになっていく。
　　　　　　　　勾配が緩やかになるということは、勾配降下法でのパラメータ更新が
　　　　　　　　ほとんど変わらないことになってしまう。それにより、訓練データが
　　　　　　　　最適解に収束できなくなってしまう。
　　　　　　　　(可視化することで勾配消失が確認できるので可視化で確認することも大事。)

シグモイド関数・・0～1を緩やかに変化する関数で、ステップ関数ではON/OFFのみだったが、
　　　　　　　　　ON/OFFと信号の強弱を伝えることができる。
　　　　　　　　　デメリット：大きな値でも変化が微小のため、勾配消失問題を引き起こす場合がある。

確認テスト(2-2)
シグモイド関数を微分したとき、入力値が0のときに最大値をとる。その値として正しいものを選べ。
シグモイド関数

```math
{f(x) = \frac{1}{1+e^{-x}}}
```
微分すると、

```math
{f'(x) = (1 - f(x))f(x)}　　となる。
```

勾配消失の解決法
活性化関数の選択、重みの初期値設定、バッチ正規化　などがある。

・活性化関数の選択
　ReLU関数：勾配消失問題の回避とスパース化に貢献する。

・重みの初期値
　Xavierを用いる方法。Xavierの初期値設定する際の活性化関数は、
　・ReLU関数　・シグモイド関数　・双曲線正接関数

初期値の設定方法は、重みの要素を前層のノード数の平方根で除算した値
　
　Heを用いる方法。Heの初期値を設定する際の活性化関数は、
　・ReLU関数

初期値の設定方法は、重みの要素を、前層のノード数の平方根で除算した値に対し、√2を掛ける。

確認テスト(2-3)
重みの初期値を0に設定するとどのような問題が発生するのか。簡潔に述べよ。

重みを0に設定すると、すべての入力値と重みの積が0になるため、出力層にはバイアス値のみが出力
される。そのため、訓練データの更新ができなくなってしまう。

バッチ正規化
　ミニバッチ単位で、入力値のデータの偏りを抑制する方法。

使いところ：活性化関数に値を渡す前後に、バッチ正規化を含んだ層を加える。

確認テスト(2-4)
一般的に考えられるバッチ正規化の効果を2点挙げよ。
　・初期値にほとんど依存しない点
　・過学習を抑制する
　・計算の高速化(データの偏りを抑えることで計算量を削減できるため)

Jupiter演習(2-5)
シグモイド推定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/ea0121d5-c689-a182-c0d6-3be675eb51ae.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/7f8a781b-3381-888c-fc2f-d1b75922e4fa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/f236e278-035a-e1f3-c581-fb7f60a4b788.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/42c2593d-7779-802b-8a82-f8e95ca786d1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/4432e77d-8d70-a69c-320c-46da94dfba34.png)

上記のシグモイド関数を用いた推定では、誤差逆伝播法を行うとグラフからわかるように勾配消失しており、
精度も0.1程度と低い結果となっていることがわかった。

次に、ReLU関数を用いた推定を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/0fbd1887-b8f8-3ddf-0203-bc3cf6b969aa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/b47251b6-1729-ff5b-5529-4148b5bc492d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/f747a367-323f-2fd0-9269-b78e865b9a14.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/d7c5123a-33b0-470f-fccc-0bcf575794f8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/f658a6c5-970b-1ed0-e2b9-0beaf6f38970.png)
シグモイド関数を用いた推定との差分は、コメントアウトで囲んでいる。活性化関数をReLU関数にしているのみである。
結果は、勾配消失は起きておらずしっかり誤差逆伝播できていることがわかった。

次は、重みの初期値を設定する方法で確認する。シグモイド関数にXavierで重みの初期値を設定し推定を行う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/f6d8298f-e731-142e-deaf-e2c1be2bd308.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/16f05787-027b-dfe4-616f-6b6cf31195c8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/1f0a8988-5b5a-ea89-0fee-726955036f2b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/c4e6e462-1cbd-b3c3-1a98-5e7d8e6a96f0.png)

1番初めのシグモイド関数での推定に重みの初期設定として、ガウス分布を用いたXavierを行うと、グラフからもわかるように
勾配消失が発生していないことがわかった。

次に、もう一つの重みの初期値設定であるHeを用いた推定を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/b865732d-4d44-01a2-64e5-4678e81bf303.png)
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/0d08035c-f2b1-4d3d-9ead-7df42f3554d1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/da7bac9a-f951-fe82-03d8-59680e1bb5f1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/ede8bfcc-e4a6-ab8c-9e35-a6c97b144b9d.png)

ReLU関数と重みの初期設定Heを用いた推定でも、勾配消失は起きていないこともわかった。

ReLU関数とHeの組み合わせでは、Heの重みの初期設定で勾配消失が起きないか判断できなかったので、
シグモイド関数とHeを用いた推定を下記に実施して、勾配消失していないか確認を行った。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/766f2743-8b49-7abb-4b54-3a676b87d224.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/18cdd07a-6fa1-52f9-610d-9d9f25826d62.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/84950f4e-d1f2-be3b-5c21-6ff86b8b034f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/60f07a1e-ab7b-ab57-aa11-d99d2ddd44e1.png)

上記結果のグラフより、勾配消失は起きておらず、重みの初期設定Heで勾配消失しないことを確認した。

#学習率最適化手法

初期の学習率設定の指針
初めは、学習率を大きく設定し、徐々に下げていく。
→学習率最適化手法を用いる。
・モメンタム
　誤差をパラメータで微分したものと学習率の積で減算した後に、現在の重みに前回の重みを
　減算した値と慣性の積を微分する。
・AbaGrad
・RMSProp
・Adam



#過学習
過学習：テスト誤差と訓練誤差で学習直線が乖離してしまうこと。

正則化(ネットワークの自由度を制約すること)を用いて過学習を抑制する。
ネットワークの自由度：層数、ノード数、パラメータ値など…

正則化の種類
・L1正則化
・L2正則化
・ドロップアウト

確認テスト(2-10)
機械学習で使われる線形モデルの正則化はモデルの重みを制限することで可能となる。
正則化手法の中にリッジ回帰という手法があり、その特徴として正しいものを選択しなさい。

答え(a)ハイパーパラメータを大きな値に設定するとすべての重みが限りなく0に近づく
リッジ回帰とは、正則化された線形回帰の一つで、線形回帰に学習した重みの二乗を加えたものである。

Weight decay(荷重減衰)
過学習の原因は、重みが大きい値をとることで発生する。
過学習の解決策として、正則化項を加算することで重みの値を抑制する。
ただし、重み値が大きいほど学習においては重要なパラメータであるので
過学習が起きない値範囲内で重み値をコントロールと重みの大きさにばらつきを出すことが必須である。

L1,L2正則化
誤差関数にpノルムを加える。
P=1ならL1正則化、P=2ならL2正則化と呼ぶ。

確認テスト(2-11)
L1正則化を表しているグラフはどちらかを答えよ。
右側のグラフ
L1正則化は特性上0をとる場合がある。そのためスパース推定に対応している。

ドロップアウト
正則化手法の中でも主に使用されている手法
ランダムにノードを削除して学習させる手法をドロップアウトという。
データ量を変化させずに、異なるモデルを学習

#畳み込みニューラルネットワーク(CNN)
主に画像分類でよく使用される方式。
画像のみではなく音声データなどにも使用される場合がある。

CNNの流れ(例)
入力層→畳み込み層→畳み込み層→プーリング層→畳み込み層→畳み込み層→プーリング層→全結合層→出力層

畳み込み層
入力値をフィルタで乗算した出力値とバイアスを足し合わせ値を活性化関数で出力値に変換する。
畳み込み層を用いることで、画像データ縦、横、チャンネルの3次元のデータ(チャンネル:空間をつかさどるデータ)を
そのまま学習でき、次に伝えることが可能になる。

・バイアス
　入力層とフィルタを乗算した値にバイアスを足す。
・パディング
　入力層とフィルタの乗算結果は、入力層のサイズより小さくなってしまう。そのため固定データを増やすことで
　出力値を入力層と同じ大きさにすることができる。主には0を足す0パディングを使用する。
・ストライド
　入力層とフィルタの計算箇所を変更させる。
・チャンネル
　空間を学習するために、縦、横、奥行などに分解したものをチャンネル数という。

全結合層だと画像データ3次元データも、1次元データとして処理されてしまう。
3次元データを学習するために畳み込み層が考案された。

Jupiter演習(2-17)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/8a1b38d5-4eb3-3e04-7c3b-932822226f65.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/6d31fb3f-7c25-5617-3a02-6c9be7f2ec9b.png)

im2colについて、image to columnの略。多次元データを2次元配列に変換するメソッド。
上記のinput_dataは、random.rand()で多次元配列(チャンネル数2の4×4行列)を作成。
縦、横のフィルタの大きさ3でストライド1、0パディングでim2colを実行。
im2col関数で多次元配列が2次元配列に変換される。
次にim2col関数を下記に記載する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/67c2fcf6-8121-edf7-9fc7-f138dea5620c.png)

im2col関数は、引数に入力値、フィルタの縦、横の大きさ、ストライド数(=1)、パディング数(=0)を用いる。
input_data.shapeで配列の各大きさを格納。
out_hとout_wが出力の縦、横の大きさ

次に2次元配列を多次元配列に変換するのは、col2imで　column to image
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/a7565dea-b1b2-2535-f4d4-f25ca5e971f4.png)

注意することとして、im2colで2次元配列に変換した配列をcol2imで多次元配列に変換することはない。
im2colとcol2imメソッドが異なるので復元はできない。

プーリング層
大きく2種類(マックスプーリングとアベレージプーリング)ある。
入力画像データの対象領域の最大値を出力する(マックスプーリング)。対象領域の平均値を出力する(アベレージプーリング)

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

Jupiter演習(2-19)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548419/68ba40e0-7132-a2ff-cb0b-03ae86af001b.png)
マックスプーリング関数のプログラム

最新のCNN
AlexNet:5層の畳み込み層およびプーリング層など、それに続く3層の全結合層から構成される。