【誤差逆伝播法】計算グラフのチートシート―これで誰でも分かるはず

<!--

# 0. 読者対象
計算グラフによる誤差逆伝播法の説明を受け、
「理屈は理解できたが、結局計算グラフの読み方が分からない」
という方。
(また、これから計算グラフを使って誤差逆伝播法の説明を受ける方、
および、次の本で勉強する方も是非お読みください。
O'REILLY ゼロから作るDeep Learning)

-->

# 1. 結論
(切り取って、好きな方をノートにでも貼ってください)
\---✂-キ-リ-ト-リ-線---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/6c228f5c-7f5e-5fdb-4b0c-6cacf7b51f4c.png)
\---✂-キ-リ-ト-リ-線---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/07ef9454-4444-99bc-c627-5f9345124778.png)

\---✂-キ-リ-ト-リ-線---

# 2. 例題
ソフトマックス関数の誤差逆伝播を、計算グラフで求めてみよう。
(準備の節は必要に応じて読んでほしい。)
## 2-1. 準備1―ソフトマックス関数と誤差逆伝播法のコンセプト
ソフトマックス関数とは、ベクトルを受け取り、同じ次元のベクトルを返す関数の一つだ。
ソフトマックス関数<sub><sub>(柔らかい最大値関数)</sub></sub>の正体を知るためには、
「ハーデストマックス関数」<sub><sub>(最も硬い最大値関数)</sub></sub>を考えるとよい。
(そんなものは多分ないけど、理解のために。)
「ハーデストマックス関数」(hardestmax)の例を次に示す。

```math
hardestmax
\begin{pmatrix}0 \\99 \\0\\100\\0 \end{pmatrix}
=
\begin{pmatrix}0 \\0 \\0\\1\\0 \end{pmatrix}
```
いかがだろうか。
入力ベクトルの最大成分のあったインデックスに1が、
それ以外のすべてのインデックスに0が入ったベクトルが返却された。
ハーデストマックス関数は、「最大値はどれか」を特定する力があるのだ。
ソフトマックス関数は、これに近いことをする。例を次に示す。


```math
softmax
\begin{pmatrix}0 \\99 \\0\\100\\0 \end{pmatrix}
=
\begin{pmatrix}0.00 \\0.27 \\0.00\\0.73\\0.00 \end{pmatrix}
```
ソフトマックス関数の出力の各成分はすべて0以上1以下の実数で、
しかも和は必ず1となる。　
なるほど。確率とみなせそうだ。

ハーデストマックス関数やソフトマックス関数はニューラルネットワーク上で、
分類問題を解くときに役に立つ。

```math
hardestmax
(各選択肢の「正解らしさ」を何らかの数字で評価したベクトル) \\
=
(正解の選択肢→1、それ以外→0なベクトル)

```
とできる。
しかし、これだと「学習」ができないのだ。

一方、ソフトマックス関数を使えば、

```math
softmax
(各選択肢の「正解らしさ」を何らかの数字で評価したベクトル) \\
=
(各選択肢が正解である確率のベクトル)

```
となる。
後は、ソフトマックス関数<sub><sub>(柔最大値関数)</sub></sub>の出力の各成分を、
ハーデストマックス関数<sub><sub>(最硬最大値関数)</sub></sub>のそれに近づくように(※)、パラメータを再調整する。この「再調整」こそ「学習」だ。
語弊はあるかもだが、次のように言ってもいいだろう。

**「ニューラルネットワークが分類問題を学習する」とはソフトマックス関数の出力を『硬く』していくことである。**

ここで、※を考えてほしい。「近づくように」ってどうやるのか。
実は、その方法の一つこそが「誤差逆伝播法」なのだ。
語弊はあるが、次のように考えてよいだろう。

(分類問題において、)**誤差逆伝播法とは、「正しく固まった最大値」と「試算した柔らかい最大値」の間の誤差を小さくするために、パラメータをどう変更すればよいかを高速で求めるアルゴリズムである。**

「正しく固まった最大値」というのは、
「不正解を1、正解を0にしていたら意味ないでしょ」という程度の注意書きなので、その点に注意していただければ「教師データによる最硬最大値」などと読み替えて構わない。


## 2-2. 準備2―ソフトマックス関数の式
ソフトマックス関数とは、「学習の余地を生むために柔らかくした最大値関数」であるということを、2-1節にてご理解いただいた。

