Swin Transformer



一、背景
在CV领域,近年来有两个主要的趋势:
- 传统的CNN已经非常成功,但在处理大分辨率图像、不同尺度物体、检测分割任务时还会有挑战。
- 受语言模型(例如 Transformer)的成功启发,“视觉 Transformer”(Vision Transformer, ViT)将 Transformer 的思想引入视觉领域:把图像切成patch看成 tokens,用自注意力建模。
但 Vision Transformer 直接应用在视觉上,遇到两个核心问题:
- 尺度问题:视觉中物体大小差异大,而 ViT 通常将图像切成固定大小的 patch,缺少“多尺度”表示。
- 计算复杂度问题:典型的 Transformer 自注意力机制是“全局”即每个 token 与所有其他 token 做注意力,时间/内存复杂度随着图像尺寸 (N = patches数) 成二次增长(O(N²))——对于高分辨率的图像,不现实。
因此,Swin Transformer 的出现,正是为了解决在视觉任务中:如何既高效又能表示多尺度、适用于分类/检测/分割的通用骨干网络的问题。
二、核心设计思想
Swin Transformer 的名字“Swin”就是 “Shifted windows” 的缩写,体现其两个关键设计:分窗口(window-based)自注意力 + 窗口平移(shifted window)机制。从宏观结构来看,它还有一个 分层设计。我们分步骤来解释。
2.1 分层结构
与 ViT 那种从头到尾用固定大小 patch、输出单一分辨率相比,Swin Transformer 引入了类似 CNN 的特征金字塔结构:
- 输入图像首先被切成较小 patch。
- 然后在不同阶段进行patch 合并,即把相邻的 patch/tokens 合并,降分辨率同时提升通道数,从而形成从高分辨率细节到低分辨率粗特征的层次结构。
- 这种结构让网络能够在浅层看到细节、高分辨率,在深层看到更抽象、低分辨率的特征,非常适合检测、分割这类任务。
简而言之,Swin Transformer 用像 CNN 那样的多尺度特征金字塔结合Transformer 那些强自注意力表达能力。
2.2 窗口化自注意力
为了解决全局注意力计算量大的问题,Swin Transformer 提出:
- 把整个图像(其实是 patch tokens)按照 固定大小的非重叠窗口 划分。每个窗口内进行自注意力,也就是说:一个窗口内所有 tokens 之间做 attention。这样,注意力的 scope 从“全图”降成“窗口内”,显著降计算成本。
- 因为窗口大小固定,窗口内 token 数固定,所以随着图像分辨率变大,总窗口数变多,但每窗口计算量不变,从而实现 线性复杂度 (O(N)) 而不是 O(N²) 。
2.3 窗口平移机制
不过,如果我们只用固定窗口且不让窗口间有交互,就可能有窗口边界无法沟通、跨窗口信息难以建模的问题。为了避免这一点,Swin Transformer 的关键创新是:
- 在一个层采用常规窗口划分(例如每 7×7 patch 为一个窗口)计算自注意力。
- 在下一个层,将窗口划分向右下平移一定距离(例如窗口大小的一半),这样新的窗口会跨越前一层的窗口边界。于是,前一个层窗口内的信息被新的窗口组合,从而实现 窗口之间的交互。
- 这个shifted window技巧用得非常巧妙:既保留了局部窗口注意力的高效优势,又通过平移让不同窗口之间的 token 能够间接通信。
2.4 总结设计
- 分层结构:支持多尺度、像 CNN 那样做特征金字塔。
- 窗口化注意力:降低计算成本,使得处理高分辨率图像可行。
- 窗口平移:解决仅局部窗口带来的窗口边界割裂问题,增强模型表达能力。
三、工作流程
下面以一个输入图像为例。
- Patch 切分
- 输入原始图像(如 H×W 像素,通道 C=3)被切成固定大小的小 patch,比如每 4×4 像素一个 patch。
- 每个 patch 被展平成一个向量(或用卷积方式嵌入)得到初步的 token 表示。
- Embedding & Stage 1
- 这些 token 经过线性投影(embedding)成为维度 C(如 96).
- 然后进入 Stage 1,一系列 “Swin Transformer Block”进行处理。每个 block 包含:LayerNorm → 窗口自注意力 (window-MSA) → MLP (多层感知机) → 残差连接。
- Patch Merging → Stage 2、Stage 3…
- 在 Stage 1 处理完后,会执行一次 “patch merging”:将相邻 2×2 token 合并为一个 token(也就是把空间分辨率减半、通道数加倍).
- 然后进入 Stage 2,用同样的 Swin Block 结构,但窗口可能相对更大、token 数更少。之后再进行 patch merging 到 Stage 3、Stage 4。最终网络输出多个尺度的特征图。
- 任务特定头
- 对于分类任务,最后可以接池化 + 全连接层;对于检测/分割任务,则可把多尺度特征送入 FPN (Feature Pyramid Network) 等结构做定位、分割。Swin Transformer 的输出可作为通用 backbone。