前言

前言就是唠唠嗑,想看干货的可以直接看下一节。
今年ICCV的最佳论文还是给到了刷榜各大CV竞赛榜的模型Swin Transformer,研究团队来自MSRA(你大爷还是你大爷啊)。

自从ViT、DETR等尝试把language模型中的王炸transformer使用到视觉领域并得到还不错的验证效果后,研究者们一直在致力于“如何更好地将语言模型建模到视觉”这个问题。ViT直接把图片划分patch,用对待word的方式来对待每个patch,轻松将图片建模成sentence;而DETR则需要CNN辅助提取特征,而transformer只是当一个neck。后者更像是一个过渡模式,咱们本文不做过多讨论。

重点说下ViT的问题,首先ViT不适合作为通用模型的backbone,不擅长处理dense输出型(如目标检测、分割等)的视觉任务。ViT通过将图像划分成不相交的patch,通过编码每个patch然后计算两两patch之间的attention,来实现聚合信息。这样,应对更高清的图片时,划分的patch数会受计算资源掣肘。你可以这么想,4x4=16个patch,两两计算注意力,和100x100=10000个patch,两两计算注意力,计算复杂度完全不一样(指数级的差别)。假如用降采样的方法依旧保持少量的patch数,那就没使用到高分辨率带来的好处;假如把用更大的编码器来保持较少的patch数,那么transformer会慢慢往MLP的方向退化。于是,研究者们开始设想一种新的transformer结构,使之能更好地适应视觉任务。

Swin Transformer就是一种通用视觉任务的Backbone而存在的模型,以替代CNN。它做到了,而且outperform现有的CNN模型。这也是其获得Best Paper的主要原因。

将ST复现到我自己的数据集(四分类),效果如下:

稳步收敛,最终准确率达到81%左右。


论文链接:https://arxiv.org/abs/2103.14030
论文标题:Swin Transformer: Hierarchical Vision Transformer using Shifted Windows
官方代码实现(pytorch):https://github.com/microsoft/Swin-Transformer/(本文主要参考代码)
本文行文主要参考是官方代码,次要参考才是论文。所以读者最好结合代码一起看本文。


总概

主体结构

Swin的主体结构主要由4个Basic Layer组成。每个Basic Layer都有Depths、NUM_HEADS两个主要参数,以此来区分各种量级的swin transformer(如swin tiny,swin base等)。
Depths代表这个Basic Layer由几个swin transformer block(以下简称“STB”)串联而成,如图1中虚线框中的数字’x2’,‘x2’,‘x6’等待。
NUM_HEADS代表这个Basic Layer中的STB的head数量(每个head就是一组独立的注意力计算机制,类似于CNN中的channel,不了解可戳《transformer详解》)。head数量越多,代表特征channel越多。

第一步,名词解答:Window、Patch、Token
这三个名词,我们可以用一个栗子来解答。假设输入图片的尺寸为224X224,先划分成多个大小为4x4像素的小片,每个小片之间没有交集。224/4=56,那么一共可以划分56x56个小片。每一个小片就叫一个patch,每一个patch将会被对待成一个token。所以patch=token。而一张图被划分为7x7个window,每个window之间也没有交集。那么每个window就会包含8x8个patch。这段计算整明白了,你就会了解window、patch和pixel的关系。

Patch Embedding

一张224x224的图片,被划分成56x56个patch,然后对每个patch(尺寸为4x4)进行编码得到96-d的embedding向量。
那么这一步的张量尺寸变换为:Bx224x224x3 -> Bx3136x96
这里的B表示batch size,而3136=56x56。
用白话描述:咱们每个图片被划分为3136个patch,每个patch又被编码成96维的向量
这一步在代码上实现十分简单,就是一个Conv2D,把步长和kernel size都设置为patch的长度即可,可看:

nn.Conv2d(in_chans, embed_dim, kernel_size=patch_size, stride=patch_size)

