论文阅读|Swin transformer

 论文链接: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挑战:

  1. 目标尺寸多变。不像NLP任务中token大小基本相同,目标检测中的目标尺寸不一,用单层级的模型很难有好的效果。
  2. 图片的高分辨率。尤其是在分割任务中,高分辨率会使得计算复杂度呈现输入图片大小的二次方增长。

相比于Vision Transformer(讲解),Swin Transformer做出了几点改进:

  1. 层次化构建方法:使用了类似卷积神经网络中的层次化构建方法(Hierarchical feature maps),比如特征图尺寸中有对图像下采样4倍的,8倍的以及16倍的,这样的backbone有助于在此基础上构建目标检测,实例分割等任务。而Vision Transformer中直接下采样16倍,后面的特征图也是维持这个下采样率不变。
  2. 特征图划分:在Swin Transformer中使用了Windows Multi-Head Self-Attention(W-MSA)的概念,比如在下图的4倍下采样和8倍下采样中,将特征图划分成了多个不相交的窗口,并且Multi-Head Self-Attention只在每个窗口内进行。相对于Vision Transformer中直接对整个特征图进行Multi-Head Self-Attention,这样做的目的是减少计算量,尤其是在浅层特征图很大的时候。
  3. 窗口变换:特征图划分虽然减少了计算量,但会隔绝不同窗口之间的信息传递,因此所以在论文中作者又提出了Shifted Windows Multi-Head Self-Attention(SW-MSA)的概念,目的是在相邻窗口中传递信息。

Introduction

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 层中先前窗口的边界,提供了它们之间的连接。 

  • 每一个小块叫做一个patch
  • 每一个红色方块框起来的为一个local window
  • 在每一个local window中计算self-attention
  • 连续两个blocks之间相互转换,第一个bolck平分feature map,第二个block从(\left \lfloor \frac{M}{2} \right \rfloor,\left \lfloor \frac{M}{2} \right \rfloor)像素有规律地取代前一层的windows
  • windows的数量变化:\left \lceil \frac{h}{M} \right \rceil\times \left \lceil \frac{w}{M} \right \rceil\rightarrow (\left \lceil \frac{h}{M} \right \rceil+1)\times (\left \lceil \frac{w}{M} \right \rceil+1),例子中是从2×2变为3×3

Related works

CNN和其变种

CNN 作为整个计算机视觉的标准网络模型。虽然 CNN 已经存在了几十年,但直到 AlexNet  的引入,CNN 才起飞并成为主流。从那时起,人们提出了更深、更有效的卷积神经架构,以进一步推动计算机视觉领域的深度学习浪潮,例如 VGG、GoogleNet、ResNet、DenseNet、HRNet和 EfficientNet。除了这些架构上的进步之外,在改进单个卷积层方面也有很多工作,例如深度卷积 和可变形卷积。虽然 CNN 及其变体仍然是计算机视觉应用的主要backbone架构,但我们强调了类似 Transformer 的架构在视觉和语言之间统一建模方面的强大潜力。我们的工作在几个基本的视觉识别任务上取得了强劲的表现,我们希望它有助于建模转变。

基于self-attention的backbone架构

同样受到 NLP 领域self-attention层和 Transformer 架构成功的启发,一些作品采用自self-attention层来替换流行的 ResNet 中的部分或全部空间卷积层。 在这些工作中,self-attention是在每个像素的局部窗口内计算的,以加快优化,并且它们实现了比对应的 ResNet 架构稍好一些的精度/ FLOPs 权衡。 然而,它们昂贵的内存访问导致它们的实际延迟(latency)明显大于卷积网络。 我们建议不使用滑动窗口(sliding windows),而是在连续层之间移动窗口(shift windows),这允许在通用硬件中更有效地实现。

self-attention / transformer 补充CNNs

另一项工作是使用self-attention层或 Transformer 来增强标准的 CNN 架构。 self-attention层可以通过提供编码远程依赖或异构交互的能力来补充backbone或头部网络。 最近,Transformer 中的encoder-decoder设计已应用于目标检测和实例分割任务。 我们的工作探索了Transformers 对基本视觉特征提取的适应性,并且是对这些工作的补充。


