问题
- CNN在反向传播中需要逐层向前求梯度,而pooling层没有可学习的参数,那它是如何进行反向传播的呢?
- CNN中为什么要加入pooling层,他的作用是什么呢?
Pooling层
CNN一般采用average pooling或max pooling来进行池化操作,而池化操作会改变feature map的大小,例如大小为64×64的feature map使用2×2的步长池化后,feature map大小为32×32。因此,这会使得在反向传播中,pooling层的梯度无法与前一层相对应。
那怎么解决这个问题呢?其实也很简单,可以理解为就是pooling操作的一个逆过程,把一个像素的梯度传递给4个像素,保证传递的loss(或梯度)总和不变。下面分别来看average pooling和max pooling的反向传播操作过程。
average pooling
average pooling在前向传播中,就是把一个patch中的值取平均传递给下一层的一个像素。因此,在反向传播中,就是把某个像素的值平均分成 n 份分配给上一层。(!!注意这里是分成 n 份,而不是将该元素的值复制 n 份,不然会使得loss之和变为原来的 n 倍,造成梯度爆炸。)
max pooling
max pooling在前向传播中,把一个patch中最大的值传递给下一层,其他值会被舍弃掉。因此,在反向传播中,就是将当前梯度直接传递给前一层的某个像素,而让同一个patch中的其他像素值为0。
所以,max pooling和average pooling不同的是,**max pooling在前向传播的时候要记录池化操作时哪个像素的值是最大的,**即max_id,在反向传播中才能将其对应起来。
总结
pooling层没有可学习的参数,在CNN的反向传播中,pooling层需要做的仅仅是将误差传递到上一 层,而没有计算梯度的过程。
Pooling层的作用
两种pooling层的原理其实很容易就理解了,那它的作用又是什么呢, CNN中为什么要加pooling层?下面汇总一下几位大佬的解释:
- 增加非线性。
- 保留主要的特征的同时减少参数,类似于PCA降维,防止过拟合,提高模型的泛化能力。
- invariance不变性
1.平移不变性
例如下面一个数字识别的例子,左边下图(大小为16×16)中的数字 1 比上图中的向右偏了一个单位,但是经过max pooling层之后,都变成了8×8的feature map。平移不变性体现在,max pooling之后,原图中的a(或b)最终都会映射到相同的位置(这句话的应该可以理解为原来feature map中的特征保持不变?比如a和b的位置不会错开,而是保持了相对位置从而保持了原来的主要特征)。
此外,图像主要的特征捕获到了,同时又将问题的规模从16×16降到了8×8(降维)。
2.旋转不变性
下图表示汉字“一”的识别,第一张相对于x轴有倾斜角,第二张是平行于x轴,两张图片相当于做了旋转,经过多次max pooling后具有相同的特征。
尺度不变性
下图表示数字“0”的识别,第一张的“0”比较大,第二张的“0”进行了较小,相当于作了缩放,同样地,经过多次max pooling后具有相同的特征。
Pooling的缺点
pooling能够增大感受野,让卷积能看到更多的信息,但是在降维的过程中也会丢失一部分信息(只留下了它认为重要的信息)。比如对segmentation要求的精度location会有一定的影响。