Swin Transformer

📅 2026/7/7 2:28:12
Swin Transformer
通过蒸馏引入 Teacher 的归纳偏置缓解数据依赖问题。但这条路线有一个明显局限它并没有改变 Transformer 本身的结构。换句话说DeiT 本身依然是一个全局 attention、无层级结构、内部缺乏局部归纳偏置的模型。所以相应的改进思路水到渠成如果不只是“引导 Transformer 学习”而是“直接修改 Transformer 的结构”会怎样这便是在 21 年的发点。1. ViT 在实际训练中的问题#在展开 Swin Transformer 的具体改进前我们需要简单了解一下原始 ViT 在实际训练中的一些问题。1.1 CV 中的注意力计算量#在原始 ViT 中每一层 Transformer 都对所有 patch token 两两计算注意力。这一步带来了一个非常关键的代价计算复杂度过高。其实这倒不能怪 ViT 归根结底其实是自注意力本身的结构让这一原本应用于序列任务的设计在视觉任务中便显现出一些不适。假设一张图像被切分为 个 patch那么 self-attention 的计算复杂度就是(2)复杂度本身自然是不变的但问题在于图像分辨率一旦提升 会快速增长而计算量是平方级爆炸的。我们用一个问题来对比说明这种情况为什么在 NLP 等序列任务中这个问题并没有这么突出其核心原因不在于 attention 机制本身而在于序列长度的增长方式是一维的而图像分辨率的增长是二维的。如图所示图像数据分辨率的增长带来的计算量增加是平方级的。而且更重要的一点是高分辨率本就是视觉任务的刚需。在一些视觉任务如小目标检测、边界精细分割等都强依赖高分辨率输入。因此除去我们一直强调的弱偏置带来的数据依赖问题外图像数据带来的高计算量也是一个非常现实的问题。1.2 归纳偏置问题#对这点我们并不陌生了我们再用 CNN 和 ViT 的差异简单复述一下因为卷积核CNN 会优先关注“邻域信息”并逐步扩大感受范围。 而 ViT 一上来就做全局建模但边缘、纹理等低级视觉特征需要靠数据自己学出来。因为层级结构CNN 输出的特征图在层级间分辨率逐渐降低而语义逐渐增强。但在原始 ViT 所有 patch token 的尺度是固定的不存在多尺度表示。总之还是我们之前说的Transformer 在视觉任务中缺乏“结构性约束”搜索过于自由以至于收敛慢数据要求高。以上便是 原始 ViT 在实际训练中会产生的一些问题而 Swin Transformer 便是针对它们进行了改进。我们已经提到过 Swin Transformer 是通过优化自身结构增强了归纳配置而在展开其具体逻辑前总结一下其核心思想那就是让 Transformer 具备类似 CNN 的归纳偏置。需要提前说明的是在这里包括下面的具体逻辑中你很可能会产生这样一种疑惑Swin Transformer 在尽力还原 CNN 的逻辑就像开倒车一样那既然都是同一套归纳偏置两种结构到底差在哪里这种改进的具体影响又是哪方面的我们先展开 Swin Transformer 的具体改进内容了解完其本身后就来展开这个问题。2. Window Attention#Swin 的第一步非常直接把“全局 attention”改为“局部 attention”具体做法很简单保持 patch token 的二维结构在此基础上划分多个不重叠的窗口即 window每个窗口内部独立进行自注意力计算。这部分是整个后续设计的前提我们详细展开如下总结来说这一设计其实就是把原本的全面注意力变成局部注意力了很容易让我们联想到卷积核。实际上这一改进就是依据局部性先验引入的归纳配置于此同时这一操作还引起了计算复杂度的变化(2)→(×)假设输入图像大小为 224×224patch size 为 4×4那么 token 数量为224×2244×456×563136在标准 ViT 中每一层 attention 的计算复杂度为(2)31362≈9.8×106现在我们引入 window假设 window size 为 7×7那么 window 的数量为31364964总计算量就是64×492≈64×2401≈1.5×105对比一下9.8×1061.5×105≈65也就是说 仅通过局部窗口划分计算量就下降了约 60~70 倍。而究其根本是因为当窗口大小固定时计算复杂度从“平方增长”变成了“线性增长”。不过这一改进也带来了相应的问题不同窗口之间的信息被完全隔离。自然Swin Transformer 也有其相应的策略3. Shifted Window移位窗口#就像刚刚说的如果只有 Window Attention模型就会退化为“块状 CNN”。为了解决这个问题Swin 提出了核心机制Shifted Window。这步的做法看似简单但实际上存在一些要注意的细节循环平移窗口 同时使用掩码遮蔽非法邻接从而交互跨窗口信息。我们具体展开如下3.1 循环平移#复述一下要点向右下方向平移 token 网格平移距离一般为ℎ 2这样就可以让窗口内容发生变化交互不同区域里的信息。但就像图里说的这里会出现一个问题一些本不相邻的区域被强行拉到一起了比如右下角和左上角。对此Swin 的解决方式是对“跨越原边界”的 token 进行 mask不允许它们参与 attention。而展开其具体逻辑前我们要先解释清楚一个问题为什么要拒绝直接计算不相邻区域的注意力这又并不像原始 transformer 的因果掩码一样会透露未来信息。如果用一句话来总结就是这是为了局部性偏置的刻意设计。简单展开一下如果 shift 后直接 attention那就会变成token 之间可以随意跨原 window 交互。而 Swin 想要的是“先局部建模再逐层扩散”。一旦这么做模型就成了“弱版 ViT”又回到了全局注意力的范畴还多了层 window 的设计。因此这里的 mask 为了约束信息只能沿着“窗口重组后的局部结构”传播从而保留 Swin 的归纳偏置设计。这点内容我们展开下面的 mask 具体设计后就可以更好的理解。3.2 Shifted Window 的 mask 设计#先总结一下 mask 的设计逻辑就是在 Shift 前构造一个“窗口分组编号图”Shift 后再根据编号差异生成 attention mask。具体如下而在这一层的注意力计算中掩码的设计方法就和这些编号紧密相关其形式如下相同编号不同编号相同编号不同编号{0相同编号−∞不同编号再摆一下掩码公式Attention(,,)softmax()总结来说就是在新划分的 window 中只计算和自己编号相同的 token 的注意力。这样我们就实现让信息跨窗口流动的同时保证了局部性偏置不被破坏。这里要专门强调一点在完成 Shifted Window 的相关计算和融合后输出的 token 会被拼接回原始图像的结构。这是因为 Swin 的整体设计也方便堆叠的同时在平移窗口中交流的 token 也会在重组后“和本地人重新交流外部信息”。4. patch merging#到这里我们就可以解释一下最开始的网络结构图中的一些内容了。首先在上面的内容里我们知道 Swin 改进了 Transformer 的 block 结构我们称之为Swin block: 要么 W-MSA要么 SW-MSA两个 Swin block 在网络中交替出现。补充一个细节在这里对归一化的设计就变成了我们之前提到的Pre-Norm前归一化结构。这样我们就明白了 Swin 的大部分结构只剩下了最后一个改进点patch merging如果再类比一下它有些像 CNN 里的池化但又有所不同。我们先具体展开其逻辑再说它的作用我们假设前一层输出的 token 网格尺寸是××Patch Merging 做的事情是把每 2×2 的 patch 合并成 1 个 token。具体操作就是把这 4 个 token 的特征拼接在通道维度上→4对整个 token 网格应用后空间尺寸就会变为2×2还没完Swin 不会直接用 4而是再接一个线性层4→2最终输出的尺寸大小为