精读Focal Attention for Long-Range Interactions in Vision Transformers
摘要
之前的Vision Transformer中,在映射图像块时,大多数会平等地考虑整个图像,即每一个图像块(patch)在输入到注意力之前都是平等的,没有详略之分。但实际上,在观察图像中得分某一区域时,越靠近该区域的图像块所包含的信息越重要,越需要详尽的观察和考虑,而距离这块区域较远的图像块则相对不那么重要,也就没必要同样仔细地去观察分析。这导致这些方法在面对高分辨率图像时增加了许多不必要的计算,费时费力。基于这一点,作者提取了一种新的注意力机制,来提高对图像信息的利用。
方法
focal attention
作者实现摘要的思路,是对图像进行不同程度的池化来缩小图像,然后缩小地越狠,那么提取token时覆盖的原图像面积越大,但提取出的token越少。这样说还是很奇怪,就拿作者举得例子来说吧
系统是以滑动窗口的形式不断移动查询,也就是说,中间蓝色的称为查询集(query set),这个查询集不是永远指图像中间那一个,而是在画面上不断移动,不重复地滑动选择sp*sp大小的区域,而整个图像是在某一阶段输入到注意力模块的feature map。对于不同的level,则表示是不同的池化程度,level越高,池化程度越高,观察地越粗略。
sw表示池化操作的细节,1级的为1,说明是直接映射,不需要池化,而凡是值不为1的,则说明要进行池化操作,池化核大小为sw*sw,步长也为sw。
sr表示池化之后,以查询块为中心,选择sr*sr个池化后的像素块作为token。例如在2级中,池化后的图像大小为10*10,但如果将这100个像素块均作为token纳入后面的计算,就与核心思路相违背,于是作者将sr定为6,只选择中心的6*6个作为token,减少了后面的计算量。
最后吐槽一句,作者这图画得像先选方块再池化,但实际操作是先池化再选方块。
架构
由于文章最大的创新点在于新的注意力机制,架构方面与最经典的ViT十分相似,所以反而放到后面来讲。
本文方法要经过四步,但每一步的差别基本上只是特征图大小不同和transformer模块数不同,模块内部是吧传统的自注意力改为本文的注意力模型。
每经过一个阶段,会将注意力图像再经过一次patch embedding,使其长宽均除以2,频道数翻倍。
对于分类模型,就是把最后一阶段所有查询的输出平均一下,扔到分类器里,对于更复杂的目标检测,则是把最后三个阶段或者全部四个阶段的输出一起丢到特殊的目标检测头里,作者没明说,原文为:For object detection, the feature maps from the last 3 or all 4 stages are fed to a particular object detector head, depending on the specific detection method we choose to use.
实验
模型细节
之前说了,模型有一些参数可以自定义,包括每个微观中的注意力模块的设置和宏观上的模块数量,作者预设了几种,并取了名字,具体细节如下
在作者预设的模型中,每个注意力模块中都只有两部分token来源,一部分是sw=1的部分,此时未进行池化,为精细化的信息,另一部分则是sw=7的部分,图像经过了7*7池化再进行了token的选择以及后续的qk映射。
pi为每一阶段每次查询块大小的设置,ci为每一阶段通道数。
分类任务
ImageNet-1K上的分类结果,除了ViT-Base/16,其余的都是在224*224的分辨率上进行训练和评估的。
目标检测
COCO数据集上,以不同模型作为backbone训练的结果,毫不意外地,本文效果最好
作者又详细对比了不同模型的参数量和计算量,可惜的是,本文虽然在理论上时间复杂度更低,但在实际表现中,参数量和计算量依然超过了其他模型,没能达到降低计算量还提高准确度的绝杀。
语义分割
这是在ADE20K数据集上的分割结果,与目标检测类似,计算量和准确率同时提高。
消融实验
窗口尺寸
窗口指的是方法那一节中所配的图中,蓝色窗口的大小,如果为7,则每个查询集大小为7*7。
对于tiny级别的模型,窗口尺寸越大,计算量越大,但效果也越好。
漂移窗口,window shift
这是Swin Transformer里提出的方法,和本文的滑动窗口思路不是一回事。可以看出,将上一篇文章的方法拿来对本文方法只有负面提升,因此正文里基本没介绍漂移窗口
模块数量
上文说了,每一阶段的模块数量可变,depth中的四个数字即为四个阶段的模块数。可以看出,模块不是越多越好,第三阶段用4个模块时计算量更低,性能反而更好。
更多推荐
所有评论(0)