摘要
本文系统讲解卷积神经网络(CNN)的局限性(归纳偏置、长距离依赖弱),深入解析Vision Transformer(ViT)的图像分块(Patch)与线性嵌入自注意力在图像上的应用,详解Swin Transformer滑动窗口机制与层次化设计。结合PyTorch,使用timm库实现图像分类。探讨多模态模型(如CLIP)的兴起。帮助学习者理解视觉领域的“Transformer革命”,掌握现代视觉模型的核心思想。


一、CNN的辉煌与局限

1.1 CNN的三大归纳偏置

  1. 局部性(Locality):卷积核关注局部区域。
  2. 平移不变性(Translation Equivariance):特征图随输入平移而平移。
  3. 权重共享(Weight Sharing):同一卷积核扫描整个图像。

✅ 这些偏置使CNN在图像任务上高效且有效


1.2 CNN的局限性

  • 长距离依赖建模弱:需深层网络或额外模块(如Non-local)。
  • 计算冗余:卷积核在所有位置滑动,无论内容是否重要。
  • 架构刚性:固定感受野,难以自适应调整。

Transformer凭借全局自注意力,为视觉任务提供新思路。


二、Vision Transformer(ViT):将图像视为序列

2.1 核心思想

  • 将图像分块(Patch),展平为序列,输入标准Transformer。
  • ✅ 证明“注意力即一切”在视觉领域同样成立。

2.2 ViT 架构详解

输入图像 (H×W×C)
       ↓
[分块] → 将图像划分为 P×P 的块,展平为 (N, D) 向量,N=(H/P)*(W/P)
       ↓
[线性嵌入] → 通过线性层映射到 D 维向量
       ↓
[添加 [CLS] token] → 用于分类
       ↓
[位置编码] → 注入位置信息(可学习或正弦)
       ↓
[Transformer Encoder] × L
       ↓
[MLP Head] → 分类输出

2.3 关键技术点

2.3.1 图像分块(Image Patching)
  • 输入图像 224×224×3,块大小 16×16
  • 得到 14×14=196 个块。
  • 每个块展平为 16×16×3=768 维向量。
  • 通过线性层映射到 D=768 维(嵌入维度)。

✅ 块越大,序列越短,计算越快,但细节损失。


2.3.2 位置编码(Positional Encoding)
  • 由于无卷积,必须显式添加位置信息。
  • ViT使用可学习的位置编码(Learnable Position Embeddings)。
  • 为每个块位置学习一个D维向量。

2.3.3 自注意力在视觉上的优势
  • 全局感受野:每个块可与所有其他块交互。
  • 动态权重:注意力权重由内容决定,自适应聚焦重要区域。
  • 长距离依赖强:一步到位,无需深层堆叠。

2.4 ViT的训练需求

  • 数据饥饿:在ImageNet上表现不如CNN。
  • 大规模预训练:在JFT-300M等大数据集上预训练后,性能超越CNN。

✅ “规模弥补归纳偏置”——ViT的成功依赖于海量数据。


三、Swin Transformer:迈向高效与多尺度

ViT计算复杂度为 O(N²)N为序列长度,对高分辨率图像不友好。

Swin Transformer(2021)提出滑动窗口(Shifted Windows)机制。


3.1 核心创新

3.1.1 局部窗口自注意力
  • 将图像划分为不重叠的窗口(如7×7)。
  • 在每个窗口内计算自注意力。
  • ✅ 计算复杂度降至 O(N),与图像尺寸线性相关。

3.1.2 滑动窗口(Shifted Windows)
  • 奇数层:窗口划分。
  • 偶数层:窗口偏移半个窗口
  • ✅ 使不同窗口间的信息得以交互,保持全局建模能力。

3.1.3 层次化设计
  • 类似CNN,Swin Transformer有多个阶段,逐步下采样,扩大感受野。
  • ✅ 生成多尺度特征图,适用于检测、分割等密集任务。

四、实战:使用timm库实现ViT图像分类

