---
# System prepended metadata

title: Gadient descent & Backpropagation
tags: [深度學習, 模型訓練技巧]

---

## 如何有效率地更新參數
還記得在「[如何訓練出好模型呢？](https://hackmd.io/@lcaMuWOwR1Ox5o5yeTEupA/BJxlQH1NA)」文章中，有提到更新參數的三種方式，分別是 Gradient Descent(GD)、Stochastic gradient descent(SGD)、Mini-batch SGD，找到一組最佳的參數，讓誤差函數（loss function）產生的數值越小越好。

那既然有了上述更新參數的方式，那為何需要本篇文章的核心概念「Backpropagetion」呢？原因是 Backpropagation 在計算上能夠變得更有效率，以下就讓我們來一探究竟。

## Gradient descent v.s. Backpropagation
### Gradient descent
先看一個簡單的例子，假設目前有一個模型，裡面參數量只有三個，在更新的時候，就是去計算誤差函數之導數也可以說是對每個參數的偏微分，全部算完後，乘上 η（Learning rate），完成一次的參數更新。

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

但若是複雜的模型呢？來看下面的例子，這是一個多層的模型架構，將輸入乘上權重（weight）再加上偏差（bias），接著丟入 Activation function 後將輸出傳給下一層，以此類推，該模型所擁有的參數量（w, b）是相當驚人的，在做參數更新的時候，要去計算誤差函數之導數或者是對每個參數的偏微分，計算完這些大量參數後乘上 η，完成一次參數更新。

![image](https://hackmd.io/_uploads/SJcfm7VrR.png =50%x)![image](https://hackmd.io/_uploads/H16XXQ4BA.png =50%x)

### Backpropagation（大量數學警報！）
下面這張圖，也跟上面多層的模型一樣，只不過單獨挑出兩層隱藏層來細看它們是如何傳遞資訊的，分別是第 l-1 層以及第 l 層，node 的數量就是神經元的數量，第 l-1 的輸出用 aˡ⁻¹ 表示，傳遞至下一層時就變為輸入，要乘上權重（Weight）用 wˡ 表示，而在 w 下標的數字代表從第 j 個 neuron 傳至下一層的第 i 個 neuron，表示為 wˡᵢⱼ，再加上偏差（bias）用 bˡ 表示，算完後得到 zˡ 再丟入 activation function 中獲得下一層的輸出 aˡ。

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

上述的內容都沒有問題後，接著必須了解在做 Backpropagation 時需要使用到 Chain rule 的概念，從數學的角度來看，w 丟入一個函式（f）後得到 x，接著 x 也丟入相同的函式（f）後得到 y，以此類推，當我們要做 z 對 w 的偏微分時，就需使用到 Chain rule。

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

還記得嗎？更新參數的時候，需要計算誤差函數之導數或者是對每個參數的偏微分，這裡將 Loss fuction 用 C(θ) 表示，並對其中一個參數也就是第 l 層的 wˡᵢⱼ 做偏微分，再用 Chain rule 展開分別計算，詳細內容請參見下圖。

需要特別注意的地方在 ∂C(θ) / ∂zᴸᵢ 此為最後的輸出層（output layer），因此計算後的 aᴸᵢ = σ(zᴸᵢ) 就直接等於輸出 yᵢ。

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

值得一提的是下方計算的皆是隱藏層而非輸出層，在計算上會有所不同，例如第 l 層計算出的輸出為 aˡᵢ，但對下一層第 l+1 層來說是輸入，需要乘上權重(weight)、加上偏差(bias)，得到 zᵢˡ⁺¹ 再經過 activation function 獲得 aᵢˡ⁺¹，以此類推，因此只要改變了前一層的 zᵢˡ 就會改變 aᵢˡ，便影響下一層所有的 zᵢˡ⁺¹ 以及 aᵢˡ⁺¹，最後才影響到 C(θ)，正是接下來 chain rule 仔細關注的地方，可以搭配看下方黑色框框的位置。

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

從計算後的結果可以發現，根據後面一層的 δˡ⁺¹ 能夠回推至 δˡ，不需要因為每次參數更新，需要花費大量運算資源，使得整體的最佳化（Optimization）會變得更有效率。

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

## 總結，Backpropagation 的優勢
在文章中，我們探討了可以如何有效率地更新參數，並提及先前所提到的方式，分別有 GD、SGD 以及 Mini-batch SGD，最後說明 Backpropagation 能夠為模型的最佳化帶來良好的計算效率，能夠從後一層（δˡ⁺¹）的結果推算出前一層（δˡ）的結果而不需要再次計算，這正是 Backpropageation 擁有的優勢。

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

---
:::info 
以上就是這篇文章「Backpropagation」的所有內容，第一次看的人會花比較多時間消化吸收，這是很正常的事情，若有任何問題，歡迎在下方與我聯繫、討論，接下來也會繼續分享相關文章，敬請期待。