《Swin Transformer: Hierarchical Vision Transformer using Shifted Windows》
论文地址:https://arxiv.org/pdf/2103.14030.pdf
Swin Transformer是2021年微软研究院发表在ICCV上的一篇best paper。该论文已在多项视觉任务中霸榜(分类、检测、分割)。再阅读本文前,先要了解一下用于图像分类的ViT:Vision Transformer(ViT)
Swin Transformer相比于ViT最大的区别就是这里划分成Windows,并在Windows内部做self-Attention(local的特征,披着Transformer的卷积神经网络 ),而ViT是在对整个特征图做self-Attention,节省计算量;此外Swin Transformer这里的Windows还是有很多种层级的大小。
对于分类网络,Swin Transformer最后面还会接上一个Layer Norm层、全局池化层以及全连接层得到最终输出。ViT是用[CLS] Token来分类的。
对于检测和分割,每个stage输出的多尺度特征就可以送给FPN、UNet进行检测和分割了。
引入Windows Multi-head Self-Attention(W-MSA)模块是为了减少计算量。ViT中的MSA是所有像素之间进行Self-Attention计算,而W-MSA只有再同一个(7*7大小)窗口内的像素之间计算Self-Attention。
M代表每个窗口(Windows)的大小
采用W-MSA模块时,只会在每个窗口内进行自注意力计算,所以窗口与窗口之间是无法进行信息传递的。为了解决这个问题,作者引入了SW-MSA模块。
这样就可以继续计算M大小窗口内的Self-Attention,又不引入多余的计算量。但是又有一个新的问题,就是拼出来的M大小窗口实际上在空间上并不是连续的。所以在计算的时候引入MASK,将拼出来的窗口中空间不连续的像素割开。
具体来说就是:先和W-MSA一样计算Q,K,V;但进行Self-Attention在softmax之前,需要将不在空间连续的其他像素(或称token,patch)减去100(其实softmax后基本就是0了),这样就能保证只有空间连续的像素进行了Self-Attention。
在计算完后还要把拼图后的数据给挪回到原来拼图前的位置上。
下图是实际运行速度对比:
到此,你可能会发现还没介绍位置编码,而且Attention的公式里面还多了一项B:
这个B就是相对位置偏执,是一个可学习的参数。所谓的相对偏移就是,像素qj与其他像素ki相乘,如果像素ki在像素qj相对位置相同(i=0,1… ; j=0,1…),那么他们的位置编码是同一个参数b。以M=2为例,相对位置可以是上、下、左、右、右上、右下、左下、左上以及自己本身;总计(2M-1)*(2M-1)个相对位置。
此外:如果之后窗口的大小发生变化后,这个位置编码B还是可以通过bi-cubic插值得到,从而进行迁移学习。
为了验证窗口偏移和相对位置编码的作用,进行了如下实验:
窗口偏移带来稳定提升,相对位置编码对图像分类带来的提升不大,但是对目标检测和分割却又较大的帮助。可能是位置信息对后面两个任务更重要,而分类最后只需要用到高层的语义信息,基本已经损失掉了位置信息。
原论文中给出的关于不同Swin Transformer的配置,T(Tiny),S(Small),B(Base),L(Large),其中:
目标检测:涨点明显
上一篇:Vision Transformer(ViT)