ARTICLE · 1313629
Swin Transformer 源码精读:移位窗口让分层视觉变成现实,ICCV 2021 最佳论文的架构革命
Swin Transformer 源码精读:移位窗口让分层视觉变成现实,ICCV 2021 最佳论文的架构革命ICCV 2021 的最佳论文(Marr Prize)给了 Swin Transformer——微软亚洲研究院的分层视觉 Transformer。它解决的问题是视觉领域的根本矛盾:NLP 的序列长度是固定的,图像的分辨率是变化的,而且图像里的物体尺度跨度极大(从蚂蚁到建筑)。官方仓库 microsoft/Swin-Transformer,今天超过 13 万星,是视觉 Transformer 普及的最大推手。 
2020 年的 ViT 证明了 Transformer 能做视觉,但留下了两个坑。第一,全局注意力的计算量与图像大小的平方成正比——检测分割用的都是大图,全图算注意力显存直接爆炸。第二,ViT 输出单一分辨率的特征图,没有多尺度结构——而多尺度(FPN、特征金字塔)恰恰是检测和分割领域十年积累的精华。 Swin 的回答是分层加窗口:像 CNN 一样从 4× 下采样逐级到 32× 下采样,每级内部做局部窗口注意力。两个设计撑起了这套方案。 第一个设计是 Window Attention:把特征图切成不重叠的窗口(比如 7×7 一格),注意力只在窗口内计算。计算量从「图像大小的平方」降到「图像大小乘窗口大小」——大图可算了。 但纯窗口注意力有个致命缺陷:窗口之间不通信,信息被网格硬性切断。第二个设计 Shifted Window(移位窗口)就是补这个洞的:下一层的窗口相对上一层偏移半个窗口(往下往右各挪格数的一半),让相邻窗口的内容进入彼此的注意力范围。信息在层与层之间「渗透」式传播,两层的组合等价于扩大了感受野。 实现里最巧的是 masked attention:移位后边界上的窗口大小不一,代码用填充加掩码的做法把不规则窗口统一成规则批次——这个细节在 models/swin_transformer.py 里只有几十行,但它是整个架构能高效跑起来的工程支点。后续的 Swin-V2 把这个机制进一步优化(用 cosine attention 和 log-spaced CPB 解决了跨窗口相对位置偏差的稳定性),大模型规模上探到 30 亿参数。 Swin 的分层特征输出天然兼容检测和分割的既有体系:特征金字塔直接接 Swin 的四级输出,检测头不用改。论文的成绩单覆盖三大任务:ImageNet-1K 分类 84.5 top-1(Swin-L)、COCO 检测 58.7 box AP(Cascade Mask R-CNN,当时+2.7)、ADE20K 分割 53.5 mIoU(当时+3.2)——三个任务同时刷新,证明的是架构的通用性而非单点调优。 它在下游的统治力比榜单更实:此后两年的检测分割论文,骨干网络默认写 Swin;多模态大模型的视觉编码器(如早期 LLaVA)大量采用 CLIP-ViT 和 Swin 的变体;视频理解、遥感、医学影像的基准上 Swin 系 backbone 遍地。可以说 transformer 时代视觉的「ResNet 位置」,被 Swin 拿下了。 官方仓库分类和检测分割分开维护:classification/ 是纯 PyTorch 实现干净利落,建议从这里的 SwinTransformer 主类读起——PatchEmbedding、四个 Stage、每个 Stage 里的 WindowAttention 和 SwinTransformerBlock 逐层对照论文的图 2 和图 3;检测分割在 mmdetection 框架里,配置文件直接可用。 值得做的消融实验:把 shifted window 关掉(窗口不移位)训练一个小模型,看分类精度掉多少——论文报的这个差距(位移带来的增益)会让你直观理解那半格偏移的价值。窗口大小 7 不是玄学,论文的敏感性分析给过 8 和 16 的对比,改这个数跑一遍,对「局部注意力的尺度」会有手感。 一句收尾的判断:Swin 证明了 Transformer 不需要模仿 CNN 的局部性也能做视觉——它只需要在计算量和感受野之间找到一个聪明的调度方式。这个调度思想(分而治之加受控通信)比 Swin 本身活得更久,后续的 HaloNet、Nat、Focal Transformer 都在它的延长线上。 补两个读码时容易忽略的点。第一是相对位置偏置(RPB):Swin 把位置信息做成可学习的偏置表加在注意力分数上,而不是像 ViT 那样把位置编码加在输入上——这个设计让位置信息天然适配可变窗口,也是它对输入尺寸更友好的原因(检测分割的多尺度训练依赖这一点)。第二是变体矩阵:仓库里 Swin-T/S/B/L 按 (C=96, layers=[2,2,6,2], heads=[3,6,12,24]) 起步逐级放大,Tiny 版 28M 参数在 ImageNet 上就能到 81.3 top-1——这个小而强的档位是它被工业界大量采用的原因,端侧和实时场景都用得起。 给想深入者的最后一条路径:把 Swin 和昨天精读过的 BEVFormer 放在一起读会看到传承——BEVFormer 的空间交叉注意力里就有 Swin 式「局部窗口查询」的影子(BEV 查询只看参考点周围的局部图像区域)。架构思想就是这样一代代流动的:Swin 证明了窗口化注意力的性价比,后来的工作把它搬进了检测、分割、3D 感知乃至多模态。读通这一篇,等于拿到了理解过去五年视觉骨干网络的钥匙。 补充一句授权与选型的实务:官方仓库 MIT 许可,商用友好;选型时 Swin 与 ConvNeXt(2022 年用现代配方重调的 CNN)的性能已相差不大,实时边缘场景可两者都比价——但 Swin 的生态位(下游模型的默认骨干、教程与预训练权重最全)依然难替代。经典的后期竞争者众,经典自身的位置却越坐越稳。 把 Swin 读懂,transformer 时代的视觉就通了三分之二——剩下那三分之一,在读这篇文章的你手里。 窗口、层级、相对位置——三个词带走 Swin 的全部秘密,也带走了视觉 transformmer 十年故事里最结实的一章。下一篇精读,我们去下一个十年找它。 经典值得反复读,下次见。 我们下一篇见。
















































































