深度学习中,有两种实现非线性的算子。一个是激活函数,另一个就是池化(pooling):
在知乎上面看到一个关于池化的神解释,摘来:
池化=涨水
卷积的目的是为了得到物体的边缘形状
可以想象水要了解山立体的形状
水位低时得出山脚的形状
水位中等时得出山腰的形状
水位高时得出山顶的形状
三点就可以大致描出山的简笔画
池化的过程=升高水位(扩大矩阵网格)
卷积的过程是区分哪里是水,哪里是山
加上一点个人理解:
对于网络结构而言,上面的层看下面的层经过pooling后传上来的特征图,就好像在太空上俯瞰地球,看到的只有山脊和雪峰。这即是对特征进行宏观上的进一步抽象。
那么为什么需要 进行抽象 呢?
因为:经过池化后,得到的是 概要统计特征 。它们不仅 具有低得多的维度 (相比使用所有提取得到的特征),同时还会 改善结果(不容易过拟合) 。
max_pooling: 夜晚的地球俯瞰图,灯光耀眼的穿透性让人们只注意到最max的部分,产生亮光区域被放大的视觉错觉。故而 max_pooling 对较抽象一点的特征(如纹理)提取更好。
average_pooling: 白天的地球俯瞰图,幅员辽阔的地球表面,仿佛被经过了二次插值的缩小,所有看到的都是像素点取平均的结果。故而 average_pooling 对较形象的特征(如背景信息)保留更好。
BP
max_pooling的反向传播
把梯度直接传给前一层最max的像素,其余像素为0。
avg_pooling的反向传播
根据映射关系,把梯度均分成n份传给前一层。
Thinking
选用 max_pooling 还是 average_pooling ,要看需要识别的图像细节特征情况。知乎上说 二者差异不会超过 2% ,这个我深表质疑。
相比之下,个人感觉 max_pooling 是比 average_pooling 更抽象化的操作,因此可以抽象出更高级一点的特征。
由于pooling太过粗暴,操作复杂,目前业界已经逐渐放弃了对pooling的使用。替代方案 如下:
-
采用 Global Pooling 以简化计算;
-
增大conv的 stride 以免去附加的pooling操作。
[1] CNN中一些特殊环节的反向传播
[2] 深度学习cnn中,怎么理解图像进行池化(pooling)后的平移不变性?