このページは執筆中であり情報はまだ不完全です。参考にしないで下さい。


Deep Learning : 早わかり (備忘録)

Neural Networks を理解する


2018.10.15: editing started by
Japanese English
目次へ

1. Neural Networks

$p$ 入力 $q$ 出力の Neural Networks を考える。 このNeural Networksの中は互いに結合された多くの Neuron で構成されている。

Fig.1.1 Neural Networks

1.1 Neuron

Fig.1.1 の Neural Networks からひとつの neuron を取りだして考える。 Fig.1.2 の neuron は $n$ 入力 $m$ 出力である。

Fig.1.2 $n$-input $m$-output Neuron

1つの neuron は、Fig.1.3 のように3つのunitに分けて考えると、とても理解しやすくなる(特に back propagation が)。

Fig.1.3 3-Units in a neuron

1.1.1 neuronを3 unitに分けて考える

1つの neuron の中の3つのunitの機能をそれぞれ、

として説明する。(Fig.1.4 参照)



Fig.1.4 Functions of 3 units in a neuron

1.1.2 [1] 多入力1出力関数 $z = f(x_1, x_2, \cdots, x_n)$

(forward propagationの説明)
$n$ 入力 $1$ 出力の関数 $f$ を用いて$z = f(x_1, x_2, \cdots, x_n)$を計算して値を出力する。 $n=1$ の場合もありえる。

Fig.1.5 Forward propagation of input units in a neuron

(backward propagationの説明)
もしも最終的に Neural Networks 全体の出力が $L$ だけ間違ったとして、 $z$には$\displaystyle \frac{\partial L}{\partial z}$ だけ責任があることがわかったとする。 すると、 $x_i$ それぞれについては $\displaystyle \frac{\partial L}{\partial x_i}$ ずつ 責任があることになり、その値は偏微分の公式により $\displaystyle \frac{\partial L}{\partial x_i} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial x_i}$ で計算できる ($i=1,2,\cdots,n$)。

Fig.1.6 Backward propagation of input unit in a neuron

1.1.3 [2] 1入力1出力関数 $a = g(z)$

(forward propagationの説明)
$1$ 入力 $1$ 出力の関数 $g$ を用いて$a = g(z)$を計算する。 $g$は非線形関数であることが多い。

Fig.1.7 Forward propagation of Activation unit in a neuron

(backward propagationの説明)
もしも最終的に Neural Networks の出力が $L$ だけ間違ったとして、 $a$には$\displaystyle \frac{\partial L}{\partial a}$ だけ責任があることがわかったとする。 すると、 $z$ については $\displaystyle \frac{\partial L}{\partial z}$ の責任があることになり、 その値は偏微分の公式により $\displaystyle \frac{\partial L}{\partial z} = \frac{\partial L}{\partial a} \cdot \frac{\partial a}{\partial z}$ で計算できる。

Fig.1.8 backward propation of Activation unit in a neuron

1.1.4 [3] 1出力の値を $m$ 個にコピーして出力する操作 $y_i = Repeat(z)$ (重要)

(forward propagationの説明)
$Repeat$ は数学的な関数ではない。 入力 $a$の値をそのままコピーして $y_1$, $y_2$, $\cdots$, $y_m$ に出力する。 したがって、数学的に等しいことを意味する$y_i = a$ と書くのは間違いで、 あえて記述するならばプログラミング言語における代入として $y_i := a$ とでも書くべき操作である。

$m=1$の場合もありえるが、このときだけは普通に数学的な等式の意味となる。

Fig.1.9 Forward propation of output operation in a neuron

