论文:https://arxiv.org/abs/2111.11418
代码: https://github.com/sail-sg/poolformer
首先,看到这个文章的名字,就知道它肯定跟attention和transform有关,经典文章:attention is all your need在脑海中飘过。。。
1.论文主要贡献
本文主要有两个创贡献,一个式提出了一种MeatFormer结构,另一个式成功将MeatFormer应用于图像分类、目标检测、语义分割等任务中。
2.网络结构
左图第一列是MeatFormer的网络,作者认为transformer最核心的地方就是token mixer,在不同transformer中,token mixer的表现形式不尽相同,有的是attention,有的是空间MLP,而本文的poolformer是用一个pooling 层来实现token mixer的作用。右图是token mixer在ImageNet-1K上的验证集表现。
2.1MeatFormer
首先,将输入影像送入input embedding层,于ViT类似,然后将结果送入两个MeatFormer模块中。
2.2PoolFormer
纵观各种transformer大法,他们大量的工作都集中在设计各种基于注意机机制的token mixer模块中,而作者认为这些类似于MLP模型的transformer的成功都得益于MetaFormer结构,为了验证这个想法,作者设计了简单的pooling层作为token mixer,这个操作没有任何可学习参数,而且他只是每个token 都平均融合它附近的token 特征。
假设输入是维度的,那么pooling操作可以表示为:
K为pooling size。
self-attention和空间MLP会由于token的数量而导致计算复杂度较大,而且,MLP在处理长序列时会带来更多的可学习参数,因此,self-attention和空间MLP智能处理几百个长度的tokens,而pooling操作的计算复杂度和token的长度时线性关系,且没有可学习参数。整个PoolFormer的结构如下图所示。
pool操作的伪代码如下图:
从图二可以看到pool操作可以减小图像的尺寸,从Pooling 操作的公式就可以看出。
直观的看,不容易看出这个pooling的关系,我们假设K=3*3,i=j=1
即就是,对每个token临近的K*K个块中的token进行均值化处理,再减去原始token值,得到每个token的残差,这里有点不是很理解作者为什么要减去原始的token值,有理解的童鞋欢迎留言交流。从伪代码中也能看出最后一步就是减去了原始token值。
还有一个细节,就是本文的pooling操作本身没有改变图像的尺寸,因为它不是将K*K个token处理成一个token,这是与正常卷积神经网络的pooling层不一样的地方,从伪代码里可以看出,pooling的stride=1,也就是每次根据K*K个邻域更新中间的token值,迭代完整个token矩阵,就相当于更新了token矩阵,不会改变尺寸,但是从图2中又能看到每个stage之后,图像的尺寸不断缩小,每次缩小为原来的1/2,这是为啥呢?答案在下面这个表里。
从上面这个表格可以看到:
stage1:patch_size=7*7,stride=4,尺寸从H*W ---> H/4 *W/4
stage2:patch_size=3*3,stride=2,尺寸从H/4 *W/4 ---> H/8 *W/8
stage3:patch_size=3*3,stride=2,尺寸从H/8 *W/8 ---> H/16 *W/16
stage4:patch_size=3*3,stride=2,尺寸从H/16 *W/16 ---> H/32 *W/32
哦,恍然大悟,原来是在patch embedding的时候改变了尺寸,pooling没有改变尺寸。
3.实验
话不多说,直接从精度和计算量上感受压迫感十足的PoolFormer吧!
3.1图像分类
3.2目标检测