誤差逆伝搬法①

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

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

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

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

```math
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)の式は以下になる。

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

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

```math
\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つの微分の掛け算に分解する。

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

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

```math
\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の関数として展開する。

```math
\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は以下のようになる。

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

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

```math
\frac{δy_{1}}{δa_{0}} = - y_{0} y_{1}
```

```math
\frac{δy_{2}}{δa_{0}} = - y_{0} y_{2}
```

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

```math
\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の場合も求めと以下のようになる。

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

よって式をまとめると、

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

となる。

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

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

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

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

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

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

となる。

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

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

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

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

まとめると

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

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

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

この結果を合わせると

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

になる。

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

```math
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の正の値を取る。


## 続き

https://qiita.com/H_T_6221/items/d79297c909cb0de4ac26