ICCV 2021 · Best Paper Award (Marr Prize)

Swin Transformer: Hierarchical Vision Transformer using Shifted Windows

Ze Liu, Yutong Lin, Yue Cao, Han Hu, Yixuan Wei, Zheng Zhang, Stephen Lin, Baining Guo
(Microsoft Research Asia)

Computer Vision Vision Transformer Backbone Architecture SOTA
核心摘要:在自然语言处理(NLP)中大放异彩的 Transformer,在迁移到计算机视觉(CV)领域时面临两大根本挑战:视觉实体的多尺度变化(Scale variations)以及图像像素的高分辨率(High resolution)导致计算量爆炸。本文提出了一种全新的层级式(Hierarchical)Vision Transformer——Swin Transformer。它通过在非重叠的局部窗口(Local Windows)内计算自注意力,并将窗口在相邻层之间进行移动(Shift)来实现跨窗口连接。该架构不仅拥有相对于图像大小的线性计算复杂度,还生成了多尺度特征图,成功接管了 CNN 在检测、分割等密集预测任务中的统治地位,全面刷新了各项 SOTA 指标。

1. 研究动机与问题背景 (Motivation)

长期以来,CNN(如 ResNet)一直是计算机视觉的绝对骨干(Backbone)。当 ViT(Vision Transformer)首次证明 Transformer 也能做图像分类时,整个 CV 界为之震动。然而,ViT 无法直接取代 CNN 成为通用的视觉骨干网络。

ViT 的致命局限性:
  • 单一尺度(Single Scale): ViT 生成的特征图(Feature Maps)是固定分辨率的(如始终是 $16\times$ 下采样),而在目标检测、实例分割任务中,极度依赖类似 FPN(特征金字塔)的多尺度特征来识别不同大小的物体。
  • 平方级计算复杂度(Quadratic Complexity): ViT 的全局自注意力机制计算复杂度与图像的 Patch 数量呈平方关系 $O(N^2)$。当处理高分辨率图像(如用于密集预测的语义分割)时,计算量和内存消耗是不可接受的。

本文试图解决的核心问题:如何设计一种具有层级结构(Hierarchical)、且计算复杂度与图像大小呈线性关系的 Transformer,使其能像 ResNet 一样无缝接入各种下游稠密预测(Dense Prediction)任务?

学术意义:Swin Transformer 真正打通了 NLP(Transformer)和 CV(Backbone)的底层架构,让 Transformer 首次具备了成为 CV 通用骨干的硬实力。

2. 数学表示与建模 (Formulation & Modeling)

Swin Transformer 的精妙在于利用局部窗口(Window)来控制计算量,并用滑动(Shift)来弥补局部窗口带来的信息隔离。其核心建模包含以下步骤:

2.1 层级特征映射 (Hierarchical Feature Maps)

为了构建多尺度特征,网络通过 Patch Merging 层在深度增加时逐渐合并相邻的 Patch:

  • Stage 1: 输入图像 $H \times W \times 3$,被切分为 $4 \times 4$ 的 Patch,每个 Patch 特征维度为 $4 \times 4 \times 3 = 48$。然后通过 Linear Embedding 映射到维度 $C$。此时分辨率为 $\frac{H}{4} \times \frac{W}{4}$。
  • Stage 2 & 3 & 4: 进行 Patch Merging。将相邻 $2 \times 2$ 的 Patch 特征在通道维度拼接(维度变为 $4C$),然后通过一个线性层降维至 $2C$。分辨率变为 $\frac{H}{8} \times \frac{W}{8}$,依此类推至 $\frac{H}{32} \times \frac{W}{32}$。

2.2 基于窗口的自注意力 (Window based Self-Attention, W-MSA)

普通的全局 MSA 复杂度对于大小为 $h \times w$ 个 patch 的图像是平方级的:

$$\Omega(\text{MSA}) = 4hwC^2 + 2(hw)^2C$$

Swin Transformer 将图像均匀划分为不重叠的窗口(每个窗口包含 $M \times M$ 个 patch,默认 $M=7$),仅在窗口内部计算注意力。此时复杂度变为关于 $hw$ 的线性关系:

$$\Omega(\text{W-MSA}) = 4hwC^2 + 2M^2hwC$$

2.3 滑动窗口注意力 (Shifted Window, SW-MSA)

完全不重叠的窗口会隔绝窗口间的信息交流。作者提出在连续的两个 Swin Transformer Block 中交替使用常规窗口(W-MSA)滑动窗口(SW-MSA)

