Swin Transformer 自用笔记
Swin Transformer: Hierarchical Vision Transformer using Shifted Windows
原文链接:https://arxiv.org/abs/2103.14030
摘要:从ViT的理念出发,提出分级的transformer架构和移动窗口的方式,优化一般基于ViT的全局自注意力计算方式,证明了Transformer在多种视觉领域任务的适用性。


SwinTransformer 模型 右图为Block中的详细2层结构

这里走一下前向过程,理解模型:
a. 224*224*3 的rgb图像经过patch size(代码实现中使用卷积操作)为 4*4 的切块后(ViT中为16*16)变成 56*56*48的特征图,这里4*4*3=48,224/4=56。
b. 然后经过线性变换(上图中的Linear Embedding)为56*56*C的特征图,这里的C的值是个超参数,而在实际计算中前面的56*56其实是一个一维的长向量,也就是一张图在此处本质上是3136*C 的一个“句子”(后面进入Encoder 和 Decoder时候也就和在NLP领域中的操作一致)。本文中C常用96。
c. 此时3136的句子长度对于任务来说不可接受,为了实现降低计算复杂度,在Swin Transformer Block中引入滑动窗口操作(Shifted Windows)来简化计算,这里详细讲解Swin操作。(注意该Block不改变张量的形状。所以56*56*C的特征图的形状不发生改变)

在原文中 3.2节 Shifted Window based Self-Attention 详细解释了使用该机制的动机和其运作方式。“The standard Transformer architecture and its adaptation for image classification both conduct global selfattention, where the relationships between a token and all other tokens are computed. The global computation leads to quadratic complexity with respect to the number of tokens, making it unsuitable for many vision problems requiring an immense set of tokens for dense prediction or to represent a high-resolution image。” 我们可以看到传统的transformer架构被移植到CV领域时候,做的self-attention操作并没有改变,就是图片有多长,自注意力就算多长,本文有个较为独特的认识见解,即对于图片而言,我们是不是不用像文本那样考虑这么长的信息,因为在图像中,可能各个token区域的相关性就没有那么的强,不值得花费如此高昂的计算代价。特别是在密集型下游任务中,这样的全局自注意力计算操作导致了巨量的运算,甚至难以进行。由此作者提出只在局部区域(以窗口为单位)做自注意力;同时使用滑动窗口的方式,来建立全局联系,总的思路是化整为2部分。复杂度的差异在原文中有计算,如下图,差异就是M^2 与 h*w 能差多少的问题,这里选我们上面的h*w=3136为例,在该问题中 M = 7, M^2 = 49,可以看到差了2个数量级。

上面的解释主要是对于“窗口”,下面解释“滑动”,在上面我们只用局部窗口做自注意力,那到最后的几层网络中一个特征图的一个“像素”,只能映射到最初特征图的某一小片区域,和全局就失去了联系。为了弥补窗口自注意力造成的全局关联信息的丢失,引入滑动操作,大致就是第一层的transformer中做左上角的窗口自注意力,第二层的transformer中将窗口的划分往右下方挪动两个patch后再做窗口自注意力计算,这样也解释了为什么上述的transformer block下面都有*2 以两层为基础block的原因;同时这样堆叠操作后,最后计算得到的每个位置的数值就是具有全局信息的。

然而还有个问题需要解决,为了使特征融合而进行的滑动窗口操作,会使得特征图出现下图中最左边的切分方式,这样不规则的区域不易于做自注意力操作,于是本文中进行了下面的矩阵拼接操作,使得计算方式保持一致性,然而这样拼接后并不能直接进行计算,因为下图中的不同颜色之间,并没有位置的相关性,就是不可以与同框内的其他色块做交互计算(如果C是天空,而与C同框的那块很有可能是地面或者其他在空间上与其并没有直接关系的语义信息的区域)这里就需要用到掩膜操作,也就是下图中的Masked MSA,具体掩膜操作可以查阅,就是让不相关联的小方块只与自己做自注意力,加其他的权值大负数后,经过sigmoid函数逼近0舍弃。

本文中也用到了相对位置编码这个技术,这里展开讲有很多,不过不是本文的重点,后面会专门写个位置编码的笔记(绝对位置编码,相对位置编码)。
d. 由于transformer的架构对于特征图的形状不会造成变化,这里为了和CNN的池化操作对齐,引入Patch Merging操作(详解于上图),具体操作是先对图像做四次下采样,生成4张特征图,将其堆叠并归一化后,使用1*1卷积将其降维,这样就将原来一个W*H*C的特征图变为一个W/2 * H/2 * 2C 的形状,和CNN中的”大小减半 通道翻倍“对等。此操作使得张量形状由56*56*C 变为 28*28*2C 。
e. 最后得到的一组特征图 7*7*8C ,根据下游任务来选择怎么将其操作,若是分类,可以用GlobalAverage pooling,分割检测之类的也可以直接拿7*7*8C的张量去用。
小技术 testing time augmentation:测试时增强,指的是在推理(预测)阶段,将原始图片进行水平翻转、垂直翻转、对角线翻转、旋转角度等数据增强操作,得到多张图,分别进行推理,再对多个结果进行综合分析,得到最终输出结果。
文章的主要贡献在于结果和对transformer架构在CV任务的应用上的思考,可细读原文实验。
参考链接:
· Swin Transformer之PatchMerging原理及源码_patch merging_白话先生的博客-CSDN博客
· 简单聊聊 Test Time Augmentation - 知乎用户yP1hFG的文章 - 知乎 https://zhuanlan.zhihu.com/p/383005472