ラビットチャレンジレポート(深層学習 day2)

#はじめに
本記事は、E資格取得講座のラビットチャレンジのレポートです。今回は深層学習 day2の講義を受けてのレポートを提出します。

#Section1:勾配消失問題
##要点
　勾配消失問題とは、誤差逆伝播法において誤差が下位層に進むにつれ、勾配がどんどん緩やかになっていく現象のことである。これにより、下位層のパラメータは更新されづらくなり、エポック数を増やしてもニューラルネットワークが学習されないといった問題が発生する。
　勾配消失問題が起きる原因としては、下位層のパラメータの微分は、出力層や中間層の活性化関数の微分の積になっていることがあげられる。出力層や中間層の活性化関数の微分の値が小さいことによって、その積である下位層のパラメータの微分の値が非常に小さくなってしまう。
　勾配消失問題を解決する方法として、主に次の3つの手法がある。
- 活性化関数の選択
- 重みの初期値設定
- バッチ正規化

活性化関数の選択については、ReLU関数を用いたニューラルネットワークが提案されている。ReLU関数の微分値は0か1なので、0となるパラメータは更新されず、スパース化に貢献する。また、1となるパラメータについては、ReLU関数を逆伝播が通過する際に値が小さくならないため、勾配消失問題が発生しにくくなる。
 重みの初期値設定については、XavierやHeの方法がある。Xavierは重みの初期値を、標準正規分布の乱数を前の層のノード数の平方根で割った値を採用する。これにより、出力は特定の値に偏らない値となる。Heの方法は、Xavierの方法に$\sqrt{2}$をかけた値を初期値として採用する。
 バッチ正規化については、ミニバッチ単位で入力データを正規化する方法で、これにより学習の効率化が進む。

##確認テスト
- 連鎖率の原理を使い、$\frac{dz}{dx}$を求めよ。

```math
\begin{eqnarray}
\frac{dz}{dx} &=& \frac{dz}{dt} \frac{dt}{dx} \\
&=& 2t\times1 \\
&=& 2(x+y)
\end{eqnarray}
```
- シグモイド関数を微分したとき、入力値が0のときに最大値をとる。その値として正しいものを選択肢から選べ。
(2)の0.25。シグモイド関数を$f(z)$とすると、シグモイド関数の微分は$f(z)(1-f(z))$となる。これと$f(z)=1/2$１であることを用いると、(2)となる。

- 重みの初期値に0を設定すると、どのような問題が発生するか。簡潔に説明せよ。
全ての重みが均一に更新されてしまう。

- 一般的に考えられるバッチ正規化の効果を2点挙げよ。
1. 学習の効率があがる。
1. 過学習を防ぐ

- (例題チャレンジ)(き)にあてはまるのはどれか。
一つのミニバッチのデータを取り出しているものが正解。

```python
data_x[i:i_end], data_t[i:i_end]
```

