###### 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 )  如果我們神經網路長上述這樣 ( 先不考慮 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 ,神經網路如下  :::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  :::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>  最後再將上述結果帶回 $$\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}}}$ 並繪製成圖  會發現我們是從靠近 y 的參數慢慢計算回來 因為前面參數的偏微分都會需要後面的參數 所以這樣是比較有效率的方法 ( 不然你每次都要重算 TT ) 也稱為 Backward Pass ~ :::
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.