ラビットチャレンジ　実装演習レポート　深層学習（前編）

# 深層学習　Day1
# 1. 入力層～中間層
## 1-A. 講義内容
**ニューラルネットワーク(NN)で出来ること**
NNでは、大きく分けて回帰問題と分類問題を解くことができる。回帰問題は、連続する実数値を取る関数を近似する問題で、ある商品の未来の売り上げを予測するなどの結果予測や、競馬のような順序性を予測するランキングの問題が扱われる。一方、分類問題は離散的な結果を予測する問題と言い換えることができ、手書き文字の認識や、写真に映った花の種類分類などの問題が含まれる。

**入力層**
NNは層構造をしており、入力として受け取った数値が次々と層を移動する。最初に数値を受け取る層を入力層という。上記の花の写真を入力として取る例でも、写真をピクセル毎の数値として受け取っている。

**中間層**
中間層では、入力層からの数値を束ねたベクトルと、それぞれの入力数値に応じた重みのベクトルの内積が計算される。中間層のノードの数だけ、重みベクトルのセットがあり、１つの中間層全体としての出力もベクトルとなる。つまり、入力層→中間層の間ではベクトルの変換が行われている。

## 1-B. 実装演習結果
**順伝播（単層・単ユニット）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/05e6284d-59bf-6372-40c4-9d2b00eedb4a.png)
単ユニットなので総入力、中間層出力の要素が1つのみとなっている。

**順伝播（単層・複数ユニット）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/39e9152d-0c84-1281-1d15-1d0070ba9cb4.png)
複数ユニットを備えているので、単ユニットと比べて重み行列が横に伸び、総入力、中間層出力が複数要素のベクトルとなっている。

## 1-C. 確認テスト考察
●P. 5
問
ディープラーニングは、結局何をやろうとしているか2行以内で述べよ。
また、次の中のどの値の最適化が最終目的か。全て選べ。
①入力値[X] ②出力値[Y] ③重み[W] ④バイアス[b] ⑤総入力[u] ⑥中間層入力[ z] ⑦学習率[ρ]

回答
与えられた入力から、理想的な出力を生み出すモデルを、層の深いネットワークで構築したい。入力から出力を得る仕組みについては、できる限り人の手を介さずに行いたい。③重み[W] ④バイアス[b]

●P. 5
問
次のネットワークを紙にかけ。
入力層︓2ノード1層
中間層︓3ノード2層
出力層︓1ノード1層

回答
![図6_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/1e46f342-575a-e4e1-adb1-d8457021684c.png)


●P. 13
問
図式に動物分類の実例を入れてみよう。

回答
体長[cm]：x1 = 9
体重[g]：x2 = 20
耳の長さ[cm]：x3 = 0.6
足の長さ[cm]：x4 = 1.3
出力：z ⇒ クラス0(犬)のconfidence:0.1、クラス1(猫)のconfidence:0.2、クラス3(ネズミ)のconfidence:0.7
特徴を数値として入力する

●P. 15
問
u=w<sub>1</sub>x<sub>1</sub> + w<sub>2</sub>x<sub>2</sub> + w<sub>3</sub>x<sub>3</sub> + w<sub>4</sub>x<sub>4</sub> + b
=**W****x** + b
この数式をPythonで書け。

回答
u1 = np.dot(x, W1) + b1
ベクトル同士の内積は、numpyパッケージのdotで計算できる

●P. 17
問
1-1のファイルから中間層の出力を定義しているソースを抜き出せ。

回答
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/e2af54c8-7cb3-a8a1-6a62-963c71863686.png)
z=funcions.relu(u)　の部分

## 1-D. 関連記事レポート

# 2. 活性化関数
## 2-A. 講義内容
**活性化関数**
上記、入力ベクトルと重みベクトルの内積計算が行われたあと、得られたスカラは各ノードで非線型関数に渡される。この関数を活性化関数といい、次の層へ出力強度を操作している。中間層、出力層でよく利用される活性化関数の例を示す

**中間層の活性化関数**
■ステップ関数
・しきい値を超えたら発火する関数
・出力は常に１か０
・パーセプトロン（ニューラルネットワークの前身）で利用された

