無限不可能性ドライブ

『ニューラルネットワーク自作入門』に刺激されてExcelVBAでニューラルネットワークを作ってみたものの、やっぱり数学やらなきゃと思い少しずつやってきたのもあって、自分の知識の整理とかそういった感じです。

【数式編】(逆伝播)出力層の重みとバイアスを更新する 1-(1)

f:id:celaeno42:20180928230310p:plain

誤差逆伝播バックプロパゲーション

ニューラルネットワークが正しい出力を得るようになるには、重みやバイアスなどのパラメータを調整する必要があります。
誤差逆伝播バックプロパゲーション)という手法を使うことで、パラメータを調整することができます。
具体的には損失関数を調整したいパラメータで偏微分することで、調整値を求めていきます。
誤差逆伝播の詳しい説明については他のWebサイトや書籍を参照してください。)

重みの更新式

まずは出力層の1つめのユニット ユニットo11 の重み  w_{11}^4 を調整するための更新式を見ていきましょう。


 \displaystyle w_{11}^4 ← w_{11}^4 - \eta \nabla E

 \displaystyle \nabla E = \frac{\partial E}{\partial w_{11}^4}

(※\eta は学習率)


更新後の重みは、更新前の重みから損失関数の勾配(  \nabla E )に学習率を掛けた値を引くことで求めることができます。
(式の意味をわかりやすくするために ← で表現しています。)
学習率はある種の定数(ハイパーパラメータ)と考えてよいので、\nabla E を求めることができれば、重みを更新することができます。

損失関数の偏微分

 \nabla E は損失関数  E w_{11}^4偏微分することで求めることができます。
これは、連鎖率(チェインルール)によって、次の式で求めます。


 \displaystyle \nabla E =  \frac{\partial E}{\partial w_{11}^4} = \frac{\partial E}{\partial u_1^4} \frac{\partial u_1^4}{\partial w_{11}^4}


まずは \displaystyle \frac{\partial E}{\partial u_1^4} について見ていきましょう。

損失関数の式を再掲しておきます。


 \displaystyle E =  -\sum_{k=1}^3 t_k \log z_k^4 = -(t_1 \log z_1^4 + t_2 \log z_2^4 + t_3 \log z_3^4 )


この式を  u_1^4偏微分します。


 \displaystyle \frac{\partial E}{\partial u_1^4} = - \left( \frac{\partial}{\partial u_1^4} t_1 \log z_1^4 + \frac{\partial}{\partial u_1^4} t_2 \log z_2^4 + \frac{\partial}{\partial u_1^4} t_3 \log z_3^4 \right)


左から第1項め、第2項め、第3項めとしてひとつずつ見ていきます。

・第1項めについて

まずは  \displaystyle \frac{\partial}{\partial u_1^4} t_1 \log z_1^4 を見ていきます。


 \displaystyle z_1^4 = \frac{\exp(u_1^4)}{\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4)}


なので、


 \displaystyle \log z_1^4 = \log \left( \frac{\exp(u_1^4)}{\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4)} \right)


公式  \displaystyle \log \frac{x}{y} = \log x - \log y を利用して、


 \displaystyle = \log(\exp(u_1^4)) - \log(\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4))


よって、


 \displaystyle \begin{align}
\frac{\partial}{\partial u_1^4} t_1 \log z_1^4 &=  t_1 \times \frac{\partial}{\partial u_1^4} \log z_1^4 \\
\\
&= t_1 \times \left( \frac{\partial}{\partial u_1^4} \log(\exp(u_1^4)) - \frac{\partial}{\partial u_1^4} \log(\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4)) \right)
\end{align}


公式  \displaystyle (\log f(x))' = \frac{f'(x)}{f(x)} を利用すると


 \displaystyle \begin{align}
\frac{\partial}{\partial u_1^4} \log(\exp(u_1^4)) &= \frac{\frac{\partial}{\partial u_1^4} \exp(u_1^4)}{\exp(u_1^4)} \\
\\
&= \frac{\exp(u_1^4)}{\exp(u_1^4)} \\
\\
&= 1 \\
\\
\\
\frac{\partial}{\partial u_1^4} \log(\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4)) &= \frac{\frac{\partial}{\partial u_1^4}(\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4))}{\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4)} \\
\\
&= \frac{\exp(u_1^4)}{\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4)} \\
\\
&= z_1^4
\end{align}