4.1 环境准备

pip install timm torch torchvision

timm(PyTorch Image Models)是一个强大的视觉模型库,包含ViT、Swin等。


4.2 加载预训练ViT模型

import torch
import timm
from PIL import Image
from torchvision import transforms

# 检查设备
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# 加载预训练ViT模型
model = timm.create_model('vit_base_patch16_224', pretrained=True)
model = model.to(device)
model.eval()

# ImageNet类别标签
with open('imagenet_classes.txt') as f:
    classes = [line.strip() for line in f.readlines()]

4.3 图像预处理

# ViT的预处理(与ResNet类似)
transform = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])

# 加载图像
img = Image.open('cat.jpg').convert('RGB')
input_tensor = transform(img).unsqueeze(0).to(device)  # (1, 3, 224, 224)

4.4 推理与预测

with torch.no_grad():
    output = model(input_tensor)
    probabilities = torch.nn.functional.softmax(output[0], dim=0)

# 获取Top-5预测
top5_prob, top5_catid = torch.topk(probabilities, 5)
for i in range(top5_prob.size(0)):
    print(f"{classes[top5_catid[i]]}: {top5_prob[i].item():.4f}")

✅ 输出如:"tabby, tabby cat: 0.8923"


4.5 使用Swin Transformer

# 加载Swin-Tiny模型
model_swin = timm.create_model('swin_tiny_patch4_window7_224', pretrained=True)
model_swin = model_swin.to(device)
model_swin.eval()

# 同样预处理和推理...

✅ Swin在检测、分割任务上表现更优。


五、多模态模型的兴起:CLIP

ViT的成功启发了多模态(图像+文本)模型。

5.1 CLIP(Contrastive Language-Image Pre-training)

  • 思想:用对比学习对齐图像与文本。
  • 架构
    • 图像编码器:ViT 或 CNN。
    • 文本编码器:Transformer。
  • 训练:从互联网收集“图像-文本对”,最大化匹配对的相似度,最小化非匹配对。

5.2 零样本图像分类

CLIP无需微调,即可进行分类:

  • 将类别名称转换为文本提示(如 "a photo of a {class}")。
  • 计算图像与所有文本提示的相似度。
  • 选择相似度最高的类别。

✅ 真正的“零样本”能力,如DALL·E、Stable Diffusion的基石。


六、总结与学习建议

本文我们:

  • 认识了CNN的局限性
  • 掌握了ViT分块序列化思想;
  • 理解了Swin Transformer滑动窗口机制;
  • 实战了timm库的图像分类;
  • 了解了CLIP等多模态模型。

📌 学习建议

  1. 理解范式转移:从“局部卷积”到“全局注意力”。
  2. 掌握timm库:它是视觉研究的瑞士军刀。
  3. 探索Swin:在密集预测任务(检测、分割)上更优。
  4. 关注多模态:CLIP、BLIP、Flamingo是未来方向。
  5. 动手实践:尝试微调ViT/Swin在自定义数据集上。

七、下一篇文章预告

第27篇:多模态大模型:图文理解与生成(CLIP, DALL·E, Stable Diffusion)
我们将深入讲解:

  • CLIP的对比学习与零样本分类
  • DALL·E系列(DALL·E 2, DALL·E 3)的图文生成原理
  • Stable Diffusion的Latent Diffusion与文本引导
  • BLIPFlamingo等图文理解模型
  • 多模态大模型的挑战与应用

进入“图文并茂”的AI世界!


参考文献

  1. Dosovitskiy, A. et al. (2020). An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale. ICLR (ViT).
  2. Liu, Z. et al. (2021). Swin Transformer: Hierarchical Vision Transformer using Shifted Windows. ICCV.
  3. Radford, A. et al. (2021). Learning Transferable Visual Models From Natural Language Supervision. ICML (CLIP).
  4. timm库: https://github.com/rwightman/pytorch-image-models
  5. OpenAI CLIP: https://openai.com/research/clip

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