Swin Transformer(ICCV 2021 best paper):基于卷积层级式架构的移动窗口视觉Transformer!

有关ViT的学习笔记详见:学习笔记——ViT(Vision Transformer)-CSDN博客

ViT在图像分类方面的结果令人鼓舞,但由于其低分辨率的特征映射和复杂度随图像大小的二次方增长,其架构不适合作为密集视觉任务或高分辨率输入图像的backbone。根据经验,作者发现 Swin Transformer架构在这些图像分类方法中实现了最佳的速度和精度权衡,即使我们的工作侧重于通用性能而不是专门用于分类 。

Swin Transformer(“Swin”代表“Shifted window”)使用了类似卷积神经网络中的层次化构建方法(Hierarchical feature maps),比如特征图尺寸中有对图像下采样4倍、8倍以及16倍,这样的backbone有助于在此基础上构建目标检测,实例分割等任务。而在之前的 ViT 中是一开始就直接下采样16倍,后面的特征图也是维持这个下采样率不变。

在Swin Transformer中使用了Windows Multi-Head Self-Attention(W-MSA)的概念,比如在下图的4倍下采样和8倍下采样中,将特征图划分成了多个不相交的区域(Window),并且Multi-Head Self-Attention只在每个窗口(Window)内进行。相对于Vision Transformer中直接对整个(Global)特征图进行Multi-Head Self-Attention,这样做的目的是能够减少计算量的,尤其是在浅层特征图很大的时候。这样做虽然减少了计算量但也会隔绝不同窗口之间的信息传递,所以在论文中作者又提出了 Shifted Windows Multi-Head Self-Attention(SW-MSA)的概念,通过此方法能够让信息在相邻的窗口中进行传递。

1、Swin Transformer模型框架

  首先将图片输入到Patch Partition模块中进行分块,即每4x4相邻的像素为一个Patch,然后在channel方向展平(flatten)。假设输入的是RGB三通道图片,那么每个patch就有4x4=16个像素,然后每个像素有R、G、B三个值所以展平后是16x3=48,所以通过Patch Partition后图像shape由 [H, W, 3]变成了 [H/4, W/4, 48]。然后在通过Linear Embeding层对每个像素的channel数据做线性变换,由48变成C,即图像shape再由 [H/4, W/4, 48]变成了 [H/4, W/4, C]。

  其实在源码中Patch Partition和Linear Embeding就是直接通过一个卷积层实现的,和之前Vision Transformer中讲的 Embedding层结构一模一样。

  为产生一个层次化表示 (Hierarchical Representation),随着网络的加深,tokens 数逐渐通过 Patch 合并层 (Patch Meraging) 被减少。首个 Patch 合并层拼接了每组 2×2相邻 patch,则 patch token 数变为原来的 1/4,即 H/4×W/4 变成了 H/8×W/8,而 patch token 的维度则扩大4倍,即 4C,最后再对 4C 维的 patch 拼接特征使用了一个线性层,将输出维度降为 2C;

  然后使用 Swin Transformer blocks 进行特征转换,其分辨率保持 H/8×W/8不变。首个 Patch 合并层 和该特征转换 Swin Transformer block 被指定为 Stage 2 (如上图的第二个虚线框所示)。重复 2 次与 Stage 2 相同过程,则分别指定为 Stage 3 和 Stage 4 (如上图的第三、四个虚线框所示)。每个 Stage 都会改变张量的形状,分辨率降低(2×2)倍,维度提高2倍,从而形成一种类似于CNN结构的层次化表征。由此,该架构可方便地替换现有的各种视觉任务的主干网络。

  最后对于分类网络,后面还会接上一个Layer Norm层、全局池化层以及全连接层得到最终输出。

2、Window Partition/Reverse

window partition函数是用于对张量划分窗口,指定窗口大小。将原本的张量从 [N H W C], 划分成 [num_windows*B, window_size, window_size, C],其中 num_windows = H*W / (window_size*window_size),即窗口的个数。而window reverse函数则是对应的逆过程。

3、Window Attention

这是这篇文章的关键。传统的Transformer都是基于全局来计算注意力的,因此计算复杂度十分高。而Swin Transformer则将注意力的计算限制在每个窗口内,进而减少了计算量。主要区别是在原始计算Attention的公式中的Q,K时加入了相对位置编码 B。后续实验有证明相对位置编码的加入提升了模型性能。

4、Patch Merging详解

该模块的作用是在每个Stage开始前做降采样,用于缩小分辨率,调整通道数 进而形成层次化的设计,同时也能节省一定运算量。

在每个Stage中首先要通过一个Patch Merging层进行下采样(Stage1除外)。如下图所示,假设输入Patch Merging的是一个4x4大小的单通道特征图(feature map),Patch Merging会将每个2x2的相邻像素(不重叠)划分为一个patch,然后将每个patch中相同位置(同一颜色)像素给拼在一起就得到了4个feature map。接着将这四个feature map在深度方向进行concat拼接,然后在通过一个LayerNorm层。最后通过一个全连接层在feature map的深度方向做线性变化,将feature map的深度由C变成C/2。通过这个简单的例子可以看出,通过Patch Merging层后,feature map的高和宽会减半,深度会翻倍。

5、W-MSA详解

