1448 words
7 minutes
Swin Transformer 论文阅读

论文链接:Swin Transformer: Hierarchical Vision Transformer using Shifted Window

microsoft
/
Swin-Transformer
Waiting for api.github.com...
00K
0K
0K
Waiting...

简介#

计算机视觉(Computer Vision, CV)领域长期以来被卷积神经网络(convolutional neural networks, CNNs)统治。自从 Transformer 在自然语言处理(natural language processing, NLP)领域横空出世,CV 的模型版图又焕然一新了。以 ViT 为首的 Transformer 架构模型打破了 CNN 统治 CV 的面貌。本文将介绍 ViT 之后的出现的基于 Transformer 的 CV 模型 Swin Transformer。该模型在许多方面均优于 ViT。

方法#

Overall Architecture#

Overall Architecture

Image Source: Source

和 ViT 一样,Swin Transformer 一开始也通过片(patch)分割模块将输入的 RGB 图像分割成不重叠的片。每个 patch 被视为一个“记号(token)”,其特征(feature)为每个像素的 RGB 原始值的连结。论文中使用大小为 4×44\times4 的的片来分割图像,因此每个 patch 的特征的维度为 4×4×3=484\times4\times3=48。。

Stage 1: 首先将原始特征上传入一个线性嵌入层(linear embedding layer),将其映射到任意维度(用 CC 来表示)。接着将映射后的 patch tockens 传入多个使用改良自注意力的 Transformer 块(Swin Transformer blocks)。这些 Transformer 块会保留 token 的数量(H4×W4\frac{H}{4}\times\frac{W}{4} )。

Stage 2 ~ 4: 为了获得层级化的表示,Swin Transformer 使用片合并层(patch merging layer)使 token 数量随着网络加深而减少。第一个片合并层将每个 2×22\times2 的邻接片进行连接得到维度为 4C4C 的特征,接着使用一个线性层对其进行映射。最终 token 的数量减少 2×2=42\times2=4 倍,输出的特征维度为 2C2C。接着将得到的特征传入 Swin Transformer blocks。阶段二到四输出的特征图分辨率分别为 H8×W8\frac{H}{8}\times\frac{W}{8}H16×W16\frac{H}{16}\times\frac{W}{16},和 H32×W32\frac{H}{32}\times\frac{W}{32}。这三个阶段一起产生了层级化的表示,拥有和典型卷积网络(VGG 和 ResNet)相同的特征图分辨率。

该结构可以方便地取代现有方法中的骨干网络,用于各种视觉任务。

Swin Transformer block#

Swin Transformer 使用滑动窗口(shifted windows)来替代标准的多头自注意力(multi-head self attention, MSA)模块,其他部分与标准的 Transformer 架构相同。

Shifted Window based Self-Attention#

标准的 Transformer 架构以及它的图像分类迁移版本都使用全局的自注意力,这意味着每个 token 和其他所有 token 的关系都会被计算。这种全局计算会导致 token 数的平方级别的复杂度,这使得它不适合许多需要大量标记来进行密集预测或表示高分辨率图像的视觉问题。

Self-attention in non-overlapped windows#

为了提高建模效率,作者提出在局部窗口内计算自注意力。窗口被布置成以非重叠方式均匀地分割图像。假设每个窗口有 M×MM\times M 个 patch,对于一张被 分割为 h×wh\times w 个 patch 的图片而言,全局 MSA 的计算复杂度和基于窗口的计算复杂度分别为:

Ω(MSA)=4hwC2+(hw)2C,\Omega(\text{MSA})=4hwC^2+(hw)^2C,Ω(W-MSA)=4hwC2+cM2hwC,\Omega(\text{W-MSA})=4hwC^2+cM^2hwC,

其中前者是 hwhw 的平方量级,后者对 hwhw 是线性的。对于较大的 hwhw 而言,全局自注意力的计算往往是负担不起的,但是基于窗口的自注意力是可行的。

Shifted window partitioning in successive blocks#

基于窗口的自注意力模块缺乏窗口之间的联系,这限制了其建模能力。为了在引入跨窗口联系的同时保留不重叠窗口的高效计算能力,作者提出一种滑动的窗口分区方法,该方法在连续的 Swin Transformer blocks 中交替使用两种分区配置:

  • 常规窗口分区:将 8×88\times8 的特征图均匀地划分为 2×22\times2 的大小为 4×44\times4 M=4M=4)的窗口。

  • 滑动窗口分区:将上一层的窗口移动 (M2,M2)(\lfloor\frac{M}{2}\rfloor,\lfloor\frac{M}{2}\rfloor) 像素点的位置。

通过这种滑动窗口的方法,连续的 Swin Transformer blocks 可以用下面的方法来计算:

z^l=W-MSA(LN(zl1)+zl1),\widehat{\bold{z}}^l=\text{W-MSA}(\text{LN}(\bold{z}^{l-1})+\bold{z}^{l-1}),zl=MLP(LN(z^l))+z^l,\bold{z}^l=\text{MLP}(\text{LN}(\widehat{\bold{z}}^l))+\widehat{\text{z}}^l,z^l+1=SW-MSA(LN(zl)+zl),\widehat{\bold{z}}^{l+1}=\text{SW-MSA}(\text{LN}(\bold{z}^l)+\bold{z}^l),zl+1=MLP(LN(z^l+1))+z^l+1,\bold{z}^{l+1}=\text{MLP}(\text{LN}(\widehat{\bold{z}}^{l+1}))+\widehat{\text{z}}^{l+1},

其中 z^l\widehat{\bold{z}}^lzl\bold{z}^l 分别表示第 ll 个块中 (S)W-MSA 模块和 MLP 模块的输出特征。W-MSA 和 SW-MSA 分别表示使用常规窗口分区和滑动窗口分区的多头自注意力。

移位窗口分割方法引入了前一层相邻非重叠窗口之间的联系,在图像分类、目标检测和语义分割方面效果显著。

Efficient batch computation for shifted configuration#

滑动窗口分区的一个问题在于滑动会使窗口的数量从 hM×wM\lceil\frac{h}{M}\rceil\times\lceil\frac{w}{M}\rceil 增加到 (hM+1)×(wM+1)(\lceil\frac{h}{M}\rceil+1)\times(\lceil\frac{w}{M}\rceil+1),而其中一些窗口的大小会小于 M×MM\times M。一个简单的解决方法是将较小的窗口填充到 M×MM\times M 的大小,并在计算注意力的时候屏蔽填充值。这回导致当窗口较小时计算量显著增加(2×23×32\times2\rightarrow3\times3,增加了 2.252.25 倍)。作者提出了一种更加高效的计算方法。该方法将图片往左上角循环滑动(超出的部分补到右下方)。移动后,一个窗口可能由多个不相邻的子窗口构成。通过循环滑动,窗口数量保持不变。

Relative position bias#

在计算自注意力时,Swin Transformer 在计算相似度时对每个头使用了一个相对位置偏置 BRM2×M2B\in\mathbb{R}^{M^2\times M^2}

Attention(Q,K,V)=SoftMax(QKT/d+B)V,\text{Attention}(Q,K,V)=\text{SoftMax}(QK^T/\sqrt{d}+B)V,

其中 Q,K,VRM2×dQ,K,V\in\mathbb{R}^{M^2\times d}querykeyvalue 矩阵;ddquery/key 的维度,M2M^2 是一个窗口中 patch 的数量。因为每个像素的相对位置落在 [M+1,M1][-M+1,M-1] 区间内,作者参数化了一个更小规模的偏置矩阵 B^R(2M1)×(2M1)\widehat{B}\in\mathbb{R}^{(2M-1)\times(2M-1)}BB 中的值取自 B^\widehat{B}。实验结果表明,与未使用偏置项或使用绝对位置嵌入(absolute position embedding)相比,使用相对位置偏置效果有了显著的提升,而相对位置偏置的基础上再添加绝对位置嵌入会略微降低性能。

Swin Transformer 论文阅读
https://etherwindy.github.io/AstroBlog/posts/swin-transformer/
Author
etherwindy
Published at
2024-04-18
License
CC BY-NC-SA 4.0