這可能是我見過的反向傳播算法理論中最易理解的解釋和最簡潔形式的公式推導了 😃
本文以多層感知機為例, 但不局限於某種激活函數或損失函數.
先上精簡版的圖示, 幫助解釋:
反向傳播的目的是更新神經元參數,而神經元參數正是 \(z=wx+b\) 中的 (w,b).
對參數的更新,利用損失值loss對參數的導數, 並沿着負梯度方向進行更新:
運用鏈式法則先求誤差對當前神經元的線性加權的結果 \(z\) 的梯度,再求對當前神經元輸入連接的權重 (w,b) 的梯度.
其中\(\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\)的梯度是個從后往前的遞推關系式. 即:
(w,b) 梯度
我們想要的(w,b)的梯度也能夠立刻計算出來:
第\(l\)層的第\(i\)個神經元與第\(l+1\)層的第\(j\)個神經元的權重:
往前一層(第 i 層)的權重:
就這樣, 梯度從后往前一層一層傳播計算, 每層的梯度等於后一層的梯度與當前層的局部偏導數的乘積, 這正是鏈式法則的簡單應用。
矩陣乘
對上面的公式稍加變化便能改成矩陣乘法形式:
參考
- 神經網絡中 BP 算法的原理與 Python 實現源碼解析: https://www.jianshu.com/p/679e390f24bb#
- BP神經網絡——從二次代價函數(Quadratic cost)到交叉熵(cross-entropy cost)代價函數 https://blog.csdn.net/lanchunhui/article/details/50086025