要套用DNN的反向傳播算法到CNN,有幾個問題需要解決:
1)池化層沒有激活函數,這個問題倒比較好解決,我們可以令池化層的激活函數為σ(z)=z,即激活後就是自己本身。這樣池化層激活函數的導數為1.
2)池化層在前向傳播的時候,對輸入進行了壓縮,那麼我們現在需要向前反向推導δl−1,這個推導方法和DNN完全不同。
3) 卷積層是通過張量卷積,或者說若干個矩陣卷積求和而得的當前層的輸出,這和DNN很不相同,DNN的全連接層是直接進行矩陣乘法得到當前層的輸出。這樣在卷積層反向傳播的時候,上一層的δl−1遞推計算方法肯定有所不同。
4)對於卷積層,由於W使用的運算是卷積,那麼從δl推導出該層的所有卷積核的W,b的方式也不同。
從上面可以看出,問題1比較好解決,而問題2,3,4也是解決CNN反向傳播算法的關鍵所在。另外要注意到的是DNN中的al,zl都只是一個向量,而我們CNN中的al,zl都是一個三維的張量,即由若干個輸入的子矩陣組成。
下面我們就針對問題2,3,4來一步步研究CNN的反向傳播算法。在研究過程中,需要注意的是,由於卷積層可以有多個卷積核,各個卷積核的處理方法是完全相同且獨立的,為了簡化算法公式的複雜度,我們下面提到卷積核都是卷積層中若干卷積核中的一個。