Vision Transformer(ViT)
Vision Transformer(ViT)是一种将Transformer模型应用于计算机视觉任务的创新方法,由Google Research团队在2020年提出。它打破了传统卷积神经网络(CNN)在图像处理中的主导地位,通过全局注意力机制直接建模图像块(patches)之间的关系,尤其在大规模数据集上表现出色。
ViT的核心思想
-
图像分块处理
例如:一张224x224的图片,分割为16x16的块后,得到14x14=196个块。
将输入图像分割为固定大小的图像块(如16x16像素),每个块展平后通过线性变换映射为嵌入向量(Embedding)。 -
位置编码
为每个块添加位置嵌入(Position Embedding),以保留图像的空间信息(Transformer本身不感知位置)。 -
Transformer编码器
将处理后的序列输入标准的Transformer编码器,通过多头自注意力机制(Multi-Head Self-Attention)捕捉全局依赖关系。 -
分类头
使用特殊的[CLS]标记(类似BERT)或全局平均池化生成图像表示,最终通过全连接层分类。
ViT的工作流程
-
输入处理
- 输入图像:
(H, W, C)
→ 分割为N
个块 → 每个块展平为(P²·C)
维向量(P
为块大小)。 - 线性投影:将每个块映射为
D
维嵌入向量 → 得到序列(N+1, D)
(+1
为[CLS]标记)。 - 添加位置编码:为每个块分配位置信息。
- 输入图像:
-
Transformer编码
通过多个Transformer层(如12层)处理序列,每层包含:- 前馈网络(FFN):非线性变换。
- 多头自注意力:计算块间相关性。
-
分类输出
取[CLS]标记对应的输出向量 → 全连接层 → 类别概率。
ViT vs. CNN:关键区别
特性 | ViT | CNN |
---|---|---|
感受野 | 全局(自注意力) | 局部(卷积核逐步扩大) |
归纳偏置 | 无空间先验(需位置编码) | 局部性、平移不变性 |
数据需求 | 需大规模数据(如JFT-300M) | 中小规模数据即可 |
计算效率 | 高分辨率图像计算成本高 | 适合高分辨率(池化降低维度) |
ViT的优缺点
✅ 优点:
- 全局建模能力:自注意力机制捕捉长距离依赖。
- 可扩展性:模型深度和宽度易扩展(如ViT-Huge)。
- 统一架构:与NLP共享Transformer,便于多模态任务。
❌ 缺点:
- 数据依赖性强:小数据集上易过拟合,需预训练(如ImageNet-21k)。
- 计算资源消耗大:高分辨率图像处理成本高。
- 细节丢失:分块可能忽略局部纹理(可通过小尺寸块缓解)。
ViT的变体与改进
-
DeiT(Data-efficient ViT)
通过知识蒸馏(使用CNN作为教师模型)减少数据依赖。 -
Swin Transformer
引入层级结构和滑动窗口注意力,提升分辨率适应性和计算效率。 -
MAE(Masked Autoencoder)
借鉴BERT的掩码建模,通过重建掩码图像块进行自监督预训练。
应用场景
- 图像分类(如ImageNet)
- 目标检测(如DETR)
- 图像生成(如ViT-GAN)
- 医学图像分析(如病理切片分类)
代码示例(PyTorch)
import torch
from torchvision.models import vit_b_16# 加载预训练ViT模型(ImageNet-21k预训练)
model = vit_b_16(pretrained=True)# 输入处理:224x224图像 → 分为16x16块
x = torch.randn(1, 3, 224, 224)
output = model(x) # 输出类别概率
总结
ViT通过纯Transformer架构实现了图像的高效全局建模,推动了视觉与语言模型的统一。尽管对数据量和计算资源要求较高,但其在大规模任务和多模态学习(如CLIP)中的潜力使其成为计算机视觉领域的重要里程碑。