第7章　[誤差逆伝播法] P275~（中盤） 【Pythonで動かして学ぶ！ あたらしい機械学習の教科書】

## 誤差逆伝播法（バックプロパゲーション）
>この誤差逆伝播法では、ネットワークの出力で生じる誤差（教師信号との差）の情報を使って、出力層の重み$v_{kj}$から中間層への重み$w_{ji}$へと入力法こと逆向きに重みを更新していくことから、この名前がつけられている。
しかし、この誤差逆伝播法は勾配法そのもので、勾配法をフィードフォワードニューラルネットに適用すると誤差逆伝播ほうが自然と導出される。

クラス分類をさせるので、誤差函数には式7-18の平均交差エントロピー誤差を考える（P266）
$$
E(w,v)=-\frac{1}{N}\sum_{n=0}^{N-1}\sum_{k=0}^{K-1}t_{nk}log(y_{nk})\hspace{40pt}(7-18)
$$

・ここでやりたいことは$\partial{E}/ \partial{w_{ji}}$(平均交差エントロピー誤差)を求めたい。
・データが１つの時の交差エントロピー$E_n$を考えたときに、その微分は$\partial{E_n} / 
\partial{w_{ji}}$で求まるから、本命の$\partial{E}/ \partial{w_{ji}}$（平均交差エントロピー誤差）はデータの個数分の$\partial{E_n} / \partial{w_{ji}}$を求めてそれを平均すれば良い
・<font color="OrangeRed">ここでtはt=[0,0,1]とかで表していた、教師信号（なんのクラスを表すかの信号）</font>

それが↓
$$
\frac{\partial{E}}{\partial{w_{ji}}}=\frac{\partial}{\partial{w_{ji}}}\frac{1}{N}
\sum_{n=0}^{N-1}E_n
=\frac{1}{N}\sum_{n=0}^{N-1}
\frac{\partial{E_n}}{\partial{w_{ji}}}
$$

今回はD=2,M=2,K＝３の場合を考える。

D:入力値の個数
M:中間層の個数
K:出力の個数
w,v:重み

重みは、w,vの二つあるので、まず$E_n$を$v_{kj}$で偏微分した式を求める。その次に$E_n$を$w_{ji}$で偏微分した式を求める。（~~順番に特に意味はなさそう。~~誤差逆伝播法では、誤差を元に逆順に式展開が伝播するため逆から行っている。）

$
\frac{\partial{E}}{\partial{v_{kj}}}
$
の$E_n$の部分は7-22の$E_n(w,v)=-\sum_{k=0}^{K-1}t_{nk}log(y_{nk})$なので、$\frac{\partial{E}}{\partial{v_{kj}}}$これは連鎖律で偏微分を求めることができる。

連鎖律↓
$$
\frac{\partial{E}}{\partial{v_{kj}}}=
\frac{\partial{E}}{\partial{a_k}}\frac{\partial{a_k}}{\partial{v_{kj}}}
$$

**$a_k$は入力値とダミー変数の総和**

ここでは、まず左側の$\frac{\partial{E}}{\partial{a_k}}$から考える。
Eの部分は$E_n$が省略されているものなので、ここを式7-22で置き換えると、(k=0の場合で考える[データ数0個？])

$$
\frac{\partial{E}}{\partial{a_0}}= \
\frac{\partial}{\partial{a_0}}(-t_0logy_0-t_1logy_1-t_2logy_2)
$$

となる。
ここで対数の微分の公式を使うと
・説明にあるようにtは教師信号でyは入力総和の出力なので、$a_0$と関係があるため。
・<font color="OrangeRed">ここでtはt=[0,0,1]とかで表していた、教師信号（なんのクラスを表すかの信号）</font>

対数の微分：
$
\begin{align*} (\log x)' = \frac{1}{x} \end{align*}
$

と表せる↓
$$
\frac{\partial{E}}{\partial{a_0}}=\
-t_0\frac{1}{y_0}\frac{\partial{y_0}}{\partial{a_0}}
-t_1\frac{1}{y_1}\frac{\partial{y_1}}{\partial{a_0}}
-t_2\frac{1}{y_2}\frac{\partial{y_2}}{\partial{a_0}}
\hspace{40pt}(7-27)
$$

