论文笔记:Swin Transformer: Hierarchical Vision Transformer using Shifted Windows
Posted UQI-LIUWJ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了论文笔记:Swin Transformer: Hierarchical Vision Transformer using Shifted Windows相关的知识,希望对你有一定的参考价值。
cvpr2021
0 abstract
- Transformer 从NLP迁移到CV,会遇到两个挑战
- 语义物体(人、车。。。)的尺寸有大有小
- 如果是像素级别的Transformer,那么resolution太大
- 为了解决上述的两个挑战,提出了swin transformer
- 将self-attention约束在移动窗口内部的各个pixel
- 同时也有cross-window connection
- ——>swin transformer可以作为通用cv任务的backbone
- 层级结构可以更好地在不同尺度下建模
- 同时对于图像大小来说,计算复杂度是线性的
1 Introduction
从论文introduction中的两个图来进行介绍:
1.1 和ViT的对比
- Vit 中,图片是分成16*16的patch组成的,然后将patch组成序列扔给Transformer。
- 换言之,ViT是16倍下采样。每一层都是16倍下采样
- 也就是说,自始至终ViT中patch代表的尺寸是一样的,都是16*16的像素
- 而CNN(及其变体)之所以在很多cv任务中表现很好,是因为他们通过池化操作,可以获得不同的感受野,也即可以抓住物体不同尺寸的特征。
- 在很多CV下游任务,尤其是像素密集型的任务(检测、分割等),多尺度信息是很重要的(比如U-Net)
- ViT虽然使用了attention,但是它的尺寸一致是patch级别的attention,自注意力一直是全局注意力
- ——>不会得到多尺寸的attention结果,这个会在一定程度上影响下游任务的表现
- 于此同时,随着图像尺寸的增加,patch的数量是平方倍的增长
- ——>对于很大的图,或者像素点很密集的图,使用ViT不一定可行
- 于是作者提出了swin transformer
- 只在小窗口内进行自注意力(而不是在整张图中算自注意力)
- ——>减少了序列的长度
- 和图像尺寸成线性关系
- ——>图片大小增大x倍,窗口的数量增加x倍,计算量也只增加x倍
- ——>相比于ViT,能更好地作用在大图中
- swin transformer 利用的性质是图像的locality
- ——>即语义相近的物体大多在很近的区域内
- ——>使用全局的attention是有点浪费的
- swin transformer 中的patch mergeing 类似于CNN中池化操作
- 后一层的一个大patch可以包含上一层几个小patch的内容
- ——>有了多尺度的信息
1.2 Swin Transformer中的window
- 红色的框是一个窗口(在swin transformer中是7*7个patch一个窗口,图中用4*4表示)
- shift window的操作可以看作是窗口整体向右下角移动(图中是向右下角移动两个patch)
- ——>这样窗口和窗口之间就有交互的(cross-window connection)
- ——>如果不进行shift window的话,不管垒几层,每次只是在小窗口里面进行self-attention,那么一个patch永远看不到其他patch的信息
- ——>这样就是孤立的自注意力,没有全局信息
- ——>通过patch merging(swin transformer中的上采样),每一个patch的感受野已经很大了。再加上shift window的话,最后几层一个窗口内包含的信息接近于全局注意力了。
2 模型部分
2.1 整体模型
(暂时将swin Transformer看成一个黑盒)
注意3(b)的两个窗口加起来才是一个swin-Transformer的基本单元【顺序不能颠倒】
——>3(a)中的数量都是偶数也是因为需要1+1搭配起来使用
2.2 window transformer VS 传统 transformer
第一个式子是mulit-head self-attention的计算复杂度,第二个式子是window-multi-head self-attention的计算复杂度
MSA复杂度的推导:
对W-MSA来说,此时MSA公式中的h和w都是
代入,有:论文中的式子
2.3 shift window transformer
- 基于窗口(在窗口内的transformer)减少了计算量,但是此时窗口之间没有通信
- —>这会限制模型的学习能力。我们需要某种方式,让窗口之间互相通信
- —>所以我们需要移动窗口,Transformer先做窗口移动,再捕捉窗口
类似于1.2中所说的那样,向右下方平移
但现在还有另外一个问题:此时我们不仅窗口数从4个变成了9个,而且每个窗口的大小也不一样。
一种方法是我们对每个不足4*4的窗口向外进行补0的padding。但是这样的话,虽然每个窗口的大小一样了,但是窗口数还是变多了。变相地增加了复杂度。
论文中使用的方法是,再做一次移位(图中的cyclic shift部分)
将窗口平移后,“不规则”的A,B,C部分,补到对应的位置,这样就还是4个窗口——>计算复杂度依旧固定
2.3.1 Masked MSA
但是这样操作又有了一个问题: 移动之后的元素是从很“远”的地方搬过来的,讲道理和原先的那一块“不规则”部分是没有多少联系的——>这两块之间是不应该有attention权重的【比如C和D,B和E】
论文中使用了掩码mask的方式进行处理
- 对不需要循环移位的部分,MASK如下图Windows0所示(不需要MASK)
- BE情况——>window1(右上角)
- CD情况——>window2(左下角)
- AF情况——>window3(右下角)
计算好的attention加上这个MASK,在经过SOFTMAX。那么不应该有关联的两块之间的权重就会非常的小
我们举个例子,来推导一下window2是怎么得到的(其他几个类似)
上图是经过循环移位后得到的图,图的大小为14*14,每个窗口的大小为7*7,其中数字0~8用来区分不同的区域。
Window2相当于是3和6组成的窗口对应的MASK
3号和6号区域所在的窗口内有49个patch,每个patch都是一个向量,如果现在把这个窗口拉直(一行接着一行),就变成了下图的矩阵。矩阵大小为49*1,一共有4*7=28个3号位元素,有3*7=21个6号位元素,每个向量的维度是C。
这里的3不是数值,而是指的是来自3号位的数字
self-attention就是和自己的转置(如下)进行矩阵相乘
self-attention的结果如下
图中3&3,6&6的部分是应该有attention的,但是3&6的部分是不应该有attention的
所以mask也就如window2画的那样了
2.3.2 再移回去
当然,做完mask之后,还是需要把移过来的部分再移回去的。(要不然图片就相当于一直在向右下角移动)
2.4 四种swin Transformer的配置
tiny/small/basic/large
3 实验结果
以上是关于论文笔记:Swin Transformer: Hierarchical Vision Transformer using Shifted Windows的主要内容,如果未能解决你的问题,请参考以下文章
论文笔记:Swin-Unet: Unet-like Pure Transformer for MedicalImage Segmentation
从ViT到Swin,10篇顶会论文看Transformer在CV领域的发展历程
论文解析[9] Swin Transformer: Hierarchical Vision Transformer using Shifted Windows