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