深層学習前編2　過学習～最新のCNN 講義課題視聴レポート (現場で潰しが効くディープラーニング講座)

### 過学習
- 過学習とは学習データに対して適応しすぎることにより、未知のデータの誤差が大きくなってしまう現象のこと
- 過学習を防ぐ方法としてL1正則化・L2正則化、ドロップアウトがあげられる。

##### L1正則化・L2正則化
- 重みが大きいと過学習になりやすいことから、重みに制限をつけることで過学習を防ぐ。それがL1正則化・L2正則化といわれる手法
- L1正則化とは各重みの絶対値の和を誤差関数に加えて最小化する方法

![無題13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/caf9a5cb-c2e2-48fc-778e-a57270f7850a.png)

- L2正則化とは各重みの絶対二乗和を誤差関数に加えて最小化する方法

![無題14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/fd44beb3-c977-6ed8-4a76-d78705f4c1c1.png)


```python
# L1正則化
for idx in range(1, hidden_layer_num+1):
    grad['W' + str(idx)] = network.layers['Affine' + str(idx)].dW + weight_decay_lambda * np.sign(network.params['W' + str(idx)])
    grad['b' + str(idx)] = network.layers['Affine' + str(idx)].db
    network.params['W' + str(idx)] -= learning_rate * grad['W' + str(idx)]
    network.params['b' + str(idx)] -= learning_rate * grad['b' + str(idx)]        
    weight_decay += weight_decay_lambda * np.sum(np.abs(network.params['W' + str(idx)]))

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

```python
# L2正則化
for idx in range(1, hidden_layer_num+1):
    grad['W' + str(idx)] = network.layers['Affine' + str(idx)].dW + weight_decay_lambda * network.params['W' + str(idx)]
    grad['b' + str(idx)] = network.layers['Affine' + str(idx)].db
    network.params['W' + str(idx)] -= learning_rate * grad['W' + str(idx)]
    network.params['b' + str(idx)] -= learning_rate * grad['b' + str(idx)]        
    weight_decay += 0.5 * weight_decay_lambda * np.sqrt(np.sum(network.params['W' + str(idx)] ** 2))

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

- 下の図で右側がL1正則化、左側がL2正則化を表している。(楕円形の部分が誤差関数、丸と四角の部分が正則化項)

![無題16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/41634a8a-f768-e379-33f9-76708e20c0a5.png)

##### 実装演習
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/eca259d9-5bda-3570-a44c-e643d1daf606.png)
![無題1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/44a97189-b264-946b-dc9d-ac102127386b.png)
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/19de7965-5c67-61df-b128-e7ae195615f6.png)

- L2正則化
![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/6e5b59ee-7450-4a07-f091-61f006fbf4d6.png)
![無題4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/dd2cee66-606f-e4bc-edd3-35aea4da8e6f.png)
![無題5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/d122199a-5e42-8173-c30b-3a868a8b379c.png)

- L1正則化
![無題6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/224389dc-8723-d63b-65ae-6713703b0ff2.png)
![無題7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/290269d2-c27a-1d75-a188-323870cc22b9.png)
![無題8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/f16139fc-3fb1-2df7-bff0-2e40f9e3eefd.png)

- L2正則化(正則化パラメータλを変更)
![無題9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/3159f671-36fb-9c7a-025b-5305cdb59be3.png)
![無題10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/9aff2383-d353-ee84-7f82-3e441f619d0a.png)
![無題11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/e4ab0ee1-8517-47e1-cf1e-2aa996b90262.png)
![無題12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/6bb13a63-9d16-4d5d-0352-69e64f3a7567.png)

- L1正則化(正則化パラメータλを変更)
![無題13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/431023cc-7879-5e11-438d-dc86b5f1e8e2.png)
![無題14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/7a3ab7b2-38aa-8db1-26d8-a82689bec29d.png)
![無題15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/05aedc60-279e-41c5-56cd-b9ef39d49c6d.png)
![無題16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/8d37d7a7-129f-4aa1-0473-400b43a33c62.png)

##### 考察
- 最初の学習では訓練データの正解率が1となり過学習を起こしている
- L2正則化を実行してみると過学習を抑制することができたが良い結果が得られなかった
- L1正則化もL2正則化と同様、過学習を抑制できているが良い結果は得られていない
- L2正則化、L1正則化共にλを大きくすると正則化が強すぎて、正解率が変化しなくなる。λを小さくすると正則化が弱すぎて過学習をおこしていることが確認できた
- 正則化だけでは過学習を抑制できてもよい結果を得ることができない可能性があると考えられる