シワのついたYシャツ<sub><sub>(学習前のAI)</sub></sub>を
一度水につけて柔らかく<sub><sub>(ソフトマックス関数の導入)</sub></sub>し、
アイロンで「正しく硬く」すれ<sub><sub>(教師データと誤差逆伝播法による学習)</sub></sub>ば
シワが取れる<sub><sub>(分類能力を帯びた学習済みAIができあがる)</sub></sub>
ことに例えられるだろう。たぶん。

誤差逆伝播法では微分を使う<sub><sub>($f(x)$を思い通りにするために$x$を再調整すると考えれば、$f'(x)$の登場は自然の成り行きだ)</sub></sub>ので
ソフトマックス関数は微分が簡単な$\exp(~)$関数を使ってなるべくシンプルに定義したい。
また、各成分の総和が1になるようにしたい。
(「各選択肢が正解である確率」の総和は、常に1だ。)
この2つの要件を満たした関数が、次に示すものだ。

```math
softmax\begin{pmatrix}a_1 \\a_2 \\:\\a_n \end{pmatrix}
=
\frac{1}{\exp(a_1)+\exp(a_2)+..+\exp(a_n)}
\begin{pmatrix}\exp(a_1) \\\exp(a_2) \\:\\\exp(a_n) \end{pmatrix}
```

## 2-3. 準備3―計算グラフの導出
1つずつの過程を図にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/758278dd-0a9c-709a-0c0b-835aff588c4d.png)
↑まず入出力のみ整理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/a00768b5-585f-dc95-a3da-d210a79546e8.png)
↑まず分子を計算するノードを書いた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/af4e3488-724b-f000-3299-c6062348e980.png)
↑分母は出力の何番目でも共通
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/bc69c1d6-3b03-4a8e-84b7-8608246e6861.png)
↑分母のノード(「∑」と「-1乗」に分けた)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/4a7fa6c1-6d7f-1e0c-b397-190559e3803e.png)
↑分母のノード(「∑」のノードの左側をつないだ)

## 2-4. 誤差逆伝播法の適用
いよいよ誤差逆伝播法を適用していく。
次の図のように、出力側から$-\frac{t_j}{y_j}$が伝わった場合を考える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/05c19c49-b5f3-0dca-d718-f445350542e6.png)

ちなみに$t_j$は正解ベクトルといって、その成分(選択肢)が正解の場合に1、不正解の場合に0となるものである。「正しく固まった最大値関数」そのものである。
$y_j$は、ソフトマックス関数の出力の成分、$\frac{\exp(a_j)}{\sum_{i=1}^n\exp(a_i)}$である。
また、簡単に表すため、$\sum_{i=1}^n\exp(a_i)$を$S$と書いている。

緑色の矢印に対応する$?_1$を求めてみよう。

第1章に示したチートシートをもとに考えれば、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/dcd68faf-1f70-3c7e-039f-74b1179dcc1b.png)
と求められる。
(書籍の中には、近似を用いていることを説明せず、いきなり$-t_j S$の結果だけを示しているものがある。
これは、初めの式で分母の$y_j$と被微分変数の$y_j$を約分し、微分変数$\frac{1}{S}$の逆数をかけたかのような誤解を生む、好ましくない表現であると思う)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/e91f49a8-17b0-8232-984a-22e5fe20c11b.png)

次に$?_2$を求めよう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/c59e1917-0617-3de8-4449-6740055498e9.png)
∑は、薄い矢印をも考慮したものである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/ba6d0fb2-067d-421c-235b-20900c13aa18.png)

$?_3$を求めよう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/3bc6d1b5-f122-72dd-80cd-9a69a3d3b78a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/01d1d5ab-b25f-171d-d6d2-abeca9c7b796.png)

$?_4$を求めよう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/cb3f167f-6354-4368-d2d9-3f4d86033422.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/439dbbfc-534a-2642-1eae-5479031ac03e.png)

最後に$?_5$を求めよう。これが「 $-\frac{t\_j}{y\_j} $ を受け取ったときに、ソフトマックス関数が逆方向に伝える誤差」である。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/4ae5bfa4-92a7-bbe4-a4f7-eedb6a4bffcc.png)

# 3.参考文献
[1]O'REILLY ゼロから作るDeep Learning