第７章（前半）で説明したように$\partial{y_0} / \partial{a_0}$の部分ではソフトマックス関数が使用されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/216a12be-3b5c-efa2-7a6f-b602a20000e3.png)

そこで、4-130で導いた、ソフトマックス関数の偏微分の公式通りにすると、
公式4-130:
$\frac{\partial{y_j}}{\partial{x_i}}=y_j(l_{ij}-y_i)$
・iは入力値の係数、jは出力値の係数
ここで、lは$i=j$のとき１、$i\neq{j}$の時0

式7-28のようになります。
$$
\frac{\partial{y_0}}{\partial{a_0}}=y_0(1-y_0)
$$
**今回はダミー変数を含めるとM=K=3なのでlの部分は1**

残りの二つは、入力値の係数と、出力値の係数が異なるのでそれぞれ
$$
\frac{\partial{y_1}}{\partial{a_0}}=-y_0y_1
$$
$$
\frac{\partial{y_2}}{\partial{a_0}}=-y_0y_2
$$
となる。

それぞれ３つを代入すると
よって、式7-27は以下のようになる（7-31）:

```math
\begin{align}
\frac{\partial{E}}{\partial{a_0}}&=
-t_0\frac{1}{y_0}\frac{\partial{y_0}}{\partial{a_0}}
-t_1\frac{1}{y_1}\frac{\partial{y_1}}{\partial{a_0}}
-t_2\frac{1}{y_2}\frac{\partial{y_2}}{\partial{a_0}}\\
&=-t_0(1-y_0)+t_1y_0+t_2y_0\\
&=(t_0+t_1+t_2)y_0-t_0\\
&=y_0-t_0
\end{align}
```
最後は$t_0+t_1+t_2=1$を使った。

$y_0$が１番目のノードのニューロンの出力で、$t_0$がそれに対する教師信号なので$y_0-t_0$は誤差を表している。

**同じようにk番目のデータ(k=1,2)を考えると式（7-32）のようになる。**

そして、式7-25の連鎖律の左側の部分は7-33のように表せる。（偏微分左側）

**式7-25の $\partial{a_k} / \partial{v_kj}$ の部分を考える。**
k=0の場合を考えると、総和の$a_0$は中間層の出力(z)と中間層から出力層への重みvの総和なので、
$$
a_0=v_{00}z_0+v_{01}z_1+v_{02}z_{02}
$$

なので、$a_0$をそれぞれのv($v_0,v_1,v_2$)について解くと7-37のようになる。

それで、7-37をまとめて書くと、7-38になる。

**k=1,k=2の場合でも同様な結果が得られるので、全てまとめて式7-39のようになる**
$$
\frac{\partial{a_k}}{\partial{v_{kj}}}=z_j\hspace{40pt}(7-39)
$$

<font color="Red">これで偏微分の左側、右側が揃ったので、組み合わせると式7-40のようになる。</font>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/622c7c65-8b57-4850-8430-8d89914f02d5.png)

式7-4１で言っていることは、今欲しい値は$v_{kj}$という適切な重みの値が欲しいので、その値を適切に調整する時の理論が図で表していること。
・zは（シグモイドを通しているから）0~1の値をとる確率で出力yと教師信号tの誤差分をなくすようなvになりたい分けだから、誤差（$\delta_k^{(2)}$のぶんだけvの値を変更する。）
・誤差($\delta_k^{(2)}$)が０の場合 = 出力$y_k$と目標データ（教師信号）$t_k$ が一致していれば,($y_k-t_k=0$)変更分の$-\alpha\delta_k^{(2)}z_j$は0となる。

(重要)P281:
>
目標データ$t_k$が0なのに、出力$y_k$が０よりも大きかった場合、誤差$\delta_k^{(2)}=(y_k-t_k)$は正の値となります。$z_j$は常に正のですから、結果、$-\alpha\delta_k^{(2)}z_j$は負の数となり、$v_{kj}$は減る方向へ修正される。つまり、出力が大きすぎて誤差が生じたので、ニューロン$z_j$からの影響を絞る方向へ重みが変更されると解釈できます。また、入力$z_j$が大きかったら、その結合からの出力への寄与が大きかったことになるので、$v_{kj}$の変更量もその分大きくするようになっていると解釈できます。

