---
# System prepended metadata

title: ML2016Fall - Backpropagation
tags: [機器學習, 李宏毅]

---

# ML2016Fall - Backpropagation

- [課程](https://www.youtube.com/watch?v=ibJpTrp5mcE)
- [PDF](https://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2016/Lecture/BP.pdf)

## Gradient Descent
![image](https://hackmd.io/_uploads/rkHJFeFEgx.png)

Gradient Descent目的是讓損失函數$L({\theta})$**趨近最小**，也就是找出讓模型預測誤差最小的參數$\theta$。
#### 步驟：
1. 給定**初始參數值** $\theta^0$
2. 計算損失函數在當前參數下的**梯度**，也就是對模型的每個參數求**偏微分**：
$$\mathbf{g} = \nabla L({\theta}^t)$$
3. 根據梯度的方向更新參數，直至設定的次數：
$${\theta}^{t+1} = {\theta}^t - \eta \cdot g$$

在實際的模型中，參數數量成千上萬，為了有效計算梯度，我們使用**Backpropagation**。它等同於Gradient Descent，但能以**更高的效率計算**。


## Chain Rule
![image](https://hackmd.io/_uploads/H1hYJDdVee.png)
Backpropagation的主要概念為Chain Rule，其被用來計算各個參數的偏微分。


## Propagation
![image](https://hackmd.io/_uploads/Hk0MGP_Eex.png)
$C^n(\theta)$為模型目前參數所預測的數值($y^n$)和實際數值($\hat{y}^n$)之間的差距。

把每筆資料的損失$C^n(\theta)$加起來 => 全部的損失$L(\theta)$
把每筆資料的損失$C^n(\theta)$的偏微分加起來 => 對全部的損失$L(\theta)$求偏微分

所以想要知道怎麼對總損失$L(\theta)$求偏微分，只要知道怎麼對單一資料的損失$C^n(\theta)$求偏微分，之後再加起來就行了。

下面會先對單一神經元偏微分在推廣至模型的全部。
![Untitled](https://hackmd.io/_uploads/Hk7Y3Pd4gl.png)
為了計算出各權重w(用Bias也是差不多過程)對單一資料損失函數$C^n(\theta)$的偏微分，我們需要分別計算出$\dfrac{\partial{z}}{\partial{w}}$、$\dfrac{\partial{C}}{\partial{z}}$。

所以Backpropagation分為兩個部分：
- Forward Pass：
綠色的部分計算$\dfrac{\partial{z}}{\partial{w}}$，這裡比較簡單，很容易就能計算出來。
- Backward Pass
紅色的部分計算$\dfrac{\partial{C}}{\partial{z}}$，反向則較為困難，不過從**輸出的地方返回計算**，其計算量和Forward Pass一樣，也會簡單許多。



---

### Propagation - Forward Pass
#### ==Forward Pass：輸入什麼，微分之後的答案就是什麼。==
目的：計算出$\dfrac{\partial{z}}{\partial{w}}$
![image](https://hackmd.io/_uploads/HyRIz_u4gg.png)
圖中很容易就可以看出$z$怎麼來的：
$$z=x_1*w_1+x_2*w_2+b$$$z$對$w_1$、$w_2$偏微分也不困難，答案明顯為$x_1$、$x_2$。
可以看出用各個權重做偏微分得到的結果其實就是前面輸入進來的東西，例如w1那邊輸入的資料是x1。
![image](https://hackmd.io/_uploads/Sk7_Mdu4lx.png)



---


### Propagation - Backward Pass
#### ==Backward Pass：從輸出層計算偏微分，反向推進直至輸出層。==
目的：計算出$\dfrac{∂C}{∂z}=\dfrac{∂a}{∂z}\dfrac{∂C}{∂a}$
因為$a$之後只經過sigmoid function就會得到$a$，所以$\dfrac{∂a}{∂z}$就只是$\sigma'(z)$。
但$\dfrac{∂C}{∂a}$會隨著之後的層數增多，而延伸出$\dfrac{∂C}{∂z^{'}}$、$\dfrac{∂C}{∂z^{''}}$、$\dfrac{∂C}{∂z^{'''}}$直至輸出層。

![image](https://hackmd.io/_uploads/S1F56__Vxx.png)
其實不重要，畢竟$a$裡面只有$z$這個變數，自然$a$對$z$偏微分等價於$a$對$z$微分
$$\dfrac{∂a}{∂z} = \sigma'(z)$$
> 我只是想寫一下$\sigma'(z)$會長怎樣而已

以下為$\dfrac{∂a}{∂z}$的過程：

$$
\frac{da}{dz} = \frac{d}{dz} \left( \frac{1}{1 + e^{-z}} \right)$$

$$\text{若 } f(z) = \frac{1}{u(z)} \quad \Rightarrow \quad f'(z) = -\frac{u'(z)}{[u(z)]^2}$$
$$\frac{d}{dz} \left( u(z)^{-1} \right)
= -1 \cdot u(z)^{-2} \cdot \frac{du}{dz}
= -\frac{u'(z)}{[u(z)]^2}
$$
對應到sigmoid
$$u(z) = 1 + e^{-z} \quad \Rightarrow \quad u'(z) = \frac{d}{dz}(1 + e^{-z}) = -e^{-z} \\[15pt]$$

$$\frac{d}{dz} \left( \frac{1}{1 + e^{-z}} \right)
= -\frac{-e^{-z}}{(1 + e^{-z})^2}
= \frac{e^{-z}}{(1 + e^{-z})^2} \\[15pt]$$
化簡
$$\text{已知 }\sigma(z) = \frac{1}{1 + e^{-z}} \quad \text{且} \quad 1 - \sigma(z) = \frac{e^{-z}}{1 + e^{-z}} \\[10pt]$$

$$\Rightarrow \quad
\sigma(z)(1 - \sigma(z)) = \frac{1}{1 + e^{-z}} \cdot \frac{e^{-z}}{1 + e^{-z}} = \frac{e^{-z}}{(1 + e^{-z})^2} \\[15pt]$$

結果
$$\frac{d}{dz} \sigma(z) = \sigma(z)(1 - \sigma(z))
=\sigma'(z)$$


![image](https://hackmd.io/_uploads/BkxE8OONgx.png)
先假設$\dfrac{∂C}{∂z^{'}}$、$\dfrac{∂C}{∂z^{'}}$，這兩個很難算的東西已經被算出來了，則我們可以很快得知：
$$
\frac{\partial C}{\partial z} = \sigma'(z) \left[ w_3 \frac{\partial C}{\partial z'} + w_4 \frac{\partial C}{\partial z''} \right]
$$其中$\sigma'(z)$是常數，它在Forward Pass的時候就已經被算出來了。
![image](https://hackmd.io/_uploads/S1X5qFuVee.png)

可以看出得到$\dfrac{∂C}{∂z}$的形式與神經網路非常相似，只是方向相反，從輸出層一路反向傳回輸入層，且Actvation Function改成像op-amp一樣乘上某個常數。

![image](https://hackmd.io/_uploads/B1eWAKdElx.png)
![image](https://hackmd.io/_uploads/SJZ3CY_Egx.png)

求解$\dfrac{∂C}{∂z^{'}}$、$\dfrac{∂C}{∂z^{''}}$

- Case 1：
剛好可以直接知道$C$對$z'$、$z''$的偏微分。
$\dfrac{∂C}{∂z^{'}}=\dfrac{∂y_1}{∂z^{'}}\dfrac{∂C}{∂y_1}$
$\dfrac{∂C}{∂z^{''}}=\dfrac{∂y_2}{∂z^{''}}\dfrac{∂C}{∂y_2}$

- Case 2：
就必須一直往下求解直至輸出層，求出輸出層的偏微分後，才能得知前面所有的偏微分。
![image](https://hackmd.io/_uploads/rJoTaYOVlx.png)

在推導$\frac{\partial C}{\partial z} = \sigma'(z) \left[ w_3 \frac{\partial C}{\partial z'} + w_4 \frac{\partial C}{\partial z''} \right]$時，我們發現其公式抽象成圖畫後，很像反向運行的神經網路。所以在Backward Pass的時候，我們直接從輸出層開始逐層向前計算偏微分，一路推導回去輸出層，這樣比較簡單也有效率。

![image](https://hackmd.io/_uploads/H1ZVVquVxl.png)

## 結論
Backpropagation 是一種透過計算損失函數對模型中各個參數的偏微分，來更新參數值的訓練方法。

整個過程分為兩個階段：
1. Forward Pass：模型接收輸入並產生輸出，用來計算損失函數的實際數值。同時間，計算出$\sigma'(z)$、$\dfrac{\partial{z}}{\partial{w}}$供Backward Pass使用。
2. Backward Pass：根據損失函數對輸出的偏微分結果，運用Chain Rule逐層反向傳遞，計算每個參數的梯度。

> [time=Wed, Jun 25, 2025 12:26 PM]