はじめに
Neural Network(NN)で使われる誤差逆伝播法の計算をまとめます。
NNの基本構造
いま、NNの中間層
k-1,k,k+1 を考える。
k-1 層内の
j 番目のユニットと
k 層内の
i 番目のユニット間の重みを
\omega_{i,j}^{k} とする。
k-1 層内の全てのユニットから
k 層内の
i 番目のユニットへの入力値
x_{i}^{k} は以下のように書ける(本解説ではバイアス項を無視する)。
\begin{equation}
x_{i}^{k} = \sum_{j}\;\omega_{i,j}^{k}\;h_{j}^{k-1}
\label{first}
\end{equation}
ここで、
h_{j}^{k-1} は
k-1 層内の
j 番目のユニットからの出力値である。
k 層内の
i 番目のユニットからの出力値
h_{i}^{k} は、活性化関数
f を用いて
\begin{equation}
h_{i}^{k} = f(x_{i}^{k})
\end{equation}
と書くことができる。
NNに解かせたい問題が多クラス問題の場合、最上層(
a 層とする)のユニットの数をクラスと同数とする。そして、各ユニットからの出力値を次式で定義する。
\begin{equation}
h_{i}^{a} = \frac{ \exp{ \left(x_{i}^{a}\right) } }{ \sum_{j}\exp{ \left(x_{j}^{a}\right) } } \equiv p_{i}
\end{equation}
p_{i} は正規化された量である。
\begin{equation}
\sum_{i}\;p_{i}=1
\end{equation}
最下層に与えられるデータ
X のクラスのラベルが
i であるなら、最上層からの出力値は
p_{i}=1,p_{j\neq i}=0 となるのが理想である。
目的関数
NNにおける学習の目的は、パラメータ
w_{i,j}^{k} を全て求めることである。その際、次の目的関数を用いる。
\begin{equation}
C = -\sum_{i}\;d_{i}\;\log{p_{i}}
\label{obj}
\end{equation}
最下層に与えられるデータ
X のクラスのラベルが
i なら、
\{d_{i}\} は
d_{i}=1,d_{j\neq i}=0 である。ここで、
0\le p_{i}\le 1 であるから
\log{p_{i}}\le 0 が成り立つ。もし、
p_{i}=1,p_{j\neq i}=0 が成り立つなら、このとき
C は最小値
0 となる。
従って、理想に近い
p_{i} を実現するには、
C を最小化すればよい。
勾配降下法(Gradient Descent Method)
C は重み
w_{i,j}^{k} の関数である。
\begin{equation}
C = C(w_{1,1}^{1},w_{1,2}^{1},\cdots,w_{i,j}^{k},\cdots)
\end{equation}
この全ての重みを求めることが目的である。
勾配降下法の手順は以下の通りである。
- 適当な初期値 \{\omega_{i,j}^{k}\} を設定する。
- C を計算する。C の変化量がしきい値以下なら終了。
- 次式を計算する。
\begin{equation}
\delta w_{i,j}^{k} = -\epsilon \frac{\partial C}{\partial w_{i,j}^{k}}
\end{equation}
ここで、\epsilon は正のパラメータである。
- w_{i,j}^{k} を更新する(w_{i,j}^{k}\leftarrow w_{i,j}^{k}+\delta w_{i,j}^{k})。
- 2へ
これを実行するには、
\begin{equation}
\frac{\partial C}{\partial w_{i,j}^{k}}
\end{equation}
を計算しなければならない。
C は
\{x_{i}^{k}\} の関数である。
\begin{equation}
C = C(x_{1}^{k},x_{2}^{k},\cdots)
\end{equation}
また、
x_{i}^{k} は
\{\omega_{i,j}^{k}\} の関数である。
\begin{equation}
x_{i}^{k} = x_{i}^{k}(w_{i,1}^{k},w_{i,2}^{k},\cdots)
\end{equation}
従って、
\begin{eqnarray}
\frac{\partial C}{\partial \omega_{i,j}^{k}}&=&\frac{\partial C}{\partial x_{i}^{k}}\frac{\partial x_{i}^{k}}{\partial \omega_{i,j}^{k}}\nonumber \\
&=&\frac{\partial C}{\partial x_{i}^{k}}h_{j}^{k-1}
\label{point}
\end{eqnarray}
を得る。ただし、最後の式で式(
\ref{first})を用いた。結局、
\frac{\partial C}{\partial \omega_{i,j}^{k}} を得るには、
\frac{\partial C}{\partial x_{i}^{k}} を求めなければならないことが分かる。
これを計算する手法が誤差逆伝播法である。
誤差逆伝播法
C を
k+1 層への入力値
\{x_{i}^{k+1}\} の関数とみなす。
\begin{equation}
C = C(x_{1}^{k+1},x_{2}^{k+1},\cdots)
\end{equation}
また、
k+1 層への入力値
x_{i}^{k+1} は、
k 層への入力値
\{x_{i}^{k}\} の関数である。
\begin{equation}
x_{i}^{k+1} = x_{i}^{k+1}(x_{1}^{k},x_{2}^{k},\cdots)
\end{equation}
従って、次式が成り立つ。
\begin{equation}
\frac{\partial C}{\partial x_{i}^{k}}=\sum_{j}\;\delta _{j}^{k+1}\frac{\partial x_{j}^{k+1}}{\partial x_{i}^{k}}
\label{aa}
\end{equation}
ここで、
\begin{equation}
\delta_{j}^{k+1} \equiv \frac{\partial C}{\partial x_{j}^{k+1}}
\end{equation}
とした。ところで、
\begin{equation}
x_{j}^{k+1} = \sum_{l}\;\omega_{j,l}^{k+1}\;f(x_{l}^{k})
\end{equation}
であるから、
\begin{equation}
\frac{\partial x_{j}^{k+1}}{\partial x_{i}^{k}}=\omega_{j,i}^{k+1}\;f^{\;\prime}(x_{i}^{k})
\end{equation}
が成り立つ。従って、式(
\ref{aa})は
\begin{equation}
\delta_{i}^{k}=f^{\;\prime}(x_{i}^{k})\;\sum_{j}\;\delta_{j}^{k+1}\;\omega_{j,i}^{k+1}
\label{ite}
\end{equation}
と変形される。ただし、
\begin{equation}
\delta_{i}^{k} \equiv \frac{\partial C}{\partial x_{i}^{k}}
\end{equation}
とした。式(
\ref{ite})から、
\{\delta_{i}^{k+1}\} が決まれば、
\{\delta_{i}^{k}\} が求まることが分る。すなわち、最上層の値
\begin{equation}
\delta_{i}^{a} \equiv \frac{\partial C}{\partial x_{i}^{a}}
\end{equation}
が決まれば、式(
\ref{ite})を順に適用することにより、全ての
\{\delta_{i}^{k}\} を求めることができる。
ここで、最上層の
\delta_{i}^{a} を計算するため、
C を変形する。
\begin{eqnarray}
C &=& -\sum_{l}\;d_{l}\;\log{p_{l}}\nonumber\\
&=& -\sum_{l}\;d_{l}\;\log{h_{l}^{a}} \nonumber\\
&=& -\sum_{l}\;d_{l}\;\log{\frac{ \exp{ \left(x_{l}^{a}\right) } }{ \sum_{j}\exp{ \left(x_{j}^{a}\right) } } } \nonumber\\
&=& -\sum_{l}\;d_{l}\;x_{l}^{a} + \left( \sum_{l}\;d_{l} \right)\;\log{ \left(\sum_{j}\exp{ \left( x_{j}^{a} \right) }\right) } \nonumber\\
&=& -\sum_{l}\;d_{l}\;x_{l}^{a} + \log{ \left(\sum_{j}\exp{ \left( x_{j}^{a} \right) }\right) }
\end{eqnarray}
最後の式で
\begin{equation}
\sum_{l}\;d_{l}=1
\end{equation}
を用いた。従って
\begin{equation}
\frac{\partial C}{\partial x_{i}^{a}}=p_{i}-d_{i}=\delta_{i}^{a}
\end{equation}
を得る。
p_{i} は
\{\omega_{i,j}^{k}\} が決まれば計算できる量であり、
\{d_{i}\} は最初に当たられる量である。この量は、実際の出力(
p_{i})と理想の出力(
d_{i})とのずれ(誤差)を表している。ここまでの議論で、最上層から最下層まで全ての
\{\delta_{i}^{k}\} を計算できることが分かる。そして、式(
\ref{point})を用いれば次式のように
\frac{\partial C}{\partial \omega_{i,j}^{k}} を全て求めることができる。
\begin{equation}
\frac{\partial C}{\partial \omega_{i,j}^{k}}=\delta_{i}^{k}\;h_{j}^{k-1}
\end{equation}
最上層の誤差を最下層へ向かって伝播していく手法なので、誤差逆伝播法と呼ぶ。
3層の場合
いま、3層の場合を具体的に考えてみる。各層において次式が成り立つ。
\begin{eqnarray}
x_{i}^{1}&=&\sum_{j=1}^{D}\;\omega_{i,j}^{1}\;h_{j}^{0},\;\;\;i=1,\cdots,M \\
h_{i}^{1}&=&f(x_{i}^{1}),\;\;\; i=1,\cdots,M \\
x_{i}^{2}&=&\sum_{j=1}^{M}\;\omega_{i,j}^{2}\;h_{j}^{1},\;\;\; i=1,\cdots,K \\
h_{i}^{2}&=&\frac{\exp{x_i^2}}{\sum_{j=1}^{K}\;\exp{x_j^2}}=p_i,\;\;\; i=1,\cdots,K
\end{eqnarray}
入力層(
k=0 )のユニット数を
D、隠れ層(
k=1 )のユニット数を
M、出力層(
k=2 )のユニット数を
K とした。
活性化関数
f として
\begin{equation}
f(x) = \tanh{x}
\end{equation}
を考える。このとき、次式が成り立つ。
\begin{equation}
f^{\prime}(x) = 1-\left(f(x)\right)^2
\end{equation}
最初に
\delta_{i}^{2} を求める。
\begin{equation}
\delta_{i}^{2}=p_{i}-d_{i},\;\;\; i=1,\cdots,K
\end{equation}
この結果を用いて、隠れ層の
\delta_{i}^{1} を計算する。
\begin{equation}
\delta_{i}^{1}=\left(1-f(x_{i}^{1})^2\right)\;\sum_{j=1}^K\;\delta_{j}^{2}\;\omega_{j,i}^{2},\;\;\; i=1,\cdots,M
\end{equation}
ここまでで
\{\delta_{i}^{1}\}と
\{\delta_{i}^{2}\} を求めることができた。これらを用いて
\begin{eqnarray}
\frac{\partial C}{\partial \omega_{i,j}^{1}}=\delta_{i}^{1}\;h_{j}^{0},\;\;\;i=1,\cdots,M,\;\;\;j=1,\cdots,D\\
\frac{\partial C}{\partial \omega_{i,j}^{2}}=\delta_{i}^{2}\;h_{j}^{1},\;\;\;i=1,\cdots,K,\;\;\; j=1,\cdots,M
\end{eqnarray}
を計算することができる。また、入力値
h_j^0 の微小変化に対する出力値
p_k の変化分を表す量
J_{k i}
\begin{equation}
J_{k i} = \frac{\partial p_k}{\partial h_i^0}
\end{equation}
は以下のように計算される。
\begin{eqnarray}
J_{k i}
&=&
\frac{\partial p_k}{\partial h_i^0} \nonumber \\
&=&
\sum\;
\frac{\partial p_k}{\partial x_\eta^2}
\frac{\partial x_\eta^2}{\partial h_\alpha^1}
\frac{\partial h_\alpha^1}{\partial x_\beta^1}
\frac{\partial x_\beta^1}{\partial h_i^0} \nonumber \\
&=&
\sum_{\eta,\alpha,\beta}\;
\frac{\partial p_k}{\partial x_\eta^2}
\omega^2_{\eta,\alpha}
\frac{\partial h_\alpha^1}{\partial x_\beta^1}
\omega^1_{\beta,i} \nonumber \\
&=&
\sum_{\eta,\alpha}\;
\left(\delta_{\eta,k}\;p_k - p_k\;p_\eta\right)
\omega^2_{\eta,\alpha}\;
f^{\prime}(x_\alpha^1)\;
\omega^1_{\alpha,i}
\end{eqnarray}