■シグモイド関数
・0 ~ 1の間を緩やかに変化する関数
・ステップ関数と異なり、信号の強弱を伝えられるようになり、予想ニューラルネットワーク普及のきっかけとなった
・大きな値では出力の変化が微小なため、勾配消失問題を引き起こすことがある

■RELU関数
・現在最も利用されている活性化関数
・シグモイド関数と異なり、x>0の領域で1よりも大きな値を取れるため勾配消失問題を回避しやすい
・x<0の領域で0を取り、スパース化にも貢献する

**出力層の活性化関数**
■シグモイド関数
・同上

■恒等写像
・入力値をそのまま出力する関数

■ソフトマックス関数
・全てのノードからの出力の和を1に整える
・分類問題で各クラスの確率の合計を100%に正規化する際に用いられる

## 2-B. 実装演習結果
**順伝播（3層・複数ユニット）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/0a8abe99-0a56-4595-fc09-83e60e7a1122.png)
中間層が3層からなるため、単層の時と比べて、重み行列、バイアスがぞれぞれ3つ設定されている。

```
    # 1層の総出力
    z1 = functions.relu(u1)
```
となっており、中間層では活性化関数にReLUが使用されている。また、

```
    # 出力層の総出力
    y = u3
```
となっており、出力層では活性化関数に恒等写像が使用されていることがわかる。

**多クラス分類（2-3-4ネットワーク）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/31e8b874-b957-a5dd-2021-264dcf5155bc.png)
2-3-4ネットワークであるため、重み行列が3カラム、4カラムとなっている。softmax関数を出力層の活性化関数としているので、出力合計が1となっている。

## 2-C. 確認テスト考察
●P. 20
問
線形と非線形の違いを図にかいて簡易に説明せよ。

回答
![図7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/0a00206d-521a-3117-62a0-2e7fdbd1bffc.png)

線形関数は比例関係を意味しており、直線の形状をしている。
非線形関数は上記以外の形状を示す。

●P. 27
問
配布されたソースコードより該当する箇所を抜き出せ。

回答
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/c426f3ee-9b99-3b3a-2461-ce61c2e5af15.png)
z = functions.sigmoid(u)の部分

## 2-D. 関連記事レポート
活性化関数として利用される関数の1つで、ReLU関数に似たLeaky ReLU関数について調べた。
ReLU関数は、現在よく利用される活性化関数の1つであるが、入力値が0以下では戻り値が0（＝勾配なし）となるので、学習が進みづらくなるケース(dying ReLU)もある。そこで、入力値が0以下でも、0でない小さい値を返すように工夫されたのが、Leaky ReLU関数である。式は下記となっている。Leaky ReLU関数はReLU関数と同様に非連続な関数であるため、数学的にはx＝0の地点では微分ができないが、便宜的にx=1では微分係数を1として扱われる。

