导语:在这项工作中,正在攻读香港科学技术大学计算机科学与工程系硕士学位的李铎,在陈启峰教授和张潼教授的指导下,提出了一种新型的神经网络算子——involution,名字很“内卷”,实力却“拒绝内卷”。
李铎表示, involution比 convolution(卷积)更高效,比 self-attention(自注意力)更简单。
作者 | 李铎 编辑 | 陈彩娴 来源 | AI科技评论
本文是对我们CVPR 2021被接收的文章“Involution: Inverting the Inherence of Convolution for Visual Recognition”的介绍,同时也分享一些我们对网络结构设计(CNN和Transformer)的理解。
我们的贡献点主要有两点:
(1)提出了一种新的神经网络算子(operator或op)称为involution,它比convolution更轻量更高效,形式上比self-attention更加简洁,可以用在各种视觉任务的模型上取得精度和效率的双重提升。
(2)通过involution的结构设计,我们能够以统一的视角来理解经典的卷积操作和近来流行的自注意力操作。
这篇工作主要是由我和 SENet 的作者胡杰一起完成的,也非常感谢HKUST的两位导师陈启峰和张潼老师的讨论和建议。
论文链接:https://arxiv.org/pdf/2103.06255.pdf
代码链接:https://github.com/d-li14/involution
1
与卷积的反对称性
这部分内容主要来自论文里的Section 2,Section 3
普通convolution的kernel享有空间不变性(spatial-agnostic)和通道特异性(channel-specific)两大基本特性;而involution则恰恰相反,具有通道不变性(channel-agnostic)和空间特异性(spatial-specific)。
convolution kernel的大小写作 ,其中 和 分别是输出和输入的通道数目,而 是kernel size, 一般不写,代表在 个pixel上共享相同的kernel,即空间不变性,而每个通道C独享对应的kernel则称为通道特异性。convolution的操作可以表达为:
其中 是input tensor, 是output tensor, 是convolution kernel。
下面我们分开来看卷积的两大特性:
空间不变性
一方面,空间不变性带来的优点包括:1.参数共享,否则参数量激增至 ,2.平移等变性,也可以理解为在空间上对类似的pattern产生类似的响应,其不足之处也很明显:提取出来的特征比较单一,不能根据输入的不同灵活地调整卷积核的参数。
另一方面,因为卷积操作的参数量和计算量中都存在 一项,其中通道数量C往往是数百甚至数千,所以为了限制参数量和计算量的规模,K的取值往往较小。我们从VGGNet开始习惯沿用 大小的kernel,这限制了卷积操作一次性地捕捉长距离关系的能力,而需要依靠堆叠多个 大小的kernel,这对于感受野的建模在一定程度上不如直接使用大的卷积核更加有效。
通道特异性
之前已经有一些研究低秩近似的工作认为卷积核在通道维度是存在着冗余的,那么卷积核在通道维度的大小就可能可以有所缩减,而不会明显影响表达能力。直观地理解,我们把每个输出通道对应的卷积核铺成一个 大小的矩阵,那么矩阵的秩不会超过 ,代表其中存在很多的kernel是近似线性相关的。
基于以上分析我们提出了involution,它在设计上与convolution的特性相反,即在通道维度共享kernel,而在空间维度采用空间特异的kernel进行更灵活的建模。involution kernel的大小为 ,其中 ,表示所有通道共享G个kernel。involution的操作表达为:
其中 是involution kernel。
在involution中,我们没有像convolution一样采用固定的weight matrix作为可学习的参数,而是考虑基于输入feature map生成对应的involution kernel,从而确保kernel size和input feature size在空间维度上能够自动对齐。否则的话,例如在ImageNet上使用固定 大小的图像作为输入训练得到的权重,就无法迁移到输入图像尺寸更大的下游任务中(比如检测、分割等)。involution kernel生成的通用形式如下:
其中 是坐标(i,j)邻域的一个index集合,所以 表示feature map上包含 的某个patch。
关于上述的kernel生成函数 ,可以有各种不同的设计方式,也值得大家去进一步探索。我们从简单有效的设计理念出发,提供了一种类似于SENet的bottleneck结构来进行实验: 就取为 这个单点集,即 取为feature map上坐标为(i, j)的单个pixel,从而得到了involution kernel生成的一种实例化
其中 和 是线性变换矩阵,r是通道缩减比率, 是中间的BN和ReLU。
注意,设计不同的kernel生成函数可以得到involution不同的实例化:
比如可以去探索更加精巧的设计来继续发掘involution的潜力,另外通过采用特定的实例化方法也可以将其特例化成为self-attention的形式(见下节)。
在上述一种简单的involution kernel的实例化下,我们得到完整的involution的示意图:
针对输入feature map的一个坐标点上的特征向量,先通过 (FC-BN-ReLU-FC)和reshape (channel-to-space)变换展开成kernel的形状,从而得到这个坐标点上对应的involution kernel,再和输入feature map上这个坐标点邻域的特征向量进行Multiply-Add得到最终输出的feature map。具体操作流程和tensor形状变化如下:
其中 是坐标(i,j)附近 的邻域。单纯基于PyTorch API简单的伪代码实现如下:
involution操作的参数量 ,计算量分为kernel generation和Multiply-Add (MAdd)两部分 ,明显低于普通convolution的参数量 和计算量 。
反过头来考虑和卷积已有的优点的对比:
在通道上共享kernel(仅有G个kernel)允许我们去使用大的空间span(增加K),从而通过spatial维度的设计提升性能的同时保证了通过channel维度的设计维持效率(见ablation in Tab. 6a,6b),即使在不同空间位置不共享权重也不会引起参数量和计算量的显著增长。
虽然我们没有在空间上的每个pixel直接共享kernel参数,但我们在更高的层面上共享了元参数(meta-weight,即指kernel生成函数的参数),所以仍然能够在不同的空间位置上进行knowledge的共享和迁移。作为对比,即使抛开参数量大涨的问题,如果将convolution在空间上共享kernel的限制完全放开,让每个pixel自由地学习对应的kernel参数,则无法达到这样的效果。
总结起来,这种从convolution到involution的设计实际上是在微观粒度(op level)对算力进行了重新的调配,而网络设计的本质就是对算力的分配,目的是将有限的算力调整到最能发挥性能的位置。比如NAS则是在宏观粒度上(network level)通过自动搜索的手段对算力进行了最优配置。
2
与自注意力的相关性
这部分内容主要来自论文Section 4.2
我们知道self-attention可以表达为(为了表达简略,省略了position encoding部分)
,
其中 分别为输入 线性变换后得到的query,key和value,H是multi-head self-attention中head的数目。下标表示(i, j)和(p,q)对应的pixel之间进行query-key匹配, 表示query(i,j)对应key的范围,可能是 的local patch(local self-attention),也可能是 的full image(global self-attention)。
我们进一步把self-attention展开写成
对比involution的表达式,我们不难发现相似之处:
self-attention中不同的head对应到involution中不同的group(在channel维度split)
self-attention中每个pixel的attention map 对应到involution中每个pixel的kernel
如果involution的kernel生成函数选择实例化为
那么self-attention也是involution的某种实例化,因此我们发现involution是更加general的表达形式。
另外 对应于attention matrix multiplication前对 做的线性变换,self-attention操作后一般也会接另一个线性变换和残差连接,这个结构正好就对应于我们用involution替换resnet bottleneck结构中的 convolution,前后也有两个 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使用 而不是 ( 是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不太适合扩展到全图来应用,但在一个相对较大的邻域内应用还是可行的(如 , ),这同时也说明了CNN设计中的locallity依然是宝藏,因为即使用global self-attention,网络的浅层也很难真的利用到复杂的全局信息。
所以我们所采用的involution去除了self-attention中很多复杂的东西,比如我们仅使用单个pixel的特征向量生成involution kernel(而不是依靠pixel-to-pixel correspondence生成attention map),在生成kernel时隐式地编码了pixel的位置信息(丢弃了显式的position encoding),从而构建了一个非常干净高效的op。
3
与卷积的反对称性Vision Transformer
既然讨论到了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的组合形式,尽管外表各异,本质上没有必要割裂开来看。
4
实验结果
总体来讲:
(1)参数量、计算量降低,性能反而提升
(2)能加在各种模型的不同位置替换convolution,比如backbone,neck和head,一般来讲替换的部分越多,模型性价比越高
我们使用involution替换ResNet bottleneck block中的 convolution得到了一族新的骨干网络RedNet,性能和效率优于ResNet和其他self-attention做op的SOTA模型。
其中fully involution-based detectors(involution用在backbone,neck和head)在保证性能略有提升或不变的前提下,能够将计算复杂度减至 40%。
值得一提的是,COCO检测任务中针对大物体的指标 提升最多(3%-4%),Cityscapes分割任务中也是大物体(比如墙,卡车,公交车等)的单类别IoU提升最明显(高达10%甚至20%以上),这也验证了我们在之前分析中所提到的involution相比于convolution在空间上具有动态建模长距离关系的显著优势。
最后,这篇工作也留了一些坑供大家进一步探索:
1、关于广义的involution中kernel生成函数空间进一步的探索;
2、类似于deformable convolution加入offest生成函数,使得这个op空间建模能力的灵活性进一步提升;
3、结合NAS的技术搜索convolution-involution混合结构(原文Section 4.3);
4、我们在上文论述了self-attention只是一种表达形式,但希望(self-)attention机制能够启发我们设计更好的视觉模型,类似地detection领域最近不少好的工作,也从DETR的架构中获益匪浅。
5
研究Q&A
简单总结一下前文内容:这项工作提出了比convolution参数量和计算量更小的新算子,并且能学习到长距离的关系建模。同时involution的架构设计思想和self-attention有联系,可以说self-attention是广义involution的某个实例化。
involution兼具convolution和self-attention的优势,效率则比这两者都更高。基于involution的架构适用于很多计算机视觉任务,比如图像分类、目标分割、实例分割等,并且比convolution更加高效。
以下,AI科技评论就这项工作与一作本人即李铎进行了对话。
1、是否从归纳偏置的角度解释involution与convolution、self-attention之间的关系?
大家认为的convolution的归纳偏置包括两条:局部性和平移等变性。关于self-attention,global self-attention形式上打破了第一条归纳偏置,但实际上也存在一个“感受野”,实验证明也是由浅层到深层从小变大,第二条平移等变性实际上一定程度上被relative position embedding维护着。
关于involution,我们认为locality依然是很有价值的,所以involution沿用了这个设计理念,而我们在保证平移等变性这方面不是在不同空间位置采用统一的kernel,而是在不同空间位置采用统一的kernel生成函数。
2、实验证明involution比convolution更加高效,以及在大目标的检测中表现更优。那么,involution相对于self-attention的明显优势是什么呢?从目前的实验来看,似乎没有明显的对比。您认为在哪些场景中能展现Involution相对于self-attention的明显优势?
involution相对于self-attention的优势不在于性能上明显的提升,而更多在于形式上简洁了很多,所以在实用场景中速度有明显提升。
3、您认为该算子是否有替代convolution、self-attention的潜力?以及它是否有扩展到NLP等领域的潜力?
我认为是有的,尤其是将来当硬件设施上针对involution的优化做得更好的时候。鉴于我们讨论过的involution和self-attention的关系,我认为它也能扩展到NLP上面。
4、这篇论文最初的研究灵感是什么?
最初的灵感来源于对卷积以及自注意力两种算子内在性质的一些对比和思考。
5、两位导师在这项研究中给您提供了哪些帮助?
张潼和陈启峰老师提供的更多是研究方向上的导引,而胡杰师兄则会在平时一起讨论一些更具体的方面,比如实现细节、文章写作整体构思等。
6、可以介绍一下您今年在CVPR中稿的其它研究吗?
其他中稿的文章基本也都契合我的研究兴趣:网络架构理解和设计以及机器学习算法相关。关于网络结构设计这部分,最近Transformer大行其道,但我们在这篇工作中也提到了,我们更愿意以统一的视角去看待CNN和Transformer,从二者的关联性出发去思考如何设计更好的网络结构。
(这里附上李铎今年的中稿论文,一共有四篇,其中一篇是oral)
7、您本科毕业于清华大学自动化系,在本科期间有做过AI研究吗?
本科期间有从事过AI研究,主要论文成果是来自在 Intel Labs China 实习期间,内容是关于轻量级神经网络结构设计,发表在 ICCV'19,该项成果也已经迁移到 Intel OpenVINO Model Zoo。
(这里附上李铎在本科期间发表的论文)
8、为什么选择在HKUST计算机科学与工程系读硕士?
选择HKUST的原因主要是近年来HKUST的发展非常迅速,尤其是不少业界知名的研究者都加入了计算机系,另外我感觉HKUST能为我提供一个相对轻松自由的研究氛围,我个人在这种环境下更能够做出成果。