基于Transformer的基准框架



ViT开创性的直接将Transformer用于图像,通过输出互不重叠的patch进行图像分类;与CNN相比更好的权衡了精度与速度;但是ViT需要在大规模数据集上进行训练效果才会比较好,DeiT则提出了一些训练策略,使之可以使用较小的预训练数据集。虽然ViT取得了令人满意的结果但是并不适合作为视觉任务的通用backbone,比如无法适应密集预测。
也有的工作结合上采样、反卷积等将ViT用来做目标检测、语义分割等但性能略有不足。



本文的Swin Transformer虽然作为一种通用框架被提出,但是在图像分类任务中实现了精度-速度的最佳权衡。也有peer work(PVT)通过构建多尺度特征图这种类似的思路进行密集预测,但是计算复杂度仍然是二次的;而本文优化到了线性复杂度,Swin Transformer在COCO目标检测和ADE20K易于分割上均达到了SOTA

Method

总体架构

图 3 展示了 Swin Transformer 架构的概述,其中展示了tiny版本 (SwinT)。 

  1. Patch Partition:首先将图片输入到Patch Partition模块中进行分块,即每4 × 4相邻的像素为一个Patch,然后在channel方向展平。由于每个patch就有4 × 4 = 16个像素,每个像素有R、G、B三个值,所以展平后的深度是16 × 3 = 48,所以通过Patch Partition后图像shape由\left [ H,W,3 \right ]变成了\left [ \frac{H}{4},\frac{W}{4},48 \right ]
  2. Linear Embedding:通过Linear Embeding层对每个像素的channel数据做线性变换,由48变成C,即图像shape再由\left [ \frac{H}{4},\frac{W}{4},48 \right ]变成了\left [ \frac{H}{4},\frac{W}{4},C \right ],在源码中通过一个卷积层实现。
  3. 网络模块堆叠:通过四个Stage构建不同大小的特征图,除了Stage1中先通过一个Linear Embeding层外,剩下三个stage都是先通过一个Patch Merging层进行下采样,然后都是重复堆叠Swin Transformer Block。注意,Transformer Block有两种结构,如图(b)中所示,这两种结构的不同之处仅在于一个使用了W-MSA结构,一个使用了SW-MSA结构。而且这两个结构是成对使用的,先使用一个W-MSA结构再使用一个SW-MSA结构。所以堆叠Swin Transformer Block的次数都是偶数(因为成对使用)。
  4. Patch mering:随着网络变得更深,通过patch合并层来减少tokens的数量。第一个patch合并层连接每组 2 × 2 相邻patches的特征,并在 4C 维连接特征上应用线性层。这将tokens数量减少了 2×2 = 4 的倍数(分辨率的 2× 下采样),并且输出维度设置为 2C。之后应用 Swin Transformer 块进行特征转换,分辨率保持在 H/8 × W/8 。patch合并和特征转换的第一个块表示为“Stage 2”。该过程重复两次,分别为“Stage 3”和“Stage 4”输出分辨率分别为  H/16 × W/16 和  H/32 × W/32 。这些stages共同产生一个分层表示,具有与典型卷积网络相同的特征图分辨率,例如 VGG 和 ResNet。因此,所提出的架构可以方便地替换现有方法中用于各种视觉任务的backbone网络。
  5. Swin transformer block:Swin Transformer 是通过将 Transformer block中的标准multi-head self-attention (MSA) 模块替换为基于shifted windows的模块(在第 3.2 节中描述)而构建的,其他层保持不变。 如图 3(b) 所示,Swin Transformer 模块由一个基于shifted window的 MSA 模块组成,后跟一个 2 层 MLP,其间具有 GELU 非线性。 在每个 MSA 模块和每个 MLP 之前应用一个 LayerNorm (LN) 层,在每个模块之后应用一个残差连接。

Patch Merging

假设输入Patch Merging的是一个4x4大小的单通道特征图,Patch Merging的过程如下:

  • 将每个2x2的相邻像素划分为一个patch
  • 将每个patch中相同位置(同一颜色)像素拼在一起,就得到了4个feature map
  • 将四个feature map在深度方向进行concat拼接
  • 通过一个LayerNorm层
  • 通过一个全连接层在feature map的深度方向做线性变化,将feature map的深度由C变成C/2。