(backward propagationの説明)
もしも最終的に Neural Networks の出力が $L$ だけ間違ったとして、 $y_i$それぞれには$\displaystyle \frac{\partial L}{\partial y_i}$ ずつ責任があることがわかったとする($i=1,2,\cdots,m$)。 すると、 $z$ についての責任 $\displaystyle \frac{\partial L}{\partial z}$ は、 単純に考えるならば それぞれの $y_i$ についての責任の平均である $\displaystyle \frac{1}{m} (\frac{\partial L}{\partial y_1} + \frac{\partial L}{\partial y_2} + \cdots + \frac{\partial L}{\partial y_m}) = \frac{1}{m} \sum_{j=1}^{m}\frac{\partial L}{\partial y_j}$ とするのが妥当に思えるだろう。 これはたとえば$m=3$のとき、 $\displaystyle \frac{\partial L}{\partial y_1} = 1.0$, $\displaystyle \frac{\partial L}{\partial y_2} = 2.0$, $\displaystyle \frac{\partial L}{\partial y_3} = 3.0$, とすると、「($a$の値のコピーである)$y_1$は$1.0$だけ大き過ぎで、($a$の値のコピーである)$y_2$は$2.0$だけ大き過ぎで、($a$の値のコピーである)$y_3$は$3.0$だけ大き過ぎだ」 という意味だから、 $a$ にはこれらの平均である$\displaystyle \frac{1.0+2.0+3.0}{3} = 2.0$ だけ責任がある(値が間違っていた)でしょ、という考え方である。

だがしかし、ここでよく考えてほしい。 $\displaystyle \frac{\partial L}{\partial y_j} = 0$ だったからといって、 $y_j$が正しい値を出力し $L$ がぴたりと正解するのに貢献したとは限らないことに注意が必要だ。 すなわち $y_j$ の出力値が forward 方向へ伝播されて計算が進む途中で0となり $L$ の値の計算に全く貢献していない場合も $\displaystyle \frac{\partial L}{\partial y_j} = 0$になってしまうからだ。 そして、Neural Networks ではneuronはやたらと結合されているので、 伝えた値が最終出力の$L$がぴたりと正解するのに貢献した場合よりも、 全く貢献しなかった場合の方がはるかに多いと推測されるのだ。 したがって、 $\displaystyle \frac{\partial L}{\partial y_j} = 0$ を数に入れて平均するのは間違いで、これでは本来とるべき責任を非常に小さくして 入力側に伝えてしまうことになる(backpropagation時の vanishing gradientsが起きやすくなる)。

では「平均はやめて」、絶対値が最大の値を採用するのはどうか? これはたとえば$m=4$のとき、 $\displaystyle \frac{\partial L}{\partial y_1} = 2.0$, $\displaystyle \frac{\partial L}{\partial y_2} = -1.0$, $\displaystyle \frac{\partial L}{\partial y_3} = -1.0$, $\displaystyle \frac{\partial L}{\partial y_4} = -1.0$, とすると、全体としては$a$の責任は負の値となるべきなのに、正の値$2.0$となってしまうので問題が起きる。

では、「絶対値がそれなりに大きいものの平均を採用する」ことはどうか? これはたとえば$m=20$のとき、「絶対値が最大の10 % より大きい要素の平均」を計算することにすると $\displaystyle \frac{\partial L}{\partial y_1} = 10.0$ で残りの19個が全部$\displaystyle \frac{\partial L}{\partial y_j} = -0.9$ の場合は、全体としては$a$の責任は負の値となるのが適切なのに、$10.0$という正の値になってしまうのでやはり問題が起きる。

以上の考察より、「単純和を採用する」ことは、少し大きな値となってしまうが、他の方法と比べるとそれなりにましな方法であることがわかる。

したがって、 $\displaystyle \frac{\partial L}{\partial z} = \frac{\partial L}{\partial y_1} + \frac{\partial L}{\partial y_2} + \cdots + \frac{\partial L}{\partial y_m} = \sum_{j=1}^{m}\frac{\partial L}{\partial y_j}$ と定義するのである。

ここの部分、つまり、この$Repeat$操作における責任の伝わり方 $\displaystyle \frac{\partial L}{\partial z} $ は、数学的な操作ではないので、偏微分の公式でクリアに求まるわけではない。 ここが理解しにくい点だと思う。

Fig.1.10 Backward propagation of Output operation in a neuron

1.1.5 [1] 多入力1出力関数 $z = f(x_1, x_2, \cdots, x_n)$ の具体例