```math
f(x)=\left\{
\begin{array}{ll}
\alpha x & (x \lt 0) \\
x & (x \geq 0)
\end{array}
\right.
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/7934a918-23fa-6dad-d946-fda799d3fd44.png)
https://www.geogebra.org/
より

参考：
https://www.atmarkit.co.jp/ait/articles/2005/13/news009.html


# 3. 出力層
## 3-A. 講義内容
**スコア(確率)**
出力層には、ソフトマックス関数によるスコア(確率)の正規化等、NN全体としての出力を整える働きがある。NNの出力は、学習ステップでは教師データと比較され、出力が教師データに近づくよう重みが更新される。

**誤差関数**
誤差関数は教師データと、NNの出力の間の誤差を示す関数。学習ステップでは、誤差関数が最小となるよう重みを更新し、NNの予測精度の向上を目指す。誤差関数には、二乗誤差や、交差エントロピーが利用される。

**出力層の活性化関数**
■シグモイド関数
・0 ~ 1の間を緩やかに変化する関数
・ステップ関数と異なり、信号の強弱を伝えられるようになり、予想ニューラルネットワーク普及のきっかけとなった
・大きな値では出力の変化が微小なため、勾配消失問題を引き起こすことがある

■恒等写像
・入力値をそのまま出力する関数

■ソフトマックス関数
・全てのノードからの出力の和を1に整える
・分類問題で各クラスの確率の合計を100%に正規化する際に用いられる

## 3-B. 実装演習結果
**回帰（2-3-2ネットワーク）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/2555f550-410f-fb78-4ffc-f5bb8b53c47b.png)
回帰問題なので、出力層の活性化関数が分類の場合と異なり恒等写像となっているため、出力合計が必ずしも1ではない。

**2値分類（2-3-1ネットワーク）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/e3c58bde-88af-338a-6e6b-e081648750a3.png)
2値分類問題なので、出力が1要素のみで、かつ0か1である。

## 3-C. 確認テスト考察
●P. 38
問
・なぜ、引き算でなく二乗するか述べよ
・下式の1/2はどういう意味を持つか述べよ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/68b6218c-9596-702d-41f8-a7b29415ed8f.png)

回答
二乗は、データ同士で相殺しないよう値を正にするため。1/2は、この式を微分すると係数2が派生するが、それを相殺して計算しやすくするためで、解に影響はない。

●P. 45
問
①~③の数式に該当するソースコードを示し、一行づつ処理の説明をせよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/3969ddb5-098a-3ae4-468f-09cb0dbe4e5f.png)

```
def softmax(x):
    if x.ndim == 2:
        x = x.T
        x = x - np.max(x, axis=0)
        y = np.exp(x) / np.sum(np.exp(x), axis=0)
        return y.T

    x = x - np.max(x) # オーバーフロー対策
    return np.exp(x) / np.sum(np.exp(x))
```

回答
return np.exp(x) / np.sum(np.exp(x))の行。
① returnの後の数式全体で戻り値を定義している
② np.exp(x)の部分で、confidenceが最大のクラスのconfidenceをxとしてe<sup>x</sup>の値
③ np.sum(np.exp(x))の部分で、すべてのクラスのconfidenceのexpを取り、その総和の値

●P. 47
問
①~②の数式に該当するソースコードを示し、一行づつ処理の説明をせよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/11341539-2fd3-e98d-60e1-d86d654fc8ed.png)

```
def cross_entropy_error(d, y):
    if y.ndim == 1:
        d = d.reshape(1, d.size)
        y = y.reshape(1, y.size)
        
    # 教師データがone-hot-vectorの場合、正解ラベルのインデックスに変換
    if d.size == y.size:
        d = d.argmax(axis=1)
             
    batch_size = y.shape[0]
    return -np.sum(np.log(y[np.arange(batch_size), d] + 1e-7)) / batch_size
