Scaling Local Self-Attention for Parameter Efficient Visual Backbones论文地址:https:///pdf/2103.12731.pdf官方代码:未开源核心代码:https://github.com/xmu-xiaoma666/External-Attention-pytorch/blob/master/attention/HaloAttention.py
首先举两个比较极端的例子:如果采用全局的SA,由于计算量与输入的大小呈平方关系,所以对于较大的输入就回导致计算量非常大;如果采用非常小的局部SA,由于每次滑动窗口的结果在显存上得不到释放,就会导致OOM(Out-Of-Memery)的问题。如何减少计算量的同时,又能降低显存呢。如下图所示,红色区域和绿色区域分别代表滑动窗口前后经过的区域,可以看出,其实这两个局部中有一大部分是重合的,所以在计算时就会导致了重复的计算,如果能减少这部分重复的计算,就能减少计算量。下图的窗口在滑动时采用的是步长为1,所以遍历完整张图片需要滑动(W-k+1)*(H-K+1)次,在这期间显存都得不到释放;如果能够增大滑动窗口的步长,就能非常有效的减少显存的使用。基于以上的观察,作者提出了将整张图片分为多个Block,并对每个Block进行SA(Blocked Local Self-Attention)。如上图所示,如果每次只考虑block内的信息,必然会导致信息的损失,因此在计算Local Self-Attention之前,作者先对每个block进行的haloing操作。也就是在每个block外,再用原始图片的信息padding一圈(这个操作叫做Halo),使得每个block的感受野能够适当变大,关注更多的信息。为什么这个操作叫Halo?Halo其实就是光环、日晕的意思(大概就是这张图这样),halo操作在原始的block上再外加一圈额外的信息,就类似在block之外再加了一层光环,起到了增加感受野的作用。
本文采用了CNN的网络结构,SA的计算方式,提出了一个新的网络结构HaloNet。与以前的工作相比,本文的创新点主要体现在两个结构,blocked local attention和attention downsampling。HaloNet在分类、检测、分割任务上都取得不错的效果。个人认为,HaloNet其实是一种介于CNN和Transformer之间结构,虽然它融合了CNN和SA的优点,但是在一定程度上也具有他们的缺点,比如训练上比CNN(EfficientNet)更慢(如下图所示)。因此,后期对HaloNet计算量和显存的优化也是一个非常重要的工作。
参考文献
[1]. Prajit Ramachandran, Niki Parmar, Ashish Vaswani, Irwan Bello, Anselm Levskaya, and Jon Shlens. Stand-alone selfattention in vision models. In H. Wallach, H. Larochelle, A. Beygelzimer, F. d’Alché Buc, E. Fox, and R. Garnett, editors, Advances in Neural Information Processing Systems 32, pages 68–80. Curran Associates, Inc., 2019.[2]. Yuan, Li, et al. "VOLO: Vision Outlooker for Visual Recognition." arXiv preprint arXiv:2106.13112 (2021).[3]. Dai, Zihang, et al. "CoAtNet: Marrying Convolution and Attention for All Data Sizes." arXiv preprint arXiv:2106.04803 (2021).