这篇工作主要是由我和SENet的作者胡杰一起完成的,也非常感谢HKUST的两位导师 陈启峰和张潼老师的讨论和建议。
本文是对我们CVPR 2021被接收的文章 Involution: Inverting the Inherence of Convolution for Visual Recognition的介绍,同时也分享一些我们对网络结构设计(CNN和Transformer)的理解。
我们的贡献点简单来讲:
(1)提出了一种新的神经网络算子(operator或op)称为involution,它比convolution更轻量更高效,形式上比self-attention更加简洁,可以用在各种视觉任务的模型上取得精度和效率的双重提升。
(2)通过involution的结构设计,我们能够以统一的视角来理解经典的卷积操作和近来流行的自注意力操作。
这部分内容主要来自原文Section 2,Section 3
普通convolution的kernel享有空间不变性(spatial-agnostic)和通道特异性(channel-specific)两大基本特性;而involution则恰恰相反,具有通道不变性(channel-agnostic)和空间特异性(spatial-specific)。
convolution kernel的大小写作1 x 1 x C 0 C_0 C0 x C i C_i Ci x K K K x K K K ,其中 C 0 C_0 C0和 C i C_i Ci分别是输出和输入的通道数目,而 K K K是kernel size,1 x 1 一般不写,代表在H x W 个pixel上共享相同的kernel,即空间不变性,而每个通道C独享对应的kernel则称为通道特异性。convolution的操作可以表述为:
其中 X X X ∈ \in ∈ R H ∗ W ∗ C i R^{H * W*C_i} RH∗W∗Ci是input tensor, Y Y Y ∈ \in ∈ R H ∗ W ∗ C 0 R^{H * W*C_0} RH∗W∗C0是output tensor, F F F ∈ \in ∈ R C 0 ∗ C i ∗ K ∗ K R^{C_0 *C_i* K * K} RC0∗Ci∗K∗K是convolution kernel。
下面我们分开来看卷积的两大特征:
空间不变性
一方面,空间不变性带来的优点包括:1.参数共享,否则参数量激增至 C 0 C_0 C0 x C i C_i Ci x K x K x H x W,2.平移等变性,也可以理解为在空间上对类似的pattern产生类似的响应,其不足之处也很明显:提取出来的特征比较单一,不能根据输入的不同灵活地调整卷积核的参数。
另一方面,因为卷积操作的参数量和计算量中都存在 C C C x C C C x K x K一项,其中通道数量C往往是数百甚至数千,所以为了限制参数量和计算量的规模,K的取值往往较小。我们从VGGNet开始习惯沿用 3 x 3大小的kernel,这限制了卷积操作一次性地捕捉长距离关系的能力,而需要依靠堆叠多个 3 x 3 大小的kernel,这对于感受野的建模在一定程度上不如直接使用大的卷积核更加有效。
通道特异性
之前已经有一些研究低秩近似的工作认为卷积核在通道维度是存在着冗余的,那么卷积核在通道维度的大小就可能可以有所缩减,而不会明显影响表达能力。直观地理解,我们把每个输出通道对应的卷积核铺成一个 C i C_i Ci x K 2 K^2 K2大小的矩阵,那么矩阵的秩不会超过 K 2 K^2 K2,代表其中存在很多的kernel是近似线性相关的。
基于以上分析我们提出了involution,它在设计上与convolution的特性相反,即在通道维度共享kernel,而在空间维度采用空间特异的kernel进行更灵活的建模。involution kernel的大小为 H H H x W W W x K K K x K K K x G G G,其中 G G G<< C C C, 表示所有通道共享G个kernel。involution的操作表达为:
在involution中,我们没有像convolution一样采用固定的weight matrix作为可学习的参数,而是考虑基于输入feature map生成对应的involution kernel,从而确保kernel size和input feature size在空间维度上能够自动对齐。否则的话,例如在ImageNet上使用固定 224 x 224大小的图像作为输入训练得到的权重,就无法迁移到输入图像尺寸更大的下游任务中(比如检测、分割等)。involution kernel生成的通用形式如下:
注意设计不同的kernel生成函数可以得到involution不同的实例化:
比如可以去探索更加精巧的设计来继续发掘involution的潜力,另外通过采用特定的实例化方法也可以将其特例化成为self-attention的形式(见下节)。
在上述一种简单的involution kernel的实例化下,我们得到完整的involution的示意图:
针对输入feature map的一个坐标点上的特征向量,先通过 ϕ \phi ϕ(FC-BN-ReLU-FC)和reshape (channel-to-space)变换展开成kernel的形状,从而得到这个坐标点上对应的involution kernel,再和输入feature map上这个坐标点邻域的特征向量进行Multiply-Add得到最终输出的feature map。具体操作流程和tensor形状变化如下:
反过头来考虑和卷积已有的优点的对比:
总结起来,这种从convolution到involution的设计实际上是在微观粒度(op level)对算力进行了重新的调配,而网络设计的本质就是对算力的分配,目的是将有限的算力调整到最能发挥性能的位置。比如NAS则是在宏观粒度上(network level)通过自动搜索的手段对算力进行了最优配置。
这部分内容主要来自原文Section 4.2
我们知道self-attention可以表达为(为了表达简略,省略了position encoding部分)
如果involution的kernel生成函数选择实例化为
那么self-attention也是involution的某种实例化,因此我们发现involution是更加general的表达形式。
另外 W V W^V WV对应于attention matrix multiplication前对 X X X 做的线性变换,self-attention操作后一般也会接另一个线性变换和残差连接,这个结构正好就对应于我们用involution替换resnet bottleneck结构中的 3 x 3 convolution,前后也有两个 1 x 1 convolution做线性变换。
这里再说一下position encoding的事情:
因为self-attention是permutation-invariant的,所以需要position encoding来区分位置信息,而在本文所实例化的involution单元中,生成的involution kernel中的每个元素本身就是按位置排序的,所以不需要额外的position信息。
另外一些基于pure self-attention构建backbone的工作(比如stand-alone self-attention,lambda networks)已经注意到,仅仅使用position encoding而不是用query-key relation就能达到相当可观的性能,即attention map使用 Q R T QR^T QRT而不是 Q K T QK^T QKT ( R R R是position encoding matrix)。而从我们involution的角度来看,这只不过是又换了一种kernel generation的形式来实例化involution。
因此,我们重新思考self-attention在backbone网络结构中有效的本质可能就是捕捉long-range and self-adaptive interactions,通俗点说是使用一个large and dynamic kernel,而这个kernel用query-key relation来构建则并不是必要的。另一方面,因为我们的involution kernel是单个pixel生成的,这个kernel不太适合扩展到全图来应用,但在一个相对较大的邻域内应用还是可行的(如 7 x 7, 9 x 9),这同时也说明了CNN设计中的locallity依然是宝藏,因为即使用global self-attention,网络的浅层也很难真的利用到复杂的全局信息。
所以我们所采用的involution去除了self-attention中很多复杂的东西,比如我们仅使用单个pixel的特征向量生成involution kernel(而不是依靠pixel-to-pixel correspondence生成attention map),在生成kernel时隐式地编码了pixel的位置信息(丢弃了显式的position encoding),从而构建了一个非常干净高效的op。
既然讨论到了self-attention,就不得不提到最近很火的ViT类工作。针对backbone结构来说,我们认为pure self-attention或者involution model 优于 CNN 优于 ViT (transformer做decoder的可能有其他妙处,比如在DETR中,暂且按下不表。)
ViT很多人也讨论过了,底层的linear projection其实类似于convolution,高层用global self-attention抽取relation,可以抽象为convolution接self-attention的混合模型。这种混合结构的提出本身是合理的,在低层用convolution提取low-level信息,在高层用self-attention建模高阶的语义关系。
可是ViT的底层的conv部分做的太不充分了,受制于self-attention爆炸的计算量,在输入端直接把图像切分成16x16的patch,输入feature size基本上相当于已经到了深如resnet倒数第二个stage的feature size,网络底层对于更细节的图像信息利用的非常不到位,而中间处理阶段也没有feature size递减的变换。
因此ICLR’21上提出的ViT结构设计本来就存在很不科学的地方,最近一些改进ViT的工作基本上也可以总结为在ViT中加入更多的spatial维度细化的self-attention操作(patch局部化或再细分,引入convolution的特性),某种意义上是在把ViT变得更像pure self-attention/involution based model。
因此,无论是convolution,self-attention还是新的involution都是message passing和feature aggregation的组合形式,尽管外表各异,本质上没有必要割裂开来看。
总体来说:
ImageNet图像分类
我们使用involution替换ResNet bottleneck block中的 3 x 3 convolution得到了一族新的骨干网络,RedNet,性能和效率优于ResNet和其他self-attention做op的SOTA模型。
COCO目标检测和实例分割
其中fully involution-based detectors(involution用在backbone,neck和head)在保证性能略有提升或不变的前提下,能够将计算复杂度减至~40%
Cityscapes语义分割
值得一提的是,COCO检测任务中针对大物体的指标 A P L AP_L APL提升最多(3%-4%),Cityscapes分割任务中也是大物体(比如墙,卡车,公交车等)的单类别IoU提升最明显(高达10%甚至20%以上),这也验证了我们在之前分析中所提到的involution相比于convolution在空间上具有动态建模长距离关系的显著优势。
最后,这篇工作也留了一些坑供大家进一步探索:
李铎,香港科技大学计算机系二年级研究生,本科毕业于清华大学计算机系,于 ICCV, CVPR, ECCV 等国际计算机视觉顶级会议发表论文 10 篇,曾在 Intel,NVIDIA,SenseTime,ByteDance 实习,曾获 2020 年度 CCF-CV 学术新锐奖,主页 https://duoli.org
转载链接:内卷算子