ViT 变体:DeiT/Swin/MaxViT
原始 ViT 在大规模数据上展现了强大能力,但其 O(n²) 计算复杂度和数据饥渴特性限制了实际应用。DeiT、Swin Transformer 和 MaxViT 分别从数据效率、计算效率和注意力机制三个维度推动了 ViT 的演进。
DeiT:数据高效的 ViT
DeiT(Data-efficient Image Transformer)的核心贡献在于让 ViT 摆脱对超大数据集的依赖,仅用 ImageNet-1K 即可训练出强力的 ViT 模型。
蒸馏策略
DeiT 引入了蒸馏 Token(distillation token),与 CLS Token 并行训练:
- 软蒸馏:学生模型学习教师模型的输出分布
- 硬蒸馏:学生模型直接学习教师模型的预测标签
- 蒸馏 Token 和 CLS Token 通过自注意力交互,最终分别用于分类和蒸馏损失
python
class DeiT(nn.Module):
def __init__(self, vit_model, teacher_model):
super().__init__()
self.vit = vit_model
self.teacher = teacher_model
self.dist_token = nn.Parameter(torch.zeros(1, 1, vit_model.embed_dim))
def forward(self, x):
B = x.shape[0]
patches = self.vit.patch_embed(x)
cls_tokens = self.vit.cls_token.expand(B, -1, -1)
dist_tokens = self.dist_token.expand(B, -1, -1)
x = torch.cat([cls_tokens, dist_tokens, patches], dim=1)
x = x + self.vit.pos_embed
x = self.vit.encoder(x)
cls_out = self.vit.head(x[:, 0]) # 分类输出
dist_out = self.vit.head_dist(x[:, 1]) # 蒸馏输出
return cls_out, dist_outDeiT-III
DeiT-III 进一步改进了训练策略,采用重复增强(Repeated Augmentation)和前向增强(Forward Augmentation),在 ImageNet-1K 上达到 85%+ Top-1 准确率。
Swin Transformer:层级式视觉 Transformer
Swin Transformer(Shifted Window Transformer)通过移动窗口机制实现了线性计算复杂度,同时引入层级结构适配密集预测任务。
核心设计
- 层级结构:类似 CNN 的多尺度特征图,通过 Patch Merging 逐步降低分辨率、增加通道数
- 窗口注意力:在固定大小窗口(默认 7×7)内计算自注意力,复杂度与图像大小线性相关
- 移动窗口:相邻层窗口偏移半个窗口大小,实现跨窗口信息交互
python
def window_partition(x, window_size):
"""将特征图划分为不重叠窗口"""
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()
return windows.view(-1, window_size, window_size, C)
def shifted_window_attention(x, window_size, shift_size):
"""移动窗口自注意力"""
# 先对特征图做循环移位
if shift_size > 0:
shifted_x = torch.roll(x, shifts=(-shift_size, -shift_size), dims=(1, 2))
else:
shifted_x = x
# 在移位后的特征图上做窗口注意力
windows = window_partition(shifted_x, window_size)
attn_windows = self_attn(windows)
# 还原特征图并逆移位
x = window_reverse(attn_windows, window_size, H, W)
if shift_size > 0:
x = torch.roll(x, shifts=(shift_size, shift_size), dims=(1, 2))
return xSwin 的优势
| 特性 | 原始 ViT | Swin Transformer |
|---|---|---|
| 计算复杂度 | O(n²) | O(n) |
| 多尺度特征 | 无 | 层级输出 |
| 下游任务适配 | 差 | 优秀(检测/分割) |
| 窗口间交互 | 全局 | 移动窗口 |
MaxViT:多轴注意力
MaxViT 结合了局部窗口注意力和全局网格注意力,实现了全交互的注意力机制:
- Block Attention:在局部窗口内计算自注意力
- Grid Attention:在全局网格上计算自注意力,每个网格点来自不同窗口
- 两种注意力交替堆叠,实现局部-全局信息的充分交互
计算开销
MaxViT 虽然实现了更丰富的注意力交互,但计算开销高于 Swin。在实际应用中需要根据任务需求和硬件条件选择合适的架构。