以上より、


 \displaystyle \begin{align}
\frac{\partial}{\partial u_1^4} t_1 \log z_1^4 &=  t_1 \times \frac{\partial}{\partial u_1^4} \log z_1^4 \\
\\
&= t_1 \times \left( \frac{\partial}{\partial u_1^4} \log(\exp(u_1^4)) - \frac{\partial}{\partial u_1^4} \log(\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4)) \right) \\
\\
&= t_1 \times ( 1 - z_1^4 )
\end{align}


・第2項めについて

次に  \displaystyle \frac{\partial}{\partial u_1^4} t_2 \log z_2^4 を見ていきます。

第1項めと同様に、


 \displaystyle z_2^4 = \frac{\exp(u_2^4)}{\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4)}


なので、


 \displaystyle \begin{align}
\log z_2^4 &= \log \left( \frac{\exp(u_2^4)}{\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4)} \right) \\
\\
&= \log(\exp(u_2^4)) - \log(\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4))
\end{align}


よって、


 \displaystyle \begin{align}
\frac{\partial}{\partial u_1^4} t_2 \log z_2^4 &=  t_2 \times \frac{\partial}{\partial u_1^4} \log z_2^4 \\
\\
&= t_2 \times \left( \frac{\partial}{\partial u_1^4} \log(\exp(u_2^4)) - \frac{\partial}{\partial u_1^4} \log(\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4)) \right)
\end{align}


公式  \displaystyle (\log f(x))' = \frac{f'(x)}{f(x)} を利用して


 \displaystyle \begin{align}
\frac{\partial}{\partial u_1^4} \log(\exp(u_2^4)) &= \frac{\frac{\partial}{\partial u_1^4} \exp(u_2^4)}{\exp(u_2^4)} \\
\\
&= \frac{0}{\exp(u_2^4)} \\
\\
&= 0
\end{align}

 \displaystyle \frac{\partial}{\partial u_1^4} \log(\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4)) は先ほど求めたので、


 \displaystyle \frac{\partial}{\partial u_1^4} \log(\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4)) = z_1^4


以上より、


 \displaystyle \begin{align}
\frac{\partial}{\partial u_1^4} t_2 \log z_2^4 &=  t_2 \times \frac{\partial}{\partial u_1^4} \log z_2^4 \\
\\
&= t_2 \times \left( \frac{\partial}{\partial u_1^4} \log(\exp(u_2^4)) - \frac{\partial}{\partial u_1^4} \log(\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4)) \right) \\
\\
&= t_2 \times ( 0 - z_1^4 ) \\
\\
&= t_2 \times -z_1^4
\end{align}


・第3項めについて

最後に  \displaystyle \frac{\partial}{\partial u_1^4} t_3 \log z_3^4 を見ていきます。

内容は第2項めとほとんど同じです。


 \displaystyle z_3^4 = \frac{\exp(u_3^4)}{\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4)}


なので、


 \displaystyle \begin{align}
\log z_3^4 &= \log \left( \frac{\exp(u_3^4)}{\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4)} \right) \\
\\
&= \log(\exp(u_3^4)) - \log(\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4))
\end{align}


よって、


 \displaystyle \begin{align}
\frac{\partial}{\partial u_1^4} t_3 \log z_3^4 &=  t_3 \times \frac{\partial}{\partial u_1^4} \log z_3^4 \\
\\
&= t_3 \times \left( \frac{\partial}{\partial u_1^4} \log(\exp(u_3^4)) - \frac{\partial}{\partial u_1^4} \log(\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4)) \right)
\end{align}


公式  \displaystyle (\log f(x))' = \frac{f'(x)}{f(x)} を利用して


 \displaystyle \begin{align}
\frac{\partial}{\partial u_1^4} \log(\exp(u_3^4)) &= \frac{\frac{\partial}{\partial u_1^4} \exp(u_3^4)}{\exp(u_3^4)} \\
\\
&= \frac{0}{\exp(u_3^4)} \\
\\
&= 0
\end{align}


 \displaystyle \frac{\partial}{\partial u_1^4} \log(\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4)) = z_1^4


