第二十五周:文献阅读笔记(swin transformer)
摘要
Swin Transformer(Swin-Transformer)是一种基于注意力机制的深度学习模型,用于解决计算机视觉领域的任务,如图像分类、目标检测和语义分割等。与传统的Transformer架构不同,Swin Transformer采用了跨尺度的分层注意力机制,使得模型能够更好地捕获图像中不同尺度的信息。这一结构使得Swin Transformer在处理大尺度图像时表现出色,并在多个计算机视觉任务上取得了竞赛的优异成绩。Swin Transformer的出现为图像处理领域带来了新的思路和性能突破。本文将详细介绍 Swin Transformer 架构。
Abstract
Swin Transformer (Swin-Transformer) is a deep learning model based on an attention mechanism for solving tasks in the field of computer vision, such as image classification, target detection, and semantic segmentation. Unlike the traditional Transformer architecture, Swin Transformer employs a cross-scale hierarchical attention mechanism that enables the model to better capture information at different scales in an image. This architecture has enabled Swin Transformer to perform well in processing large-scale images and achieve excellent results in competitions on several computer vision tasks.The emergence of Swin Transformer has brought new ideas and performance breakthroughs in the field of image processing. In this paper, we describe the Swin Transformer architecture in detail.
1. swin transformer 文献笔记
文献题目:Swin Transformer: Hierarchical Vision Transformer using Shifted Windows
文献链接:https://arxiv.org/pdf/2103.14030.pdf
1.1. 文献摘要
作者在本文提出了一种新的视觉 Transformer 架构,称为 Swin Transformer,它能够作为计算机视觉通用的骨干网络。将 Transformer 从自然语言处理领域应用到计算机视觉的挑战源于两个领域之间的差异,例如计算机视觉所处理的实体规模差异较大,以及图像中的像素与文本中的单词相比,图像种的像素分辨率更大。为了解决这些差异,作者提出了一个分层 Transformer,其表示是使用 Shifted windows 计算的。通过将自注意力计算限制在非重叠的本地窗口,同时还允许跨窗口连接,这样能够带来了更高的效率。这种层次结构具有在各种尺度上建模的灵活性,并且具有相对于图像大小的线性计算复杂性。Swin Transformer 的这些特点使其能够兼容广泛的视觉任务,包括图像分类(ImageNet-1K 上的 87.3 top-1 准确度)和物体检测等密集预测任务(COCO testdev 上的 58.7 box AP 和 51.1 mask AP)和语义分割(ADE20K val 上为 53.5 mIoU)。其性能在 COCO 上大幅超越了之前的最先进水平。
1.2. 引言
计算机视觉建模长期以来一直由卷积神经网络(CNN)主导。AlexNet是一个大型深度卷积神经网络,该神经网络拥有 6000 万个参数和 650,000 个神经元,由五个卷积层(其中一些后面是最大池层)和三个全连接层(最后一个 1000 路 softmax)组成,并且该大型卷积神经网络在ImageNet LSVRC-2010和ILSVRC-2012图像分类竞赛中取得了远低于第二名错误率的成绩。由此可见,CNN 架构已经变得越来越强大。随着 CNN 作为各种视觉任务的骨干网络,这些架构的进步带来了性能的改进。
而自然语言处理种的网络架构主要采用当下流行的Transformer,Transformer 专为序列建模和转导任务而设计,相对于传统的循环神经网络(RNN)模型,Transformer采用了自注意力机制(self-attention),使得模型能够更好地捕捉输入序列中各个位置之间的关系。它通过同时考虑输入序列中的所有位置信息,而无需像RNN那样逐个位置地进行处理,大大提高了训练和推理的效率,Transformer的成功部分得益于其并行计算的能力和深层网络的表示能力。这使得Transformer模型能够处理长文本序列,同时提供更好的建模能力和上下文理解能力。因其强大的注意力机制,从而能够更好的关注序列种的各个单词,它在自然语言语言领域的巨大成功促使研究人员研究它对计算机视觉的适应,最近它在某些任务上的表现也有明显的进步,特别是图像分类和联合视觉语言建模。
在该文献中,作者团队寻求Transformer在计算机视觉领域的可扩展性,从而使其的通用性能够得以提高。
将其在语言领域的高性能转移到视觉领域的重大挑战可以通过两种模式之间的差异来解释:
- 这些差异之一涉及规模。与作为语言 Transformer 中处理的基本元素的单词标记不同,视觉元素在规模上可能存在很大差异,在现有的基于 Transformer 的模型中,自注意力机制的计算是基于 token 之间的相对位置和关系的。为了确保模型能够处理任意长度的序列,并且在计算自注意力时具有固定的计算复杂度,需要将输入序列分割成固定大小的 token,如果输入序列较长,分割为固定长度的 token 可能会导致信息的丢失或模糊,特别是对于长文本或大尺寸图像,显然这并不适合这些视觉应用。
- 另一个区别是图像中像素的分辨率比文本段落中的单词要高得多。存在许多视觉任务,例如语义分割,需要在像素级进行密集预测,这对于高分辨率图像上的 Transformer 来说是很棘手的。
为了克服这些问题,作者团队提出了 Swin Transformer,它构建分层特征图。如图下所示,Swin Transformer 通过从小尺寸patche(灰色轮廓)开始并逐渐合并更深 Transformer 层中的相邻patch来构建分层表示,从而构造出一个层次化表示。线性计算复杂度是通过在分割图像的非重叠窗口(以红色框出)内本地计算自注意力来实现的。每个窗口中的patch数量是固定的,因此复杂度与图像大小成线性关系。这些优点使 Swin Transformer 适合作为各种视觉任务的通用骨干网,与之前基于 Transformer 的架构形成鲜明对比,后者生成单一分辨率的特征图并具有二次复杂度。
Swin Transformer 的一个关键设计元素是它 在连续自注意力层之间的窗口分区的移位 (shift),如上图所示。移位窗口桥接了前一层的窗口,提供二者之间的连接,显着增强建模能力。这种策略对于现实世界的延迟也是有效的:一个局部窗口内的所有 query patch 共享相同的 key 集合,这有助于硬件中的内存访问。相比之下,早期的 基于滑动 (sliding) 窗口的自注意力方法由于不同 query 像素具有不同的 key 集合而在通用硬件上受到低延迟的影响。
Swin Transformer 与 VIT 的对比
作者所提出的 Swin Transformer 通过合并更深层中的图像块(以灰色显示)来构建分层特征图,并且由于仅在每个局部窗口(以红色显示)内计算自注意力,因此具有输入图像大小的线性计算复杂性。因此,它可以作为图像分类和密集识别任务的通用主干。 (b) 相比之下,之前的视觉 Transformers [20] 产生单个低分辨率的特征图,并且由于全局自注意力的计算,输入图像大小的计算复杂度是二次方的。
由于VIT里所采用的 patch size 是16*16的,如(b)图,每一个patch至始至终代表的尺寸都一样,其中每层的Transformer block,对应的token的尺寸都是16倍的下采样率,尽管VIT可以通过全局的自注意力操作达到全局建模的能力,但是它对多尺寸特征的把握就会弱一些。因为其自注意力机制始终在整张图种进行,也就是全局建模,因此输入图像大小的计算复杂度是跟图像的尺寸呈平方倍增长
1.3. Swin Transformer原理
1.3.1. 整体架构
上图概述了 Swin Transformer 架构,其中展示了微型版本 (Swin-T)。它首先通过patch分割模块(Patch Partition)将输入 RGB 图像分割成不重叠的patches。每个patch都被视为一个token,其特征被设置为原始像素 RGB 值的串联。在本文作者的实现中,使用 4×4 的 patch 大小,因此每个 patch 的特征维度为 4 × 4 × 3 = 48。线性嵌入层应用于此原始值特征,将其投影到任意维度(记为C)。
为了产生分层表示,随着网络变得更深,通过Patch Merging层来减少标记的数量,相当于卷积神经网络中的池化操作。第一个Patch Merging层连接每组 2 × 2 相邻 patch 的特征,并在 4*C 维连接特征上应用线性层。这将token数量减少了 2×2 = 4 的倍数,并且输出维度设置为 2C 。随后应用 Swin Transformer 块进行特征转换,分辨率保持在 H 8 ∗ W 8 \frac{H}{8}*\frac{W}{8} 8H∗8W 。该过程重复两次,输出分辨率分别为 H 16 ∗ W 16 \frac{H}{16}*\frac{W}{16} 16H∗16W 和 H 32 ∗ W 32 \frac{H}{32}*\frac{W}{32} 32H∗32W 。这些过程共同产生分层表示,具有与典型卷积网络相同的特征图分辨率,例如 VGG和 ResNet。因此,所提出的架构可以方便地替换现有方法中用于各种视觉任务的主干网络。
假设输入的图像数据为 2242243,通过Patch Partition后,得到的图片尺寸为 H 4 ∗ W 4 ∗ C = 56 ∗ 56 ∗ 48 \frac{H}{4}*\frac{W}{4}*C=56 * 56 * 48 4H∗4W∗C=56∗56∗48。
然后就该经过Linear Embedding层,这层的目的是为了Patch Partition层输出的向量的维度转换成我们预先设置好的值(Transformer能够接受的值),在本文中,作者将这个超参数设为C,对于 Swin tiny 这个网络来说,在这里的C为96,因此经历完Linear Embedding层后,我们最初的输入尺寸就变成了 56 * 56 * 96,前面的 56 * 56 就会被拉直(相乘),变成 3136,得到的是 3136 * 96 这个序列长度,96则是每一个token的维度,这里的Patch Partition、Linear Embedding与VIT里的Patch Projection的其中一步操作。
此时我们得到的序列长度为 3136 * 96,目前来说Transformer不能接受这个序列长度,Swin Transformer就引入了这种基于窗口的自注意力计算,每个窗口按照默认来说都只有49个patch,因此序列长度就只有49,这就相当小了,也就有效解决了计算复杂度问题。
而该文献整体架构中的Swin Transformer Block 层便是基于窗口去计算自注意力的,如果想要有多尺寸的特征信息,那就需要构建一个层级式的Transformer,我们需要一个像卷积神经网络里一样,有一个池化的操作,在该文献中,作者提出了 Patch Merging 操作,经过 Patch Merging操作后,输出的大小从 56 * 56 * 96 变为 28 * 28 * 192,随后同理,都是先进行 Patch Merging,再经过 Swin Transformer,连续进行降维操作,同卷积神经网络一致,经过反复的池化,对张量进行降维
1.3.2. Patch Merging
Patch Merging 是将临近的小 Patch,合并成一个大 Patch,这样就能起到下采样一个特征图的效果,如下图,我们下采样2倍,在选点时是每隔一个点选一个,图中的1、2、3、4只是代表序号,并不是张量里的值,同样序号的patch会被合并到一起,经过选点并合并后,原先一个大的张量就变成了下图中的四个张量
然后我们将这四个张量在 C 这个维度上拼接起来,得到的张量大小为
H
2
∗
W
2
∗
4
C
\frac{H}{2}*\frac{W}{2}*4C
2H∗2W∗4C,这么做也就是用空间上的维度去换取更多的通道数,这样使得原来很大的一个张量变小了
接着在 C 这个维度上,作者使用 1*1 卷积,将通道数从 4C 降至 2C,上述的整个过程便是 Patch Merging 操作。
1.3.3. VIT中的Patch Projection
以ViT-B/16为例,直接使用一个卷积核大小为16x16,步距为16,卷积核个数为768的卷积来实现。输出的尺寸为 (224-16)/16+1=14,通过卷积 [224, 224, 3] -> [14, 14, 768],然后H以及W两个维度展平即可 [14, 14, 768] -> [196, 768],,此时变成了一个二维矩阵,满足Transformer的输入。在输入Transformer Encoder之前注意需要加上[class]token以及Position Embedding。然后插入一个专门用于分类的[class]token,这个[class]token是一个可训练的参数,数据格式和其他token一样都是一个向量,以ViT-B/16为例,就是一个长度为768的向量,与之前从图片中生成的tokens拼接在一起,即 Cat([1, 768], [196, 768]) -> [197, 768]。
1.3.4. 基于滑动窗口的自注意力
1. 非重叠窗口中的自注意力
为高效建模,作者团队提出在非重叠的局部窗口中计算自注意力,取代全局自注意力,以不重叠的方式均匀地划分图像得到各个窗口。已知 D = 2C,则设每个非重叠局部窗口都包含 N = M × M 个 patch tokens,则 基于具有 N = h × w 个 patch tokens 的图像窗口的 MSA 模块 和 基于非重叠局部窗口的 W-MSA 模块 的计算复杂度分别是:
其中,MSA关于 patch token 数
h
∗
w
h*w
h∗w 具有二次复杂度(共hw个 patch tokens,每个 patch token 在全局计算 hw 次 )。W-MSA则当M固定时(默认设为7)具有线性复杂度(共hw个 patch tokens,每个 patch token 在各自的局部窗口内计算
M
2
M^2
M2 次)。巨大的 h * w 对全局自注意力计算而言是难以承受的,而基于窗口的自注意力(W_MSA)则具有良好的扩展性。
2. 连续块中的移动窗口分区
基于窗口的自注意力模块缺乏跨窗口的连接,这限制了其建模能力。为了引入跨窗口连接,同时保持非重叠窗口的高效计算,作者提出了一种移位窗口分区方法,该方法在连续 Swin Transformer 块中的两个分区配置之间交替。
如上图所示,第一个模块使用从左上角像素开始的常规窗口划分策略,将 8 × 8 特征图均匀划分为大小为 4 × 4 (M = 4) 的 2 × 2 窗口。然后,下一个模块采用与上一层不同的窗口配置,通过将窗户移动
(
⌊
M
2
⌋
,
⌊
M
2
⌋
)
(\left \lfloor \frac{M}{2} \right \rfloor,\left \lfloor \frac{M}{2} \right \rfloor)
(⌊2M⌋,⌊2M⌋)个像素,使用移位窗口分区方法,连续的 Swin Transformer 块计算如下:
如上图所示,每次的输入先经过一次LN,然后进行计算窗口的多头自注意力,然后再经过LN、MLP,紧接着再进行LN,然后再进行基于移动窗口的多头自注意力,最后再经过LN、MLP,这样就达到了窗口和窗口之间的互相通信了。
3. 移动窗口所存在的问题
尽管在论文中,作者介绍的移动窗口模式,已经能够达到窗口和窗口之间的通信,但是我们会发现一个问题,如上图,就是原来我们计算时的特征图上只有四个窗口,当做完移动窗口的操作后,我们得到了9个窗口,很显然窗口数量增加了,而且每个窗口里的元素大小不同。如果我们想去做快速运算,就是将这些窗口全部压成一个 patch,直接去计算这个注意力,这是做不到的。如果我们通过对移动窗口后的各个窗口进行padding填充操作,那计算机复杂度相比于移动前的计算复杂度要高的多。那么,该如何提升计算复杂度呢?
此处,作者团队提出了一种更有效的批计算方法,其循环向左上方移位,如上图所示。在这种移位后,批窗口可由特征图中不相邻的子窗口组成,因此 使用Mask机制将自注意计算限制在每个子窗口内。通过循环移位,批处理窗口的数仍与规则分区的窗口数相同 (如规则划分时是 4 个窗口,向左上角循环移位后仍是 4 个窗口,如上图的 A,B,C,D 所示)。
经过了循环移位的方法,一个窗口可包含来自不同窗口的内容。因此,要采用 masked MSA 机制将自注意力计算限制在各子窗口内。最后通过逆循环移位方法将每个窗口的自注意力结果返回。例如,一个 9 窗口的图解如下所示:
按子窗口划分即可得到 5 号子窗口的自注意力的结果,但直接计算会使得 5 号 / 6 号 / 4 号子窗口的自注意力计算混在一起,类似的混算还包括 5 号 / 8 号 / 2 号子窗口 和 9 号 / 7 号 / 3 号 / 1 号子窗口的纵向或横向等。所以需采用 masked MSA 机制:先正常计算自注意力,再进行 mask 操作将不需要的注意力图置 0,从而将自注意力计算限制在各子窗口内。
例如, 6 号 / 4 号子窗口共由 4 个 patch 构成一个正方形区域,如下所示,故应计算出 4×4 注意力图。
为避免各不同的子窗口注意力计算发生混叠,合适的注意力图应如下所示:
从而,合适的 mask 应如下所示:
再例如,9 号 / 7 号 / 3 号 / 1 号子窗口共由 4 个 patch 构成一个正方形区域,如下所示:
同理,合适的 mask 应如下所示:
1.3.5. 小结
在 Swin Transformer 的结构里,它的这个 Transformer block 的安排是十分有讲究的,它每次都是先要做一次基于窗口的多头自注意力,然后再做一次基于移动窗口的多头自注意力,作者的主要研究动机就是想设计一个层级式的Transformer,为了能够实现层级式,作者提出了 Patch Merging 的操作,从而能够像卷积神经网络一样,将Transformer分为几个阶段,为了减少计算复杂度,能够将模型应用到视觉里的密集预测任务,作者又提出了基于窗口和移动窗口的多头自注意力方式,最后将所有模块整合到一起,就是该文献中的 Swin Transformer的结构。
1.4 实验
对于图像分类,作者在 ImageNet-1K [19] 上对提出的 Swin Transformer 进行了基准测试,其中包含来自 1,000 个类别的 128 万张训练图像和 5 万张验证图像。得出了对应的准确度,作者考虑两种训练设置:
- Regular ImageNet-1K training:作者使用 AdamW 优化器进行 300 个epochs,使用余弦衰减学习率调度器和 20 个周期的 linear warm-up。使用的 batch-size 为 1024,初始学习率为 0.001,权重衰减为 0.05。在训练中包含了的大多数增强和正则化策略,除了重复增强和EMA,它们不会提高性能。
- Pre-training on ImageNet-22K and fine-tuning on
ImageNet-1K:作者还对更大的 ImageNet-22K 数据集进行预训练,该数据集包含 1420 万张图像和 22K 类。我们使用 AdamW 优化器进行 90 个epochs,使用线性衰减学习率调度程序和 5 个epochs的线性预热。使用的 batch-size 为 4096,初始学习率为 0.001,权重衰减为 0.01。在 ImageNet-1K 微调中,我们训练模型 30 个周期,批量大小为 1024,恒定学习率为 1 0 − 5 10^{−5} 10−5,权重衰减为 1 0 − 8 10^{−8} 10−8。
常规 ImageNet-1K 训练的结果
表 1(a) 展示了与其他主干网的比较,包括使用常规 ImageNet-1K 训练的基于 Transformer 和基于 ConvNet 的主干网。与之前最先进的基于 Transformer 的架构相比,Swin Transformers 明显超过了具有类似复杂性的对应 DeiT 架构:Swin-T (81.3%) 比 DeiT-S (79.8%) +1.5% )使用 2242 输入,Swin-B (83.3%/84.5%) 比使用 2242/3842 输入的 DeiT-B (81.8%/83.1%) 分别增加 1.5%/1.4%。与最先进的 ConvNet(即 RegNet [48] 和 EfficientNet )相比,Swin Transformer 实现了稍微更好的速度与精度权衡。值得注意的是,虽然 RegNet 和 EfficientNet 是通过彻底的架构搜索获得的,但所提出的 Swin Transformer 是根据标准 Transformer 改编的,并且具有进一步改进的强大潜力。
ImageNet-22K 预训练的结果
作者还在 ImageNet22K 上预训练了更大容量的 Swin-B 和 Swin-L。 ImageNet-1K 图像分类的微调结果如表 1(b) 所示。对于 Swin-B,ImageNet22K 预训练比在 ImageNet-1K 上从头开始训练带来了 1.8%∼1.9% 的增益。与之前 ImageNet-22K 预训练的最佳结果相比,我们的模型实现了明显更好的速度与精度权衡:Swin-B 获得了 86.4% 的 top-1 精度,比具有类似推理吞吐量的 ViT 高出 2.4% (84.7 与 85.9 图像/秒)和略低的 FLOP(47.0G 与 55.4G)。较大的 Swin-L 模型实现了 87.3% 的 top-1 准确率,比 Swin-B 模型高出 0.9%。