```

回答
return -np.sum(np.log(y[np.arange(batch_size), d] + 1e-7)) / batch_sizeの行
① returnの後の数式全体で戻り値を定義している
② np.log(y[np.arange(batch_size), d] + 1e-7)がシグマの中に対応している。yは正解ラベルで、0か1の値をとり、dはNNの予測である。1e-7は-∞となることを防止している。

## 3-D. 関連記事レポート

# 4. 勾配降下法
## 4-A. 講義内容
**勾配降下法**
深層学習の目的は、学習を通して誤差を最小にするネットワークを作成することにあり、それは、誤差E(w)を最小にするパラメータwを発見する問題に帰着できる。このパラメータ最適化問題を解く方法の１つに勾配降下法がある。勾配降下法は、次の式で与えられ、εを学習率という。εが大きすぎると学習が発散してしまい収束しない。εが小さすぎると、学習に時間がかかってしまう。

```math
\boldsymbol{W}^{(t+1)}=\boldsymbol{W}^{(t)}-\varepsilon\nabla E
```

**確率的勾配降下法**
一度に全てのデータを利用して重みを更新する通常の勾配降下法と異なり、ランダムにデータを抽出し、都度誤差を計算して重みを更新する方法。次のメリットが得られる。
・データが冗⻑な場合の計算コストの軽減
・望まない局所極小解に収束するリスクの軽減
・オンライン学習ができる

**ミニバッチ勾配降下法**
ランダムに分割したデータの集合(ミニバッチ)の平均誤差を利用して重みを更新する方法。確率的勾配降下法のメリットを損なわず、並列化により計算資源を有効利用できる。

## 4-B. 実装演習結果
コードが記載されているセルを複数回実行すると、都度出力される図が異なった。学習データがランダムに選択されているためか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/79d0b523-b185-f795-67a7-e8a2c2fa69d2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/0ecff2a5-fd55-b264-2143-a13373c326e3.png)

## 4-C. 確認テスト考察
●P. 50
問
該当するソースコードを探してみよう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/6878a9e5-d3ce-5cca-0780-3f7f6e482274.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/fca41585-3271-3b0d-991f-185611fcdc08.png)

回答
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/66709c95-7a5d-746e-e228-234e9cced739.png)
network[key]  -= learning_rate* grad[key]の部分

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/474d784f-afb3-8889-052f-b2cb3d7f787c.png)
grad = backward(x, d, z1, y)の部分

●P. 59
問
オンライン学習とは何か2行でまとめよ。

回答
バッチ学習はすべての学習データを一気に読み込ませて学習させるのに対して、学習データが入力される都度、確率的勾配降下法などを用いてパラメータを更新する学習の方式をオンライン学習という。

●P. 62
問
この数式の意味を図に書いて説明せよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/7944b472-9d32-300b-54ea-ee7ad50f28a8.png)

回答
1エポック前の重みと、誤差の微分に学習率を乗じたものの差を、今回のエポックのエポックの重みとする。
![図8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/f40a2fa0-e8d0-abda-b730-cd7c64db6d9b.png)


## 4-D. 関連記事レポート
勾配降下法の計算で使用される演算子∇（ナブラ）について調べてみました。
参考Webサイトによると∇は様々な演算に利用されるが、勾配降下法における演算は、
勾配を求める計算となる。

```math
\boldsymbol{W}^{(t+1)}=\boldsymbol{W}^{(t)}-\varepsilon\nabla E
```
したがって、上記の∇Eは次のように計算される。

```math
\nabla E=grad\: E=\frac{\partial E}{\partial \boldsymbol{W}}\\
=\left(
\frac{\partial E}{\partial W_{1}},\:\frac{\partial E}{\partial W_{2}},\:\cdots,\:\frac{\partial E}{\partial W_{m}}
\right)
```
参考：
https://mathwords.net/nabla


# 5. 誤差逆伝搬法
## 5-A. 講義内容
**誤差逆伝搬**
算出された誤差を、出力層側から順に微分し、前の層前の層へと伝播し、最小限の計算で各パラメータでの微分値を解析的に計算する手法。計算結果（=誤差）から微分を逆算することで、連鎖律を利用して不要な再帰的計算を避けることができる。例えば、下図の出力側で誤差関数E(y)をyで偏微分した、

```math
\frac{\partial E}{\partial y}
```
を計算しているが、入力側にさかのぼると、活性化関数f<sup>(2)</sup>への入力前の部分で、E(y)をu<sup>(2)</sup>で偏微分した、

```math
\frac{\partial E}{\partial y} \frac{\partial y}{\partial u^{(2)}}
```
を計算している。誤差逆伝搬では、出力側から入力側へとさかのぼって計算していくので、E(y)をyで偏微分した部分を再利用でき、計算量を小さくすることができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/f3923035-9fbe-e08c-01d4-876c9c83f84d.png)
講義資料より

## 5-B. 実装演習結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/1d96987d-f70b-847a-369d-d2df0d133269.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/3e0f7054-270a-93d5-e2f2-5758dea002f8.png)
コードでは誤差逆伝搬により1回パラメータを更新しているが、重み、バイアスの値が変わっており、更新されていることがわかる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/1c127735-480b-6262-8e06-2582c1962b9e.png)
試しに、再度順伝搬を実行してみると、目標出力は
d = np.array([[0, 1]])
であるため、正しい方向に少しばかり学習されているようだ。

## 5-C. 確認テスト考察
●P. 71
問
誤差逆伝播法では不要な再帰的処理を避ける事が出来る。既に行った計算結果を保持しているソースコードを抽出せよ。

回答
delta1 = np.dot(delta2, W2.T) * functions.d_sigmoid(z1)の部分で、delta1を計算するにあたり、すでに計算したdelta2を利用しているため、delta2に既に行った計算結果が格納されているといえる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/118e5ebd-c0f2-15bc-2f3f-c7bdc7df4db8.png)

●P. 76
問
2つの空欄に該当するソースコードを探せ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/b2f36708-9e55-dbe7-fdf2-9b4e5e00312b.png)

回答
delta1 = np.dot(delta2, W2.T) * functions.d_sigmoid(z1)
grad['W1'] = np.dot(x.T, delta1)

## 5-D. 関連記事レポート

# 深層学習　Day2
# 1. 勾配消失問題
## 1-A. 講義内容
**勾配消失問題**
誤差逆伝播法が下位層に進んでいくに連れて、勾配がどんどん緩やかになっていく。そのため、勾配降下法による、更新では下位層のパラメータはほとんど変わらず、訓練は最適値に収束しなくなる。勾配消失問題は、活性化関数としてシグモイド関数を利用した場合に発生しやすい。シグモイド関数は引数の値が大きい領域では傾きがなだらか、つまり微分係数が小さくなることが一因となる。

**勾配消失問題の解決法**
■活性化関数の変更
活性化関数にReLU関数を用いると、比較的勾配消失問題は発生しづらい。そのため、ReLU関数は現在最も利用されている活性化関数である。

■重みの初期値設定
重みの初期値は、一般的には乱数が使用されており、これを変更することで勾配消失問題を発生しづらくすることができる。この方法は学習を早めることがある。
・Xavierの初期値
　重みの要素を、前の層のノード数の平方根で除算した値

・Heの初期値
　重みの要素を、前の層のノード数の平方根で除算し、ルート2を乗じた値

■バッチ正規化
ミニバッチ単位で、入力データの偏りを除く手法。

## 1-B. 実装演習結果
活性化関数にシグモイド関数を用いて、ガウス分布に基づいて重みを初期化した場合、下記のように学習が進まず、勾配消失問題に直面していることがわかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/ef871a0a-429d-d1e4-d405-0b4c9fb66a34.png)

活性化関数にReLU関数を用いて、ガウス分布に基づいて重みを初期化した場合、下記のように学習が進み、勾配消失問題を克服したことがわかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/5858708d-7428-e875-a26f-8804ca15b913.png)

活性化関数にシグモイド関数を用いて、Xavierの重み初期化を実行した場合、下記のように学習が進み、勾配消失問題を克服したことがわかる。また、上の条件に比べて学習の立ち上がりが早い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/d11324b4-3555-3b53-dc04-318d832b8c17.png)

活性化関数にReLU関数を用いて、Heの重み初期化を実行した場合、下記のように学習が進み、上の条件に比べて学習の立ち上がりが早い。活性化関数の種別と重みの初期化法のどちらも学習の速さに影響することがわかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/4c23f392-b862-efd2-c3f4-d4efebb4328d.png)

## 1-C. 確認テスト考察
●P. 76
問
連鎖律の原理を使い、dz/dxを求めよ。
z = t<sup>2</sup>
t = x + y

回答
dz/dxは連鎖率より、(dz/dt)(dt/dx)と書けるので、
dz/dt = 2t
dt/dx = 1
したがって
dz/dx = 2t

●P. 18
問
シグモイド関数を微分した時、入力値が0の時に最大値をとる。その値として正しいものを選択肢から選べ。
（1）0.15
（2）0.25
（3）0.35
（4）0.4518

回答
シグモイド関数は、f(x) = 1/(1 + exp(-x))の式で表現できる。ここで、X = 1 + exp(-x)とおくと、
連鎖率より、
df(x)/dx = {d(1/X)/dX}{dX/dx}
         = -{1/X<sup>2</sup>}{-exp(-x)}
         = (1/X){exp(-x)/1 + exp(-x)}
         = f(x)(1 - f(x))
よってdf(0)/dx = 0.5・0.5 = 0.25    (2)

●P. 26
問
重みの初期値に0を設定すると、どのような問題が発生するか。簡潔に説明せよ。

回答
すべての重みの値が均一に更新されてしまうため、うまく学習を行えなくなる。

●P. 29
問
一般的に考えられるバッチ正規化の効果を2点挙げよ。

回答
・学習時、中間層の重みの更新が安定化されるため、学習が早く進む
・過学習が発生しづらくなる

## 1-D. 関連記事レポート
シグモイド関数は、その導関数の最大値が0.25と小さいことが勾配消失問題の原因となるため、現在ではReLU関数が好んで利用されている。しかし、シグモイド関数と類似の外観ながらも導関数の大きさの問題を克服した活性化関数の1つとしてtanh関数があり、これについて調べた。tanh関数（双曲線正接関数）は原点を通り、原点対象なS字型をした関数で外見は、(0, 0.5)において対称なシグモイド関数とよく似た形状をとる。最大値：1、最小値：-1で、出力値の幅はシグモイド関数よりも大きい。活性化関数としての性質における両関数の最大の違いは微分係数で、x=0においてシグモイド関数は最大値0.25をとるのに対し、tanh関数は最大値1.0をとる。しかし、tanh関数でもX=1以外では1以下の値となり勾配を減衰させてしまうため、勾配消失問題の解決策とはならなかった。式は下記となる。

```math
f(x)=tanh(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/32aa52a3-22e9-9fad-f9cc-f3ad57ade9af.png)
緑：tanh関数
赤：tanh関数の導関数
https://www.geogebra.org/
より