以上より、


 \displaystyle \begin{align}
\frac{\partial}{\partial u_1^4} t_3 \log z_3^4 &=  t_3 \times \frac{\partial}{\partial u_1^4} \log z_3^4 \\
\\
&= t_3 \times \left( \frac{\partial}{\partial u_1^4} \log(\exp(u_3^4)) - \frac{\partial}{\partial u_1^4} \log(\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4)) \right) \\
\\
&= t_3 \times ( 0 - z_1^4 ) \\
\\
&= t_3 \times -z_1^4
\end{align}


・まとめると…

 \displaystyle \frac{\partial E}{\partial u_1^4} = - \left( \frac{\partial}{\partial u_1^4} t_1 \log z_1^4 + \frac{\partial}{\partial u_1^4} t_2 \log z_2^4 + \frac{\partial}{\partial u_1^4} t_3 \log z_3^4 \right)


を求めようとしていて、


 \displaystyle \begin{align}
\frac{\partial}{\partial u_1^4} t_1 \log z_1^4 &= t_1 \times (1 - z_1^4) \\
\\
\frac{\partial}{\partial u_1^4} t_2 \log z_2^4 &= t_2 \times -z_1^4 \\
\\
\frac{\partial}{\partial u_1^4} t_3 \log z_2^4 &= t_3 \times -z_1^4
\end{align}


とわかったので、


 \displaystyle \begin{align}
\frac{\partial E}{\partial u_1^4} &= - \left( \frac{\partial}{\partial u_1^4} t_1 \log z_1^4 + \frac{\partial}{\partial u_1^4} t_2 \log z_2^4 + \frac{\partial}{\partial u_1^4} t_3 \log z_3^4 \right) \\
\\
&= - \left( (t_1 \times (1 - z_1^4)) + (t_2 \times -z_1^4) + (t_3 \times -z_1^4) \right) \\
\\
&= - (t_1 - t_1 \cdot z_1^4 - t_2 \cdot z_1^4 - t_3 \cdot z_1^4) \\
\\
&= - (t_1 - z_1^4 (t_1 + t_2 + t_3) )   ※ \\
\\
&= - (t_1 - z_1^4) \\
\\
&= z_1^4 - t_1  (1)
\end{align}