##### ドロップアウト
- 過学習の原因の1つとしてノードの数が多いことがあげられる。ドロップアウトとはランダムにノードを削除して学習を行うことで過学習を防ぐ方法である。
- 削除するノードは重みの更新をするたびに変える
- 複数のネットワークを作成し、平均をとることで精度が向上することが一般的に知られている。ドロップアウトを行うことで計算量を減らしつつ、複数のネットワークでの学習を実現していると言える

##### 実装演習
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/6d611c59-b3cb-de6d-087b-2f3400c74ef9.png)
![無題1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/742252f0-d94c-7b11-4425-03230d3f2a48.png)
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/e209967e-a253-c6cb-7e82-41a7914ea28e.png)
![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/e255f5e7-9100-7ccf-774d-854f36fee4be.png)

- ドロップ率を変更した場合
![無題4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/ada2a157-2909-50a9-2825-87c468eb0efa.png)
![無題5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/6eaf19c9-39e2-08dc-35a8-4673f0aad01e.png)
![無題6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/fd8a48a6-e306-6501-816b-bf13dfe2daad.png)
![無題7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/9b097c1e-fbe9-274b-79e1-e0ecd656e0b7.png)

- 学習率最適化とドロップ率の変更を行った場合
![無題8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/a02e1fd6-86bf-45be-b738-7f9dbd151474.png)
![無題9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/be901112-f4ce-72f2-6bb2-0da22a7157c6.png)
![無題10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/a2a9671f-c99a-8383-a33c-4694fec807b6.png)
![無題11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/c9a09f52-c666-7ca8-6bb6-3490d3b42865.png)
![無題12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/329c123d-e0ac-2b3c-d8e3-42c8b4cba39f.png)
![無題13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/3b96973a-df85-97a1-f159-537a74dc9917.png)
![無題14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/25fadbd7-c42c-e9de-1c72-a2b6544ce87a.png)
![無題15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/75d1a286-4cba-11b4-8b58-c34f26d277fd.png)
![無題16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/4dfcc195-f9d1-8011-dc44-bf612dd56936.png)
![無題17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/53aaf073-5c33-82fc-639f-ea6c32ad0740.png)
![無題18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/3fce5691-5d0c-fff6-6cf8-999226449087.png)
![無題19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/41a580dd-85ee-c690-eb0b-a7731cf2e197.png)

- ドロップアウトとL1正則化を行った場合
![無題20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/f25af954-989a-26c5-e2e3-baa746aa50fc.png)
![無題21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/b34c15c4-8367-0609-873c-b772044c23ed.png)
![無題22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/1457aeb6-f74f-744d-57e5-6eae44d44b6c.png)

##### 考察
- ドロップアウトを行った結果、過学習を起こさず比較的良い結果を得ることができた
- ドロップアウト率大きくするとうまく学習が進まず、小さくすると過学習を起こしてしまった
- ドロップアウト率をそのままに各学習率最適化法を使うと、過学習を起こしやすくなった。学習率を最適化する場合は過学習の対策を強める必要があると考えられる
- 学習率最適化法を使いつつ、ドロップアウト率を大きくすると過学習は起こさなかったが、良い結果は得られなかった
- ドロップアウトとL1正則化を組み合わせた場合が一番良い結果を得ることができた。学習の速さ、過学習を起こしているかどうかなどを総合的に判断し、様々な方法を組み合わせてニューラルネットワークを構築する必要がある

### 畳み込みニューラルネットワーク(CNN)
- 畳み込みニューラルネットワークとは畳み込み層とプーリング層という2種類の層を含む順伝播型ネットワーク。主に画像認識で使われる。
- これまでの順伝播型ネットワークは隣接している層同士の結合は全結合であったが、畳み込みニューラルネットでは特定のユニット同士が結合をもっている
- 全結合で画像を学習した場合、縦・横・チャンネルの3次元データが1次元のデータとして処理されてしまう

##### 畳み込み層
- 畳み込み層とは通常の順伝播型ネットワークでいうと各入力値と各重みの積にバイアスをかけて値を次の層に出力する層のことを言う
- 畳み込みニューラルネットワークは主に画像認識で使われるので入力データは画像となる。畳み込み層では重みのことをフィルタと呼ぶ。
- 入力されたデータの画素をi,jで表し(i,j)番目の画素の値をxとし、フィルタの画素をp,qで表し(p,q)の値をhで表すとすると畳み込み層の計算は以下の式で表される(フィルタは入力された画像よりサイズが小さいものとする)

![無題15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/778dc1c2-28cc-9819-a10f-bf0be6203af6.png)

- イメージとしては入力された画像にフィルタを重ねて各要素の積の和を求める、そしてフィルタを少しづつずらして同様に計算を行う。以上を繰り返して値を出力する

##### パディング
- 普通に畳み込みの計算を行うと、入力された画像よりフィルタのほうが小さいことから、出力される画像のサイズはどんどん小さくなってしまう。出力される画像のサイズを大きくしたい場合は、入力画像の外側に0などの値を加えて入力画像のサイズを大きくする方法がある。これをパディングと呼ぶ

