池化到底有什么用 pooling

时间:2024-04-06 08:28:02

部分内容转载自:https://mp.weixin.qq.com/s/sS75fWhgcIW2w2JCbs8YKQ

今天来说说深度学习中的池化问题,包含池化的种类,作用机制以及最新的思考。

1 池化还要不要了

通常我们认为,池化可以增加网络对于平移的不变性,对于网络的泛化能力的提升是非常关键的。不过,到底能起到多大的正向作用,却是被很多人怀疑的。

首先是Hinton,还记得Hinton提出的Capsule Module吧。他认为池化的使用就是一个大错误,而它有效又反而是一个大灾难。池化固然可以提供一些平移和旋转不变性,但是也破坏了图像中的姿态和空间等信息,对检测分割等高级任务有影响,所以才提出胶囊网络(CapsuleNetwork)。至于这个发展的怎么样了,笔者没有关注,但是从大佬敢于革自己的“本命”这一点,就说明这个问题确实有点严重。

Hinton虽然指出了pooling的坏影响,但是无法否定其好处,那么池化是不是真的能够提升网络的泛化能力呢?

首先站出来好好回答这个问题的是斯坦福大学Eric Kauderer-Abrams的研究【1】,它们通过一个平移敏感图来进行研究。

这个平移敏感图长下面这样,它评估的就是一个网络的输出对于输入的平移的敏感度。

池化到底有什么用 pooling

上面这个图是这么算的,首先用原图计算预测特征分数,然后用平移过的图计算预测特征分数,最后计算两者的归一化分数,越亮说明越相关。x和y分别就是偏移量,可以看到x,y都接近0的时候越亮,说明越相关,然后就随着距离的增强而降低。

这就是说平移越大之后,对性能的影响越大,毕竟一个网络不可能拥有完全的平移不变性。

在这个基础上,他们就做实验了,结果如下,c表示卷积,p表示pooling,aug表示数据增强,所以这里就是比较pooling和aug对性能的影响,结果表明池化不池化的,好像没有什么用,而数据增强做不做得好,才是关键。结果说明CNN本身没什么平移不变性,是靠数据学来的。

池化到底有什么用 pooling

上面做了实验,但是没有更深层次地分析,为什么池化就没有用了呢,这可是违反我们的常识的。

池化到底有什么用 pooling

DeepMind的研究【2】给出了一个比较有说服力的解答,实验的设置差不多,使用非池化和各种池化的网络结构。

池化到底有什么用 pooling总之结论就是:看上面的4个图

(a) 刚开始的时候池化确实有利于提高抗变形能力。

(b) 不管池化不池化,模型最后学习完都能获得同样的抗变形能力。

(c) 初始化的时候不同的池化方法是有差异的。

(d) 学习完之后不管什么池化方法效果都差不多。

 

那总得有个理由吧?他们给出的理由是卷积核本身参数越平滑才越能提高对平移的稳定性,文中在卷积操作后面串接平滑操作,实验对比如下。

池化到底有什么用 pooling

这也没毛病对吧,卷积核都平滑了,当然就没有那么敏感了。

 

暂且先总结一下吧:池化什么的不重要了,搞数据增强才是正道。

 

2 什么是池化

 

上面都这么说了,接下来说池化略有点尴尬,但是作为知识体系的重要一环,还是有必要讲述。

pooling,小名池化,思想来自于视觉机制,是对信息进行抽象的过程。


 

池化到底有什么用 pooling

上图就是一个池化的示意图,用了一个10*10的卷积核,对20*20的图像分块不重叠的进行了池化,池化之后feature map为2*2的大小。

pooling有什么用呢?或者说为什么需要pooling呢?原因有几个:

 

1、增大感受野

 

所谓感受野,即一个像素对应回原图的区域大小,假如没有pooling,一个3*3,步长为1的卷积,那么输出的一个像素的感受野就是3*3的区域,再加一个stride=1的3*3卷积,则感受野为5*5。

 

假如我们在每一个卷积中间加上3*3的pooling呢?很明显感受野迅速增大,这就是pooling的一大用处。感受野的增加对于模型的能力的提升是必要的,正所谓“一叶障目则不见泰山也”。

 

2、平移不变性

 

