0
1

誤差逆伝搬法①

Last updated at Posted at 2024-09-17

誤差逆伝搬法(バックプロパゲーション)

フィートフォワードニューラルネットワークを学習させる方法として、誤差逆伝搬法が有名である。
この方法ではネットワークの出力で生じる誤差(教師信号との差)の情報を使って、出力層の重みvkjから中間層への重みwjiへと入力方向と逆向きに重みを更新していく。
この誤差逆伝搬法は、勾配法そのものになる。
勾配法をフィードフォワードニューラルネットに適用すると誤差逆伝搬法の法則が自然と導出される。

勾配法を適用するには、誤差関数をパラメータで偏微分する。
この誤差関数は、ネットワークにクラス分類させるので、平均交差エントロピー誤差を考える。

E(w, v) = - \frac{1}{N} \sum_{n=0}^{N-1} \sum_{k=0}^{K-1} t_{nk} \log (y_{nk})

1つのデータnに対する交差エントロピー誤差Enを定義する。

E_{n}(w, v) = - \frac{1}{N} \sum_{n=0}^{N-1} \sum_{k=0}^{K-1} t_{nk} \log (y_{nk})

E(w, v)に対してE_{n}(w, v)の式は以下になる。

E(w, v) = \frac{1}{N} \sum_{n=0}^{N-1} E_{n}(w, v)

つまり、平均交差エントロピー誤差は、データ個別の交差エントロピー誤差の平均と解釈できる。
勾配法で使うEのパラメータの偏微分δE/δwjiを考えると、和と微分は交換できることから、書くデータnに対するδEn/δwjiを求めて平均すれば本命のδE/δwjiを求める。

\frac{δE}{δw_{ji}} = \frac{δ}{δw_{ji}} \frac{1}{N} \sum_{n=0}^{N-1} E_{n} = \frac{1}{N} \sum_{n=0}^{N-1} \frac{δE_{n}}{δw_{ji}}

よって、δEn/δwjiの導出を目指す。

δE/δvkjを求める

偏微分を使って、δE/δvkjを2つの微分の掛け算に分解する。

\frac{δE}{δv_{kj}} = \frac{δE}{δa_{k}} \frac{δa_k}{δv_{kj}}

ここのEはEnのことである。式を見やすくするために省略する。
δE/δakをk=0の場合で求めていく。

\frac{δE}{δa_{0}} = \frac{δ}{δa_{0}} (- t_{0} \log y_{0} - t_{1} \log y_{1} - t_{2} \log y_{2})

ここで、tkは教師信号なので入力総和のa0で変化することはないが、ネットワークの出力であるykのほうは入力総和に関係する。
このため、tkは定数、ykはa0の関数として展開する。

\frac{δE}{δa_{0}} = - t_{0} \frac{1}{y_{0}} \frac{δy_{0}}{δa_{0}} - t_{1} \frac{1}{y_{1}} \frac{δy_{1}}{δa_{0}} - t_{2} \frac{1}{y_{2}} \frac{δy_{2}}{δa_{0}}

yがaのソフトマックス関数で作られているため、δy0/δa0は以下のようになる。

\frac{δy_{0}}{δa_{0}} = y_{0} (1 - y_{0})

第2項、第3項についてもソフトマックス関数の微分から求められる。

\frac{δy_{1}}{δa_{0}} = - y_{0} y_{1}
\frac{δy_{2}}{δa_{0}} = - y_{0} y_{2}

このため、δE/δa0は以下のようになる。

\displaylines{
\frac{δE}{δa_{0}} = - t_{0} \frac{1}{y_{0}} \frac{δy_{0}}{δa_{0}} - t_{1} \frac{1}{y_{1}} \frac{δy_{1}}{δa_{0}} - t_{2} \frac{1}{y_{2}} \frac{δy_{2}}{δa_{0}} \\
= -t_{0}(1 - y_{0}) + t_{1} y_{0} + t_{2} y_{0} \\
= (t_{0} + t_{1} + t_{2}) y_{0} - t_{0} \\
= y_{0} + t_{0}
}

最後はt0, t1, t2のどれか1つが1でそれ以外は0であることを考え、和が1になるためになる。
y0はニューロン出力でt0がそれに対する教師信号なので、y0-t0は誤差を表している。

同様にしてk=1, 2の場合も求めと以下のようになる。

\frac{δE}{δa_{1}} = y_{1} - t_{1}, \frac{δE}{δa_{2}} = y_{2} - t_{2}

よって式をまとめると、

\frac{δE}{δa_{k}} = y_{k} - t_{k}

となる。

δE/δakは出力層(第2層)の誤差を表しているので、以下のように書き表すことが出来る。

\frac{δE}{δa_{k}} = δ_{k}^{(2)}

この結果は誤差関数に交差エントロピーを使って得られたものである。誤差関数に二乗誤差を使えば以下の式が得られる。

\frac{δE}{δa_{k}} = δ_{k}^{(2)} = (y_{k} - t_{k}) h'(a_{k})

h(x)は出力層のニューロンの活性化関数であり、活性化関数にシグモイド関数δ(x)を使った場合は

h'(x) = (1 - δ(x)) δ(x)

となる。

微分を分割した後半部分δak/δvkjについて求めていく。
k=0の場合を考えると、a0は以下のようになる。

a_{0} = v_{00} z_{0} + v_{01} z_{1} + v_{02} z_{2}

vについての各偏微分した結果は以下になる。

\frac{δa_{0}}{δv_{00}} = z_{0}, \frac{δa_{0}}{δv_{01}} = z_{1}, \frac{δa_{0}}{δv_{02}} = z_{2}

まとめると

\frac{δa_{0}}{δv_{0j}} = z_{j}

k=1, 2の場合でも同様の結果を得られるため、

\frac{δa_{k}}{δv_{kj}} = z_{j}

この結果を合わせると

\frac{δE}{δv_{kj}} = \frac{δE}{δa_{k}} \frac{δa_k}{δv_{kj}} = (y_{k} - t_{k}) z_{j} = δ_{k}^{(2)} z_{j}

になる。

よって、vkjの更新規則は以下のようになる。

v_{kj}(t+1) = v_{kj}(t) - α \frac{δE}{δv_{kj}} = v_{kj}(t) - α δ_{k}^{(2)} z_{j}

重みvkjは中間層(第1層)のニューロンjから出力層(第2層)のニューロンkへ情報を伝達する結合の重みになる。
この結合の大きさは、この結合への入力の大きさzjとその先で生じる誤差δの積で決まる。
誤差δは正の値も負の値も取るが、zjはzj=δ(bj)なので常に0から1の正の値を取る。

続き

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1