ゼロから作るDeep Learning

本記事は[ゼロから作るDeep Learning](https://www.oreilly.co.jp/books/9784873117584/)などを参考にしています。

デモ用のコードは[こちら](https://github.com/hayato24s/deep-learning-from-scratch/blob/32bd6eb655fc4eafdc79b8e09592986154bfb872/notebooks/mlp_mnist.ipynb)です。

## 学習

深層学習では次のようなモデルを考える。

```math
L=f(\boldsymbol{x};\boldsymbol{\theta})
```

ここで、各文字は次のように定義される。

$L$ : 損失
$f$ : モデル
$\boldsymbol{x}$ : 入力値
$\boldsymbol{\theta}$ : パラメータ

損失が小さくなるようにモデル$f$の学習を行う。
モデル$f$の学習は次のようにパラメータ$\boldsymbol{\theta}$を更新することで実現される。

```math
\boldsymbol{\theta_{new}}=\boldsymbol{\theta_{old}} - \eta \frac{\partial L}{\partial \boldsymbol{\theta_{old}}}, \quad \eta > 0
```

ここで、$\eta$は学習率と呼ばれるハイパーパラメータである。

<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1424543/9eb982b5-5d29-8805-52a7-ffd6d8d6a775.png">

例として、上図のような場合を考える。

$\frac{\partial L}{\partial \boldsymbol{\theta_{old}}} < 0$であるため、パラメータの更新を行うと、$L(\boldsymbol{\theta_{old}})>L(\boldsymbol{\theta_{new}})$となり、損失が小さくなっていることが分かる。

ただし、学習率$\eta$や勾配$\frac{\partial L}{\partial \boldsymbol{\theta_{old}}}$が大きいと、パラメータが$\boldsymbol{\theta_{new}^{'}}$へと更新され、$L(\boldsymbol{\theta_{old}})<L(\boldsymbol{\theta_{new}^{'}})$となってしまい、むしろ損失が大きくなってしまう。

このように、必ずしもパラメータの更新を行うことによって損失が小さくなるわけでない。

## 連鎖律

上述したように、深層学習ではパラメータの更新を行うために勾配を求める必要がある。そこで、連鎖律を用いて勾配を効率的に算出する。

ここでは、次のようなモデルを考える。
```math
L = L(z), \quad z = z(y, \theta_{y}), \quad y = y(x, \theta_{x})
```

勾配は連鎖律を用いて次のように計算できる。

```math
\begin{align}
\frac{\partial L}{\partial \theta_{y}} &= \frac{\partial L}{\partial z}\frac{\partial z}{\partial \theta_{y}} \\
\frac{\partial L}{\partial y} &= \frac{\partial L}{\partial z}\frac{\partial z}{\partial y} \\
\frac{\partial L}{\partial \theta_{x}} &= \frac{\partial L}{\partial z}\frac{\partial z}{\partial y}\frac{\partial y}{\partial \theta_{x}} = \frac{\partial L}{\partial y}\frac{\partial y}{\partial \theta_{x}} \\
\frac{\partial L}{\partial x} &= \frac{\partial L}{\partial z}\frac{\partial z}{\partial y}\frac{\partial y}{\partial x} = \frac{\partial L}{\partial y}\frac{\partial y}{\partial x}\\
\end{align}
```

## 全結合層

下図のような全結合層を考える。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1424543/d085f958-ed77-28ac-c00c-dad99e8c8055.png">

$\boldsymbol{x}$,$\boldsymbol{y}$,$W$を次のように定義する。

```math
\boldsymbol{x}=\begin{pmatrix}
x_{1} \\
x_{2}
\end{pmatrix}
```

```math
\boldsymbol{y}=\begin{pmatrix}
y_{1} \\
y_{2} \\
y_{3}
\end{pmatrix}
```

```math
W = \begin{pmatrix}
w_{11} & w_{12} & w_{13} \\
w_{21} & w_{22} & w_{23} \\
\end{pmatrix}
```

順伝播は下記のように表せる。

```math
\begin{align}
\boldsymbol{y}^{t} &= \begin{pmatrix}
y_1 & y_2 & y_3
\end{pmatrix} \\
&= \begin{pmatrix}
x_{1}w_{11} + x_{2}w_{21} & x_{1}w_{12} + x_{2}w_{22} & x_{1}w_{13} + x_{2}w_{23}
\end{pmatrix} \\
&= \begin{pmatrix}
x_{1} & x_{2}
\end{pmatrix}
\begin{pmatrix}
w_{11} & w_{12} & w_{13} \\
w_{21} & w_{22} & w_{23} \\
\end{pmatrix} \\
&= \boldsymbol{x}^{t} W
\end{align}
```

次に、逆伝播について考える。
```math
L = L(y_{1},y_{2},y_{3})
```
であるとする。
```math
\begin{align}
y_{1} = y_{1}(x_{1},x_{2},w_{11},w_{21}) = x_{1}w_{11} + x_{2}w_{21} \\
y_{2} = y_{2}(x_{1},x_{2},w_{12},w_{22}) = x_{1}w_{12} + x_{2}w_{22} \\
y_{3} = y_{3}(x_{1},x_{2},w_{13},w_{23}) = x_{1}w_{13} + x_{2}w_{23}
\end{align}
```
であることに注意して、連鎖律を用いると、

```math
\begin{align}
\frac{\partial L}{\partial \boldsymbol{x}^{t}}
&=
\begin{pmatrix}
\frac{\partial L}{\partial x_{1}} & \frac{\partial L}{\partial x_{2}}
\end{pmatrix} \\
&= \begin{pmatrix}
\frac{\partial L}{\partial y_{1}}\frac{\partial y_{1}}{\partial x_{1}}
+\frac{\partial L}{\partial y_{2}}\frac{\partial y_{2}}{\partial x_{1}}
+\frac{\partial L}{\partial y_{3}}\frac{\partial y_{3}}{\partial x_{1}} & 
\frac{\partial L}{\partial y_{1}}\frac{\partial y_{1}}{\partial x_{2}}
+\frac{\partial L}{\partial y_{2}}\frac{\partial y_{2}}{\partial x_{2}}
+\frac{\partial L}{\partial y_{3}}\frac{\partial y_{3}}{\partial x_{2}}
\end{pmatrix} \\
&= \begin{pmatrix}
\frac{\partial L}{\partial y_{1}} w_{11}
+\frac{\partial L}{\partial y_{2}} w_{12}
+\frac{\partial L}{\partial y_{3}} w_{13} &
\frac{\partial L}{\partial y_{1}} w_{21}
+\frac{\partial L}{\partial y_{2}} w_{22}
+\frac{\partial L}{\partial y_{3}} w_{23}
\end{pmatrix} \\
&= \begin{pmatrix}
\frac{\partial L}{\partial y_{1}} & \frac{\partial L}{\partial y_{2}} & \frac{\partial L}{\partial y_{3}}
\end{pmatrix}
\begin{pmatrix}
w_{11} & w_{21} \\
w_{12} & w_{22} \\
w_{13} & w_{23} \\
\end{pmatrix} \\
&= \frac{\partial L}{\partial \boldsymbol{y}^{t}} W^{t}
\end{align}
```
と表せる。

また、
```math
\begin{align}
\frac{\partial L}{\partial w_{ij}}
&= \frac{\partial L}{\partial y_{1}}\frac{\partial y_{1}}{\partial w_{ij}}
+ \frac{\partial L}{\partial y_{2}}\frac{\partial y_{2}}{\partial w_{ij}}
+ \frac{\partial L}{\partial y_{3}}\frac{\partial y_{3}}{\partial w_{ij}} \\
&= \frac{\partial L}{\partial y_{1}}\frac{\partial (x_{1}w_{11} + x_{2}w_{21})}{\partial w_{ij}}
+ \frac{\partial L}{\partial y_{2}}\frac{\partial (x_{1}w_{12} + x_{2}w_{22})}{\partial w_{ij}}
+ \frac{\partial L}{\partial y_{3}}\frac{\partial (x_{1}w_{13} + x_{2}w_{23})}{\partial w_{ij}} \\
&= \frac{\partial L}{\partial y_{j}} x_{i}
\end{align}
```

となるので、

```math
\begin{align}
\frac{\partial L}{\partial W}
&= \begin{pmatrix}
\frac{\partial L}{\partial w_{11}} & \frac{\partial L}{\partial w_{12}} & \frac{\partial L}{\partial w_{13}} \\
\frac{\partial L}{\partial w_{21}} & \frac{\partial L}{\partial w_{22}} & \frac{\partial L}{\partial w_{23}}
\end{pmatrix} \\
&= \begin{pmatrix}
\frac{\partial L}{\partial y_{1}} x_{1} & \frac{\partial L}{\partial y_{2}} x_{1} & \frac{\partial L}{\partial y_{3}} x_{1} \\
\frac{\partial L}{\partial y_{1}} x_{2} & \frac{\partial L}{\partial y_{2}} x_{2} & \frac{\partial L}{\partial y_{3}} x_{2}
\end{pmatrix} \\
&= \begin{pmatrix}
x_{1} \\
x_{2}
\end{pmatrix}
\begin{pmatrix}
\frac{\partial L}{\partial y_{1}} & \frac{\partial L}{\partial y_{2}} & \frac{\partial L}{\partial y_{3}}
\end{pmatrix} \\
&= 
\begin{pmatrix}
\boldsymbol{x}^{t}
\end{pmatrix}^{t}
\frac{\partial L}{\partial \boldsymbol{y}^{t}}
\end{align}
```
と表せる。

これまでの議論の自然な拡張としてバッチ化を行う。

$X$,$Y$を次のように定義する。

```math
X = \begin{pmatrix}
x_{11} & x_{12} \\
x_{21} & x_{22}
\end{pmatrix}
```

```math
Y = \begin{pmatrix}
y_{11} & y_{12} & y_{13} \\
y_{21} & y_{22} & y_{23}
\end{pmatrix}
```

それぞれの行列において、1行目が1つ目のサンプルに、2行目が2つ目のサンプルに対応している。

順伝播は次のように表せる。

```math
\begin{align}
Y &= \begin{pmatrix}
y_{11} & y_{12} & y_{13} \\
y_{21} & y_{22} & y_{23}
\end{pmatrix} \\
&= \begin{pmatrix}
x_{11}w_{11} + x_{12}w_{21} & x_{11}w_{12} + x_{12}w_{22} & x_{11}w_{13} + x_{12}w_{23} \\
x_{21}w_{11} + x_{22}w_{21} & x_{21}w_{12} + x_{22}w_{22} & x_{21}w_{13} + x_{22}w_{23}
\end{pmatrix} \\
&= \begin{pmatrix}
x_{11} & x_{12} \\
x_{21} & x_{22}
\end{pmatrix} 
\begin{pmatrix}
w_{11} & w_{12} & w_{13} \\
w_{21} & w_{22} & w_{23} \\
\end{pmatrix} \\
&= XW
\end{align}
```

逆伝播は次のように表せる。

```math
\begin{align}
\frac{\partial L}{\partial X}
&= \begin{pmatrix}
\frac{\partial L}{\partial x_{11}} & \frac{\partial L}{\partial x_{12}} \\
\frac{\partial L}{\partial x_{21}} & \frac{\partial L}{\partial x_{22}}
\end{pmatrix} \\
&= \begin{pmatrix}
\frac{\partial L}{\partial y_{11}}w_{11} + \frac{\partial L}{\partial y_{12}}w_{12} + \frac{\partial L}{\partial y_{13}}w_{13} & \frac{\partial L}{\partial y_{11}}w_{21} + \frac{\partial L}{\partial y_{12}}w_{22} + \frac{\partial L}{\partial y_{13}}w_{23} \\
\frac{\partial L}{\partial y_{21}}w_{11} + \frac{\partial L}{\partial y_{22}}w_{12} + \frac{\partial L}{\partial y_{23}}w_{13} & \frac{\partial L}{\partial y_{21}}w_{21} + \frac{\partial L}{\partial y_{22}}w_{22} + \frac{\partial L}{\partial y_{23}}w_{23}
\end{pmatrix} \\
&= \begin{pmatrix}
\frac{\partial L}{\partial y_{11}} & \frac{\partial L}{\partial y_{12}} & \frac{\partial L}{\partial y_{13}} \\
\frac{\partial L}{\partial y_{21}} & \frac{\partial L}{\partial y_{22}} & \frac{\partial L}{\partial y_{23}}
\end{pmatrix}
\begin{pmatrix}
w_{11} & w_{21} \\
w_{12} & w_{22} \\
w_{13} & w_{23} \\
\end{pmatrix} \\
&= \frac{\partial L}{\partial Y} W^{t}
\end{align}
```

```math
\begin{align}
\frac{\partial L}{\partial W}
&= \begin{pmatrix}
\frac{\partial L}{\partial w_{11}} & \frac{\partial L}{\partial w_{12}} & \frac{\partial L}{\partial w_{13}} \\
\frac{\partial L}{\partial w_{21}} & \frac{\partial L}{\partial w_{22}} & \frac{\partial L}{\partial w_{23}}
\end{pmatrix} \\
&= \begin{pmatrix}
\frac{\partial L}{\partial y_{11}} x_{11} + \frac{\partial L}{\partial y_{21}} x_{21} &  \frac{\partial L}{\partial y_{12}} x_{11} + \frac{\partial L}{\partial y_{22}} x_{21} & \frac{\partial L}{\partial y_{13}} x_{11} + \frac{\partial L}{\partial y_{23}} x_{21} \\
\frac{\partial L}{\partial y_{11}} x_{12} + \frac{\partial L}{\partial y_{21}} x_{22} &  \frac{\partial L}{\partial y_{12}} x_{12} + \frac{\partial L}{\partial y_{22}} x_{22} & \frac{\partial L}{\partial y_{13}} x_{12} + \frac{\partial L}{\partial y_{23}} x_{22}
\end{pmatrix} \\
&= \begin{pmatrix}
x_{11} & x_{21} \\
x_{12} & x_{22}
\end{pmatrix}
\begin{pmatrix}
\frac{\partial L}{\partial y_{11}} & \frac{\partial L}{\partial y_{12}} & \frac{\partial L}{\partial y_{13}} \\
\frac{\partial L}{\partial y_{21}} & \frac{\partial L}{\partial y_{22}} & \frac{\partial L}{\partial y_{23}}
\end{pmatrix} \\
&= X^{t} \frac{\partial L}{\partial Y}
\end{align}
```

## Relu

<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1424543/3883cc5a-8a30-18cd-7412-ec99a0aa5fa6.png">

Relu関数は下式で表される。

```math
y = \begin{cases}
x \quad (x \geq 0) \\
0 \quad (x < 0)
\end{cases}
```

逆伝播は次のように表せる。

```math
\frac{\partial y}{\partial x} = \begin{cases}
1 \quad (x \geq 0) \\
0 \quad (x < 0)
\end{cases}
```

## Softmax

Softmax関数は次のように表される。

```math
y_{i} = f_{softmax}(x_{i}) = \frac{exp(x_{i})}{\displaystyle\sum_{j=1}^{D}exp(x_{j})},
```

ここで、

```math
\boldsymbol{x} = \begin{pmatrix}
x_{1} \\
\vdots \\
x_{D}
\end{pmatrix}, \quad
\boldsymbol{y} = \begin{pmatrix}
y_{1} \\
\vdots \\
y_{D}
\end{pmatrix}
\in \mathbb{R}^{D}
```

とおいた。

このとき、

```math
\displaystyle\sum_{d=1}^{D}y_{d} = 1, \quad 0 \leq y_{d} \leq 1 \quad for \quad 1 \leq d \leq D
```

を満たす。

## CrossEntorypyLoss

CrossEntropyLossは次のように表される。

```math
L = - \displaystyle\sum_{k=1}^{K}t_{k}log(y_{k})
```

ここで、$t_{k}$はone-hotベクトルであり、$y_{k}$はクラス$k$である予測確率を表す。

つまり、

```math
\displaystyle\sum_{k=1}^{K}y_{k} = 1, \quad 0 \leq y_{k} \leq 1 \quad for \quad 1 \leq k \leq K
```

```math
\displaystyle\sum_{k=1}^{K}t_{k} = 1, \quad t_{k} \in \{0, 1\} \quad for \quad 1 \leq k \leq K
```

を満たす。

バッチ化されている場合は次のように表される。

```math
L = - \frac{1}{N}\displaystyle\sum_{n=1}^{N}\displaystyle\sum_{k=1}^{K}t_{nk}log(y_{nk})
```

ここで、$N$はバッチサイズを表す。

## Softmax And CrossEntorypyLoss

Softmax関数を適用した後に、CrossEntropyLossを計算する場合を考える。

これは、$K$をクラス数、$\boldsymbol{t}$をone-hotベクトルとすると、

```math
\boldsymbol{x} = \begin{pmatrix}
x_{1} \\
\vdots \\
x_{K}
\end{pmatrix}, \quad
\boldsymbol{y} = \begin{pmatrix}
y_{1} \\
\vdots \\
y_{K}
\end{pmatrix}
\in \mathbb{R}^{K}
```

```math
y_{k} = f_{softmax}(x_{k}) \quad for \quad 1 \leq k \leq K
```

```math
\boldsymbol{t} = \begin{pmatrix}
t_{1} \\
\vdots \\
t_{K}
\end{pmatrix}
```

```math
L = - \displaystyle\sum_{k=1}^{K}t_{k}log(y_{k})
```

と表せる。

このとき、逆伝播は次のようになることが知られている。

```math
\frac{\partial L}{\partial x_{k}} = y_{k} - t_{k}
```

つまり、

```math
\frac{\partial L}{\partial \boldsymbol{x}} = \boldsymbol{y} - \boldsymbol{t}
```

と表せる。

## 確率的勾配降下法

SGD(Stochastic Gradient Descent)ともいう。

ランダムに選ばれたサンプルに対して順伝播と逆伝播を実行して、パラメータの更新を行う。