1.1.5.1 加算 $z = x_1 + x_2 + \cdots + x_n$

$\displaystyle \frac{\partial z}{\partial x_i} = 1$ なので $\displaystyle \frac{\partial L}{\partial x_i} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial x_i} = \frac{\partial L}{\partial z}$

1.1.5.2 乗算 $z = x_1 * x_2$

$\displaystyle \frac{\partial z}{\partial x_1} = x_2$ なので $\displaystyle \frac{\partial L}{\partial x_1} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial x_1} = \frac{\partial L}{\partial z} \cdot x_2$
$\displaystyle \frac{\partial z}{\partial x_2} = x_1$ なので $\displaystyle \frac{\partial L}{\partial x_2} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial x_2} = \frac{\partial L}{\partial z} \cdot x_1$

1.1.5.3 乗算と加算の組み合わせ $z = w_1 * x_1 + w_2 * x_2 \cdots + w_n * x_n + b$

$\displaystyle \frac{\partial z}{\partial x_i} = w_i$ なので $\displaystyle \frac{\partial L}{\partial x_i} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial x_i} = \frac{\partial L}{\partial z} \cdot w_i$
$\displaystyle \frac{\partial z}{\partial w_i} = x_i$ なので $\displaystyle \frac{\partial L}{\partial w_i} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial w_i} = \frac{\partial L}{\partial z} \cdot x_i$
$\displaystyle \frac{\partial z}{\partial b} = 1$ なので $\displaystyle \frac{\partial L}{\partial x_2} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial b} = \frac{\partial L}{\partial z}$

1.1.5.4 除算 $z = x_1 / x_2$

$\displaystyle \frac{\partial z}{\partial x_1} = \frac{1}{x_2}$ なので $\displaystyle \frac{\partial L}{\partial x_1} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial x_1} = \frac{\partial L}{\partial z} \cdot \frac{1}{x_2}$
$\displaystyle \frac{\partial z}{\partial x_2} = -\frac{x_1}{x_2^2}$ なので $\displaystyle \frac{\partial L}{\partial x_2} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial x_2} = - \frac{\partial L}{\partial z} \cdot \frac{x_1}{x_2^2}$

1.1.5.5 平均 $\displaystyle z = \frac{1}{n} \sum_{i=1}^n x_i$

$\displaystyle \frac{\partial z}{\partial x_i} = \frac{1}{n}$ なので $\displaystyle \frac{\partial L}{\partial x_i} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial x_i} = \frac{\partial L}{\partial z} \cdot \frac{1}{n}$

1.1.5.6 最大値 $\displaystyle z = max(x_1, x_2, \cdots, x_n)$

(forward propagation 時には) $x_1, x_2, \cdots, x_n$ から最大のものを選んで$z$の値とする。

したがって、(backward propagation 時には) $z$ と等しい $x_i$ にだけ責任を伝播すればよい。

