---
# System prepended metadata

title: Backpropagation 反向傳播算法
tags: [ML數學分部]

---

###### 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 )

![](https://i.imgur.com/LlymUxo.png =500x270)

如果我們神經網路長上述這樣 ( 先不考慮 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 ，神經網路如下

![](https://i.imgur.com/CimTrDR.png)



:::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 

![](https://i.imgur.com/NsT3yFx.png)


:::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>

![](https://i.imgur.com/ecQYdeq.png)

最後再將上述結果帶回
$$\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}}}$

並繪製成圖

![](https://i.imgur.com/3OCt89E.png)

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

