张芷铭的个人博客

Vision Transformer(ViT)将图像分割为 Patch 序列,通过自注意力机制实现全局建模,颠覆了 CNN 主导的视觉处理范式。

核心原理

工作流程

1. 图像分块与嵌入

输入图像($H \times W \times C$)分割为 $N$ 个 $P \times P$ 的块,序列长度 $N = (H \times W)/P^2$。每个块展平后线性投影到 $D$ 维:

$$z_0 = [x_{\text{class}}; x_p^1 \mathbf{E}; \cdots; x_p^N \mathbf{E}] + \mathbf{E}_{\text{pos}}$$

2. 位置编码

可学习的位置编码注入块的空间位置信息。

3. Transformer 编码器

$L$ 层堆叠,每层包含:

  • 多头自注意力(MSA):$\text{Attention}(Q,K,V) = \text{softmax}(\frac{QK^T}{\sqrt{d_k}})V$
  • 前馈网络(MLP):两层全连接 + GELU
  • 残差连接与层归一化

4. 分类头

提取 [CLS] 标记输出,通过 MLP 分类。

与 CNN 对比

特性ViTCNN
感受野全局局部(需堆叠扩大)
归纳偏置强(平移不变性+局部性)
数据需求需大规模预训练小数据友好
计算复杂度$O(N^2)$适合高分辨率

ViT 数据充足时超越 CNN,小数据场景易过拟合。

优势与挑战

优势

  • 全局上下文建模,捕捉长距离依赖
  • 多任务统一框架
  • 无归纳偏置约束,数据驱动特征学习

挑战

  • 高分辨率图像序列过长,显存爆炸
  • 块内部缺乏交互,局部细节丢失
  • 单一尺度特征,多尺度适应性差

变体模型

Swin Transformer(2021)

  • 滑动窗口注意力:窗口内计算,降低计算量
  • 层级金字塔结构:生成多尺度特征

ViT-CoMer(CVPR 2024)

双分支架构针对密集预测任务:

  • ViT 分支:全局上下文
  • CNN 分支:多尺度特征
  • CTI 模块:双向特征交互,COCO 检测 +5.6% AP

轻量化变体

EdgeViT-XXS:1.6M 参数,0.3G FLOPs,适用于移动端。

应用场景

场景模型效果
医学影像LVM-Med糖尿病视网膜病变分类超 CNN 11%
自动驾驶HM-ViT遮挡场景检测精度 2.1%→53.2%
3D 视觉3D-VisTA统一处理点云与文本

PyTorch 实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
from transformers import ViTForImageClassification, ViTConfig

config = ViTConfig(
    image_size=224,
    patch_size=16,
    num_labels=10,
    hidden_size=256,
    num_hidden_layers=4,
    num_attention_heads=4,
)
model = ViTForImageClassification(config)

# 训练技巧
optimizer = torch.optim.AdamW(model.parameters(), lr=3e-5)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=10)
nn.utils.clip_grad_norm_(model.parameters(), 1.0)

未来方向

  • 高效注意力:线性注意力降至 $O(N)$
  • 多模态融合:统一视觉、语言、音频编码器
  • 动态计算:按区域复杂度分配资源

Comments