参考：
https://www.atmarkit.co.jp/ait/articles/2003/19/news015.html

# 2. 学習率最適化手法
## 2-A. 講義内容
**学習率**
学習率とは、勾配降下法による重み更新の際、どれだけ大きく値を更新するかを決めるパラメータ。学習率が大き過ぎた場合、学習は発散し、小さ過ぎた場合、学習に時間がかかってしまう上、大域的最適解にたどり着かないケースがある。そこで、学習率を最適化する目的で下記の手法が編み出された。

**通常の勾配降下法**
時刻tの重みに対して、誤差をパラメータで微分したものと学習率の積を減算し、時刻t+1の重みとする。

**モメンタム**
時刻tの重みに対して、誤差をパラメータで微分したものと学習率の積を減算し、さらに時刻tの重みに時刻t-1の重みを減産した値と慣性の積を加算し、時刻t+1の重みとする。
・局所的最適解にはならず、大域的最適解となる
・谷間についてから最も低い位置(最適値)にいくまでの時間が早い

**AdaGrad**
時刻tの重みに対して、誤差をパラメータで微分したものと再定義した学習率の積を減算し、時刻t+1の重みとする。
・勾配の緩やかな斜面に対して、最適値に近づける
・学習率が徐々に小さくなるので、鞍点問題を引き起こすことがある

