简单的介绍
原始 ViT(图像 Transformer):
把整张图片切成一个个小块 Patch,直接当成单词 Token,全局注意力缺点:图片太大 →
Token 太多 → 计算爆炸、很慢、效果差。
Swin Transformer 核心解决:
局部窗口注意力 + 分层下采样 + 移动窗口 Shift Window变成:小窗口自注意力 → 合并窗口
变大 → 再小窗口注意力,也就是金字塔层级视觉 Transformer,也是现在 YOLO、分割、检测几
乎都在用的底座。
Swin不是一个单词而是Shifted Window,其实就是滑动的意思。
Patch Partition
首先一张图片要经过一个Patch Partition模块。把整个图片进行图片块的分区,假设我们以4个像
素*4个像素作为一个patch,也就是一个块。那么一张图片横着应该是w/4个patch。竖着也可以分
h/4个patch。彩色图片是3个通道的,所以每个patch应该是4*4*3=48的。所以经过Patch Partition
模块的操作后,本质上就是把一张照片转换成一个向量。假设原始图像是224*224的,所以这个向
量最终会变成56*56*48的。
Linear Embedding
Linear Embedding=Patch Embedding(48→96线性投影)+Position Embedding(位置编码相加)
Patch Embedding:对图像分块做线性投影(48 维→96 维)
Patch Embedding 是一个可学习的线性全连接层(Linear Projection)
作用:把展平后的48 维原始像素向量 → 映射为模型主干维度 96 维特征 Token
Position Embedding 位置编码
Swin Transformer 采用可学习绝对位置编码,并非通过正弦余弦等数学公式固定计算生成。其完整
计算与更新流程如下:
根据 Patch 特征图尺寸 56×56×96
初始化同形状、服从正态分布的随机参数矩阵作为初始位置编码;
位置编码与 Patch Embedding 输出的内容特征维度一致(均为 96 维),满足逐元素相加条件;
训练阶段,位置编码参数会随着网络反向传播、梯度下降自动学习空间位置语义,逐渐学会区分左
上角、中间、右下角等不同空间位置;
推理阶段,训练完成的位置编码参数固定不再更新,直接与对应位置的 Patch 内容特征逐元素相加
融合:
图片 224×224×3
Patch Partition:分 4×4 块展平 → 56×56×48
Patch Embedding 线性投影:48→96 → 56×56×96(内容特征)
Position Embedding:初始化 56×56×96 可学习位置参数,训练学习位置信息
两者相加 = Linear Embedding 最终 Token
送入 W-MSA 窗口注意力
Swin Transformer Block
网络结构
一个标准 Swin Block 单元 = 两层 Transformer 层:
第一层:窗口自注意力 W-MSA(只在窗口内注意力)
第二层:移位窗口自注意力 SW-MSA(窗口移动,实现跨窗口交互)
每层后面都带:LayerNorm + MLP 前馈网络 + 残差连接
窗口自注意力 W-MSA
将图像划分成若干 Patch 之后,W-MSA 会在这些 Patch 基础上进一步划分互不重叠的窗
口,仅在每个窗口内部独立进行多头自注意力计算,不再进行全局注意力交互,从而大幅降低模型
计算量。本文设置窗口大小为 7×7,即每个窗口包含 49 个 Patch Token。
但该方式存在明显缺陷:窗口之间完全相互隔绝、信息互不流通,模型全局建模能力较弱。例
如小猫的两只眼睛分别落在两个不同窗口中,自注意力始终无法建立两只眼睛之间的特征关联与交
互。因此 W-MSA 必须搭配SW-MSA 移位窗口自注意力共同使用。
输入:56×56×96
含义:高 56 个 Patch × 宽 56 个 Patch × 特征维度 96
W-MSA 内部窗口划分维度变化(设定窗口 7×7)
56×56×96 划窗口 [64,49,96]
64:一共 64 个窗口
49:每个窗口 49 个 Patch Token
96:每个 Token 维度不变
W-MSA 输入输出维度
W-MSA 窗口自注意力的输入为 Linear Embedding 输出特征:56×56×96
移位窗口自注意力 SW-MSA
只需要将窗口整体移动,就能把原本分属两个窗口的小猫双眼,重新划分到同一个窗口内。那么具
体需要移动多少个 Patch 呢?移位距离由窗口大小超参数 M 决定,取 M//2(向下取整) 即可。我
们窗口大小为 7,因此 7//2 = 3,只需要将窗口向下、向右各移动 3 个 Patch即可。
这时又会出现一个新问题:窗口移位后会移出图片边界怎么办?Swin 采用 循环移位(Cyclic
Shift) 的方式处理:把图片上方、左侧移出边界的区域,循环填补到图片下方、右侧空缺的对应
位置,也就是左上角区域填补到右下角,左侧与顶边区域循环移动到对侧。完成循环移位填补重组
后,再在各个新窗口内部正常执行自注意力计算即可。
对特征图执行窗口移位操作(Shift Window)
移位后重新划分不规则窗口
每个窗口内部依然独立做多头自注意力(和 W-MSA 计算方式一模一样)
加上移位窗口掩码(cyclic shift mask),防止跨无效区域注意力
计算完成后逆移位还原,拼回原图形状
Patch Merging
ViT 是一直保持原图尺寸不变,没有下采样;Swin Transformer 用 Patch Merging 做下采样,作
用:把相邻 4 个小 Patch 合并成 1 个大 Patch,尺寸减半、通道翻倍,实现多尺度特征提取。
它就是 Swin 的池化 / 下采样层,比卷积池化更强、更平滑。
我们可以把它类比为 CNN 中的池化层,但二者原理与实现方式完全不同。
我们先展开 Patch Merging 具体逻辑与维度变化,假设前一层输入的 Token 网格尺寸为
H×W×C。Patch Merging 核心操作:将特征图上每相邻 2×2 个 Patch 合并为 1 个新 Token。第一
步:把这 4 个 Patch 的特征在通道维度直接拼接 Concat,特征维度变为原来的 4 倍。对整个
Token 网格执行该操作后,空间宽高尺寸直接减半。
拼接得到的高维特征并不会直接使用,Swin 会在拼接后再接一层线性投影层,对特征维度进行压
缩调整。最终输出 Token 网格尺寸为:空间宽高继续保持减半,特征通道维度变为原来的 2 倍。
到这里可以明显看出 Swin 融入了经典 CNN 的分层思想:网络前向传播过程中,空间分辨率逐渐
降低,通道维度逐渐增大,特征信息密度不断提升,感受野从局部逐步扩散到全局,形成完整的多
尺度特征金字塔结构。
整体网络结构
随着网络层数不断加深,各个阶段对应的 Patch 感受野在不断变大。初始阶段每个 Patch 对应原
图4×4 像素,经过多次下采样后,后期单个 Patch 可以对应原图32×32 像素。也就是说模型提取
的图像块越来越大、感受野越来越广,以此实现多尺度特征提取。与此同时,特征通道数也在逐层
加倍增长。
模型最终输出特征为7×7×768,经过全局平均池化后压缩为单个 768 维特征向量,再送入全连接
分类层, 分类层权重矩阵维度为768×1000(1000 代表数据集总类别数量),计算得到 1000 维类
别得分向量,经过 Softmax 归一化转换为类别概率,概率最高的类别即为模型最终分类预测结
果。
Swin Transformer更像是解码器
很多人会误以为 Swin Transformer 更像解码器,其实并不是。Swin 虽然使用了掩码多头注意
力,但和 Transformer 解码器的掩码完全不同。
在 SW-MSA 移位窗口中,我们通过循环移位把图像不同区域填充到同一个窗口内,如果直接计算
注意力,原本空间不相邻、远距离的区域会产生无意义的注意力交互。因此在注意力分数计算阶
段,我们需要通过循环移位掩码,将这些不属于相邻区域、无意义的灰色部分注意力分数全部遮
挡,赋值为负无穷。屏蔽完成后,再将有效注意力分数送入 Softmax 计算归一化权重,只保留真
实相邻区域的有效注意力交互。
参考
【1】深度学习进阶(八)Swin Transformer - 哥布林学者 - 博客园
【2】大白话讲明白 Swin Transformer #SwinTransformer #Transformer #Swin #ai新星计划 #抖音年终知识大赏 - 抖音