$\displaystyle \begin{equation} \frac{\partial z}{\partial x_i} = \left\{ \begin{matrix} 1 && (z = x_i) \\ 0 && (z \neq x_i) \end{matrix} \right. \end{equation}$
であるから
$\displaystyle \begin{equation} \frac{\partial L}{\partial x_i} = \left\{ \begin{matrix} \displaystyle \frac{\partial L}{\partial z} && (z = x_i) \\ 0 && (z \neq x_i) \end{matrix} \right. \end{equation}$

1.1.6 [2] 1入力1出力関数 $a = g(z)$ の具体例

1.1.6.1 指数関数: $a = e^z$

$\displaystyle \frac{\partial a}{\partial z} = e^z = a$ なので $\displaystyle \frac{\partial L}{\partial z} = \frac{\partial L}{\partial a} \cdot \frac{\partial a}{\partial z} = \frac{\partial L}{\partial z} \cdot a$

1.1.6.2 log関数: $a = \log z$

$\displaystyle \frac{\partial a}{\partial z} = \frac{1}{z}$ なので $\displaystyle \frac{\partial L}{\partial z} = \frac{\partial L}{\partial a} \cdot \frac{\partial a}{\partial z} = \frac{\partial L}{\partial z} \cdot \frac{1}{z}$

1.1.6.3 sigmoid関数: $\displaystyle a = \frac{1}{1+e^{-z}}$

$\displaystyle \frac{\partial a}{\partial z} = -\frac{-e^{-z}}{(1+e^{-z})^2} = \frac{e^{-z}}{(1+e^{-z})^2} $
また
$\displaystyle (1-a)a = (1- \frac{1}{1+e^{-z}}) \frac{1}{1+e^{-z}} = \frac{1+e^{-z} - 1}{(1+e^{-z})^2} = \frac{e^{-z}}{(1+e^{-z})^2}$
であるから
$\displaystyle \frac{\partial a}{\partial z} = (1-a)a$
がいえる。したがって、
$\displaystyle \frac{\partial L}{\partial z} = \frac{\partial L}{\partial a} \cdot \frac{\partial a}{\partial z} = \frac{\partial L}{\partial z} \cdot (1-a)a$

1.1.6.3 $\tanh$関数: $\displaystyle a = \frac{e^z - e^{-z}}{e^z+e^{-z}} = (e^z - e^{-z})(e^z+e^{-z})^{-1}$

$\displaystyle \frac{\partial a}{\partial z} = (e^z + e^{-z}) (e^z+e^{-z})^{-1} - (e^z - e^{-z})(e^z-e^{-z}) (e^z+e^{-z})^{-2} = 1 - (\frac{e^z -e^{-z}}{e^z+e^{-z}})^2 = 1 - a^2$
なので
$\displaystyle \frac{\partial L}{\partial z} = \frac{\partial L}{\partial a} \cdot \frac{\partial a}{\partial z} = \frac{\partial L}{\partial z} \cdot (1-a^2)$

1.1.6.4 ReLU 関数 (Rectified Linear Unit)

$\displaystyle \begin{equation} a = \left\{ \begin{matrix} z && (z \gt 0) \\ 0 && (z \leqq 0) \end{matrix} \right. \end{equation}$
なので
$\displaystyle \begin{equation} \frac{\partial a}{\partial z} = \left\{ \begin{matrix} 1 && (z \gt 0) \\ 0 && (z \leqq 0) \end{matrix} \right. \end{equation}$
したがって
$\displaystyle \frac{\partial L}{\partial z} = \frac{\partial L}{\partial a} \cdot \frac{\partial a}{\partial z} = \left\{ \begin{matrix} \frac{\partial L}{\partial a} && (z \gt 0) \\ 0 && (z \leqq 0) \end{matrix} \right. $

1.1.6.5 leaky ReLU 関数 (leaky Rectified Linear Unit)

ReLUでは、training中に一部のneuronが0だけを出力するようになり、実質的に死んでしまう dying ReLU とよばれる 問題が起きることがある。ReLU関数では、入力が負ならば gradient が0なのでneuron が復活する見込みはない。 そこで改良されたのが leaky ReLU 関数である。

$\displaystyle \begin{equation} a = \left\{ \begin{matrix} z && (z \gt 0) && \\ \alpha ~ z && (z \leqq 0) && \quad\quad\quad \alpha \simeq 0.01 \end{matrix} \right. \end{equation}$
なので
$\displaystyle \begin{equation} \frac{\partial a}{\partial z} = \left\{ \begin{matrix} 1 && (z \gt 0) \\ \alpha && (z \leqq 0) \end{matrix} \right. \end{equation}$
したがって
$\displaystyle \frac{\partial L}{\partial z} = \frac{\partial L}{\partial a} \cdot \frac{\partial a}{\partial z} = \left\{ \begin{matrix} \frac{\partial L}{\partial a} && (z \gt 0) \\ \alpha \frac{\partial L}{\partial a} && (z \leqq 0) \end{matrix} \right. $

1.1.6.6 ELU関数 (exponential linear unit)

ELU は ReLU とよく似ているが、「$z=0$の近傍を含めてあらゆる場所で滑らかなので、$z=0$の左右で gradient が跳ね回ることがなく、gradient descent の収束が速い」という特徴を持つ。

$\displaystyle \begin{equation} a = \left\{ \begin{matrix} z && (z \gt 0) && \\ \alpha ~ (e^z - 1) && (z \leqq 0) && \quad\quad\quad \alpha \simeq 1.0 \end{matrix} \right. \end{equation}$
なので
$\displaystyle \begin{equation} \frac{\partial a}{\partial z} = \left\{ \begin{matrix} 1 && (z \gt 0) \\ \alpha ~ e^z&& (z \leqq 0) \end{matrix} \right. \end{equation}$
したがって
$\displaystyle \frac{\partial L}{\partial z} = \frac{\partial L}{\partial a} \cdot \frac{\partial a}{\partial z} = \left\{ \begin{matrix} \frac{\partial L}{\partial a} && (z \gt 0) \\ \alpha ~ e^z ~ \frac{\partial L}{\partial a} && (z \leqq 0) \end{matrix} \right. $

1.2 Training (学習)

1.2.1 誤差 (Loss関数)

Neural Networkに入力 $input_i$ ($i=1,2,\cdots, n$)を与えたとき forward propagation によって$m$個の出力 $output_j$ ($j=1,2,\cdots, m$)が得られたとする。 $output_j$ の正解を $correct_j$ ($j=1,2,=cdots, m$)とすると、誤差を $L_j = output_j - correct_j$ で定義する。

$L_j$ を0に近付けていくことが「training (学習)」である。 Neural Networks 内の多くの neruron には、調整が可能な hyperparameter が存在する。 たとえば上の 「1.1.5.3 乗算と加算の組み合わせ $z = w_1 * x_1 + w_2 * x_2 \cdots w_{n'} + b$」 では $w_1, w_2, \cdots, w_{n'}, b$ がhyperparameterであり、調節が可能である。

$\alpha$ を learning rate として、 $w_i = w_i - \alpha \frac{\partial L}{\partial w_i}$, $b = b - \alpha \frac{\partial L}{\partial b}$, と更新する。

1.2.2 パラメータの更新

training data が $M$ exampleあるとして、

という3種類の方法が存在する。

1.2.3 overfitting, underfitting に対応する

regularization (L1, L2, その他), dropout, weight decay, ...

1.2.4 Optimization

Moment, AdaGrad, RMSprop, Adam

1.3 layer

neuronをまとめてlayerを作成する。


Convolutional Nerual Network


Residual Nerual Network


Recurrent Nerual Network


1.4 Softmax関数 with Loss レイヤ

softmax関数: $\displaystyle y_k = \frac{e^{a_k}}{\displaystyle \sum_{i=1}^n e^{a_i}}$
Loss関数: $\displaystyle L = - \sum_j t_j \log y_j$
ただし $\displaystyle \boldsymbol{t} = \left( \begin{matrix} t_1 \\ t_2 \\ \vdots \\ t_n \\ \end{matrix} \right) $ は one hot vector なので $\displaystyle \sum_j t_j = 1$
$\displaystyle L = -t_1 \log \frac{e^{a_1}}{\sum_i e^{a_i}} - \cdots -t_k \log \frac{e^{a_k}}{\sum_i e^{a_i}} - \cdots -t_n \log \frac{e^{a_n}}{\sum_i e^{a_i}} \\ \quad = \cdots -t_k (\log e^{a_k} - \log \sum_i e^{a_i}) - \cdots \\ \quad = -t_1 a_1 - \cdots -t_k a_k - \cdots - t_n a_n + (t_1 + t2 + \cdots + t_n) \log \sum_i e^{a_i} \\ \quad = -t_1 a_1 - \cdots -t_k a_k - \cdots - t_n a_n + \log \sum_i e^{a_i}) \\ $
$\displaystyle \frac{\partial L}{\partial a_k} = - t_k + \frac{e^{a_k}}{\sum_i e^{a_i}} \\ \quad = -t_k + y_k $
Yoshihisa Nitta

http://nw.tsuda.ac.jp/