【誤差逆伝搬】多層パーセプトロンのまとめ(2)

さて、昨日の続きです。今度は隠れ層を一層追加して下の図のような構造で考えます。

これが通常の3層構造のパーセプトロンにおいて、各層のニューロン数が2個の最も単純な形。さて、今度は出力に至るまでの順方向の計算は以下のようになります。まず、入力$x_k$($k=1,2,\cdots ,K$)に対して、中間層の出力$z_i$($i=1,2,\cdots ,I$)は、
\[
s_i = \sum_{k=1}^{K} v_{ki}x_k \\
z_i = f(s_i)
\]
と表されます。今回は階層が一段増えたので、もう一段計算します。中間層の出力$z_i$に対して、出力層の出力$y_j$($j=1,2,\cdots ,J$)は、
\[
u_j = \sum_{i=1}^{I} w_{ij}z_i\\
y_j = f(u_j)
\]
となります。ここで、$w_{ij}$の値の更新(学習)は前回の記事で説明しました。今回は$v_{ki}$の学習を考えます。その前に、前回書いた$w_{ij}$の変化量に対する誤差関数$E$の変化の割合を再掲します。
\[
\frac{\partial E}{\partial w_{ij}} = \frac{dE}{dy_j}\frac{dy_j}{du_j}\frac{\partial u_j}{\partial w_{ij}}
\]
ここで、$u_j$の値が変化したときの誤差関数$E$の変化率を

\[
\frac{dE}{dy_j}\frac{dy_j}{du_j} = \delta_j
\]

と表現することにします(このように書くと、後ほど便利)。そうすると、

\[
\frac{\partial E}{\partial w_{ij}} = \delta_j \frac{\partial u_j}{\partial w_{ij}} \tag{1}
\]

と書けるのですが、この形が非常に重要です。

それでは、次に$v_{ki}$の変化に対する誤差関数$E$の変化量を求めてみます。

\[
\frac{\partial E}{\partial v_{ki}} = \sum_{j=1}^{J} \frac{\partial E_j}{\partial y_j}\frac{\partial y_j}{\partial u_j}\frac{\partial u_j}{\partial z_i}\frac{\partial z_i}{\partial s_i}\frac{\partial s_i}{\partial v_{ki}}\\
= \Bigl(\sum_{j=1}^{J} \delta_j \frac{\partial u_j}{\partial z_i}\Bigl) \frac{\partial z_i}{\partial s_i}\frac{\partial s_i}{\partial v_{ki}}\\
\]

ただし、$E=\sum_{j=1}^{J} E_j = \sum_{j=1}^{J} (t_j – y_j)^2$とおきました。ここで、
\[
\delta_i = \Bigl(\sum_{j=1}^{J} \delta_j \frac{\partial u_j}{\partial z_i}\Bigl)\frac{\partial z_i}{\partial s_i}
\]
とおくと、
\[
\frac{\partial E}{\partial v_{ki}} = \delta_i \frac{\partial s_i}{\partial v_{ki}}
\]
となり、先ほどの(1)式で書いた$\partial E/\partial w_{ij}$と全く同じ形になります。つまり、最初に$\delta_j$を計算して出力層に直結する$w_{ij}$の値を更新し、次に$\delta_j$の値を用いて$\delta_i$を求め、同様に$v_{ki}$の値を更新する。

さて、偏微分が残っていると嫌なので、最終形を以下に示します。先ずは、出力層と繋がっている$w_{ij}$を更新します。
\[
\delta_j = \frac{dE}{dy_j}\frac{dy_j}{du_j} = -2(t_j – y_j)\cdot y_j(1-y_j)
\]
を計算し、
\[
\frac{\partial E}{\partial w_{ij}} = \delta_j \frac{\partial u_j}{\partial w_{ij}} = \delta_j\cdot z_i
\]
を使って、最急降下法で$w_{ij}$の値を更新します。次は、
\[
\delta_i = \Bigl(\sum_{j=1}^{J} \delta_j \frac{\partial u_j}{\partial z_i}\Bigl)\frac{\partial z_i}{\partial s_i} = \Bigl(\sum_{j=1}^{J} \delta_j \cdot w_{ij}\Bigl)\cdot z_i(1-z_i)
\]
を計算し、
\[
\frac{\partial E}{\partial v_{ki}} = \delta_i \cdot x_k
\]
を使って、最急降下法で$v_{ki}$の値を更新する。

この手順を繰り返していくと、4層構造であっても、5層構造であっても、誤差$\delta $の値を次々と漸化式のように計算していって(出力を計算する方向とは逆方向に伝搬していって)ネットワークの結線の重みを学習させることが出来ます。

うーん、説明がまだ親切ではないですね。後でもう少し文章を推敲したいと思います。次の投稿ではここで述べたアルゴリズムをRで実装したいと思います(パッケージは使いません)。

ところで・・・

最近のニューラルネットワークを述べた書籍は3層構造に特化したものばかりで、あまり4層以上を意識した書き方をしているものがありません。深層学習が流行る前は、実用的には3層で十分という人が多かったですからねぇ。

私は馬場則夫先生らが執筆した以下の書籍を参考にしました。この本では4層以上の場合も想定した説明がなされています。絶版のようですが図書館にはあると思います。深層学習に関連のあるAutoencoderも載ってます。