(※ 教師データは one-hot 表現としているため、 t_1 + t_2 + t_3 = 1

uの偏微分

では残りの \displaystyle \frac{\partial u_1^4}{\partial w_{11}^4} について見ていきましょう。

【数式編】(順伝播)出力層のユニットの出力を求める - 無限不可能性ドライブ で求めたように


\displaystyle u_1^4 = w_{11}^4 z_1^3 + w_{12}^4 z_2^3 + w_{13}^4 z_3^3 + w_{14}^4 z_4^3 + b_1^4


なので、


\displaystyle \begin{align}
 \frac{\partial u_1^4}{\partial w_{11}^4} &= \frac{\partial}{\partial w_{11}^4} (w_{11}^4 z_1^3 + w_{12}^4 z_2^3 + w_{13}^4 z_3^3 + w_{14}^4 z_4^3 + b_1^4) \\
\\
&= z_1^3  (2)
\end{align}


まとめ: w_{11}^4 の更新式

以上((1)、(2))から、 w_{11}^4 を調整するための具体的な更新式は以下のようになります。(※  \eta は学習率)


 \displaystyle w_{11}^4 ← w_{11}^4 - \eta \nabla E

 \displaystyle \begin{align}
 \nabla E =  \frac{\partial E}{\partial w_{11}^4} &= \frac{\partial E}{\partial u_1^4} \frac{\partial u_1^4}{\partial w_{11}^4} \\
\\
&= (z_1^4 - t_1) \times z_1^3
\end{align}


「(そのユニットの出力 - 該当する教師データ) × その重みに関係した入力値」になっていることがわかります。

【数式編】(損失関数)クロスエントロピー誤差

f:id:celaeno42:20180927233132p:plain

損失関数

前回の最終出力で  z_1^4, z_2^4, z_3^4 がわかりました。
これらの値がそれぞれ、教師データの  t_1, t_2, t_3 と同じ(か、ひじょうに近い値)であれば、期待した出力といえます。
しかし、重みやバイアスの初期値はいいかげん(ランダム)な値になっているため、初めから期待した出力になるわけではありません。
そこで、損失関数を使い、現時点での出力が期待する出力とどれだけ乖離しているか(誤差)を調べ、出力が期待する値になるように、重みやバイアスを調整していきます。

今回、出力層の活性化関数には  Softmax を適用しているので、損失関数にはクロスエントロピー誤差(交差エントロピー誤差)を採用します。

クロスエントロピー誤差

このニューラルネットワークでのクロスエントロピー誤差( E)は以下の式で表されます。


 \displaystyle E = -\sum_{k=1}^3 t_k \log z_k^4



\sum を展開するとこのようになります。



\displaystyle E =  -\sum_{k=1}^3 t_k \log z_k^4 = -(t_1 \log z_1^4 + t_2 \log z_2^4 + t_3 \log z_3^4 )


教師データ

今回、教師データは one-hot 表現としています。
これは、正解のラベルが 1 でそれ以外は 0 となっているデータです。
例えば、 t_2 が正解ラベルの場合、次のようになります。


 \displaystyle
\begin{bmatrix}
t_1 \\
t_2 \\
t_3
\end{bmatrix}

=

\begin{bmatrix}
0 \\
1 \\
0
\end{bmatrix}


誤差の計算

具体的に誤差の計算をしてみましょう。
いま、期待する出力として、以下の出力を得たいとします。


 \displaystyle
\begin{bmatrix}
t_1 \\
t_2 \\
t_3
\end{bmatrix}

=

\begin{bmatrix}
もも \\
りんご \\
ぶどう
\end{bmatrix}

=

\begin{bmatrix}
0 \\
1 \\
0
\end{bmatrix}


つまり、りんごの出力(このニューラルネットワークでは  z_2^4 )が最大になるようにしたいとします。
ところが、ニューラルネットワークの最終出力が次のような場合、損失関数の値はどのようになるでしょうか。
(出力層ではソフトマックス関数を適用しているので、出力の総和は 1 になっています。)


 \displaystyle
\begin{bmatrix}
もも \\
りんご \\
ぶどう
\end{bmatrix}

=

\begin{bmatrix}
z_1^4 \\
z_2^4 \\
z_3^4
\end{bmatrix}

=

\begin{bmatrix}
0.5 \\
0.2 \\
0.3
\end{bmatrix}


 \displaystyle \begin{align} E &= -( t_1 \log z_1^4 + t_2 \log z_2^4 + t_3 \log z_3^4 ) \\
&= - (0 \times \log 0.5 + 1 \times \log 0.2 + 0 \times \log 0.3 ) \\
&= - (0 \times (-0.30) + 1 \times (-0.70) + 0 \times (-0.52)) \\
&= - (-0.70) \\
&= 0.70 \end{align}


では、最終出力が次のようだった場合はどうなるでしょうか。
今回は、りんごの出力が最大になっています。


 \displaystyle
\begin{bmatrix}
もも \\
りんご \\
ぶどう
\end{bmatrix}

=

\begin{bmatrix}
z_1^4 \\
z_2^4 \\
z_3^4
\end{bmatrix}

=

\begin{bmatrix}
0.3 \\
0.5 \\
0.2
\end{bmatrix}


 \displaystyle \begin{align} E &= -( t_1 \log z_1^4 + t_2 \log z_2^4 + t_3 \log z_3^4 ) \\
&= - (0 \times \log 0.3 + 1 \times \log 0.5 + 0 \times \log 0.2 ) \\
&= - (0 \times (-0.52) + 1 \times (-0.30) + 0 \times (-0.70)) \\
&= - (-0.30) \\
&= 0.30 \end{align}


先ほどと比べて損失関数の値が小さくなっています。
さらに次のような場合はどうでしょうか。
今度はさらにりんごの出力値が大きくなっています。


 \displaystyle
\begin{bmatrix}
もも \\
りんご \\
ぶどう
\end{bmatrix}

=

\begin{bmatrix}
z_1^4 \\
z_2^4 \\
z_3^4
\end{bmatrix}

=

\begin{bmatrix}
0.05 \\
0.90 \\
0.05
\end{bmatrix}


 \displaystyle \begin{align} E &= -( t_1 \log z_1^4 + t_2 \log z_2^4 + t_3 \log z_3^4 ) \\
&= - (0 \times \log 0.05 + 1 \times \log 0.90 + 0 \times \log 0.05 ) \\
&= - (0 \times (-1.30) + 1 \times (-0.05) + 0 \times (-1.30)) \\
&= - (-0.05) \\
&= 0.05 \end{align}


先ほどと比べてさらに損失関数の値が小さくなっています。

まとめ

このように、正しい(期待する)出力に近ければ近いほど損失関数の値は小さくなっていきます。なので、損失関数の値が小さくなるような出力となるように、重みやバイアスなどのパラメータを調整すれば、正しい判断のできるニューラルネットワークになります。

また、ソフトマックス関数が出力を確率として求めていることを考えると、
 2つめの例では 50% (0.5) の確率でりんごだと思っていて、
 3つめの例では 90% (0.9) の確率でりんごだと思っている
と考えることができます。
損失関数の値は、ニューラルネットワークがどの程度(自信をもって)正しく判断しているかの目安になります。


f:id:celaeno42:20181212233850p:plain

【数式編】(順伝播)出力層のユニットの出力を求める

f:id:celaeno42:20180924233724p:plain

出力値の求め方

出力層のユニットの出力値の求め方は、隠れ層のユニットの出力値の求め方とほぼ同じですが、活性化関数を  Softmax にしているため、その部分が異なります。
例として ユニットo11 の出力を求めてみます。

 z_1^4 を求める

ユニットo11 の出力値  z_1^4 を求めるには、その前に  u_1^4 を求める必要があります。


\displaystyle u_1^4 = w_{11}^4 z_1^3 + w_{12}^4 z_2^3 + w_{13}^4 z_3^3 + w_{14}^4 z_4^3 + b_1^4


この  u_1^4 Softmax を適用すると  z_1^4 が求まります。


\displaystyle z_1^4 = Softmax(u_1^4)


Softmax(ソフトマックス)関数

 Softmax の具体的な式は次のようになります。


 \displaystyle z_1^4 = Softmax(u_1^4) = \frac{\exp(u_1^4)}{\sum_{k=1}^3 \exp(u_k^4)} = \frac{\exp(u_1^4)}{\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4)}


 ReLU に比べて複雑な感じの式ですが、やっていることはそれほど難しいことではありません。