在第 $l$ 层使用常规切分后,在第 $l+1$ 层,窗口向右下角平移 $(\lfloor\frac{M}{2}\rfloor, \lfloor\frac{M}{2}\rfloor)$ 个 patch。这两个连续 Block 的前向传播公式如下:

$$\hat{z}^l = \text{W-MSA}(\text{LN}(z^{l-1})) + z^{l-1}$$ $$z^l = \text{MLP}(\text{LN}(\hat{z}^l)) + \hat{z}^l$$ $$\hat{z}^{l+1} = \text{SW-MSA}(\text{LN}(z^l)) + z^l$$ $$z^{l+1} = \text{MLP}(\text{LN}(\hat{z}^{l+1})) + \hat{z}^{l+1}$$

2.4 相对位置偏置 (Relative Position Bias)

在计算自注意力时,论文摒弃了绝对位置编码,而在计算相似度矩阵时加入相对位置偏置 $B \in \mathbb{R}^{M^2 \times M^2}$:

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

由于沿两个坐标轴的相对位置在 $[-M+1, M-1]$ 之间,模型参数化了一个较小的偏置矩阵 $\hat{B} \in \mathbb{R}^{(2M-1) \times (2M-1)}$,而 $B$ 中的值从 $\hat{B}$ 中提取。这一设计大幅提升了下游密集预测任务的性能。

Figure 4:循环移位 (Cyclic Shift) 实现高效批量计算

🪟
Shifted Window
窗口平移后
边缘产生碎片窗口
(2×2 → 3×3 个窗口)
🔄
Cyclic Shift
torch.roll 向左上
循环移位 ⌊M/2⌋
窗口数恢复为 2×2
🎭
Masked Attention
不相邻区域 mask=-100
softmax 后权重→0
屏蔽非法交互
↩️
Reverse Shift
逆向 torch.roll
恢复原始位置
比 Padding 快 13-18%

3. 实验设置与复现细节 (Experiments & Reproducibility)

为验证其作为“通用视觉骨干”的定位,论文在三大主流 CV 任务上进行了全面实验。

3.1 架构变体与参数配置

根据基础通道数 $C$ 和各 Stage 的 Block 数量,设定了 4 个规模的模型($M=7$, $d=32$, 扩展比 $\alpha=4$):

  • Swin-T (Tiny): $C=96$, 层数={2, 2, 6, 2}, 参数量 $\approx$ 28M (对标 ResNet-50)
  • Swin-S (Small): $C=96$, 层数={2, 2, 18, 2}, 参数量 $\approx$ 50M (对标 ResNet-101)
  • Swin-B (Base): $C=128$, 层数={2, 2, 18, 2}, 参数量 $\approx$ 88M (对标 ViT-B)
  • Swin-L (Large): $C=192$, 层数={2, 2, 18, 2}, 参数量 $\approx$ 197M

3.2 任务一:图像分类 (ImageNet-1K)

  • 预处理与增强:基本遵循 DeiT,未使用 repeated augmentation 和 EMA(发现无益)。
  • 优化器设定: AdamW 优化器,300 epochs,初始学习率 0.001(Cosine 衰减),Weight Decay 0.05,20 epochs Warm-up,Batch Size 1024。
  • 预训练: 大模型(Swin-B/L)在 ImageNet-22K 上预训练 90 epochs。

3.3 任务二:目标检测与实例分割 (COCO 2017)

  • 测试框架: 替换了主流框架(Cascade Mask R-CNN, ATSS, RepPoints v2, Sparse R-CNN)中的 ResNet 骨干。
  • 优化器设定: AdamW,初始学习率 0.0001,Weight Decay 0.05,多尺度训练,使用 3x schedule(36 epochs)。

3.4 任务三:语义分割 (ADE20K)

  • 测试框架: 基于 mmsegmentation 库的 UperNet。

4. 实验结果与核心结论 (Results & Findings)

4.1 ImageNet 分类表现

相比同样参数量和计算量级别(FLOPs)的模型,Swin Transformer 完胜 DeiT 和经过高度 NAS 搜索的 RegNet。不仅是准确率,吞吐量(Throughput)也维持在非常高的水平

表 1:ImageNet-1K 分类结果(常规训练 vs. ImageNet-22K 预训练)
模型 输入分辨率 参数量 FLOPs Top-1 准确率
RegNetY-16G $224^2$ 84M 16.0G 82.9%
DeiT-S $224^2$ 22M 4.6G 79.8%
Swin-T (Ours) $224^2$ 29M 4.5G 81.3%
DeiT-B $384^2$ 86M 55.4G 83.1%
Swin-B (Ours) $384^2$ 88M 47.0G 84.5%
--- 下方为 ImageNet-22K 预训练微调结果 ---
ViT-L/16 $384^2$ 307M 190.7G 85.2%
Swin-L (Ours) $384^2$ 197M 103.9G 87.3%

