手推反向傳播公式


這可能是我見過的反向傳播算法理論中最易理解的解釋和最簡潔形式的公式推導了 😃

本文以多層感知機為例, 但不局限於某種激活函數或損失函數.
先上精簡版的圖示, 幫助解釋:

BP圖示

反向傳播的目的是更新神經元參數,而神經元參數正是 \(z=wx+b\) 中的 (w,b).
對參數的更新,利用損失值loss對參數的導數, 並沿着負梯度方向進行更新:

\[w=w-\eta \nabla w \\ b=b-\eta \nabla b \]

運用鏈式法則先求誤差對當前神經元的線性加權的結果 \(z\) 的梯度,再求對當前神經元輸入連接的權重 (w,b) 的梯度.

\[\begin{align} {\partial E\over \partial z_i^l} &=\sum_j[{\partial E\over \partial z_j^{l+1}}{\partial z_j^{l+1}\over\partial a_i^l}{\partial a_i^l\over\partial z_i^l}] \\ &= \sum_j[{\partial E\over \partial z_j^{l+1}} w_{ji}^{l+1} \sigma'(z_i^l)] \end{align} \]

其中\(\sigma(\cdot)\)為激活函數, \(\sigma'(\cdot)\) 為激活函數的導數.
\(a_j^{l+1}, a_i^l\) 分別代表當前第\(l+1\)層第\(j\)個神經元與前一層(第\(l\)層)第\(i\)個神經元的激活輸出值.
\(a_i^l=\sigma(z_l^l)\)
\(z_j^{l+1}=w_{ji}^{l+1}a_i^l+b_j^{l+1}\)

注意的是式子和圖示中的 \(E\) 是單個訓練樣本的損失, 而式子中的求和符號 \(\sum\) 是對應層的神經元求和. 不要和代價損失的求和混淆了(cost function 是對所有訓練樣本的損失求平均值).

從上式中,你應該能看出來損失對每層神經元的\(z_i\)的梯度是個從后往前的遞推關系式. 即:

\[\delta_i^l=\sum_j[{\delta_j^{l+1}} w_{ji}^{l+1} \sigma'(z_i^l)] \]

(w,b) 梯度

我們想要的(w,b)的梯度也能夠立刻計算出來:
\(l\)層的第\(i\)個神經元與第\(l+1\)層的第\(j\)個神經元的權重:

\[\begin{align} {\partial E\over \partial w_{ji}^{l+1}} &={\partial E\over \partial z_i^l} {\partial z_i^l\over \partial w_{ji}^{l+1}}= \delta_j^{l+1}a_i^l \\ {\partial E\over \partial b_j^{l+1}} &=\delta_j^{l+1} \end{align} \]

往前一層(第 i 層)的權重:

\[\begin{align} {\partial E\over \partial w_{ih}^l} &=\delta_i^la_h^{l-1} \\ {\partial E\over \partial b_i^l} &=\delta_i^l \end{align} \]

就這樣, 梯度從后往前一層一層傳播計算, 每層的梯度等於后一層的梯度與當前層的局部偏導數的乘積, 這正是鏈式法則的簡單應用。

矩陣乘

對上面的公式稍加變化便能改成矩陣乘法形式:

\[\delta_i^l=\sum_j[{\delta_j^{l+1}} w_{ji}^{l+1} \sigma'(z_i^l)] \\ \Rightarrow[\delta^\ell]_{j\times 1}=[(w^{\ell+1})_{k\times j}^T\times(\delta^{\ell+1})_{k\times 1}]_{j\times 1}\odot\sigma'(z^\ell)_{j\times 1} \\ [\frac{\partial\,E}{\partial\,w^{\ell +1}}]_{j\times i}=[\delta^{\ell +1}]_{j\times 1}\cdot [a^{\ell}]_{1\times i} \]

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM