## 如何有效率地更新參數 還記得在「[如何訓練出好模型呢?](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」的所有內容,第一次看的人會花比較多時間消化吸收,這是很正常的事情,若有任何問題,歡迎在下方與我聯繫、討論,接下來也會繼續分享相關文章,敬請期待。