4.2 COCO 目标检测:历史性的碾压

这是 Swin 震惊 CV 界的战绩。在同等参数和 FLOPs 级别下,用 Cascade Mask R-CNN 框架,Swin-T 比 ResNet-50 的 Box AP 暴涨了 +4.2,Mask AP 暴涨 +3.3。最终融合各项高级策略(HTC++)的 Swin-L 模型拿下了 58.7 Box AP,超越了当时榜单上使用最先进 Copy-paste 数据增强的 SOTA(55.9 AP),实现了对纯 CNN 架构绝对性能的跨代碾压。

4.3 关键消融实验 (Ablation Studies)

  • Shifted Window 真的有用吗? 取消 Shift 机制后,ImageNet Top-1 掉了 1.1%,而 COCO 目标检测的 AP 直接暴跌 2.8 个点!这证明,对于缺乏全局感知的局部窗口来说,跨层“拼图偏移”是重建感受野的关键。
  • 位置偏置: 加入绝对位置编码(Absolute position)不仅没带来提升,反而使密集任务性能下降。相对位置偏置(Relative position bias)才是关键,比什么位置编码都不加高了 1.2%(ImageNet)。

5. 审稿人视角:犀利评论 (Critical Review)

🔥 高光优点

  • 完美的架构对齐 (Alignment with CV tasks): 之前大家都在想尽办法强行把图片切成 Sequence 喂给 ViT,而本文退后一步思考:视觉信号天生就有 2D 先验和尺度金字塔。Swin 巧妙地借用了 CNN “逐渐降采样”的老智慧,完美适配了几乎所有为 CNN 开发的下游检测分割头(如 FPN),工程友好度满分。
  • 优雅的复杂度解决路径: $O(N^2)$ 是自注意力的心病。通过 Local Window 控制复杂度为 $O(N)$,再通过 Shift 实现特征交互,设计哲学异常清晰。
  • 统治级的霸榜性能: 论文不仅仅在说故事,在目标检测和分割这种极度考验 Backbone 抽取细腻特征能力的任务上,用断层式(margin > 2.0+ AP)的领先证明了架构的优越性。

🤔 局限与探讨

  • 局部性妥协: 相比于标准 ViT 在第一层就能建立“左上角与右下角”的全局关联(这往往被视为 Transformer 打败 CNN 的核心红利),Swin Transformer 重新走回了“通过堆叠局部感受野来扩大全局感受野”的老路。这种妥协一定程度上损失了长程依赖(Long-range dependency)的快速建立。
  • 手工设计痕迹严重: 窗口大小固定 $M=7$、Shift 位移固定 $\lfloor M/2 \rfloor$、Patch Merging 的 $2 \times 2$ 拼接,这些超参数本质上和 CNN 里的 Kernel Size=3x3 并没有哲学上的区别。Swin 更像是一个“披着 Self-Attention 外衣的强悍 CNN”。

🚀 未来方向

后续研究(如后来的 Swin-V2)必定需要解决它如何扩展到超高分辨率(如超大 Window Size、大尺度预训练下的相对位置编码崩溃),以及进一步统一视觉自监督学习(MAE 架构在 Swin 上其实不如在 Vanilla ViT 上自然)。

6. One More Thing

论文中极容易被读者忽略,但在系统级实现上价值千金的设计,是位于图 4 的 "Cyclic Shift (循环移位) + Masked MSA"

工程与算法的美妙交汇:
当采用偏移窗口时,图像边缘的窗口会被切碎(比如原来 $2 \times 2$ 个窗口变成了 $3 \times 3$ 个残缺窗口)。如果在硬件里直接计算,处理不同尺寸的 Tensor 会严重拖慢 GPU 速度(甚至比直接算全局 Attention 更慢)。

微软的科学家做了一个极简的变换:把左上、正上、左边这三个“越界”的区域,直接像贪吃蛇穿墙一样,循环移动补到右下角。这样,窗口数量又变回了原先的标准数量(完美对齐显存),并且在计算时加一个 Masking 告诉模型“其实它们不是真的靠在一起”。

消融实验表5(Table 5)揭示:正是这个小小的技巧,让 Shifted Window 的速度比 Naive Padding 的做法快了 13% 到 18%,才真正将理论上的低复杂度变为了 GPU 上的现实!