关于池化的一些思考-2022
引言
神经网络中的池化 (pooling
):对输入数据进行降采样,减小输入数据的分辨率。
除了batch size,数据本身的分辨率和特征通道数是影响网络
计算量和参数量的重要指标。池化会降低数据分辨率,从而减少计算量。从另一个角度来看,低分辨率的数据可以使用更少的特征通道数 (网络参数) 来拟合特征,从而减少了网络参数量。
本文对主流池化方法进行总结,并提出一些猜想:
池化的效果往往在高分辨率的输入上有很好的体现,低分辨率的数据可能并不需要池化
池化的有效性也许并不归功于池化的方法,反而只要是数据分辨率的降低往往都能得到很好的效果
池化的方法 – 结构化 or 非结构化? :是否依赖输入数据的结构
一、结构化(平均池化、最大池化?)
- 我将以矩阵形式的池化方法称之为
结构化
的池化。
1.1 平均池化、最大池化等
目前用的最广泛的池化方法:平均池化、最大池化 – 简单 有效1。
还有很多池化的方法:随机池化、组合池化、金字塔池化等等2
1.2 Strip Pooling
论文地址3:Strip Pooling: Rethinking Spatial Pooling for Scene Parsing
条状池化是一种很新颖、大胆的池化方法,之前提到的池化方法大多是基于一个
n
×
n
n \times n
n×n的矩阵,还算比较规则,没想到基于某一行或者某一列 (
1
×
n
1 \times n
1×n) 的池化也能取得这么好的效果:
其与之前池化的方式对比如下图:
1.3 塌边 (面) 池化 - 三角网格
之前提到的都是标准矩阵形式的池化,这种池化方法并不适用于三维的数据。单以三角网格来说,将网格传统简化方式推广到网络的池化是一个不错的方向。
MeshCNN将塌边作为池化方法,推广到三角网格上:
测试了一下,没有塌边池化的话,只使用论文里边的卷积:在SHREC (500个面) 分类上性能差不多,COSEG 分割准确率会降低2 - 3%。
直接将塌面引入到网格池化是很复杂的,SubdivNet另辟蹊径先Remesh再池化:
Subdivision使三角网格也具有类似图像的一些规则结构
以上需要构造一个矩阵 - 池化之前到池化之后的特征映射矩阵
二、非结构化(聚类、Top_k?)
- 我将以聚类或者排序等形式的池化方法称之为
非结构化
的池化。
2.1 三维点云
先以点云举例,它是离散、杂乱无章、毫无结构可言的,目前主流的池化或者降采样的方法是最远点采样 (Farthest Point Sampling)
论文地址6:PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space
主要使用的就是根据距离排序的方法对点云下采样,使用最大池化处理点云无序问题 存疑:仅仅是最大池化是否忽略了很多潜在的信息
2.2 Graph - 图
PDMesh将三角网格转换成了图,引入了图顶点合并作为池化的方法
2.3 Transformer - 图像
从二维到三维的规则池化,然后再从三维回到二维
近些年2D图像上的Transformer不光引入了图像的位置编码、自注意力,还有Token的池化…
论文地址9:PSViT: Better Vision Transformer via Token Pooling and Attention Sharing
论文地址10:Token Pooling in Vision Transformers
论文地址11:MetaFormer Is Actually What You Need for Vision
印象最深刻的还是MetaFormer
这篇论文,没有华丽的池化,只有简单的平均池化就有非常好的效果:
展示了网络架构的力量…
三、讨论
关于池化其实还是有很多争议:
CNN真的需要下采样(上采样)吗?
CNN一定需要池化层吗?
假如算力无限制,设计卷积神经网络(CNN)的过程中还需要池化(pooling)吗?
就目前的情况,池化应该是不可或缺的,因为不管是最新的研究还是很多神经网络的落地,都用到了池化
但是如果网络的输入只是低分辨率的数据,私以为去掉池化也无妨:
有没有这样一种可能的解决方案:预处理 (下采样) -> 网络 (无池化) -> 后处理 (上采样 or 其他)