可以看出,通过Patch Merging层后,feature map的高和宽会减半,深度会翻倍

基于shifted window 的self-attention

Transformer 架构及其对图像分类的适应都进行全局self-attention,其中计算了token与所有其他tokens之间的关系。 全局计算会导致与tokens数量相关的二次复杂性,使其不适用于许多需要大量tokens进行密集预测或表示高分辨率图像的视觉问题。

非重叠窗口中的self-attention

为了有效建模,我们建议在局部窗口内计算self-attention。 窗口被布置为以不重叠的方式均匀地划分图像。 假设每个窗口包含 M × M 个patches,全局 MSA 模块和基于 h × w patches图像的窗口的计算复杂度为 :

其中前者是patch数目 hw 的二次方,当 M 固定时(默认设置为 7)后者是线性的。 全局self-attention计算对于大型硬件来说通常是负担不起的,而基于窗口的self-attention是可扩展的。

连续块中的shifted window分区

基于窗口的self-attention模块缺乏跨窗口(across windows)的连接,这限制了其建模能力。 为了在保持非重叠窗口的高效计算的同时引入跨窗口连接,我们提出了一种移位窗口(shifted window)分区方法,该方法在连续的 Swin Transformer 块中的两个分区配置之间交替。

如图 2 所示,第一个模块使用从左上角像素开始的常规窗口分区策略,将 8 × 8 特征图均匀地划分为大小为 4 × 4 (M = 4) 的 2 × 2 窗口。 然后,下一个模块采用从前一层的窗口配置偏移的窗口配置,通过将窗口从规则分区的窗口中移动(\left \lfloor \frac{M}{2},\frac{M}{2} \right \rfloor)个像素。

使用移位窗口分区(shifted window partioning)方法,连续的 Swin Transformer 块计算为:

其中\hat{Z}^{L}Z^{L}分别表示block l 的 (S)WMSA 模块和 MLP 模块的输出特征; W-MSA 和 SW-MSA 分别表示使用基于multi-head self-attention的常规窗口和移位(shifted)窗口分区配置。 

移位窗口分区方法在前一层中引入了相邻非重叠窗口之间的连接,并被发现在图像分类、目标检测和语义分割中是有效的。

Efficient batch computation for shifted configuration

 一个问题是移动窗口后窗口数目变多了,有的窗口尺寸还会小于MxM;一种简单的解决办法就是将其填充到MxM大小,计算注意力的时候把补0的这一部分mask掉不参与计算。
假设原始窗口数为2x2,移动后窗口数目变成3x3,计算量增加了2.25倍。
因此本文提出了一种更高效的batch computation的方法,参见Fig 4,通过循环向左上角移动,此时窗口中的feature map来自不同的子窗口,此时利用mask计算每个子窗口的那部分值;通过这种batch computation的方式,批处理窗口的数目与常规窗口的计算数目相同,保证了效率,Table 5中延迟指标也显示出了这种方法的有效性

掩码可视化:

相对位置编码

根据论文中提供的公式可知是在Q和K进行匹配并除以\sqrt{d}后加上了相对位置偏置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。

最后将行标和列标进行相加。这样即保证了相对位置关系,而且相加后每行中不会出现重复的编码问题

刚刚上面也说了,之前计算的是相对位置索引,并不是相对位置偏执参数。真正使用到的可训练参数\hat{B}是保存在relative position bias table表里的,这个表的长度是等于( 2 M − 1 ) × ( 2 M − 1 )的。那么上述公式中的相对位置偏执参数B是根据上面的相对位置索引表根据查relative position bias table表得到的,如下图所示。

参数

 Architecture Variants

本文搭建的Swin -B参数量与ViT-B/Deit-B相近,此外还有Swin -T,-S,-L,参数量分别是Swin-B的0.25x,0.5x.2x.此外,窗口大小默认设置为M=7,head的维度为d=32,其他网络结构超参数为:
Table 1展示了模型参数量、计算量等信息。


 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值