Swin Transformer:分层局部注意力
源码、配套笔记&讲解视频,点击文末名片
- Swin Transformer 的背景和动机
1.1 Transformer 的起点:从 NLP 到视觉
Transformer 最初是用在 自然语言处理(NLP) 的,比如翻译、写文章。它的核心是 自注意力机制(Self-Attention),能让模型自己决定哪些元素更相关。
- 在句子里,每个词长度差不多,关系相对“平等”,所以 Transformer 处理文字很顺手。
但是一搬到图像领域,问题就来了: - 像素量太大:一句话几十个词,一张图上百万像素,直接做自注意力计算,复杂度爆炸。
- 尺度不一致:语言里的词基本差不多大,而图像里的物体大小差别很大(蚂蚁 vs 飞机)。模型必须学会多尺度表征。
1.2 Vision Transformer (ViT) 的第一步
ViT 的做法很直接:把图片切成固定大小的“小方块”(Patch),当作词元输入 Transformer。
- 好处:完全抛弃卷积,模型很“纯粹”。
- 问题:
- 只在单一尺度上工作(固定 Patch 尺寸),对多尺度目标不友好。
- 计算复杂度二次方增长:像素越多,算力消耗飞涨。
- 需要巨量数据 才能训练好(比如 JFT-300M),否则容易过拟合。
1.3 PVT(Pyramid Vision Transformer)的改进
PVT 想解决 多尺度 问题,于是引入了类似 CNN 的“金字塔”设计:
- 逐层下采样,高层特征图更小,能捕捉到大范围语义;低层特征保留细节。
- 这样模型更适合目标检测、分割这些任务,不再局限于分类。
但 PVT 依旧有问题: - 自注意力计算虽然减少了,但还是比较重,尤其在高分辨率任务里。
- 窗口没有很好地被“局部化”,计算效率和效果还有优化空间。
1.4 Swin Transformer 的动机与巧思
在 ViT 和 PVT 的基础上,Swin Transformer(Shifted Window Transformer)提出了两个关键想法:
- 分层结构(Hierarchical)
- 像 CNN 一样,Swin 把图像逐步下采样,形成 从细节到整体 的层次化特征。
- 这样自然能处理不同大小的目标,和 PVT 的目标是一致的,但实现更高效。
- 移位窗口(Shifted Window Attention)
- 不像 ViT 那样全局自注意力,而是在局部“小窗口”内算注意力,计算量大幅下降(复杂度从二次方降到线性)。
- 为了避免“各自为战”,Swin 会在下一层把窗口稍微挪动一下,让窗口之间的信息交流。
- 这就像上课时:你先和同桌小组讨论(窗口注意力),下一轮换组讨论(移位窗口),最终全班信息互通。
1.5 背景小结(为什么 Swin 必须出现?)
- ViT:能学全局关系,但计算量太大,缺乏多尺度,且对小数据集不友好。
- PVT:引入金字塔设计,适合下游任务,但在效率上还有瓶颈。
- Swin Transformer:在金字塔思路上更进一步,用“局部窗口 + 移位”的方式,在 效率 和 建模能力 之间找到完美平衡。
结果就是:Swin 不仅能做分类,还能很自然地扩展到 检测、分割,成为一个真正意义上的 通用视觉主干网络(backbone)。
2、Swin Transformer 的创新点
- 分层结构(Hierarchical Representation)
- 传统 ViT:整张图片被切成固定大小的 Patch,经过一层层 Transformer,得到的特征图大小几乎不变,缺少层次。
- Swin:像 CNN 一样,逐步下采样,构建 金字塔式的特征图。
- 低层 → 分辨率高,细节丰富。
- 高层 → 分辨率低,语义强大。
👉 好处:天然支持检测、分割等需要多尺度特征的任务。
- 窗口注意力(Window-based Self-Attention)
- 问题:全局注意力计算量随图像大小是 二次方 增长,算不动。
- Swin 的做法:只在 局部窗口 里算注意力,每个窗口固定大小(如 7×7 Patch)。
👉 好处:复杂度降低到 线性,高分辨率图像也能处理。
- 移位窗口机制(Shifted Windowing)
- 问题:如果只在局部窗口里算注意力,不同窗口之间就互相“断开联系”。
- Swin 的巧思:在下一层,把窗口整体“挪一下位置”(比如往右下移动一半)。
👉 结果:窗口之间可以“交叉讨论”,信息自然流通,又不增加太多计算。
(就像小组讨论时换桌子,避免信息被困在原小组。)
- 通用性与高效性
- Swin 的设计能轻松接入现有框架,比如 FPN(特征金字塔网络)、U-Net。
- 由于是分层 + 线性复杂度,它能同时兼顾 速度 和 精度,在分类、检测、分割任务上都能达到 SOTA(当时最优)。
- 相对位置编码(Relative Position Bias)
- ViT 使用 绝对位置编码,不够灵活。
- Swin 改成 相对位置偏置:学习不同 Patch 相对位置的影响。
👉 好处:更符合视觉的平移不变性,检测和分割性能更好。
3、核心模型网络结构
- 从图片到“小方块”
- 最左边写着 Images (H×W×3),就是我们输入的一张彩色照片。
- Patch Partition(切小块):把图片像“切西瓜”一样切成很多小方块(比如每块 4×4 像素)。
- Linear Embedding(小方块编码):给每个小方块贴上“身份证”,把它变成一个向量。
👉 这一步就把图片变成了“小方块的队伍”,像文字里的一串词。
- 四个学习阶段(Stage 1 → Stage 4)
看左边 (a) 的大框框,里面有四个 Stage,可以想象成四层学习:
- Stage 1:第一层学习,学生还在“看细节”,图像分辨率比较大。
- Patch Merging:每次升级到下一层前,都会把“4 个小方块合并成 1 个大方块”。
- 👉 就像拼乐高,先拼小零件,再拼成大积木。
- Stage 2 → Stage 4:随着层数加深,分辨率越来越小,但每个方块的信息量越来越大。
- 👉 就像读书时:小学生记细节(字词),大学生总结大意(段落、文章)。
- Swin Transformer Block(右边的图 b)
右边的 (b) 展示了 Swin Transformer Block 的内部“学习流程”。你可以把它理解成“同学讨论问题”的场景。
第一个 Block(W-MSA)
- LN(Layer Norm):先让大家状态归一(像是先安静下来,准备讨论)。
- W-MSA(Window Attention):同学们分小组讨论,每组只和附近的人交流(局部窗口)。
- MLP(全连接层):讨论结束后,每个人整理自己的想法。
- 残差连接:把原来的想法和新想法结合(避免“推翻重来”)。
👉 就像同桌之间先小范围讨论。
第二个 Block(SW-MSA) - 一开始一样 LN。
- SW-MSA(Shifted Window Attention):这次换个座位!把小组“整体挪一挪”,让不同小组的同学交流。
- 再做一次 MLP 和残差。
👉 就像换组讨论,保证大家不是“各玩各的”,而是能全班互通信息。
- 整体理解
- 左边 (a):展示了“分层学习”的过程(小块 → 大块 → 金字塔)。
- 右边 (b):展示了“窗口注意力 + 移位窗口”的讨论方式。
一句话总结:
👉 Swin Transformer 就像一群学生(Patch),先分组讨论(窗口注意力),然后换组交流(移位窗口),再逐级总结(分层结构)。这样既能看细节,又能看全局,还能高效完成大任务。
4、 Swin Transformer 的重大缺点
- 只能先看局部,再慢慢拼全局 → 不如一次性看全图
Swin 通过 窗口注意力(W-MSA) 来降低计算量,但这意味着它的注意力范围一开始是局限在小窗口里的。
虽然有 移位窗口(SW-MSA) 来打通窗口之间的信息,但全局交互是“间接的”,并不是像 ViT 那样直接全局建模。
👉 这导致 Swin 对一些需要 强全局依赖 的任务(比如图像里非常远的区域之间的关系)可能不如全局 Transformer。
想象一下:
- ViT 是“全班开大会”,每个人都能和全班所有人说话(直接全局交流)。
- Swin 是“小组讨论”,只允许和同桌聊一聊,再换组,再慢慢传递到全班。
👉 优点是效率高,不乱,但缺点就是 信息传递绕了一圈,不像 ViT 那样一步到位。
- 窗口大小固定,灵活性不足
- Swin 的小组大小(窗口,比如 7×7)是提前规定好的。
- 但图片里的物体有的很小(蚂蚁 🐜),有的很大(飞机 ✈️)。
- 小组太小 → 看不到大物体全貌。
- 小组太大 → 小物体容易被忽略。
👉 就像课堂分组,每组固定 7 个人,但问题是:有些任务适合 2 人小组,有些任务适合 20 人大组,Swin 没办法灵活调整。
- 遇到超大图还是很吃力
- 虽然 Swin 已经比 ViT 省了很多力气,但如果你给它一张 8K 高清大图,它还是会“累到爆显存”。
- 就像小组讨论:班级人太多(图像分辨率太高),小组再怎么分配,也会有人抱怨“太吵、记不住”。
👉 所以在特别大的任务上,Swin 依然有性能瓶颈。
5、基于 Swin Transformer 的改进模型
- CoAtNet(Google)——CNN + Transformer 的“混血儿”
🔹 CoAtNet 的思路:
👉 CNN overs Attention transformer = CoAtNet
- 前几层:用 卷积(CNN) → 学习图像的局部细节(边缘、纹理等)。
- 后几层:用 注意力(Transformer) → 学习全局依赖(大范围关系)。
- 整体是一个 “先 CNN,后 Transformer” 的流水线。
🔹 可以类比成: - 小学生(低层)先背字帖(卷积,强归纳偏置,细节清晰)。
- 高年级学生(高层)再学文章结构(注意力,全局建模)。
- 这样结合起来,比 Swin 单独用注意力更稳健,也比纯 CNN 更灵活。