这步以后再flatten一下,就可以把56x56x96变为3196x96。

输入到STB(swin transformer block)之前,对输入张量进行dropout,这里的dropout主要是为了进行数据增强,因为这一步会随机性让一些patch embedding的数值为0,详情可戳《pytorch中nn.Dropout的使用技巧》。

Patch Merging

先把STB当做一个黑盒模型,Patch Embedding就是处理STB输入,而Patch Merging就是处理STB的输出。Patch merging模块是整个Swin Transformer模型中唯一的降采样操作。张量通过STB模块的时候尺寸是不发生改变的。

Patch Merging就好比CNN中的Pooling操作,但是比Pooling操作复杂一些。我们看图1,56x56x96对应(H/4)x(W/4)xC。经过Patch Merging以后,变为(H/8)x(W/8)x2C,即28x28x192。
分辨率下降到了1/4,而token的维度扩充到了2倍
这一步经过了以下操作:

上面操作有没有些熟悉,就是pixel shuffle(链接可戳)的反过程嘛。
这一操作,直接可以把56x56x96变成28x28x(4x96),再通过一个线性层变为28x28x(2x96)。线性层如下:

nn.Linear(4*dim, 2*dim, bias=False)

有疑问可留言交流~

Swin Transformer Block

重头戏来了,Swin transformer是在标准transformer上的一个改进。主要是用Shifted window来改进标准多头自注意力模块。

ST中使用的激活函数是《GELU》,使用的正则化方法是Layer Normalization(可戳《Layer Normalization》《常见的Normalization》进一步了解)


与标准transformer不同的就是紫色部分的两个框,分别是W-MSA和SW-MSA。
W-MSA表示,在window内部的Multi-Head Self-Attention,就是把window当做独立的全局来计算window中每个token两两注意力。
SW-MSA与W-MSA的一丢丢不一样,就是将window的覆盖范围偏移一下,原文设置为window的边长的一半。

W-MSA

全称为Window based Multi-head Self Attention。一张图平分为7x7个window,这些window互相都没有overlap。然后,每个window包含一定数量的token,直接对这些token计算window内部的自注意力。 以分而治之的方法,远远降低了标准transformer的计算复杂度。以第1层为例,7x7个window,每个window包含16x16个patch,相当于把标准transformer应用在window上,而不是全图上。不太了解标准transformer做法的可戳《令人心动的transformer》,文中介绍了QKV、Multi-Head self attention等原理。

那么,不同window之间的信息怎么聚合呢?这就要用到SW-MSA了。

SW-MSA

这里的shifted window相对于初始的划分有一个平移。这个平移距离刚好是单个window边长的一半。

图3
上图是一个2x2个window的例子,window通过对角线方向滑动后,中间那个window就获取到了上一层所有window的信息了。用这种Shifted Window技巧来聚合各个不相交window之间的信息被证明是在各种视觉任务中非常有效的。

SW-MSA在逻辑上很make sense,但在计算上需要颇费心机。我们看图3,当窗口滑动后,窗口数从2x2变到3x3,而且边缘的窗口也比正常窗口小。为了应对计算上的问题,作者提出了基于cyclic shift的batch computation

这种做法可以保证window数量不变,也可以保证每个window中的token数量也一样多。然后,通过MSA中的mask来分开window中的子窗口,如那个黄色部分A小块。这样,就可以实现非常高效且省资源的计算。


上图示例的Cyclic Shifting方法,可以保持面向计算的window数量保持不变(还是2X2),在window内部通过attention mask来计算子window中的自注意力。
代码中通过2个torch.roll来实现。一个负责滑动过去,一个负责滑动回来,两者在结构中交替出现。
torch.roll的图片示例为:

详情可戳《torch.roll图片实验》

Some Tricks

