CNN中的反向傳播

Pooling層的反向傳播

我們知道Pooling操作會使得feature map的尺寸發生變化,假如做2×22×2的池化,假設l+1l+1層的feature map有16個梯度,那麼第ll層應該需要64個梯度,做法很簡單,只需要把1個像素的梯度反向傳給4個像素即可,但是要保證

傳遞的梯度總和不變 。由於有這條原則,因此avg pooling和max pooling的反向傳播並不相同

1. avg pooling

avg pooling的前向傳播就是把一個patch(窗口)內的值求和取平均。那麼反向傳播的過程就是把某個元素的梯度等分成n份,分配給前一層,這樣就保證了池化前後的 梯度之和保持不變 ,還是比較好理解的,圖示如下

CNN中的反向傳播

avg pooling比較容易讓人理解錯的地方就是以為梯度直接複製N遍,但是這樣會造成loss之和變為原來的N倍,網絡會發生梯度爆炸

max pooling

max pooling也要滿足梯度之和不變的原則,max pooling的前向傳播是把patch中最大的值傳給後一層,而其他像素的值直接被捨棄掉。那麼反向傳播也就是把這個梯度直接傳給前一層某一像素,兒其它像素不接受梯度,也就是0。max pooling和avg pooling操作的不同點在於需要記錄池化時,到底哪個像素的值是最大的,也就是 max_id ,這個可以看caffe的源碼的pooling_layer.cpp,下面是caffe框架max pooling部分的源碼

<code>// If max pooling, we will initialize the vector index partif (this->layer_param_.pooling_param().pool() == PoolingParameter_PoolMethod_MAX    && top.size() == 1) {    max_idx_.Reshape(bottom[0]->num, channels_, pooled_height_, pooled_width_);}/<code>

源碼中有一個名為 max_idx_ 的變量,這個變量記錄的就是最大值所在的位置,因為在反向傳播中要用到。前向傳播和反向傳播的過程如下圖所示

CNN中的反向傳播


分享到:


相關文章: