【论文阅读】Swin Transformer:Hierarchical Vision Transformer Using Shifted Windows

🚩前言

  • 🐳博客主页:😚睡晚不猿序程😚
  • ⌚首发时间:2022.9.5
  • ⏰最近更新时间:2022.9.5
  • 🙆本文由 睡晚不猿序程 原创,首发于 CSDN
  • 🤡作者是蒻蒟本蒟,如果文章里有任何错误或者表述不清,请 tt 我,万分感谢!orz


1. 内容简介

论文标题:Swin Transformer: Hierarchical Vision Transformer Using Shifted Windows

作者:Ze Liu,Yutong Lin,Yue Cao,Yixuan Wei,Zheng Zhang,Stephen Lin,Baining Guo

发布于:ICCV 2021

自己认为的关键词:Transformer


2. 摘要浏览

解决的问题:让 Transformer 去适应计算机视觉领域很困难,因为其有天然的不同:例如多尺度,以及相比起词语,图像分辨率非常高。这篇文章就是要解决 Transformer 在视觉领域的应用困难,所以提出了一个分层的 Transformer,取名为 Swin Transformer。

主要贡献:提出了 Swin Transformer,可以用作 CV 方向一般任务的骨干网络(backbone)

架构:Swin Transformer,其表达是通过在滑动窗口内进行计算得到的。其自注意力不仅会在窗口内进行计算,还可以跨窗口进行运算。并且这个模型是分层的,这样就可以很好的把握图像的多尺度特征,并且拥有线性复杂度。

完成效果:可以胜任多种视觉任务,包括图像分类,密集预测(如目标检测),语义分割,并对之前的 SOTA 模型实现了超越

3. 图片、表格浏览

图一

image-20220902172113422

一张图很好的表示了 Swin Transformer 的分层结构,这样的分层结构能很好的把握图像的多尺度特征,就像 CNN 一样。

图 a:Swin Tr 通过在更深层把小的 patch 合成为一个更大的 patch 来把握特征,并且拥有线性计算复杂度(原因是在计算自注意力的时候,尽在窗口内计算自注意力)。因此,Swin Tr 可以作为图像分类以及密集识别的骨干网络

图 b:之前提出的 ViT 结构,他的特征图仅为一个单独的低分辨率图像,并且拥有平方计算复杂度(以为他把图像划分为许多 16x16 的 patch,随着图像的增大,patch 也增多,计算复杂度为平方复杂度,因为计算自注意力是是在全局条件下计算的

图二

image-20220905084820255

滑动窗口的图例,左边是 l l l 层(左)原本的窗口划分,每个窗口计算自注意力。接着在下一层,也就是 l + 1 l+1 l+1 层(右)窗口进行滑动,自注意力在滑动后的窗口中进行计算,边界为原窗口的边界

图三

image-20220905090330983

图 a :Swin Tr 的结构

图 b:两个连续的 Swin Tr 块的结构,可以看到第一个块使用的是普通的窗口计算自注意力,而第二个块则使用了滑动窗口计算自注意力,两个合起来组成一个大的模块

图四

image-20220905090840114

高效计算滑动窗口的自注意力的图示,还没看文章内容感觉看的不是很懂iai

表一

image-20220905091019708

使用不同的骨干网络来对 ImageNet-1K 进行分类结果的对比,其中的 throughtput 数据来自一个 github 仓库,使用的 V100 GPU

表二

image-20220905091549250

COCO 的物体检测和图像分割结果

表三

image-20220905091715249

在 ADE20K 数据集上进行语义分割的结果

表四

image-20220905091854041

滑动窗口以及不同的位置嵌入方式的消融实验,可以看到使用滑动窗口可以涨很多个点。而使用默认的相对加性位置嵌入的效果是最好的

表五

image-20220905092053265

使用不同的自注意力计算方式的速度对比,可以看出在窗口内计算自注意力的速度快了非常多

表六

image-20220905092157271

使用不同的自注意力方法得到的结果对比


4. 引言浏览

CNN 已经主导了 CV 领域很久了,使用更大的规模,更复杂的连接以及卷积形式,使得 CNN 能够胜任许多的视觉任务。

Transformer 的提出走出了第二条路,他被设计用于序列建模以及翻译任务,他使用自注意力来建模较长的数据依赖关系。近来,Tr 已经在图像分类以及多模态上取得了不错的成绩

在这篇文章中,作者希望拓展 Transformer 的适用性,也就是让其像 CNN 一样称为在 CV 中的骨干网络。把 NLP 领域模型的优势转化到 CV 领域非常困难,这可以用两个领域之间的差异来解释。其中其中之一就是尺度

现有的问题:在 NLP 领域,word token 被认为是 Tr 的基本元素,而相比起 CV 领域,视觉的元素可以在比例上有很大的变化(多尺度)在现有的基于 Tr 的方法中,token 的大小都是固定的,所以难以用于 CV 任务当中。另一个问题是,比起词语,图片的分辨率高得多。而且如语义分割这一任务需要在像素级别进行密集预测,这样的话自注意力的计算复杂度就成了平方级别

解决方案:提出了 Swin Transformer,可以构建分层的激活图,且拥有线性计算复杂度。其从小尺寸的 patch 开始,并随着网络的加深逐步进行合并。

优势:这样的话 Tr 可以方便的利用特征金字塔或者是 U-Net 等先进的密集预测技术。线性时间复杂度是通过在不重叠的窗口中计算自注意力来实现的。每个窗口中的 patch 数量是固定的

核心设计

image-20220905084820255

就是其滑动窗口,如上图所示。两个相邻的自注意力层窗口的滑动。窗口的滑动可以让两个窗口的信息进行交互。并且这个策略可以带来更低的响应延迟。

relaworld-latency:生产环境下的响应延迟需求。应该也就是说输入数据,多久之后能输出数据,也就是处理速度吧!


自由阅读

5. 方法

5.1 总体架构

image-20220905090330983

上面是 Swin Tr 的整体架构图,下面解析一下他的步骤:

  1. 将输入的 RGB 图像通过 patch splitting module 划分为不重叠的 patch,每一个 patch 被当作是”token“来对待,他的特征被设置为原始像素 RGB 值的串联。接着经过一个线性嵌入层将其转换为任意的维度(这里写为 C)

    论文中设置 patch size 为 4 × 4 4\times 4 4×4 大小,因此每一个 patch 大小为 4 × 4 × 3 = 48 4 \times 4 \times 3 =48 4×4×3=48

  2. 经过了一系列的 Swin Transformer 块,这些块会保持 tokens 数( H 4 × W 4 \frac{H}4 \times \frac W 4 4H×4W),将其和线性嵌入层合在一起称为一个 Stage

  3. 随着网络的深入,patch merging layer 将多个 patch 块连接起来组合成一个更大的 patch,这样的话网络的 token 数就减少了

    第一个 patch merging layer 将 2 × 2 2\times 2 2×2 大小的 patch 连接起来,并使用一个维度为 4C 的线性变换层来融合特征

    其实就是把每个小窗口的相同位置的值提取出来

    并且这样会让 token 数量减少 4 倍,然后我们指定其输出维度为 2C(和 CNN 的做法一样,图像大小缩小,通道增加)

    经过了特征变换,接着再使用 Swin Transformer block 来进行处理。第一个 patch merging layer 和特征变换层我们合起来称为 Stage 2,接下来以此类推

  4. 经过一系列处理,我们得到了像经过 CNN 处理之后的特征图

所以,我们可以把上面所示的这一结构轻松的拿去替代原本的 CNN 结构

Swin Transformer block

其和原本的 Transformer block 不同的地方在于把多头注意力(MSA)用基于滑动窗口的注意力机制取代了,其他的层保持不变。

一个 Swin Tr 块中包含有一个基于滑动窗口的自注意力模块,并且跟着一个两层的 MLP,使用 GELU 作为激活函数

image-20220905104359140

这里的 MSA 分为两种,一种是不使用滑动窗口的 W-MSA,一种是使用滑动窗口的 SW-MSA,二者交替使用

5.2 基于滑动窗口的自注意力机制

以往的注意力机制是基于全局的注意力,这样导致了平方级的计算复杂度,当输入为一个超大的 token 序列时,其难以计算。因此作者提出了基于滑动窗口的自注意力

在不重叠的窗口中计算自注意力

作者仅在本地窗口中计算自注意力,这些窗口以非重叠的方式均匀分割图像。默认使用 7 × 7 7 \times 7 7×7 的窗口大小,这样有效减少了计算复杂度

在连续块之间的滑动窗口划分

因为我们仅在窗口内计算自注意力,因此缺少了窗口之间的连接。因此作者引入了滑动窗口的概念。他们提出了一个滑动窗口划分方法,并且在两个连续的 Swin Tr 块中交替使用(如下图示)

image-20220905084820255

输入为一个 8 × 8 8 \times 8 8×8 大小的特征图,我们我们将其划分为 2 × 2 2 \times 2 2×2 大小的窗口,每个窗口大小为 4 × 4 4 \times 4 4×4。接着下一个模块的窗口配置是是由上一个模块的窗口移动而来的,通过移动 ( ⌊ M 2 ⌋ , ⌊ M 2 ⌋ ) (\lfloor \frac M 2 \rfloor,\lfloor \frac M 2 \rfloor) (⌊2M,2M⌋) 来实现

首先原本只有四个窗口,但是现在经过了窗口滑动,产生了九个窗口,而且这九个窗口的大小都不一样,难以进行自注意力的高校计算。这里作者提出了一个解决方案(参考资料

image-20220905113716295

首先将上面三个窗口移动到下面,左边三个窗口移动到右边,如上图所示,接下来我们可以通过带 masked 的 MSA 来在这原本划分的窗口上(这里的示例为四个)进行自注意力计算,在四个窗口上通过掩盖计算九次

因为要直接原本划分的窗口来进行运算,我们要把我们不想要计算自注意力的数据进行掩盖

image-20220905114825327

上图来源知乎@zjzjxxww

经过平移后我们要计算的自注意力区域如上,从12区域来看,我们要计算1块的自注意力,则 2 块的信息是多余的

image-20220905164816208

因为要计算自注意力,要将整个部分拉成一个向量,其中元素序列为四个1三个2。我们只想要 1 的元素自己算自注意力,2的元素自己算自注意力,而不想要 1 和 2 元素之间算自注意力,所以我们只需要再加上一个维度一样的矩阵,其中黄色和蓝色的部分设置为 0,灰色的部分设置为 -100,这样的话加起来灰色的部分就会接近 -100,然后进行 softmax 运算的时候就近乎为 0 了,这样就可以高效的计算出滑动窗口内的自注意力

滑动窗口配置下的高效批量计算

经过了滑动窗口的处理会带来更多的窗口,而且某些窗口的大小会小于 M × M M \times M M×M。一个简单的方法是进行填充,并且在计算时进行 mask。作者表示,这样会带来很大的计算消耗。所以作者采用了将图片向左上角循环移动的方式来进行计算。经过了如此移动,一个 batched window 可以由多个原本不相邻的 sub-window 组成,这时候 mask 机制就可以很有效的应用于此,并且计算方法和原先的计算方法类似

相对位置偏置
在计算自注意力的时候,对每一个头的计算引入了相对位置偏置 B ∈ R M 2 × M 2 B \in \mathbb R^{M^2 \times M^2} BRM2×M2 ,计算公式如下
A t t e n t i o n ( Q , K , V ) = S o f t M a x ( Q K T / d + B ) V Attention(Q,K,V)=SoftMax(QK^T/\sqrt d+B)V Attention(Q,K,V)=SoftMax(QKT/d +B)V
相对位置编码参考资料

相对位置的范围为 [ − M + 1 , M − 1 ] [-M+1,M-1] [M+1,M1],所以设置了一个偏置矩阵 B ^ ∈ R ( 2 M − 1 ) × ( 2 M − 1 ) \hat B\in \mathbb R^{(2M-1)\times(2M-1)} B^R(2M1)×(2M1),偏置值 B 从中采样。使用相对位置编码可以比不适用位置编码、使用绝对位置编码有很大的提升。在预训练中学习得到的相对位置偏置可以通过双三次插值来用于初始化一个有着不一样的窗口大小的模型去微调

5.3 结构变体

作者构造了多种的 Swin Tr 模型,对应这不同的大小,有和 ViT 大小相似的 Swin-B,也有超小型和小型的 Swin-T 和 Swin-S,也有大型的 Swin-L

默认来说,窗口大小设置为 7,每个头的 query 维度为 32,MLP 的扩张层为 4(啥意思)

7. 实验

7.1 ImageNet-1K 图像分类

训练设置

作者考虑了两种训练方法:

  1. 使用 AdamW 优化器,余弦衰减学习率调度器,学习 300 个 epochs,使用学习率预热 20 epochs,batchsieze 大小为 1024,初始学习率 0.001,weight decay 0.05
  2. 在 ImageNet-22K 上进行预训练,再到 ImageNet-1K 上进行微调
    使用 AdamW 优化器,余弦衰减学习率调度器,学习 90 个 epochs,使用学习率预热 5 epoch,batchsize 大小为 4096,初始化学习率为 0.001,weight decay 0.01
    在 ImageNet-1K 上进行微调的时候,batchsize 为 1024,训练 30 个 epoch,固定学习率 1e-5,weight decay 为 1e-8

top-1 accuracy:以 imagenet 1K 为例,分类模型会对输入图片打分,会给出这个输入图片属于 1K 个分类的各个概率,top-1 accuracy 指的是排名第一个的类别和实际的结果相符的准确率

7.2 消融实验

滑动窗口

使用滑动窗口明显提升点数

相对位置编码

使用相对位置编码能够很好的提升点数,使用绝对位置编码能提升分类准确率,却会降低目标检测和语义分割的准确率

不同的自注意力机制

使用本文中的方法来计算自注意力队速度的提升显著

6. 总结、预告

6.1 总结

这篇文章提出的 Swin Transformer 和 CNN 有异曲同工之处。随着网络的深入,模型将原本的 patch 合并起来,组成一个更大的 patch。就像 CNN 一样,刚开始从较为低级的特征开始提取,随着网络的深入,提取更为高级的特征,最后一层,也就可以提取到全局的特征了。

相比起 ViT 是计算全局的自注意力,Swin Tr 只在窗口内计算自注意力,这样随着输入图片的增大,计算复杂度成线性增长。但是这也带来了一个问题,不同窗口之间不能进行信息交互,所以作者提出了滑动窗口,将原先的窗口进行滑动,构成新的窗口,然后再在新的窗口内计算自注意力。交替使用窗口自注意力和滑动窗口自注意力可以让在不同窗口的信息进行交互。

经过了作者的处理,这个 Swin Tr 已经有了取代 CNN 成为 CV 领域任务的骨干网路的潜力,可以尝试在原本使用 CNN 的地方换上 Swin Transformer 来进行替代。

6.2 预告

看完了这两篇关于 CV Transformer 的重要论文,接下来看什么还没有想法iai

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值