共享key
上面说到ST在每个window内实施标准transformer,其实还有额外的trick,其中一个重要的节省内存的trick就是: Shared Key
在一个window内部,所有的patch共享一组Key。咱们可以看一下示意图:

在计算attention的时候,需要编码出每个token的QKV值,然后用公式:
Attention(Q,K,V)=softmax(QKT/dk)VAttention(Q, K,V) = softmax(QK^T/\sqrt{d_k})VAttention(Q,K,V)=softmax(QKT/dk

)V
而对于每一个patch都计算一个不同的K集合,是非常memory unfriendly的。如果使用共享Key值,就会大大节约内存。
在原文中描述如下:

This strategy is also efficient in regards to real-world latency: all query patches within a window share the same key set, which facilitates memory access in hardware.

相对位置编码
论文中实验显示,采用相对位置编码比绝对位置编码有明显涨点。
咱们再看一眼ST中的自注意力计算公式:
Attention(Q,K,V)=softmax(QKT/dk+B)VAttention(Q, K,V) = softmax(QK^T/\sqrt{d_k} + B)VAttention(Q,K,V)=softmax(QKT/dk

+B)V
其中B为位置编码参数。假设window是M×MM\times MM×M个patch大小,计算patch a相对于patch b的注意力时,我们可以考虑他们之间的相对位置。在考量相对位置编码方案时,我们需要具备这个思想:不同的相对位置关系有不同的相对位置编码
在ST中,假设window大小为M×MM\times MM×M,则每个patch相对于另一个patch的位置差别取值范围是[−M+1,M−1][-M+1, M-1][M+1,M1],那么值域的跨度为2M−12M-12M1。先根据先验知识计算出一个相对位置编码矩阵B^∈R(2M−1)×(2M−1)\hat{B} \in{\mathbb{R}^{(2M-1)\times(2M-1)}}B^R(2M1)×(2M1),然后通过位置关系进行查表就可以得到当前的BBB值。

总结

ST相比ViT而言,采用了基于window局部自注意力,在应对大分辨率图像或者应对dense型输出的视觉任务时,可以把输入切分出更多的window。假设每个window的含有的patch数一致,window内自注意力计算量就可以看做一个常数,全局的计算复杂度跟图片的大小 H×WH\times WH×W成线性关系。相比于ViT的全局自注意力计算(跟(H×W)2(H\times W)^2(H×W)2呈线性关系),ST线性计算复杂度使之可以应对高分辨率输入以及dense型输出的视觉任务,也使得transformer作为general purpose backbone有了可能性。

