###### tags: `ML數學分部`
{%hackmd @kk6333/theme-sty1 %}
# Backpropagation 反向傳播算法
## 簡介
反向傳播算法 (BPP) 是拿來計算梯度、更新神經網路參數的方法
在之前我們知道該怎麼更新 linear regression 的參數
也就是計算 loss 的梯度並更新權重
$$w^1 \leftarrow w^0 - \eta * \frac{\partial{L}}{\partial{w}}$$
那神經網路我們可以看成是由多個 linear regression 所組成 ( 加上 Activation funciton )
( 詳情可見:[從 Linear Regression 到神經網路](https://hackmd.io/0nN91045TBCTiV1SluiHgQ?view) )
也就是有很多的權重 w 要計算,
而 Backpropagation 就是一種有效率來計算每個權重梯度的方法
<br>
## 目標
我們最終的目標是算出 Update 參數時的梯度 $\bigtriangledown L(\theta)$
這邊將 $L(\theta)$ (loss) 定義為
$$L(\theta)=\sum_{n=1}^N{l^n(\theta)}$$
( 定義 $l$ 的意思是個別資料的 $loss$ )
那梯度可以寫成下列式
$$\bigtriangledown L(\theta) = \frac{\partial{L}}{\partial{w}} = \sum_{n=1}^N{\frac{\partial{l^n}}{\partial{w}}} $$
於是我們的目標就是要計算出
$$目標 = \frac{\partial{l}}{\partial{w}}$$
並將它加總
<br>
## Forward Pass & Backward Pass
這邊使用老師舉的範例來說明
( 會用到微積分的 Chain Rule )

如果我們神經網路長上述這樣 ( 先不考慮 Activation function )
那要我的計算目標 $\frac{\partial{l}}{\partial{w}}$ 利用 Chain Rule 可以化簡為以下式子
$$\frac{\partial{l}}{\partial{w}}=\frac{\partial{z}}{\partial{w}}\frac{\partial{l}}{\partial{z}}$$
在這個階段我們會將任務變為兩個
也就是 BPP 的兩步驟
1. Forward Pass : 使用神經網路進行預測,同時也會計算出 $\frac{\partial{z}}{\partial{w}}$
2. Backward Pass : 向後傳播計算 $\frac{\partial{l}}{\partial{z}}$
都算出後就可得到目標值
<br>
## Step1. Forward Pass
向前傳播其實就是讓神經網路取預測 y
那 $\frac{\partial{z}}{\partial{w}}$ 呢 ?
:::info
我們將 z 攤開
可以驚訝發現因為 $z=x_1w_1 + x_2w_2+b$
所以 $\frac{\partial{z}}{\partial{w_1}}=x_1$
代表 $\frac{\partial{z}}{\partial{w}}$ 的解會是 input
:::
所以 forward 就結束啦 ~
---
<br>
## Step2. Backward Pass
因為 $\frac{\partial{l}}{\partial{z}}$ 無法直接計算,所以要將它攤開
這時可以考慮 Activation function ,神經網路如下

:::info
將 $\frac{\partial{l}}{\partial{z}}$ 做分解
$$\frac{\partial{l}}{\partial{z}} = \frac{\partial{a}}{\partial{z}}\frac{\partial{l}}{\partial{a}}$$
:::warning
在這邊 $\frac{\partial{a}}{\partial{z}}=\sigma^{'}(z)$
因為 z 在 forward 就算出來了(不然你 y 怎麼來 ^^ )
所以 $\sigma^{'}(z)$ 為一常數 (scalar)
:::
<br>
我們再將 Activation Func 後面加一層 Layer

:::info
繼續分解 $\frac{\partial{l}}{\partial{a}}$
$$\frac{\partial{l}}{\partial{a}}=\frac{\partial{z^{'}}}{\partial{a}}\frac{\partial{l}}{\partial{z^{'}}}+\frac{\partial{z^{''}}}{\partial{a}}\frac{\partial{l}}{\partial{z^{''}}}$$
我們細看 $\frac{\partial{z^{'}}}{\partial{a}}$
帶入 z 公式且設 x=a 時,對 a 微分後會剩下$w_3$
($z=aw_3+a_jw_j...$)
---
帶回 $\frac{\partial{l}}{\partial{z}}$
$$\frac{\partial{l}}{\partial{z}}=\sigma^{'}(z)[ w_3\frac{\partial{l}}{\partial{z^{'}}} + w_4\frac{\partial{l}}{\partial{z^{''}}}]$$
當此 layer 是輸出層時,便可計算 $\frac{\partial{l}}{\partial{z^{'}}}$ 了
$$\frac{\partial{l}}{\partial{z^{'}}}=\frac{\partial{y_1}}{\partial{z^{'}}}\frac{\partial{l}}{\partial{y_1}}$$
<br>

最後再將上述結果帶回
$$\frac{\partial{l}}{\partial{z}}=\sigma^{'}(z)[ w_3\frac{\partial{l}}{\partial{z^{'}}} + w_4\frac{\partial{l}}{\partial{z^{''}}}]$$
即求出 $\frac{\partial{l}}{\partial{z}}$
:::
<br>
有了 $\frac{\partial{l}}{\partial{z}}$ 和 $\frac{\partial{z}}{\partial{w}}$
我們就算出了梯度
$$\frac{\partial{l}}{\partial{w}}=\frac{\partial{z}}{\partial{w}}\frac{\partial{l}}{\partial{z}} $$
---
:::warning
為啥叫 Backward Pass 呢 ?
將公式列出 (這邊舉例計算 $z=z_1$ 公式 )
$$\frac{\partial{l}}{\partial{z_1}}=\sigma^{'}(z_1)[ w_3\frac{\partial{l}}{\partial{z_{3}}} + w_4\frac{\partial{l}}{\partial{z_{4}}}]$$
$\frac{\partial{l}}{\partial{z_{3}}}$ 又可展開
$$\frac{\partial{l}}{\partial{z_3}}=\sigma^{'}(z_3)[ w_5\frac{\partial{l}}{\partial{z_{5}}} + w_6\frac{\partial{l}}{\partial{z_{6}}}]$$
同理 $\frac{\partial{l}}{\partial{z_{4}}}$
並繪製成圖

會發現我們是從靠近 y 的參數慢慢計算回來
因為前面參數的偏微分都會需要後面的參數
所以這樣是比較有效率的方法 ( 不然你每次都要重算 TT )
也稱為 Backward Pass ~
:::