f:id:celaeno42:20180926222124p:plain

問題:
ももが3個、りんごが5個、ぶどうが2個あります。ももの割合はどのくらいですか?

これは次の式で計算できますね。


\displaystyle ももの割合 = \frac{ももの個数}{ももの個数 + りんごの個数 + ぶどうの個数} = \frac{3}{3 + 5 + 2} = \frac{3}{10}


先ほどの  Softmax の式と比べると同じような構成になっていることがわかると思います。


 \displaystyle z_1^4 = \frac{\exp(u_1^4)}{\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4)}


さて、これは次のように考えることもできます。

f:id:celaeno42:20180926222136p:plain

問題:
ももが3個、りんごが5個、ぶどうが2個入っている袋があります。この袋からくだものを1つ取り出すとして、ももを取り出す確率はどのくらいですか?

10個のくだものから3個のももを取り出すので、答えは先ほど同様  \displaystyle \frac{3}{10} ですね。

つまり、ソフトマックス関数では、その出力の確率がどのくらいかを求めているといってもいいでしょう。
そして、確率の総和は 1 になるので、ソフトマックス関数を適用した出力層のすべての出力の和も 1 になります。

具体的には


 \displaystyle z_1^4 + z_2^4 + z_3^4 = 1


となります。

ももを取り出す確率 =  \displaystyle \frac{3}{10}、りんごを取り出す確率 =  \displaystyle \frac{5}{10}、ぶどうを取り出す確率 =  \displaystyle \frac{2}{10} で、

全部足すと


 \displaystyle \frac{3}{10} + \frac{5}{10} + \frac{2}{10} = 1


となることと同じです。

出力を求める式

他のユニットの式もあわせてまとめておきましょう。

ユニットo11

