最小のニューラルネットワークからバックプロパゲーションを理解する


はじめに

CourseraでDeepLearningSpecializationを始めたのでアウトプットがてらに覚えておきたいことをメモしていきたいと思います。今回はシグモイド関数を使ったニューロンからバックプロパゲーションを書きます。MachineLearningの時よりも丁寧に解説されていました。

シグモイド関数について

ロジスティック関数とは、特定の実数を受け取り0から1の値を返す関数です。以下のように定義されます。
$$g(z) = \frac{1}{1 + e^{-z}}$$
グラフは以下になります。グリッド線を表示させるのを忘れていましたが、$z=0$の地点で0.5を示すことがわかります。

フォワードプロパゲーション

入力値にサンプルデータである$x_1$、$x_2$とそれらの重みである$w_1$、$w_2$、さらにバイアス項の$b$を受け取って予測値$a$と実測値$y$とのコストを求めます。計算の工程は以下のようになります。

また、それぞれの丸が表す式は以下のようになります。左から右に計算を進めていくためフォワードプロパゲーションと呼びます。
- $z = w_1x_1 + w_2x_2 + b$
- $a = g(z) = \frac{1}{1 + e^{-z}}$
- $L(a, y) = -(ylog(a) + (1-y)log(1-a))$

コスト関数の最小化

予測値$a$と実測値$y$の誤差を最小とするために関数の傾きを利用してコスト関数の最小化を行います。この辺はこちらに書きました。バックプロパゲーションで行っているのもこれと同じことです。傾きを出すまでの工程がやや長いため複雑になっています。

バックプロパゲーション

傾きを出すために微分を使います。
$L(a, y)$は合成関数であるため、$w_1$で微分するには右側から徐々に変化量を見ていく必要があります。これを式で表すと以下のようになります。
$$\frac{\partial L(a, y)}{\partial w_1} = \frac{\partial L(a, y)}{\partial a}\frac{\partial a}{\partial z}\frac{\partial z}{\partial w_1}$$

ここでは教師データは一つとしてバックプロパゲーションをすすめていきます。

ステップ①

対数関数の微分公式は
$$\frac{d}{dx}log(x) = \frac{1}{x}$$
なので

\begin{eqnarray}
L(a, y) &=& -(ylog(a) + (1-y)log(1-a)) \\
\frac{\partial L(a, y)}{\partial a} &=& -\frac{y}{a} + \frac{1-y}{1-a} \\
\end{eqnarray}

となります。
つまり$a$が、無限小分ずれるとL(a, y)は$-\frac{y}{a} + \frac{1-y}{1-a}$だけずれることになります。

ステップ②

逆数の微分公式は
$$ \frac{\partial}{\partial x}\frac{1}{f} = \frac{-f'}{f^2} $$
なので、

\begin{eqnarray}
a &=& \frac{1}{1 + e^{-z}} = g(z) \\
\frac{\partial a}{\partial z} &=& \frac{-(1+e^{-z})'}{(1+e^{-z})^2} \\
&=& \frac{e^{-z}}{(1+e^{-z})^2} \\
&=& \frac{1}{1+e^{-z}}\frac{e^{-z}}{1+e^{-z}} \\
&=&  \frac{1}{1+e^{-z}}(\frac{1+e^{-z}}{1+e^{-z}} - \frac{1}{1+e^{-z}}) \\
&=& a(1-a)
\end{eqnarray}

となり、

\begin{eqnarray}
\frac{\partial L(a, y)}{\partial a}\frac{\partial a}{\partial z} &=& (-\frac{y}{a} + \frac{1-y}{1-a})(a(1-a)) \\
&=& a-y
\end{eqnarray}

となります。

ステップ③

$$z = w_1x_1 + w_2x_2 + b $$
$$\frac{\partial}{\partial w_1}z = x_1$$
なので

\begin{eqnarray}
\frac{\partial L(a, y)}{\partial a}\frac{\partial a}{\partial z}\frac{\partial z}{\partial w_1} = (a-y)x_1
\end{eqnarray}

となります。
同様の方法で以下も求められます。

\begin{eqnarray}
\frac{\partial L(a, y)}{\partial a}\frac{\partial a}{\partial z}\frac{\partial z}{\partial w_2} = (a-y)x_2
\end{eqnarray}
\begin{eqnarray}
\frac{\partial L(a, y)}{\partial a}\frac{\partial a}{\partial z}\frac{\partial z}{\partial b} = a-y
\end{eqnarray}

値が求められたら求めた値を使ってパラメータ$w_1$、$w_2$を更新していけばOKです。

おまけ

サンプル数が増えた場合、コスト関数$J$は以下のようになります。
$$ J(w, b) = \frac{1}{m}\sum_{i=1}^{m}L(a^{(i)}, y^{(i)})$$
また、$J$を$w_1$で微分した値は以下で表せます。
$$\frac{\partial}{\partial w_1}J(w, b) = \frac{1}{m}\sum^m_{i=1}\frac{\partial}{\partial w_1}L(a^{(i)}, y^{(i)})$$