我们希望目标的些许位置的移动,能得到相同的结果。因为pooling不断地抽象了区域的特征而不关心位置,所以pooling一定程度上增加了平移不变性。

 

3、降低优化难度和参数

 

我们可以用步长大于1的卷积来替代池化,但是池化每个特征通道单独做降采样,与基于卷积的降采样相比,不需要参数,更容易优化。全局池化更是可以大大降低模型的参数量和优化工作量。

 

3 池化有哪些

1、平均池化和最大池化

池化到底有什么用 pooling

这是我们最熟悉的,通常认为如果选取区域均值(mean pooling),往往能保留整体数据的特征,较好的突出背景信息;如果选取区域最大值(max pooling),则能更好保留纹理特征。

 

2、stochastic pooling/mixed pooling

stochastic pooling对feature map中的元素按照其概率值大小随机选择,元素被选中的概率与其数值大小正相关,这就是一种正则化的操作了。mixed pooling就是在max/average pooling中进行随机选择。

池化到底有什么用 pooling池化到底有什么用 pooling池化到底有什么用 pooling

3、Data Driven/Detail-Preserving Pooling

 

上面的这些方法都是手动设计,而现在深度学习各个领域其实都是往自动化的方向发展。

 

我们前面也说过,从**函数到归一化都开始研究数据驱动的方案,池化也是如此,每一张图片都可以学习到最适合自己的池化方式。

 

此外还有一些变种如weighted max pooling,Lp pooling,generalization max pooling就不再提了,还有global pooling。

 

4 总结

带步长的卷积虽然不需要池化,却没有了灵活的**机制。平均池化稳扎稳打,却丢失了细节。最大池化克服了平均池化的缺点,却打断了梯度回传。

 

最终发现,池化也还是要学的好,所谓随机应变,盖莫如此。另外,如何选择好用于池化的区域,也是一门学问。

 

 

参考文献

 

[1] Kaudererabrams E. Quantifying Translation-Invariance in Convolutional Neural Networks.[J]. arXiv: Computer Vision and Pattern Recognition, 2018.

[2] Ruderman A, Rabinowitz N C, Morcos A S, et al. Pooling is neither necessary nor sufficient for appropriate deformation stability in CNNs[J]. arXiv: Computer Vision and Pattern Recognition, 2018.

今天来说说深度学习中的池化问题,包含池化的种类,作用机制以及最新的思考。

 

1 池化还要不要了

 

通常我们认为,池化可以增加网络对于平移的不变性,对于网络的泛化能力的提升是非常关键的。不过,到底能起到多大的正向作用,却是被很多人怀疑的。

 

首先是Hinton,还记得Hinton提出的Capsule Module吧。他认为池化的使用就是一个大错误,而它有效又反而是一个大灾难。池化固然可以提供一些平移和旋转不变性,但是也破坏了图像中的姿态和空间等信息,对检测分割等高级任务有影响,所以才提出胶囊网络(CapsuleNetwork)。至于这个发展的怎么样了,笔者没有关注,但是从大佬敢于革自己的“本命”这一点,就说明这个问题确实有点严重。

 

Hinton虽然指出了pooling的坏影响,但是无法否定其好处,那么池化是不是真的能够提升网络的泛化能力呢?

 

首先站出来好好回答这个问题的是斯坦福大学Eric Kauderer-Abrams的研究【1】,它们通过一个平移敏感图来进行研究。

 

这个平移敏感图长下面这样,它评估的就是一个网络的输出对于输入的平移的敏感度。

池化到底有什么用 pooling

上面这个图是这么算的,首先用原图计算预测特征分数,然后用平移过的图计算预测特征分数,最后计算两者的归一化分数,越亮说明越相关。x和y分别就是偏移量,可以看到x,y都接近0的时候越亮,说明越相关,然后就随着距离的增强而降低。

 

这就是说平移越大之后,对性能的影响越大,毕竟一个网络不可能拥有完全的平移不变性。

 

在这个基础上,他们就做实验了,结果如下,c表示卷积,p表示pooling,aug表示数据增强,所以这里就是比较pooling和aug对性能的影响,结果表明池化不池化的,好像没有什么用,而数据增强做不做得好,才是关键。结果说明CNN本身没什么平移不变性,是靠数据学来的。

池化到底有什么用 pooling

