共计 1984 个字符,预计需要花费 5 分钟才能阅读完成。
背景与痛点
在深度学习领域,卷积神经网络 (CNN) 长期以来一直是视觉任务的主流选择。但随着任务复杂度的提升,传统 CNN 的一些局限性逐渐显现出来。

-
长距离依赖建模不足:CNN 通过局部感受野逐步扩大视野范围,这种层级结构在捕捉全局关系时效率较低。
-
固定权重模式:卷积核的权重在推理时是固定的,缺乏对不同输入的自适应能力。
-
计算资源分配不均:CNN 对所有图像区域一视同仁,无法根据重要性动态分配计算资源。
Transformer 架构引入自注意力机制,很好地解决了这些问题。视觉 Transformer(ViT)通过将图像分割为小块 (patch) 并应用 Transformer 编码器,实现了:
- 全局感受野:每个 patch 都能直接关注图像的任何区域
- 动态权重:注意力权重根据输入内容实时计算
- 计算效率:可以聚焦重要区域,减少冗余计算
核心架构解析
Patch Embedding 机制
ViT 首先将输入图像分割为固定大小的 patch(通常 16×16 像素),然后将每个 patch 展平为向量。这个过程就像把图像变成了一个 ” 句子 ”,每个 patch 相当于一个 ” 单词 ”。
- 图像分割:224×224 的输入被分为 14×14 个 16×16 的 patch
- 线性投影:每个 patch 通过全连接层映射到模型维度(如 768)
- 添加分类 token:在序列开头插入一个可学习的分类 token
Multi-Head Self-Attention
自注意力是 Transformer 的核心机制,在视觉任务中:
- 每个 patch 生成 Query、Key 和 Value 三个表示
- 计算 patch 之间的注意力权重(softmax(QK^T/√d))
- 使用权重对 Value 进行加权求和
- 多头机制并行执行多次注意力计算,增强模型容量
Positional Encoding
由于 Transformer 本身不包含位置信息,ViT 需要显式添加位置编码:
- 标准方法:使用可学习的位置嵌入向量
- 视觉专用改进:相对位置编码、2D-aware 编码等
代码实现
下面是一个基础的 ViT 模型 PyTorch 实现:
import torch
import torch.nn as nn
class PatchEmbedding(nn.Module):
def __init__(self, img_size=224, patch_size=16, in_chans=3, embed_dim=768):
super().__init__()
self.proj = nn.Conv2d(in_chans, embed_dim,
kernel_size=patch_size,
stride=patch_size)
def forward(self, x):
x = self.proj(x) # [B, C, H, W] -> [B, E, H/P, W/P]
x = x.flatten(2).transpose(1, 2) # [B, E, N] -> [B, N, E]
return x
class Attention(nn.Module):
def __init__(self, dim, num_heads=8):
super().__init__()
self.num_heads = num_heads
self.scale = (dim // num_heads) ** -0.5
self.qkv = nn.Linear(dim, dim * 3)
self.proj = nn.Linear(dim, dim)
def forward(self, x):
B, N, C = x.shape
qkv = self.qkv(x).reshape(B, N, 3, self.num_heads, C//self.num_heads)
q, k, v = qkv.unbind(2)
attn = (q @ k.transpose(-2, -1)) * self.scale
attn = attn.softmax(dim=-1)
x = (attn @ v).transpose(1, 2).reshape(B, N, C)
x = self.proj(x)
return x
实战建议
小数据集训练
- 数据增强:MixUp、CutMix 等高级增强策略效果显著
- 迁移学习:在 ImageNet 预训练模型上进行微调
- 正则化:DropPath、Label Smoothing 等防止过拟合
显存优化
- 梯度检查点:用计算时间换取显存空间
- 混合精度训练:使用 AMP 自动混合精度
- 梯度累积:小批量多次累积后更新
常见问题
- 梯度消失:适当减小学习率,检查初始化
- 过拟合:增加数据增强,添加正则项
- 训练不稳定:使用学习率 warmup
性能考量
- 硬件适配:在 GPU 上 batch 处理效率高,TPU 适合大规模训练
- 模型压缩:Post-training 量化可减少 4 倍模型大小
- 架构选择:对于密集预测任务,Swin Transformer 可能更高效
思考题
- 如何设计更适合高分辨率图像的 Transformer 变体?
- 自注意力计算能否进一步优化以减少内存消耗?
- 视觉 Transformer 在视频理解任务中有哪些潜在优势?
正文完
发表至: 深度学习
近三天内