\displaystyle u_1^4 = w_{11}^4 z_1^3 + w_{12}^4 z_2^3 + w_{13}^4 z_3^3 + w_{14}^4 z_4^3 + b_1^4


\displaystyle z_1^4 = Softmax(u_1^4) \left( = \frac{\exp(u_1^4)}{\sum_{k=1}^3 \exp(u_k^4)} = \frac{\exp(u_1^4)}{\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4)} \right)


ユニットo12

\displaystyle u_2^4 = w_{21}^4 z_1^3 + w_{22}^4 z_2^3 + w_{23}^4 z_3^3 + w_{24}^4 z_4^3 + b_2^4


\displaystyle z_2^4 = Softmax(u_2^4) \left( = \frac{\exp(u_2^4)}{\sum_{k=1}^3 \exp(u_k^4)} = \frac{\exp(u_2^4)}{\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4)} \right)


ユニットo13

\displaystyle u_3^4 = w_{31}^4 z_1^3 + w_{32}^4 z_2^3 + w_{33}^4 z_3^3 + w_{34}^4 z_4^3 + b_3^4


\displaystyle z_3^4 = Softmax(u_3^4) \left( = \frac{\exp(u_3^4)}{\sum_{k=1}^3 \exp(u_k^4)} = \frac{\exp(u_3^4)}{\exp(u_1^4) + \exp(u_2^4) + \exp(u_3^4)} \right)




f:id:celaeno42:20180926231750p:plain


f:id:celaeno42:20181212233850p:plain

【数式編】(順伝播)隠れ層2層めのユニットの出力を求める

f:id:celaeno42:20180924000931p:plain

出力値の求め方

隠れ層2層めのユニットの出力値の求め方は、1層めのユニットとほぼ同じです。
ただし、入力値は1層めの該当するユニットの出力値( z_1^2, z_2^2, z_3^2)となります。
例として ユニットh21 の出力を求めてみます。

 z_1^3 を求める

ユニットh21 の出力値  z_1^3 を求めるには、その前に  u_1^3 を求める必要があります。


\displaystyle u_1^3 = w_{11}^3 z_1^2 + w_{12}^3 z_2^2 + w_{13}^3 z_3^2 + b_1^3


これに  ReLU を適用して  z_1^3 を求めます。


\displaystyle z_1^3 = ReLU(u_1^3)


出力を求める式

他のユニットも同様です。

ユニットh21

\displaystyle u_1^3 = w_{11}^3 z_1^2 + w_{12}^3 z_2^2 + w_{13}^3 z_3^2 + b_1^3

\displaystyle z_1^3 = ReLU(u_1^3)


ユニットh22

\displaystyle u_2^3 = w_{21}^3 z_1^2 + w_{22}^3 z_2^2 + w_{23}^3 z_3^2 + b_2^3

\displaystyle z_2^3 = ReLU(u_2^3)


ユニットh23

\displaystyle u_3^3 = w_{31}^3 z_1^2 + w_{32}^3 z_2^2 + w_{33}^3 z_3^2 + b_3^3

\displaystyle z_3^3 = ReLU(u_3^3)


ユニットh24

\displaystyle u_4^3 = w_{41}^3 z_1^2 + w_{42}^3 z_2^2 + w_{43}^3 z_3^2 + b_4^3

\displaystyle z_4^3 = ReLU(u_4^3)




f:id:celaeno42:20180924233724p:plain

f:id:celaeno42:20181212233850p:plain

【数式編】(順伝播)隠れ層1層めのユニットの出力を求める

f:id:celaeno42:20180922233518p:plain

出力値の求め方

順伝播でのユニットの出力値は、そのユニットへの入力に対し、それぞれ対応する重みを掛けて足しあげたものにバイアス値を加え、その値に活性化関数を適用することで求めることができます。
図の ユニットh11 を例にとると、入力層の各ユニットからの出力に、それぞれに対応する重みを掛けて足し合わせたものにバイアス値を加えて  u_1^2 を求め、 u_1^2 に活性化関数の  ReLU を適用すると、 z_1^2 を求めることができます。

 z_1^2 を求める