引入Windows Multi-head Self-Attention(W-MSA)模块是为了减少计算量。如下图所示,左侧使用的是普通的Multi-head Self-Attention(MSA)模块,对于feature map中的每个像素(或称作token,patch)在Self-Attention计算过程中需要和所有的像素去计算。但在图右侧,在使用Windows Multi-head Self-Attention(W-MSA)模块时,首先将feature map按照MxM(例子中的M=2)大小划分成一个个Windows,然后单独对每个Windows内部进行Self-Attention。

为高效建模,我们提出在非重叠的局部窗口中计算自注意力,取代全局自注意力。以不重叠的方式均匀地划分图像得到各个窗口。设每个非重叠局部窗口都包含 N = M × M 个 patch tokens,则基于具有 N = h × w 个 patch tokens 的图像窗口的 MSA 模块 和 基于非重叠局部窗口的 W-MSA 模块 的计算复杂度分别是:

对于一个 h*w*C 的图像,被分割后每个窗口包括 M*M 块。则对应的MSA和W-MSA的计算如下式所示:

其中,MSA 关于 patch token 数 h×w 具有 二次复杂度 (共 h*w个 patch tokens,每个 patch token 在全局计算 h*w次)。W-MSA 则当 M 固定时 (默认设为 7) 具有线性复杂度  (共 h*w个 patch tokens,每个 patch token 在各自的局部窗口内计算 M2次)。巨大的 h×w 对全局自注意力计算而言是难以承受的,而基于窗口的自注意力 (W_MSA) 则具有良好的扩展性。

6、SW-MSA详解(难点)

采用W-MSA模块时,只会在每个窗口内进行自注意力计算,所以窗口与窗口之间是无法进行信息传递的。为了解决这个问题,作者引入了Shifted Windows Multi-Head Self-Attention(SW-MSA)模块,即进行偏移的W-MSA。如下图所示,左侧使用的是W-MSA(假设是第L层),那么根据之前介绍的W-MSA和SW-MSA是成对使用的,那么第L+1层使用的就是SW-MSA(右侧图)。根据左右两幅图对比能够发现窗口(Windows)发生了偏移(可以理解成窗口从左上角分别向右侧和下方各偏移了⌊ M/2 ⌋ 个像素)。看下偏移后的窗口(右侧图),比如对于第一行第2列的2x4的窗口,它能够使第L层的第一排的两个窗口信息进行交流。再比如,第二行第二列的4x4的窗口,他能够使第L层的四个窗口信息进行交流,其他的同理。那么这就解决了不同窗口之间无法进行信息交流的问题。

环形移动窗口法(cyclic shift):先向右边位移,把左边被排开的内容填充到右边空着的位置,shift的尺寸是window_size/2。然后再往下位移,把上边被排开的内容填充到下边空着的位置。

经过了 cycle shift 的方法,一个 window 可能会包括来自不同 window 的内容,如上图红色框内的 sub-window,来自4个不同的 sub-window。因此,要采用 masked MSA 机制将 self-attention 的计算限制在每个子窗口内。最后通过 reverse cycle shift 的方法将每个 window 的 self-attention 结果返回。

这里进行下简单的图解,下图5代表 cycle shift 的过程,这9个 window 通过移位从左边移动到右侧的位置。

按子窗口划分即可得到 5 号子窗口的自注意力的结果,但直接计算会使得 6 号 / 4 号子窗口的自注意力计算混在一起,类似的混算还包括 8 号 / 2 号子窗口 和  9 号 / 7 号 / 3 号 / 1 号子窗口的纵向或横向等。所以需采用 masked MSA 机制:先正常计算自注意力,再进行 mask 操作将不需要的注意力图置 0,从而将自注意力计算限制在各子窗口内。

按照 Swin Transformer 的代码实现 (下面会有讲解),还是做正常的 self-attention (在 window_size 上做),之后要进行一次 mask 操作,把不需要的 attention 值给它置为0。

例1: 比如右上角这个 window,如下图6所示。它由4个 patch 组成,所以应该计算出的 attention map是4×4的。但是6和4是2个不同的 sub-window,我们又不想让它们的 attention 发生交叠。所以我们希望的 attention map 应该是图7这个样子。

因此我们就需要如下图8所示的 mask。

模型配置

Swin-T:C=96,layer number:{2262}  。

Swin-S:C=96,layer number:{22182}  。

Swin-B:C=128,layer number:{22182}  。

Swin-L:C=128,layer number:{22182}  。

win. sz 7x7 表示窗口大小为7x7

dim表示feature map的channel深度(或者说token的向量长度)

head表示多头注意力模块中head的个数

7、总结

1SwinT提出了一种类似于CNN的层次化结构,使得能够学习多尺度的特征,感受野不断扩大,对于局部细节的捕捉能力更强,并且可以作为一个视觉任务的通用backboneViT只强调了Transformer在视觉图片分类领域的开创性作用,SwinT更多的是想证明Transformer可以和CNN一样作为通用的模型

2SwinT提出了W-MSA(窗口多头注意力),使得计算复杂度远远降低。ViT由于是在整张图计算自注意力,其计算复杂度会随着输入图片大小呈二次方增长,这是非常庞大的计算量;而SwinT提出的W-MSA,将注意力计算范围限制在每一个小窗口内,所以随着输入图片大小变化,但窗口大小是固定的,计算复杂度呈线性增长。

3SwinT提出了SW-MSA(移动窗口多头注意力),W-MSA虽然将计算复杂度降下来了,但是窗口之间的计算是独立的,导致缺乏信息流通,于是就有了移动窗口,能够既降低计算复杂度又产生窗口之间的信息交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值