Skip to content

ViT 变体:DeiT/Swin/MaxViT

原始 ViT 在大规模数据上展现了强大能力,但其 O(n²) 计算复杂度和数据饥渴特性限制了实际应用。DeiT、Swin Transformer 和 MaxViT 分别从数据效率、计算效率和注意力机制三个维度推动了 ViT 的演进。

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_out

DeiT-III

DeiT-III 进一步改进了训练策略,采用重复增强(Repeated Augmentation)和前向增强(Forward Augmentation),在 ImageNet-1K 上达到 85%+ Top-1 准确率。

Swin Transformer:层级式视觉 Transformer

Swin Transformer(Shifted Window Transformer)通过移动窗口机制实现了线性计算复杂度,同时引入层级结构适配密集预测任务。

核心设计

  1. 层级结构:类似 CNN 的多尺度特征图,通过 Patch Merging 逐步降低分辨率、增加通道数
  2. 窗口注意力:在固定大小窗口(默认 7×7)内计算自注意力,复杂度与图像大小线性相关
  3. 移动窗口:相邻层窗口偏移半个窗口大小,实现跨窗口信息交互
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 x

Swin 的优势

特性原始 ViTSwin Transformer
计算复杂度O(n²)O(n)
多尺度特征层级输出
下游任务适配优秀(检测/分割)
窗口间交互全局移动窗口

MaxViT:多轴注意力

MaxViT 结合了局部窗口注意力和全局网格注意力,实现了全交互的注意力机制:

  • Block Attention:在局部窗口内计算自注意力
  • Grid Attention:在全局网格上计算自注意力,每个网格点来自不同窗口
  • 两种注意力交替堆叠,实现局部-全局信息的充分交互

计算开销

MaxViT 虽然实现了更丰富的注意力交互,但计算开销高于 Swin。在实际应用中需要根据任务需求和硬件条件选择合适的架构。

相关资源

最近更新