はじめに
この記事で,書かずに終わってしまったBackpropagationについてメモします.
計算方法や実装は比較的容易なのに,理解するのにそこそこ時間がかかったので,整理して自分なりの備忘用にしてあります.
どこで使うの?
人工ニューラルネットワーク(ANN: Artificial Neural Network)や深層ニューラルネットワーク(DNN: Deep Neural Network)の学習時に生じた誤差をネットワーク内に反映させる時に用いる手法が,Backpropagationである.
Backpropagationは,日本語では誤差逆伝播法と言うらしい.
計算方法
更新処理では,以下のコスト関数$J$をパラメータ$\Theta$で偏微分した値が必要になる.
\frac{\partial}{\partial \Theta_{ij}^{(l)}}J(\Theta)
これは,パラメータ$\Theta_{ij}^{(l)}$すべてにおいて誤差を求めるというもの.一度にすべてを求めるのは現実的ではなく,それよりも効率の良い求め方がある.それが,Backpropagation Algorithmである.
以下のような4層ANNを例にBackpropagationの計算をしてみる.
まず,入力値を$x$とするとForward Propagationの計算は以下のようになる.
\begin{align}
a^{(1)} &= x \\
\\
z^{(2)} &= \Theta^{(1)}a^{(1)} \\
a^{(2)} &= g(z^{(2)}) \\
a^{(2)} &:= \left(\begin{matrix}
1 \\
a_1^{(2)}\\
\vdots\\
a_{s_2}^{(2)}
\end{matrix}\right)\\
\\
z^{(3)} &= \Theta^{(2)}a^{(2)} \\
a^{(3)} &= g(z^{(3)}) \\
a^{(3)} &:= \left(\begin{matrix}
1 \\
a_1^{(3)}\\
\vdots\\
a_{s_3}^{(3)}
\end{matrix}\right)\\
\\
z^{(4)} &= \Theta^{(3)}a^{(3)} \\
a^{(4)} &= g(z^{(4)}) = h_\Theta(x)
\end{align}
各層$l$にあるノード$j$の誤差を$\delta_{j}^{(l)}$とする.
そうして,各ノードの誤差$\delta_{j}^{(l)}$は以下のように計算する.
\begin{align}
\delta^{(4)} &= a^{(4)} - y \\
\\
\delta^{(3)} &= (\Theta^{(3)})^T \delta^{(4)} \circ g^\prime(z^{(3)}) \\
\\
\delta^{(2)} &= (\Theta^{(2)})^T \delta^{(3)} \circ g^\prime(z^{(2)}) \\
\end{align}
$\delta^{(1)}$がないのは,入力値に誤差というものがないためである.
$g^\prime(\cdot)$は,活性化関数の導関数になる.Sigmoid関数であれば,$x(1-x)$となる.また,$\circ$はアダマール積であり,行列の要素同士の積算を表している.
各層の$\delta^{(l)}$を求めることができたら,更新値を次のようにして計算する.
\begin{align}
\triangle_{ij}^{(l)} &= \sum_{i=1}^m a_j^{(l)}\delta_i^{(l+1)} \\
\frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta) &= \frac{1}{m}\triangle_{ij}^{(l)} + \lambda\Theta_{ij}^{(l)} \\
\end{align}
まとめ
Backpropagationは簡単な計算しかしてなく,Forward propagationと似た実装である.
式が分からなくなったら,変数の次元数を確認していけば良い.