##### ストライド
- ストライドとは畳み込みの計算を行うときにフィルタをずらす間隔のことを言う
- ストライドを大きくすると画像の特徴を取りこぼす可能性が増える。ただし、入力された画像が大きすぎるときに出力される画像のサイズを小さくしたいときはストライドを2以上にして計算を行う。
-例)サイズ6×6の入力画像を、サイズ2×2のフィルタで畳み込んだ時(ストライドとパディングは1)の出力画象のサイズは6×6となる

##### チャンネル
- チャンネルとは入力画像の奥行きのことを示す。
- チャンネルの数とフィルターの数は一致する

##### 実装演習
- im2col
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/3ce4ab9f-2348-7497-6412-0f143d9ee9d0.png)
![無題1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/f87bb43d-27ce-40eb-bf29-dd0e5dd11097.png)
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/98e6f0a3-844b-6366-479f-13c28e7aed3c.png)
![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/d9e9b77b-a290-8706-b063-972daa789caf.png)

- フィルターのサイズ、ストライド、パディングを変更した場合
![無題4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/824a0631-4085-61e3-8fdd-006adbae35f9.png)
![無題5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/3358b080-3975-492d-96df-ccade2115210.png)
![無題6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/d3b304f5-ae0b-b68d-fac3-44d8c4527794.png)

- col2im
![無題7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/c7623270-3684-c123-6a7d-fe6304ed4424.png)
![無題8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/aa780402-e27a-c427-b727-d938dba1b9ce.png)


##### 考察
- im2colはimage to columnの略で画像を2次元配列に変えるという意味
- 画像(多次元データ)を2次元配列に変換することで、2次元配列を扱う既存のライブラリを利用することができる
- フィルターのサイズを大きくすることで出力される2次元配列のサイズが小さくなる。ストライドを大きくすることで出力される2次元配列のサイズが小さくなる。パディングを増やすことで出力される2次元配列のサイズが大きくなる
- col2imは2次元配列を多次元データに変換する処理
- im2colとcol2imは全く違う処理を行うので、im2colの出力をそのままcol2imの入力に使っても元の多次元データに復元することはできない。通常はim2colで出力された2次元配列を加工してからcol2imを行う


##### プーリング層
- プーリング層では以下の計算が行われる。入力された画像を一定のサイズの正方形に分割する。そして、それぞれの正方形の中で平均値や最大値などの値を計算し最終的な出力値とする。
- プーリング層を使うことで、学習データの間で特徴の位置にずれがある場合でも、出力値を安定させることができる
- 畳み込み層と同様にパディングやストライドを使う場合がある

##### 実装演習
- 畳み込みニューラルネットワーク
![無題9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/e38941f3-a1e1-013d-9b3b-0e9e27d5a77c.png)
![無題10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/25195b7b-4c39-6cab-dddf-6760b4281ac8.png)
![無題11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/96c68e9e-f235-de7c-9b7a-a9551e001466.png)
![無題12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/85fa3ea5-2d8c-7dbc-cfe9-0f7bdd34ce39.png)
![無題13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/9dc5a1f5-2ab9-6667-7757-70c92fae5b99.png)
![無題14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/3b7db77f-35d7-c727-d984-7115ca6811ff.png)
![無題15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/c8baa467-6466-52eb-9858-6b30d244dbfb.png)
![無題16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/e3e64ec2-4444-eb55-0ca0-951b7c459a02.png)
![無題17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/d963fb1c-e450-6a43-4ba2-44cd07a09d8a.png)
![無題18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/e0e48f22-5836-5b35-e3e2-673c63d2beea.png)


##### 考察
- ネットワークの構成は畳み込み層、ReLU関数を使った中間層、プーリング層などからなり、出力層はソフトマックス関数を使っている。
- プーリング層ではマックスプーリングを行っている
- 学習率の最適化にはAdamを使っている。結果として高い精度を実現できている

### 最新のCNN
##### AlexNet
- AlexNetとは2012年に開かれた画像認識コンペで、2位に大差をつけて優勝したモデルである。AlexNetの登場がディープラーニングブームのきっかけとなったと言われている。
- これ以前にもディープラーニングや畳み込みニューラルネットワークは存在していたが、実際に成果を出したのはAlexNetが初めてだとされている
- AlexNetは3層の畳み込み層、2層のプーリング層の後に3層の全結合層、合計8層で構成されたモデルである。
- プーリング層では最大値が出力されている
- 全結合層の活性化関数にはReLU関数が使われている
- 過学習を防ぐため、全結合層にドロップアウトを使用している

[次へ(修了課題)](https://qiita.com/yuma-k105/items/da8afd267c269d0bd51f)