**RMSProp**
時刻tの重みに対して、誤差をパラメータで微分したものと再定義した学習率の積を減算し、時刻t+1の重みとする。AdaGradを改良したもの。
・局所的最適解にはならず、大域的最適解となる
・ハイパーパラメータの調整が必要な場合が少ない

**Adam**
モメンタムと、AdaGrad → RMSPropはそれぞれ別系列として発展してきたが、それらを組み合わせた手法。モメンタムの「過去の勾配の指数関数的減衰平均」、RMSPropの「過去の勾配の2乗の指数関数的減衰平均」を取り入れたアルゴリズム。

## 2-B. 実装演習結果
学習率の最適化手法を利用しない単純なSGDを用いて学習を行った場合、下図のように学習が進まなかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/53037b3e-8b6f-dfe6-5af1-b1b6350bfe36.png)

モメンタムを用いて学習率最適化を行うと、下記のように学習が進んだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/7cce07b7-f4ec-011e-f7da-938109489ef5.png)

AdaGradを用いて学習率最適化を行うと、下記のように学習が進んだ。モメンタムを用いた場合とおおむね同じ程度の学習の早さであった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/de9f3dda-ff20-d133-1905-a896c01ef835.png)

RMSpropを用いるとAdaGradと比べ学習の速さは、大きく向上している。RMSpropはAdaGradの改良版ともいわれるが、効果が大きいことが実感できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/ba694bfd-82d1-8e4c-6529-ec2587697fd7.png)

Adamを用いた場合も、モメンタムやAdaGradに比べて学習が早まった。現在、最も利用されているといわれるAdamであるが、今回の例ではRMSpropのほうが学習が早かったようにも見える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/5d62e856-a97e-550d-94a7-cdc10ac954d6.png)

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

