从ViT到Swin:手把手教你理解那个让Transformer在CV领域“开窍”的Shifted Windows

张开发
2026/4/13 1:42:15 15 分钟阅读

分享文章

从ViT到Swin:手把手教你理解那个让Transformer在CV领域“开窍”的Shifted Windows
从ViT到Swin揭秘Shifted Windows如何让Transformer在CV领域开窍当Vision TransformerViT首次将自然语言处理领域的Transformer架构引入计算机视觉时整个AI社区为之振奋。但很快研究者们发现了一个尴尬的事实这个在图像分类任务上表现惊艳的模型在面对目标检测、语义分割等密集预测任务时却显得有些力不从心。问题的根源在于ViT的两个致命弱点——计算复杂度随图像尺寸呈平方级增长以及缺乏处理多尺度视觉特征的能力。直到2021年CVPR上Swin Transformer的横空出世这个僵局才被彻底打破。1. ViT的困境为什么全注意力机制在CV领域水土不服ViT直接将NLP中的Transformer架构搬到了计算机视觉领域这种粗暴移植带来了几个根本性问题。想象一下当我们处理一张224×224像素的图像时ViT会将其分割为16×16的patch产生196个视觉token。在标准的自注意力机制中每个token都需要与其他所有token计算关系这意味着# 标准自注意力的计算复杂度 复杂度 O((H × W)²) # 对于224×224图像H×W196这种平方级的复杂度使得ViT在处理高分辨率图像时变得极其昂贵。更糟糕的是视觉数据与语言数据存在本质差异尺度变化问题自然图像中的物体可能以各种尺寸出现而ViT的固定patch大小难以适应这种多尺度特性局部性缺失CNN通过卷积核天然具备局部感受野而ViT的全局注意力会不必要地关联无关区域位置信息处理ViT虽然引入了位置编码但缺乏CNN那种平移等变性的归纳偏置这些问题在图像分类任务中尚可容忍但在需要像素级预测的密集任务如目标检测、语义分割中就成为致命缺陷。下表对比了ViT与CNN在密集预测任务中的关键差异特性ViTCNN计算复杂度O(n²)O(n)多尺度处理单一尺度金字塔结构局部性全局注意力局部卷积平移等变性需要学习内置硬件效率内存占用高优化成熟2. Swin Transformer的核心创新层级结构与移位窗口Swin Transformer的突破性在于它没有简单地对ViT修修补补而是重新思考了视觉Transformer应该具备的基本特性。其设计哲学可以概括为像CNN一样思考但用Transformer的方式实现。这主要体现在两个关键创新上2.1 层级特征金字塔视觉世界的多尺度表达与ViT保持单一尺度不同Swin Transformer构建了一个四阶段的特征金字塔Stage 1将图像划分为4×4的小patch相比ViT的16×16更细粒度产生H/4 × W/4的token序列Stage 2合并2×2相邻patch特征维度翻倍分辨率降至H/8 × W/8Stage 3再次合并得到H/16 × W/16分辨率Stage 4最终H/32 × W/32的特征图这种设计带来了三重好处自然地模拟了CNN的金字塔结构适合各种视觉任务深层网络可以关注更全局的语义信息与FPN、U-Net等现有架构无缝兼容# Swin的层级结构伪代码 def forward(x): # Stage 1 x PatchEmbed(x) # H/4 × W/4 × C x SwinBlock(x) # Stage 2 x PatchMerging(x) # H/8 × W/8 × 2C x SwinBlock(x) # Stage 3 x PatchMerging(x) # H/16 × W/16 × 4C x SwinBlock(x) # Stage 4 x PatchMerging(x) # H/32 × W/32 × 8C x SwinBlock(x) return x2.2 移位窗口自注意力全局理解的局部计算Swin Transformer最精妙的设计在于其Shifted Window Self-Attention机制。它将图像划分为不重叠的M×M局部窗口默认7×7只在窗口内计算自注意力复杂度从O(n²)降至O(n)。但这样会丧失跨窗口信息交流于是Swin采用了如下策略常规窗口划分第一层将图像均匀分割移位窗口划分下一层窗口向右下角偏移(⌊M/2⌋, ⌊M/2⌋)像素交替进行两种划分方式在相邻层交替使用这种设计就像精心编排的舞蹈步伐——每一步都覆盖新的区域同时保持与上一步的部分重叠。具体实现上移位窗口带来了三个关键优势跨窗口连接通过相邻层的偏移信息可以在窗口间流动线性复杂度计算量仅与图像大小成线性关系硬件友好规则的内存访问模式利于GPU加速提示移位窗口的灵感可能来源于CNN中的滑动卷积但避免了卷积的权重共享限制保持了Transformer的参数灵活性3. 技术细节剖析Swin Transformer如何实现高效计算3.1 移位窗口的高效实现看似简单的窗口移位在实际实现时需要解决一个关键问题偏移后的窗口大小不一难以批量计算。Swin Transformer采用了一种巧妙的环形移位掩码策略对特征图进行环形移位torch.roll应用常规窗口划分使用注意力掩码恢复正确的空间关系import torch def shifted_window_attention(x, window_size, shift_size): # 环形移位 if shift_size 0: x torch.roll(x, shifts(-shift_size, -shift_size), dims(1, 2)) # 划分窗口 B, H, W, C x.shape x x.view(B, H // window_size, window_size, W // window_size, window_size, C) windows x.permute(0, 1, 3, 2, 4, 5).contiguous().view(-1, window_size, window_size, C) # 计算窗口注意力此处简化 attn window_attention(windows) # 恢复原始布局 attn attn.view(B, H // window_size, W // window_size, window_size, window_size, C) x attn.permute(0, 1, 3, 2, 4, 5).contiguous().view(B, H, W, C) # 反向环形移位 if shift_size 0: x torch.roll(x, shifts(shift_size, shift_size), dims(1, 2)) return x3.2 相对位置偏置注入空间感知与ViT使用绝对位置编码不同Swin Transformer引入了相对位置偏置来增强空间感知。对于窗口内的每个query和key位置对添加一个可学习的偏置项$$ Attention Softmax(QK^T / \sqrt{d} B)V $$其中B ∈ ℝ^{M²×M²}是基于query和key相对位置的可学习矩阵。这种设计更符合视觉任务的特性物体识别通常依赖相对位置对不同注意力头可以学习不同的空间偏置在推理时可以缓存减少计算开销4. 实战效果为什么Swin Transformer成为通用视觉骨干Swin Transformer的论文呈现了一组令人信服的数据证明了其在各类视觉任务上的优越性ImageNet-1K分类86.4% Top-1准确率ViT-Base为77.9%COCO目标检测58.7 box AP比之前最佳提升2.7点ADE20K语义分割53.5 mIoU提升3.2点更值得关注的是其效率优势。下表对比了不同模型在COCO目标检测任务上的速度和精度模型AP (%)延迟 (ms)显存占用 (GB)ResNet-5041.015.27.6ViT-Base44.928.712.4Swin-T (类似参数量)50.418.38.9在实际部署中Swin Transformer展现出三大优势线性复杂度处理高分辨率图像时优势明显硬件友好规则计算模式利于优化架构兼容可直接替换现有CNN骨干网络从工程角度看Swin Transformer的成功不是偶然。它既保留了Transformer强大的建模能力又吸收了CNN在视觉任务中的成功经验最终实现了鱼与熊掌兼得的效果。这提醒我们在AI架构设计中有时最有效的创新不是彻底颠覆而是巧妙的融合与平衡。

更多文章