##ハンズオン
ハンズオン結果は下記。活性化関数をシグモイド関数、パラメータの初期値の決め方を単純な標準正規分布にしたがう乱数にした場合は、パラメータをいくら更新してもaccuracyが上がらなかった。そこで活性化関数をReLUに変更したところ、更新回数が500回を超えたところから急激に上昇した。また、活性化関数はシグモイド関数のままで、パラメータの初期値の決め方をXavier、Heに変更した場合、それぞれ学習の初期段階からaccuracyが上昇した。
[ハンズオン](https://github.com/StoneRIeverKS/rabbit_challenge/blob/master/2_2_1_vanishing_gradient.ipynb)


#Section2:学習率最適化手法
##要点
　勾配降下法において、学習率$\varepsilon$の値を変えることで、収束の速さなどが変わる。したがって、適切な学習率を設定することが必要である。この学習率の設定の方法として代表的なアルゴリズムとして、モメンタム、AdaGrad、RMSProp、Adamがある。
　モメンタムは、

```math
\begin{eqnarray}
V_t = \mu V_{t-1}-\varepsilon \nabla E \\
\boldsymbol{\omega}^{(t+1)} = \boldsymbol{\omega}^{(t)} + V_t
\end{eqnarray}
```
によってパラメータを更新する。メリットとしては、局所的最適解にはならず、大域的最適解となりやすいなどがあげられる。
 AdaGradは、

```math
\begin{eqnarray}
h_0 &=& \theta \\
h_t &=& h_{t-1} + (\nabla E)^2 \\
\boldsymbol{\omega}^{(t+1)} &=& \boldsymbol{\omega}^{(t)} -\varepsilon \frac{1}{\sqrt{h_t}+\theta}\nabla E
\end{eqnarray}
```
によってパラメータを更新する。メリットとしては、勾配の緩やかな斜面に対して、最適解に近づける。

RMSPropは、

```math
\begin{eqnarray}
h_t &=& \alpha h_{t-1} + (1-\alpha)(\nabla E)^2 \\
\boldsymbol{\omega}^{(t+1)} &=& \boldsymbol{\omega}^{(t)} -\varepsilon \frac{1}{\sqrt{h_t}+\theta}\nabla E
\end{eqnarray}
```
によってパラメータを更新する。メリットとしては、局所最適解にはならず、大域的最適解となるなどがあげられる。
Adamは、モメンタムの過去の勾配の指数関数的減衰平均、RMSPropの過去の勾配の2乗の指数関数的減衰平均の特徴を持ったアルゴリズムである。

##確認テスト
- モメンタム・AdaGrad・RMSPropの特徴をそれぞれ簡潔に説明せよ。
    -  モメンタム：局所的最適解にはならず、大域的最適解となりやすい
    -  AdaGrad：勾配の緩やかな斜面に対して、最適解
    -  RMSProp：局所最適解にはならず、大域的最適解となる


##ハンズオン
ハンズオンは下記。
[ハンズオン](https://github.com/StoneRIeverKS/rabbit_challenge/blob/master/2_4_optimizer.ipynb)

#Section3:過学習
##要点
　過学習とは、モデルやニューラルネットワークなどが学習データに特化して学習してしまうことで、訓練データを適切に予測できなくなる現象をいう。過学習が発生する原因としては、パラメータの値が適切ではない、パラメータやノードの数が多いなどが原因としてある。
　過学習を解決する方法としては、正則化やドロップアウトなどが知られている。正則化は、目的関数である誤差関数に$p$次元ノルム(正則化項と呼ばれる)を加算することで過学習を防ぐ手法である。過学習は特定のパラメータが異常に大きくなったりすることで発生するので、正則化項によってパラメータの大きさを抑制するという考え方である。
　ドロップアウトはニューラルネットワーク中のノードをランダムに削除して学習させることを指す。メリットとして、データ量を変化させずに、異なるモデルを学習させていると解釈できる。


##確認テスト
- 機械学習で使われる線形モデルの正則化は、モデルの重みを制限することで可能となる。前述の線形モデルの正則化手法の中にリッジ回帰という手法があり、その特徴として正しいものを選択しなさい。
(a)ハイパーパラメータを大きな値に設定すると、すべての重みが限りなく0に近づく。

- 下図について、L1正則化を表しているグラフはどちらか答えよ。
右側のLasso推定量のグラフ

- 最終的な勾配を計算する(え)にあてはまるのはどれか。
(4)Param

- 最終的な勾配を計算する(お)にあてはまるのはどれか。
(3)np.sign(param)

- (か)にあてはまるのはどれか。
(3)image[bottom:top, right:left, :]


##ハンズオン
ハンズオンは下記。
[ハンズオン](https://github.com/StoneRIeverKS/rabbit_challenge/blob/master/2_5_overfiting.ipynb)

#Section4:畳み込みニューラルネットワークの概念
##要点
　畳み込みネットワークの中間層には、畳み込み層、プーリング層、全結合層の3つがある。ここでは、畳み込み層とプーリング層についてレポートする。
　畳み込み層を理解するには、パディング、ストライド、チャンネルの3つの概念を理解する必要がある。
　パディングとは、元データに対して、周囲を0などの値で補完することである。これにより、端のデータに対する畳み込み回数が増えるので、端の特徴も考慮されたネットワークを構築することができる。
　ストライドとは、フィルターを動かす幅である。これにより、畳み込み層の出力画像のサイズを調整することができる。
　チャンネルとは、一つの画素が持つデータの次元のことである。例えば、カラー写真の場合、一つの画素は(R, G, B)の3つ組でデータを保持している。これをそのままR、G、Bに対してそれぞれ畳み込み処理を行い、それぞれのチャンネルを保持したまま、畳み込み層の出力とする。

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


##ハンズオン
ハンズオンは下記。
[ハンズオン](https://github.com/StoneRIeverKS/rabbit_challenge/blob/master/2_6_simple_convolution_network.ipynb)

#Section5:最新のCNN
##要点
 AlexNetとは、全結合層の出力の際に、ドロップアウトを使用して過学習を防いでいる。また、出力層に渡す際に、Frattenの処理を行い、13×13×256のデータを43,246次元のデータに変換している。その後出てきたAlexNetの改良版においては、Global Max PoolingやGlobal Average Poolingを行い、出力層に渡すことが考えられた。このような、ある意味「大雑把な」処理でも精度が高く、計算コストを抑えることに役に立っている。

##確認テスト
確認テストはなかったので割愛。

##ハンズオン
ハンズオンはなかったので割愛。

#参考文献
勾配消失問題については、本講義で学ぶことができたが、巷には勾配発散問題というのもあるらしい。今後学ぶRNNと関係があるみたいなので、RNNを学んだら再度読み返そうと思う。https://masamunetogetoge.com/gradient-vanish
学習率最適化手法の中でAdamについての説明が薄かったので、[元論文](https://arxiv.org/pdf/1412.6980.pdf)を確認した。論文中のAlgorithm1内で確かに「モメンタムの過去の勾配の指数関数的減衰平均、RMSPropの過去の勾配の2乗の指数関数的減衰平均」が表現されていた。
過学習について、ドロップアウト法が出てきたが、[人工知能は人間を超えるか](https://www.google.co.jp/books/edition/%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD%E3%81%AF%E4%BA%BA%E9%96%93%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E3%81%8B/R-nwBgAAQBAJ?hl=ja&gbpv=1&printsec=frontcover)には、ドロップアウト法の説明として、「ちょっとノードを減らしたくらいではびくともしない頑健性を持たせるために行っている」というような観点で説明されていた。過学習を抑えるという目的は同じだが、色々な解釈ができる。
畳み込みニューラルネットワークについては[こちら](https://deepage.net/deep_learning/2016/11/07/convolutional_neural_network.html)を参考にした。これによるとSpotifyやLINEは畳み込みニューラルネットワークをレコメンドに応用しているらしい。
AlexNetについて、技術関係ではないが[アレクサの名前の由来](https://robotstart.info/2017/11/14/amazon-alexa.html)が面白かった。AlexNetは開発者の名前を取っているのに対し、アレクサは完全に別のところに名前の由来がある。そもそもAlexNetはGoogle系のコンピュータ科学者であるのに対し、アレクサはAmazonの製品だった...