回答
モメンタム：谷間についてから最も低い位置(最適値)にいくまでの時間が早い
AdaGrad：勾配の緩やかな斜面に対して、最適値に近づけるが鞍点問題を引き起こすことがある。
RMSProp：AdaGradを改良し、鞍点問題を克服している。

## 2-D. 関連記事レポート
Adamについて調べました。論文より、アルゴリズムは下記となっています。
論文中では、下記のAdamのメリットが謳われていました。
・実装が簡単
・計算効率が高く、メモリ使用量が少ない
・勾配の対角スケーリングの影響をうけない
・非定常的な目標関数や、ノイズの多い・あるいは疎な勾配でも対応できる
・ハイパーパラメータは多くの場合、調整が不要
また、該当の論文ではAdamの改良版AdaMaxについても触れられていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/bf66d039-744b-d659-4980-7125c93a68ab.png)

参考：
https://qiita.com/shima_x/items/321e90564da38f3033b2
https://lib-arts.hatenablog.com/entry/paper13_Adam

# 3. 過学習
## 3-A. 講義内容
**過学習**
特定の訓練サンプルに対して特化して学習した結果、テスト誤差と訓練誤差とで学習曲線が乖離すること。

**正則化**
ネットワークの自由度（層数、ノード数、パラメータの値等）を制約する手法。過学習を抑制する働きがある。

**Weight decay（荷重減衰）**
■過学習の原因
学習を進めていくとネットワークの重みにばらつきが生じ、作用される重みが大きい入力ほど学習において重要な値である。しかし、この重みが大きすぎると、過学習が発生してしまう。

■過学習の対策
過学習がおこる大きさ以下で重みをコントロールすることで過学習を抑制できるが、一方で重みの大きさにばらつきを出すことは学習において必要である。そこで、誤差に対して正則化項を加算することで、重みの値に対してペナルティを与え、重みが大きくなりすぎることを抑制する。

■L1、L2正則化
誤差関数にpノルムを加算する。p = 1の場合L1正則化、p = 2の場合、L2正則化と呼ぶ。

**ドロップアウト**
■過学習の原因
ノード数が多すぎることも、過学習の原因の一つである。

■過学習の対策
ランダムにノードを削除して学習させる手法（ドロップアウト）を用いる。データ量を変化させずに、異なるモデルを学習させている（アンサンブル学習のような）効果が得られる。

## 3-B. 実装演習結果
学習データを少量に抑え、過学習を起こさせている。学習データではaccuracyが上昇しているが、検証データではaccuracyが頭打ちとなり、学習データに過剰に適合していくことがわかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/fd51fb5a-d704-8311-26cf-348370a492f7.png)

上記にL2正則化を行った。学習データのaccuracyが下がり、学習データ・検証データ間のaccuracyの差は縮まっていることがわかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/c9cfd4e6-34fc-fe2d-9dfb-aa8cb5bc809b.png)

L1正則化を行った。全体的に学習データ・検証データ間のaccuracyの差は縮まっているようだが、曲線が滑らかでなくなっている。L1正則化項がスパース性を与えたためか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/7007d30e-d269-f6e6-1418-95a3be7baca1.png)

ドロップアウトを行った。過学習の傾向は小さくなっているが、学習が遅くなっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/fcd8cb05-63dc-5c97-d410-9dd4939ec33f.png)

L1正則化とドロップアウトを組み合わせると、互いの端緒が補われ、学習は若干早くなり、曲線はなめらかとなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/5fd6bb7a-6458-8645-75de-53498b1e753c.png)

## 3-C. 確認テスト考察
●P. 64
問
下図について、L1正則化を表しているグラフはどちらか答えよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/6757a791-7944-b263-a923-80cc2141d2dd.png)

回答
右
Lp正規化の、Lpノルムによる正則化を表しており、Lpノルムは次の式で与えられる。L1正規化はL1ノルムを用いた正規化なので、下記式より円ではなく正方形を示す右がL1正規化である。

```math
||X||_{p} = (|x_{1}|^{p} + |x_{2}|^{p} + \cdots + |x_{n}|^{p})^{1/p}
```

## 3-D. 関連記事レポート

