反向傳播算法, Backpropagation, BP
1986年, Hinton, 深度學習之父, 和他的合作者發表了論文"Learning Representations by Back-propagating errors", 首次系統地描述了如何利用BP算法有訓練神經網絡. 從這一年開始, BP在有監督的神經網絡算法中占着核心地位. 它描述了如何利用錯誤信息, 從最后一層(輸出層)開始到第一個隱層, 逐步調整權值參數, 達到學習的目的.
以MLP為例說明BP的詳細過程. 假設這個多層神經網絡共有L層, 輸入層為layer 1, 輸出層為layer L, 中間的\(L-2\)層為隱層. 第\(l\)層第\(i\)個神經元的凈輸出(過激活函數之前的輸出)為\(net^l_i\), 它的(激活)輸出為\(a^l_i\). 同一層神經元使用相同的激活函數\(f^{l}(net_l)\)
BP算法從整體上來說分為兩步: 前向反饋(feedforward)與反向傳播(Backpropagate).
Feedforward
feedforward 的過程是指信息從輸入層開始單向向前傳播, 經過隱層, 最后到輸出層, 得到整個網絡的輸出. 一句話概括就是第\(l-1\)層的輸出作為第\(l\)層的輸入.
輸入層:
其中, \(x\)為輸入的樣本, 一個\(c^1\)維列向量.
隱層:
\(f^{l-1}\)為第\(l-1\)層的激活函數. \(W^l, b^l\)分別為第\(l\)層的權值矩陣與bias. \(W^l: c^l \times c^{l-1}\), \(b: c^l \times 1\)
輸出層:
Backpropagation
輸出層的梯度計算
錯誤信息指的是網絡的輸出與目標值的差異. 差異的大小用損失函數表示. 先考慮在單個樣本\(x\)上的損失:
它是一個關於輸入樣本\(x\), 目標值\(y\), 和神經網絡參數\(W,b\)的多變量函數.
然后根據\(J\)調整輸出層layer \(L\)的參數\(W^L, b^l\). 先從單個參數開始, 一步步地從實數計算到矩陣計算. 第\(L\)層第\(i\)個神經元的權值參數為\(w^L_i\), 它的第\(j\)個值為\(w^L_{ij}\). 利用chain rule求\(J\)關於它的偏導:
\begin{equation}\label{wholechain}
\frac {\partial J}{\partial w^L_{ij}} = \frac {\partial J}{\partial net^L_{i}} \frac {\partial net^L}{\partial w^L_{ij}}
\end{equation}
\(\frac {\partial J}{\partial net^L_{i}}\)這部分用\(\delta^L_i\)表示, 稱為這個神經元的敏感度, 什么對什么的敏感度呢? 錯誤程度對凈輸出\(net\)的敏感度.
\begin{equation}\label{sensitivityOfLi}
\delta^L_i = \frac {\partial J}{\partial net^L_i} = \frac {\partial J}{\partial a^L_i} \frac{\partial a^L_i}{\partial net^L_i} = \frac {\partial J}{\partial a^L_i} f^{L'}(net^L_i)
\end{equation}
在\(L-1\)層的輸出傳入\(L\)層的時候, 與\(w^L_{ij}\)相乘的值為\(a^{L-1}_j\)
\begin{equation}\label{weightOutput}
\frac {\partial net^L}{\partial w^L_{ij}} = a^{L-1}-j
\end{equation}
將\((\ref{weightOutput})\)與\((\ref{sensitivityOfLi})\)代入\((\ref{wholechain})\)得:
\begin{equation}\label{wholechain2}
\Delta w^L_{ij} = \frac {\partial J}{\partial w^L{ij}} = \delta^L_i a^{L-1}_j
\end{equation}
然后算\(b^L_i\)的偏導:
也就是說神經元的\(bias\)偏導值等於它的敏感度\(\delta\).
接下來看整個神經元的權值梯度:
然后是整個第\(L\)層的權值梯度:
隱層的梯度計算
隱層的計算比輸出層要復雜一些. 先計算第\(l\)層第\(j\)個神經元的敏感度.
麻煩的一部分就是\(\frac {\partial J}{\partial a^l_j}\). 因為\(a^l_j\)會作為輸入的一部分傳入到下一層與它相連的所有神經元里. 因為這里是以全連接的MLP為例, 所以是\(l+1\)層的所有神經元, 若不是全連接層, 如conv層, 就不是\(l+1\)層的所有神經元.
代入上一個式子得:
這是一個很重要的式子, 因為它說明第\(l\)層的神經元敏感度與第\(l+1\)層中跟它連接的神經元敏感度的加權和成正比.
第\(l\)層的敏感度為:
\(\circ\)代表element-wise向量乘法, 例如\((a_1, a_2)\circ(b_1, b_2) = (a_1b_1, a_2b_2)\).
根據之前推導過的輸出層的形式, 可以直接寫出第\(l\)層的權值梯度
bias的梯度值就是當前層的敏感度:
更新參數
以上就是BP算法的核心推導過程了. # 需要記住的要點 可以看出**它的關鍵就在於各層神經元敏感度的計算**. 需要記住**第$l$層的神經元敏感度與第$l+1$層與之連接的神經元敏感度的加權和成正比. 比例因子為各自激活函數的導數值**, 即 $$ \delta^l = W^{l+1} \delta^{l+1} \circ {f^l}'(net^l) $$ 得到敏感度后就可以得到梯度值: $$ \Delta W^l = \delta^l {a^{l-1}}^T $$ $$ \Delta b^l = \delta^l $$