ユニットh11 の出力値  z_1^2 を求めるには、その前に  u_1^2 を求める必要があります。まずは  u_1^2 を求めていきましょう。
各入力値にそれぞれに対応する重みを掛けて足し合わせたものにバイアス値を加えるので、次のような式になります。


\displaystyle u_1^2 = w_{11}^2 x_1 + w_{12}^2 x_2 + w_{13}^2 x_3 + w_{14}^2 x_4 + b_1^2


ちなみに、バイアス値には入力として常に 1 を掛けていて、実際には  b_1^2 \times 1 となっています。
入力として常に 1 を掛けるのは、行列計算の際の取り扱いが便利だからという理由によるものです。

この  u_1^2 ReLU を適用すると  z_1^2 が求まります。

ReLU関数

引数を  x としたときの  ReLU


\displaystyle
ReLU(x) = max(x, 0) =
\left \{ \begin{array}{ll}
 x & (x \geq 0) \\
 0 & (x \lt 0)
 \end{array} \right.


で表され、「引数が0以上のときはその値(引数の値をそのまま)、そうでないときには0を戻す」関数です。
グラフにするとこのような感じになります。

f:id:celaeno42:20180923235613p:plain:w400


今回は  ReLU のまま表現することにします。


\displaystyle z_1^2 = ReLU(u_1^2)


これで ユニットh11 の出力が求まりました。

出力を求める式

隠れ層1層めの他のユニットについても、重みとバイアスが異なるだけで基本的な計算式は一緒です。

ユニットh11

\displaystyle u_1^2 = w_{11}^2 x_1 + w_{12}^2 x_2 + w_{13}^2 x_3 + w_{14}^2 x_4 + b_1^2

\displaystyle z_1^2 = ReLU(u_1^2)

ユニットh12

\displaystyle u_2^2 = w_{21}^2 x_1 + w_{22}^2 x_2 + w_{23}^2 x_3 + w_{24}^2 x_4 + b_2^2

\displaystyle z_2^2 = ReLU(u_2^2)

ユニットh13

\displaystyle u_3^2 = w_{31}^2 x_1 + w_{32}^2 x_2 + w_{33}^2 x_3 + w_{34}^2 x_4 + b_3^2

\displaystyle z_3^2 = ReLU(u_3^2)




f:id:celaeno42:20180924000931p:plain

f:id:celaeno42:20181212233850p:plain

今回扱うニューラルネットワーク

何をやるつもりか

何をやらないつもりか

  • 汎用化の追求
  • 精度の追求

今回扱うニューラルネットワーク


こんな感じ。
f:id:celaeno42:20180922233518p:plain

f:id:celaeno42:20181212233850p:plain

はじめに

このブログの目的めいたもの

ニューラルネットワークの順伝播、逆伝播についてはじめは数式を中心に、その後でExcelVBAでの実装を目標に進めていきたいと思っています。
ただし、ニューラルネットワークの基本的な内容についてはあちこちで目にされていると思うので、詳しくは触れない方向で…

一応自己紹介めいたもの

なんだかんだでよくいじっている言語は ExcelVBA な人です。
ついおととしくらいまではAIとか機械学習とかは少しは興味がありましたが難しそうだしそれほど首を突っ込んでやろうとは思っていませんでした。Androidアプリを作るためにJavaをやってたのですが、その反動(?)でなにかスクリプト言語がやりたい!と悶々と思っていて、まぁ、いろいろ見ていったところ Python がよさげじゃない?と思って Python をやり始めたら、使っていた書籍に機械学習のサンプルがあったりしてよくわからないままいじったりしているうちにだんだんと興味がわいてきて、そんなとき『ニューラルネットワーク自作入門』を読んで、「これVBAで実装できるんじゃない?」と思って仕組みをよく理解しないまま実装してとりあえずちゃんと動いたのですが、やっぱり仕組みをちゃんと理解したいと思ってそれから数学をやり始めたり、やっぱり統計学をやらなきゃと思って統計学の勉強を始めてみたりして、いったいどこに向かっているのかは自分でもよくわかりませんが、とにかくニューラルネットワークの仕組みをスッキリと理解したい、ちゃんと人に説明できるようになりたい(説明する予定はありませんが…)と思ってきわめてゆっくりですが歩みを進めている、そんな感じです。


f:id:celaeno42:20181212233850p:plain