# 4. 畳み込みニューラルネットワーク（CNN）の概念
## 4-A. 講義内容
**畳み込み層**
畳み込み層では、入力画像に対して全結合ネットワークでいう「重み」に相当する小さな画像（フィルター）を重ね、重なった要素ごとに入力画像とフィルター間で積を取り合計する。この処理をフィルターをずらしながら、入力画像を網羅するように繰り返して得られる行列が出力となる。畳み込み層では、画像の場合、縦、横、チャンネルの3次元のデータをそのまま学習し、次に伝えることができる。また、縦・横2次元の画像だけでなく、奥行のある３次元の対象も学習できる。

■バイアス
全結合ネットワークの「バイアス」の概念がCNNにも存在し、重なった入力画像とフィルターの各要素ごとの積の合計に加算される値である。

■パディング
CNNでは、入力画像にフィルターを重ねた部分ごとに値を１つだけ返すため、一般的には出力された行列は入力画像よりも小さい。出力される行列の大きさを調整するために入力画像に縁をつけてあらかじめ大きくしてから畳み込み計算を行う手法をパディングという。縁の部分の値は、0で埋める、入力画像の平均値で埋めるなどの方法がある。

■ストライド
畳み込み計算は、フィルターずらしながら入力画像を網羅的に処理するが、フィルターをずらす幅をストライドという。

**プーリング層**
プーリング層では、畳み込み層のフィルターのようにウィンドウをずらしながら、入力画像の各区域の最大値（最大プーリング）や平均値（平均プーリング）を取り出し、新たな画像を構成する。特徴量の位置のずれを吸収する働きがある。

## 4-B. 実装演習結果
im2colの処理内容確認。このネットワークは、フィルターサイズが3x3であるため、処理後のカラム数は3x3=9となっていることが確認できる。また、パディング：0、ストライド：1であるため、4x4の入力画像に対して4か所フィルターを当てるので、画像2枚分で行数は4x2=8である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/fb8eab60-bbcb-d5b8-84e8-e3568bbb76fc.png)
上記で、実際にMNISTの判定をCNNに学習させた結果、下図となった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1463031/ec34346a-ab84-77a8-19c5-62550359b3c8.png)

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

回答
((6 + (1 x 2) - 2) / 1) + 1 = 7
よって7x7の出力画像となる。

## 4-D. 関連記事レポート

# 5. 最新のCNN
## 5-A. 講義内容
**AlexNet**
5層の畳み込み層及びプーリング層など、それに続く3層の全結合層からなるCNN。全結合層の出力にドロップアウトを使用し、過学習を抑制している。畳み込み層・プーリング層から、全結合層へ移行する部分ではFlattenという処理が行われており、これはすべてのチャネルを通して、縦横に並んだ画像のピクセルを、一列に並べなおす処理である。全結合層への移行には、他にもGlobal Max PoolingやGlobal Average Poolingといった処理方法があるが、一般的にはこれらの手法の方が、Flattenよりも精度が良いとされている。

## 5-B. 実装演習結果
## 5-C. 確認テスト考察
確認テストなし

## 5-D. 関連記事レポート
**全結合層への移行について**
畳み込み層・プーリング層から、全結合層へ移行する部分の処理には下記がある。
■Flatten
すべてのチャネルを通して、縦横に並んだ画像のピクセルを、一列に並べなおす処理.

■Global Max Pooling
チャネルごとに最大値を取り出して、ベクトルの１つの要素とする。チャネル数＝ベクトルの要素数となる。

■Global Average Pooling
チャネルごとに平均値を取り出して、ベクトルの１つの要素とする。チャネル数＝ベクトルの要素数となる。

**AlexNetについて**
・トロント大学のジェフリー・ヒントン教授らのチームによって発表された物体認識のためのモデル
・物体認識のために、初めて深層学習の概念および畳み込みニューラルネットワークの概念を取り入れたアーキテクチャ
・ヒントン教授のチームSuperVisionは、AlexNetを用いて2012年のILSVRCで圧倒的低エラー率で優勝
・従来の人手による特徴量エンジニアリングと異なり、機械自身が特徴量を見つけだす手法であった
参考：https://axa.biopapyrus.jp/deep-learning/cnn/image-classification/alexnet.html