论文链接:Swin Transformer: Hierarchical Vision Transformer using Shifted Windows
源码地址:https://github.com/microsoft/Swin-Transformer
参考资料:Swin Transformer:Hierarchical Vision Transformer using Shifted Windows (论文阅读笔记)_酉意铭的博客-CSDN博客
(51条消息) Swin-Transformer网络结构详解_霹雳吧啦Wz-CSDN博客_swin transformer结构
目录
摘要
Introduction
Related works
CNN和其变种
基于self-attention的backbone架构
self-attention / transformer 补充CNNs
基于Transformer的基准框架
Method
总体架构
Patch Merging
基于shifted window 的self-attention
非重叠窗口中的self-attention
连续块中的shifted window分区
Efficient batch computation for shifted configuration
相对位置编码
参数
Architecture Variants
CV中使用transformer挑战:
相比于Vision Transformer(讲解),Swin Transformer做出了几点改进:
Transformer 是专为序列建模和转导任务而设计,以其对数据中的长期依赖关系建模的关注而著称。 它在语言领域的巨大成功促使研究人员研究其对计算机视觉的适应性,最近它在某些任务上展示了有希望的结果,特别是图像分类和联合视觉语言建模。
如图 1(a) 所示,Swin Transformer 通过从小尺寸的patches(灰色轮廓)开始并逐渐合并更深的 Transformer 层中的相邻patches来构建分层表示。通过这些分层特征图,Swin Transformer 模型可以方便地利用先进的技术进行密集预测,例如特征金字塔网络 (FPN) 或U-Net。线性计算复杂度是通过在分割图像的非重叠窗口中局部计算self-attention来实现的(以红色标出)。每个窗口中的patches数量是固定的,因此复杂度与图像大小成线性关系。这些优点使 Swin Transformer 适合作为各种视觉任务的通用backbone,与之前基于 Transformer 的架构形成对比,后者产生单一分辨率的特征图并具有二次复杂性。
Swin Transformer 的一个关键设计元素是它在连续自注意力层之间的窗口分区的移动(shift),如图 2 所示。移动的窗口(shifted windows)桥接前一层的窗口,提供它们之间的连接,显着增强建模能力(见表 4)。 这种策略在现实世界的延迟方面也很有效:窗口内的所有查询补丁(query patches)共享相同的key set,这有助于硬件中的内存访问。 相比之下,早期的基于滑动窗口的自注意力方法由于不同query pixel的不同key set而在通用硬件上受到低延迟的影响。 我们的实验表明,所提出的shifted window方法的延迟比sliding window方法低得多,但建模能力相似(见表 5 和表 6)。shifted window方法也证明对全 MLP 架构有益 。
图 2. 在提出的 Swin Transformer 架构中计算自注意力的shifted window方法的说明。 在第 l 层(左),采用规则的窗口划分方案,在每个窗口内计算self-attention。 在下一层 l + 1(右),窗口分区被移动(shifted),产生新的窗口。 新窗口中的自注意力计算跨越了第 l 层中先前窗口的边界,提供了它们之间的连接。
CNN 作为整个计算机视觉的标准网络模型。虽然 CNN 已经存在了几十年,但直到 AlexNet 的引入,CNN 才起飞并成为主流。从那时起,人们提出了更深、更有效的卷积神经架构,以进一步推动计算机视觉领域的深度学习浪潮,例如 VGG、GoogleNet、ResNet、DenseNet、HRNet和 EfficientNet。除了这些架构上的进步之外,在改进单个卷积层方面也有很多工作,例如深度卷积 和可变形卷积。虽然 CNN 及其变体仍然是计算机视觉应用的主要backbone架构,但我们强调了类似 Transformer 的架构在视觉和语言之间统一建模方面的强大潜力。我们的工作在几个基本的视觉识别任务上取得了强劲的表现,我们希望它有助于建模转变。
同样受到 NLP 领域self-attention层和 Transformer 架构成功的启发,一些作品采用自self-attention层来替换流行的 ResNet 中的部分或全部空间卷积层。 在这些工作中,self-attention是在每个像素的局部窗口内计算的,以加快优化,并且它们实现了比对应的 ResNet 架构稍好一些的精度/ FLOPs 权衡。 然而,它们昂贵的内存访问导致它们的实际延迟(latency)明显大于卷积网络。 我们建议不使用滑动窗口(sliding windows),而是在连续层之间移动窗口(shift windows),这允许在通用硬件中更有效地实现。
另一项工作是使用self-attention层或 Transformer 来增强标准的 CNN 架构。 self-attention层可以通过提供编码远程依赖或异构交互的能力来补充backbone或头部网络。 最近,Transformer 中的encoder-decoder设计已应用于目标检测和实例分割任务。 我们的工作探索了Transformers 对基本视觉特征提取的适应性,并且是对这些工作的补充。
ViT开创性的直接将Transformer用于图像,通过输出互不重叠的patch进行图像分类;与CNN相比更好的权衡了精度与速度;但是ViT需要在大规模数据集上进行训练效果才会比较好,DeiT则提出了一些训练策略,使之可以使用较小的预训练数据集。虽然ViT取得了令人满意的结果但是并不适合作为视觉任务的通用backbone,比如无法适应密集预测。
也有的工作结合上采样、反卷积等将ViT用来做目标检测、语义分割等但性能略有不足。
本文的Swin Transformer虽然作为一种通用框架被提出,但是在图像分类任务中实现了精度-速度的最佳权衡。也有peer work(PVT)通过构建多尺度特征图这种类似的思路进行密集预测,但是计算复杂度仍然是二次的;而本文优化到了线性复杂度,Swin Transformer在COCO目标检测和ADE20K易于分割上均达到了SOTA
图 3 展示了 Swin Transformer 架构的概述,其中展示了tiny版本 (SwinT)。
假设输入Patch Merging的是一个4x4大小的单通道特征图,Patch Merging的过程如下:
可以看出,通过Patch Merging层后,feature map的高和宽会减半,深度会翻倍
Transformer 架构及其对图像分类的适应都进行全局self-attention,其中计算了token与所有其他tokens之间的关系。 全局计算会导致与tokens数量相关的二次复杂性,使其不适用于许多需要大量tokens进行密集预测或表示高分辨率图像的视觉问题。
为了有效建模,我们建议在局部窗口内计算self-attention。 窗口被布置为以不重叠的方式均匀地划分图像。 假设每个窗口包含 M × M 个patches,全局 MSA 模块和基于 h × w patches图像的窗口的计算复杂度为 :
其中前者是patch数目 hw 的二次方,当 M 固定时(默认设置为 7)后者是线性的。 全局self-attention计算对于大型硬件来说通常是负担不起的,而基于窗口的self-attention是可扩展的。
基于窗口的self-attention模块缺乏跨窗口(across windows)的连接,这限制了其建模能力。 为了在保持非重叠窗口的高效计算的同时引入跨窗口连接,我们提出了一种移位窗口(shifted window)分区方法,该方法在连续的 Swin Transformer 块中的两个分区配置之间交替。
如图 2 所示,第一个模块使用从左上角像素开始的常规窗口分区策略,将 8 × 8 特征图均匀地划分为大小为 4 × 4 (M = 4) 的 2 × 2 窗口。 然后,下一个模块采用从前一层的窗口配置偏移的窗口配置,通过将窗口从规则分区的窗口中移动个像素。
使用移位窗口分区(shifted window partioning)方法,连续的 Swin Transformer 块计算为:
其中和
分别表示block l 的 (S)WMSA 模块和 MLP 模块的输出特征; W-MSA 和 SW-MSA 分别表示使用基于multi-head self-attention的常规窗口和移位(shifted)窗口分区配置。
移位窗口分区方法在前一层中引入了相邻非重叠窗口之间的连接,并被发现在图像分类、目标检测和语义分割中是有效的。
一个问题是移动窗口后窗口数目变多了,有的窗口尺寸还会小于MxM;一种简单的解决办法就是将其填充到MxM大小,计算注意力的时候把补0的这一部分mask掉不参与计算。
假设原始窗口数为2x2,移动后窗口数目变成3x3,计算量增加了2.25倍。
因此本文提出了一种更高效的batch computation的方法,参见Fig 4,通过循环向左上角移动,此时窗口中的feature map来自不同的子窗口,此时利用mask计算每个子窗口的那部分值;通过这种batch computation的方式,批处理窗口的数目与常规窗口的计算数目相同,保证了效率,Table 5中延迟指标也显示出了这种方法的有效性
掩码可视化:
根据论文中提供的公式可知是在Q和K进行匹配并除以后加上了相对位置偏置B。
由于论文中并没有详解讲解这个相对位置偏置,所以根据阅读源码做了简单的总结。如下图,假设输入的feature map高宽都为2,那么首先我们可以构建出每个像素的绝对位置(左下方的矩阵),对于每个像素的绝对位置是使用行号和列号表示的。比如蓝色的像素对应的是第0行第0列所以绝对位置索引是(0,0),接下来再看看相对位置索引。首先看下蓝色的像素,在蓝色像素使用q与所有像素k进行匹配过程中,是以蓝色像素为参考点。然后用蓝色像素的绝对位置索引与其他位置索引进行相减,就得到其他位置相对蓝色像素的相对位置索引。例如黄色像素的绝对位置索引是(0,1),则它相对蓝色像素的相对位置索引为( 0 , 0 ) − ( 0 , 1 ) = ( 0 , − 1 )。那么同理可以得到其他位置相对蓝色像素的相对位置索引矩阵。同样,也能得到相对黄色,红色以及绿色像素的相对位置索引矩阵。接下来将每个相对位置索引矩阵按行展平,并拼接在一起可以得到下面的4x4矩阵 。
这里描述的一直是相对位置索引,并不是相对位置偏置参数。因为后面我们会根据相对位置索引去取对应的参数。
首先在原始的相对位置索引上加上M-1(M为窗口的大小,在本示例中M=2),加上之后索引中就不会有负数了。
接着将所有的行标都乘上2M-1。
最后将行标和列标进行相加。这样即保证了相对位置关系,而且相加后每行中不会出现重复的编码问题
刚刚上面也说了,之前计算的是相对位置索引,并不是相对位置偏执参数。真正使用到的可训练参数是保存在relative position bias table表里的,这个表的长度是等于( 2 M − 1 ) × ( 2 M − 1 )的。那么上述公式中的相对位置偏执参数B是根据上面的相对位置索引表根据查relative position bias table表得到的,如下图所示。
本文搭建的Swin -B参数量与ViT-B/Deit-B相近,此外还有Swin -T,-S,-L,参数量分别是Swin-B的0.25x,0.5x.2x.此外,窗口大小默认设置为M=7,head的维度为d=32,其他网络结构超参数为: Table 1展示了模型参数量、计算量等信息。