Swin Transformer全方位解读【ICCV2021马尔奖】相关推荐

  1. 历届图灵奖和马尔奖获得者

    1.历届图灵奖获得者 1966 A. J. Perlis因在新一代编程技术和编译架构方面的贡献而获奖 1967 Maurice V. Wilkes因设计出第一台具有内置存储程序的计算机而获奖 1968 ...

  2. 马尔奖得主 Alan Yuille | AI 视觉的未来:像人一样看世界

    ‍‍ 智源导读:人类的视觉系统经过百万年的进化已具有非常强大的功能,甚至是一种未受到充分赏识的超能力.人类之所以在视觉上表现如此优异,一方面归功于人类的进化史,另一方面是因为我们的大脑投入了很大一部分 ...

  3. Swin Transformer论文解读

    文章目录 创新点 算法 Patch Merging W-MSA SW-MSA 位置偏置 结构变体 实验 ImageNet分类 COCO目标检测 ADE20K语义分割 消融实验 结论 论文: <S ...

  4. 【知乎热议】如何看待swin transformer成为ICCV2021的 best paper?

    编辑:深度学习技术前沿 转载请注明来源,谢谢! [导读]今年ICCV2021, 在所有被接收的论文中,来自中国的论文数量占比最高,达到了 43.2%,约为第二位美国(23.6%)的两倍.中国学者凭借S ...

  5. 专访 Swin Transformer 作者胡瀚:面向计算机视觉中的「开放问题」 原创

    文 | 刘冰一.Echo 编辑 | 极市平台 本文原创首发于极市平台,转载请获得授权并标明出处. 胡瀚,湖北潜江人,本博均毕业于清华大学自动化系,曾就职于百度研究院深度学习实验室,目前任职于微软亚洲研 ...

  6. Swin Transformer升级版来了!30亿参数,刷榜多项视觉任务

    ©作者 | 杜伟.陈萍 来源 | 机器之心 微软亚洲研究院升级了 Swin Transformer,新版本具有 30 亿个参数,可以训练分辨率高达 1,536×1,536 的图像,并在四个具有代表性的 ...

  7. Swin Transformer升级版来了!30亿参数,刷榜多项视觉任务,微软亚研原班人马打造...

    视学算法报道 编辑:杜伟.陈萍 微软亚洲研究院升级了 Swin Transformer,新版本具有 30 亿个参数,可以训练分辨率高达 1,536×1,536 的图像,并在四个具有代表性的基准上刷新纪 ...

  8. 大大刷新记录!Swin Transformer v2.0 来了,30亿参数!

    关注公众号,发现CV技术之美 本文转载自 微软研究院AI头条 编者按:2021年,获得 ICCV 最佳论文奖的 Swin Transformer,通过在广泛的视觉问题上证明 Transformer 架 ...

  9. Swin Transformer:Hierarchical Vision Transformer using Shifted Windows (论文阅读笔记)

    swin transformer 是微软亚研院胡瀚老师与2021年提出,发表在ICCV上并获得best paper 和马尔奖.是基于transformer的backbone网络,屠榜各大视觉任务. 论 ...

最新文章

  1. Main-Accounts-and-Financial-Dimensions-Data-Model_thumb
  2. redis mysql 案例_linux安装redis和mysql的实例讲解
  3. 实验4-1-10 兔子繁衍问题 (15分)
  4. web input光标的颜色
  5. linux网络编程之inet_addr和inet_ntoa使用总结
  6. Web前端工作笔记003---Javascript 解决IE8不支持filter、map的方法
  7. python 中主线程结束 子线程还在运行么_Python爬虫进阶(二)爬虫之多任务模块(Ⅰ)...
  8. Uiautomator入门(初学者用)
  9. java设计模式-终结者者模式
  10. android 百度地图
  11. 2022年江苏省职业院校技能大赛网络搭建与应用赛项中职样卷
  12. Laya 微信小游戏登录问题
  13. android 盒子刷机,一加5刷机盒子
  14. [Russell Han] 24 | 数据库基础 | 关系模型
  15. HTML5视频播放器jQuery插件
  16. 零基础怎么做好海报重叠设计
  17. CSI笔记【2】:正交频分多路复用技术/OFDM
  18. 微信小程序 - 手持弹幕 | 全屏炫酷滚屏神器源代码模板,超详细代码和注释复制粘贴即可使用(全屏文字滚动,支持调节滚动速度、字体大小、字体颜色)文字内容横屏滚动,手机变身 LED 屏
  19. Spring Boot连接Oracle数据库驱动加载不上的问题(pom.xml引入ojdbc报错的问题)
  20. 美团2017年CodeM资格赛题解

热门文章

  1. 2021亚丁百度网址URL批量采集工具【过安全验证】
  2. Failed to execute goal org.codehaus.mojo:exec-maven-plugin:3.0.0:exec (defau-cli) on project
  3. (十四)懈寄生(4)
  4. Python PIL.Image之制作GIF图片
  5. 老师就是学生的天-- 恩人意识,青天意识从娃娃抓起
  6. DFS中的回溯法(纯暴力穷举)
  7. 1.27 Watermelon
  8. 交叉编译时不要忘记-march编译选项
  9. win10设置软件开机启动
  10. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU特性那些事(2)- RT1052DVL6性能实测(CoreMark)...