ここの部分が非常に重要で、ここで言っていることは、
・目的データtよりも出力データyの方が大きければ、vの変更はその出力yを減らす方に変化する(v=0.2とかになるのかな？)
・そして、誤差(y-t=0)がなければ、vは変わらない
・また、入力値z(これは確率を表す)が大きければvの変更量もその分大きくなる

## Eのwで微分を求める。
**$\partial{E}/\partial{w_{ji}}$を求める**

・式7-43は7-34と同じ
・式7-44は7-39と同じ
・なので、同様に式7-45は7-41と同じ
として処理できる。

**$\delta_{j}^{(1)}$をとりあえずとしておいたで、それが何かを求める。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/0f09519b-cef8-104c-1260-dace828cc5ce.png)

まず、最初に7-43の式を連鎖律で偏微分すると：
$$
\delta_j^{(1)}=\frac{\partial{E}}{\partial{b_j}}=
\biggl(
\sum_{k=0}^{K-1}\frac{\partial{E}}{\partial{a_k}}
\frac{\partial{a_k}}{\partial{z_j}}
\biggr)
\frac{\partial{z_j}}{\partial{b_j}}
$$
なるのを理解するのに、以下を理解する必要がある。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/fd47188f-22bd-c579-7a47-1cbc8ea39374.png)

・ここでは、$g_0$と$g_1$が$w_0$とw_1$の関数で、fがg_0$とg_１$の関数となっている場合となっているので、これを置き換える。

$$
E(a_k(z_0,z_1)）
$$
(k=0~2の3つ)

なので、(4-62)が適用できる。
という関数になる。
$$
\frac{\partial}{\partial{z_j}}E(a_0(z_0,z_1),a_1(z_0,z_1),a_2(z_0,z_1))=\sum_{k=0}^{K-1}\frac{\partial{E}}{\partial{a_k}}\frac{\partial{a_k}}{\partial{z_j}}
$$
となる。

これを組み合わせると、式7-46のように展開できる。


**~~式7-47がなぜ$v_{kj}$になるかわかりませんが~~、P283で説明している通り、$\delta_{j}^{(1)}$は以下のようになる**
**<font color="DeepPink">・式7-47では、$z_j$について偏微分しろと言っているので、それ以外のvは定数とおく、z=1として残るところのvだけ定数も残るので、$v_{kj}$が残る。**</font>

それらを合わせると↓

$$
\delta_{j}^{(1)}=h'(b_j)\sum_{k=0}^{K-1}v_{kj}\delta_{k}^{(2)}
$$

## P284~ 誤差逆伝播法まとめ
**誤差逆伝播法で行いたいことは、w,vなどの重みパラメータの最適化であり、逆向きに伝播させることでそれを可能にしている。**

・最初の$h'(b_j)$は、シグモイド関数で変換されたものなので、$b_j$は0~1の値をとっている、そのため、この値は常に正の値をとる。
・$\frac{\partial{E}}{\partial{a_k}}=
\delta_{k}^{(2)}=
(y_k-t_k)h'(a_k)$なので、出力層の出力yに重みvをかけて集めてきているものです。（出力層での誤差が大きければ、v*（大きい値）となり、vが大きく働く。）　

①では、まず、適当にw,vを設定して、出力yを得る。
②教師信号のtがあるので、そのtとyを比較する。
③今まで導出した式を用いて誤差を逆向きに伝播する。具体的には全ての誤差（y-t）と重みv（２層目）をかけて総和をとり、それを中間層のシグモイド関数を通した総和$h'(b_0)$をかける。（それが③の図の式）
④誤差が0になるようにw,vを更新する。（誤差がわかったので、その分が0になるようにする。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/9dfe99ce-8d04-defc-2287-2b67eb80f654.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/89a4fc1b-24bf-1a64-f252-2665515325ab.png)

###　誤差逆伝播法式まとめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/fc28dea6-e8ed-fae8-028d-ebee809e560f.png)