Swin Transformer详解

之前transformer主要用于NLP领域,现在也应用到了CV领域。

该文介绍了一种新的Transformer,称为Swin Transformer,它可以作为计算机视觉的通用backbone。
将Transformer从语言调整到视觉的挑战来自两个领域之间的差异:

1.视觉实体的大小差异很大,NLP对象的大小是标准固定的。
2.图像中的像素与文本中的单词相比具有很高的分辨率,而CV中使用Transformer的计算复杂度是图像尺度的平方,这会导致计算量过于庞大。

为了解决这两个问题,我们提出了a hierarchical Transformer ,其表示是用滑窗操作计算的。滑窗操作方案通过将注意力计算限制到不重叠的局部窗口,同时还允许跨窗口连接,带来了更高的效率。(滑窗操作包括不重叠的local window,和重叠的cross-window。
这种分层体系结构可以灵活地在各种尺度上建模,并且在图像大小方面具有线性计算复杂性。Swin Transformer的这些品质使其能够兼容广泛的视觉任务。
Swin Transformer详解_第1张图片
(a) 提出的Swin Transformer通过合并更深层的图像块(以灰色显示)来构建分层特征图,并且由于只在每个局部窗口(以红色显示)内计算注意力,因此对于输入图像大小具有线性计算复杂度。因此,它可以作为图像分类和密集识别任务的通用backbone。

(b) 相比之下,以前的Vison transformer产生单一低分辨率的特征图,并且由于计算全局的自我注意,对于输入图像大小具有二次计算复杂度。

———————————————————————————————————————

Swin Transformer整体架构

Swin Transformer详解_第2张图片
(a)Architecture
Swin Transformer详解_第3张图片
构建了4个stage,每个stage中都是类似的重复单元。
和ViT类似,通过patch partition将输入图片 HxWx3 划分为不重合的patch集合,其中每个patch尺寸为 4x4,那么每个patch的特征维度为 4x4x3=48patch块的数量为H/4 x W/4
stage1:先通过一个linear embedding将输划分后的patch特征维度变成C,然后送入Swin Transformer Block;
stage2-stage4操作相同,先通过一个patch merging,将输入按照2x2的相邻patches合并,这样子patch块的数量就变成了H/8 x W/8,特征维度就变成了4C,这个地方文章写的不清楚,猜测是跟stage1一样使用linear embedding将4C压缩成2C(通过一个全连接层再调整通道维度为原来的两倍),然后送入Swin Transformer Block。
在这里插入图片描述
stage1:【H/4 x W/4,C】
stage2:【H/8 x W/8,2C】
stage2:【H/16 x W/16,4C】
stage2:【H/32 x W/32,8C】

Swin Transformer和ViT划分patch的方式类似,Swin Transformer也是先确定每个patch的大小,然后计算确定patch数量。不同的是,随着网络深度加深ViT的patch数量不会变化,而Swin Transformer随着网络深度的加深数量会逐渐减少并且每个patch的感知范围会扩大,这个设计是为了方便Swin Transformer的层级构建,并且能够适应视觉任务的多尺度。

————————————————————————————————————

(b) Two Successive Swin Transformer Blocks
Swin Transformer详解_第4张图片
这是两个连续的Swin Transformer Block。一个Swin Transformer Block由一个带两层MLP的shifted window based MSA组成。在每个MSA模块和每个MLP之前使用LayerNorm(LN)层,并在每个MSA和MLP之后使用残差连接。

——————————————————————————————————————

Shifted Window based Self-Attention

Swin Transformer详解_第5张图片
在所提出的Swin transformer体系结构中计算注意力的滑窗操作的示例。在l层(左)中,采用规则的窗口划分方案,在每个窗口内计算自注意。在下一层l + 1(右)中,窗口分区被移动,产生了新的窗口。新窗口中的自注意计算跨越了层l中以前窗口的边界,提供了它们之间的连接。

普通的MSA和W-MSA的计算量对比:
在这里插入图片描述
W-MSA虽然降低了计算复杂度,但是不重合的window之间缺乏信息交流,于是作者进一步引入shifted window partition来解决不同window的信息交流问题,该方法在连续的Swin Transformer块中的两个Swin Transformer Block之间交替进行。

第一个模块W-MSA: 使用从左上角像素开始的常规窗口划分策略,将8 × 8特征图均匀划分为大小为4×4 (M = 4)的2×2窗口。

下一个模块SW-MSA: 采用与前一层不同的窗口配置,通过将窗口从规则划分的窗口中移位(M/2,M/2)个像素。

Swin Transformer详解_第6张图片
将前一层Swin Transformer Block的8x8尺寸feature map划分成2x2个patch,每个patch尺寸为4x4,然后将下一层Swin Transformer Block的window位置进行移动,得到3x3个不重合的patch。移动window的划分方式使上一层相邻的不重合window之间引入连接,大大的增加了感受野。可以看到移位后的窗口包含了原本相邻窗口的元素。但这也引入了一个新问题,即window的个数翻倍了,由原本四个窗口变成了9个窗口。

在实际代码里,我们是通过对特征图移位,并给Attention设置mask来间接实现的。能在保持原有的window个数下,最后的计算结果等价。

特征图移位操作
Swin Transformer详解_第7张图片
Attention Mask
先特征图移位
Swin Transformer详解_第8张图片
让具有相同index QK进行计算,而忽略不同index QK计算结果。
Swin Transformer详解_第9张图片

——————————————————————————————————————
Relative position bias
增加了个相对位置偏差B
在这里插入图片描述

你可能感兴趣的:(笔记,pytorch,人工智能)