Pooling 池化层
一.定义
pooling 是仿照人的视觉系统进行降维(降采样),用更高层的抽象表示图像特征。
二.作用
池化层对特征图进行压缩。1.使特征图变小,简化网络计算复杂度,减少下一层的参数和计算量,防止过拟合;2.进行特征压缩,提取特征,保留主要的特征;保持某种不变性,包括平移、(旋转?)和尺度,尺度不变性也就是增大了感受野。
另:关于池化层增大感受野问题。即这个0原来被16X16的表示,经过pooling后,可以用4X4的图表示了。
那我为了增大感受野,我一开始就用跟图像一样大的卷积核,那不就感受野更大了?
不行,因为卷积层越深模型的表征能力越强,即卷积次数越多越好,你用跟图像一样大的,得到了1X1的feature map,但是一下降维这么多,会导致很多重要信息丢失,你再进行卷积的时候效果就没那么好了。你说降维导致信息丢失,那即使第一次不降维到1X1到最后面也会降维到1X1或者很低的维度信息不一样丢失了吗?一次降维到1X1会导致一次性失信息太多了,之后的卷积的表征能力就没那么强了,而逐渐降维一次性丢失的信息没有那么多,所以以后每一次卷积表征能力相对一次性降维更强。
池化操作除了能够明显降低参数量外,还能够保持对平移、伸缩、旋转操作的不变性。平移不变性是指输出结果对输入的小量平移基本保持不变。例如输入为(1,5,3),最大池化将会取5,如果将输入右移一位得到(0,1,5),输出的结果仍为5。对伸缩的不变性(一般称为尺度不变性)可以这样理解,如果原先神经元在最大池化操作之后输出5,那么在经过伸缩(尺度变换)后,最大池化操作在该神经元上很大概率的输出仍然为5。因为神经元感受的是邻域输入的最大值,而并非某一个确定的值。旋转不变性,可见P226。多个过滤器学到不同旋转方向的???
三.种类
最常见的池化操作为最大池化和平均池化:
最大池化 Max Pooling
前向传播:选图像区域的最大值作为该区域池化后的值。
反向传播:梯度通过最大值的位置传播,其它位置梯度为0。
平均池化 Average Pooling(也称mean pooling)
前向传播:计算图像区域的平均值作为该区域池化后的值。
反向传播:梯度取均值后分给每个位置。
Global Pooling
“global pooling”就是pooling的滑窗size和整张feature map的size一样大。这样,每个 W×H×C 的feature map输入就会被转化为 1×1×C 输出。因此,其实也等同于每个位置权重都为 1/(W×H)的FC层操作。等同于输入tensor,输出vector。
“global pooling”在滑窗内的具体pooling方法可以是任意的,所以就会被细分为“global avg pooling”、“global max pooling”等。
对比:均值池化通过对领域内数值求平均来实现,能够抑制由于邻域大小受限造成估计值方差增大的现象,特点是对背景的保留效果更好。最大池化则通过取邻域内特征的最大值来实现,能够抑制网络参数误差造成估计均值偏移的现象,特点是能够更好的提取纹理信息。特殊的池化方式还包括对相邻重叠区域的池化以及空间金字塔池化。相邻重叠区域的池化,是采用比窗口宽度更小的步长,使得窗口在每次滑动时存在重叠的区域。空间金字塔池化主要考虑了多尺度信息的描述。例如同时计算1*1、2*2、4*4的矩阵的池化并将结果拼接在一起作为下一个网络层的输入。
四.反向传播
CNN网络中另外一个不可导的环节就是Pooling池化操作,因为Pooling操作使得feature map的尺寸变化,假如做2×2的池化,假设那么第k+1层的feature map有16个梯度,那么第k层就会有64个梯度,这使得梯度无法对位的进行传播下去。其实解决这个问题的思想也很简单,就是把1个像素的梯度传递给4个像素,但是需要保证传递的 loss(或者梯度)总和不变。根据这条原则,mean pooling和max pooling的反向传播也是不同的。
1、mean pooling
mean pooling的前向传播就是把一个patch中的值求取平均来做pooling,那么反向传播的过程也就是把某个元素的梯度等分为n份分配给前一层,这样就保证池化前后的梯度(残差)之和保持不变,还是比较理解的,图示如下 :
mean pooling比较容易让人理解错的地方就是会简单的认为直接把梯度复制N遍之后直接反向传播回去,但是这样会造成loss之和变为原来的N倍,网络是会产生梯度爆炸的。
2、max pooling
max pooling也要满足梯度之和不变的原则,max pooling的前向传播是把patch中最大的值传递给后一层,而其他像素的值直接被舍弃掉。那么反向传播也就是把梯度直接传给前一层某一个像素,而其他像素不接受梯度,也就是为0。所以max pooling操作和mean pooling操作不同点在于需要记录下池化操作时到底哪个像素的值是最大,也就是max id,这个变量就是记录最大值所在位置的,因为在反向传播中要用到,那么假设前向传播和反向传播的过程就如下图所示 :
五.输入输出分析
六.参数计算量分析
池化层没有要学习的参数。
池化的计算量:
(输出的角度来考虑,输出的feature map上每一个通道上的每一个点就对应着输入feature map同样通道的上的一个k * k 区域的 max ,sum或者avg池化操作,所以 pooling flops = BatchSize * Cout * Hout * Wout * k * k )
六.缺点
虽然pooling能够增大感受野,让卷积看到更多的信息,但是它在降维的过程中丢失了一些信息(因为毕竟它变小了嘛,只留下了它认为重要的信息),降低了分辨率。