上面做了实验,但是没有更深层次地分析,为什么池化就没有用了呢,这可是违反我们的常识的。

池化到底有什么用 pooling

DeepMind的研究【2】给出了一个比较有说服力的解答,实验的设置差不多,使用非池化和各种池化的网络结构。

池化到底有什么用 pooling总之结论就是:看上面的4个图

(a) 刚开始的时候池化确实有利于提高抗变形能力。

(b) 不管池化不池化,模型最后学习完都能获得同样的抗变形能力。

(c) 初始化的时候不同的池化方法是有差异的。

(d) 学习完之后不管什么池化方法效果都差不多。

 

那总得有个理由吧?他们给出的理由是卷积核本身参数越平滑才越能提高对平移的稳定性,文中在卷积操作后面串接平滑操作,实验对比如下。

池化到底有什么用 pooling

这也没毛病对吧,卷积核都平滑了,当然就没有那么敏感了。

 

暂且先总结一下吧:池化什么的不重要了,搞数据增强才是正道。

 

2 什么是池化

 

上面都这么说了,接下来说池化略有点尴尬,但是作为知识体系的重要一环,还是有必要讲述。

pooling,小名池化,思想来自于视觉机制,是对信息进行抽象的过程。


 

池化到底有什么用 pooling

上图就是一个池化的示意图,用了一个10*10的卷积核,对20*20的图像分块不重叠的进行了池化,池化之后feature map为2*2的大小。

pooling有什么用呢?或者说为什么需要pooling呢?原因有几个:

 

1、增大感受野

 

所谓感受野,即一个像素对应回原图的区域大小,假如没有pooling,一个3*3,步长为1的卷积,那么输出的一个像素的感受野就是3*3的区域,再加一个stride=1的3*3卷积,则感受野为5*5。

 

假如我们在每一个卷积中间加上3*3的pooling呢?很明显感受野迅速增大,这就是pooling的一大用处。感受野的增加对于模型的能力的提升是必要的,正所谓“一叶障目则不见泰山也”。

 

2、平移不变性

 

我们希望目标的些许位置的移动,能得到相同的结果。因为pooling不断地抽象了区域的特征而不关心位置,所以pooling一定程度上增加了平移不变性。

 

3、降低优化难度和参数

 

我们可以用步长大于1的卷积来替代池化,但是池化每个特征通道单独做降采样,与基于卷积的降采样相比,不需要参数,更容易优化。全局池化更是可以大大降低模型的参数量和优化工作量。

 

3 池化有哪些

1、平均池化和最大池化

池化到底有什么用 pooling

这是我们最熟悉的,通常认为如果选取区域均值(mean pooling),往往能保留整体数据的特征,较好的突出背景信息;如果选取区域最大值(max pooling),则能更好保留纹理特征。

 

2、stochastic pooling/mixed pooling

 

 

stochastic pooling对feature map中的元素按照其概率值大小随机选择,元素被选中的概率与其数值大小正相关,这就是一种正则化的操作了。mixed pooling就是在max/average pooling中进行随机选择。

 

3、Data Driven/Detail-Preserving Pooling

 

上面的这些方法都是手动设计,而现在深度学习各个领域其实都是往自动化的方向发展。

 

我们前面也说过,从**函数到归一化都开始研究数据驱动的方案,池化也是如此,每一张图片都可以学习到最适合自己的池化方式。

 

此外还有一些变种如weighted max pooling,Lp pooling,generalization max pooling就不再提了,还有global pooling。

 

4 总结

带步长的卷积虽然不需要池化,却没有了灵活的**机制。平均池化稳扎稳打,却丢失了细节。最大池化克服了平均池化的缺点,却打断了梯度回传。

 

最终发现,池化也还是要学的好,所谓随机应变,盖莫如此。另外,如何选择好用于池化的区域,也是一门学问。

 

 

参考文献

 

[1] Kaudererabrams E. Quantifying Translation-Invariance in Convolutional Neural Networks.[J]. arXiv: Computer Vision and Pattern Recognition, 2018.

[2] Ruderman A, Rabinowitz N C, Morcos A S, et al. Pooling is neither necessary nor sufficient for appropriate deformation stability in CNNs[J]. arXiv: Computer Vision and Pattern Recognition, 2018.