第七阶段 · 第56篇2026-04-02

Vision Transformer:Transformer也能看图片

Transformer本来是处理文本的,但ViT证明了它也能处理图片。秘诀在于:把图片切成小块,每一块当做一个"词"。

阅读时间:11分钟
💡 意外的发现

你有没有玩过拼图?一张完整的画,被切成几百个小块。你一片一片地拼,最后拼成完整的画。

Transformer本来是用来处理文字的,它把句子切成一个个词(token),然后理解这些词之间的关系。2020年,Google的研究团队想到了一个疯狂的主意:如果把图片也切成小块,每一块当做一个"词",Transformer能不能理解图片?

结果出乎意料——不仅能理解,而且效果还很好!这就是Vision Transformer(ViT)的故事。

ViT的核心思想
🎯 从文字到图片

Vision Transformer(ViT)的核心思想非常简单:把图片切成固定大小的小方块(patch),每个patch当做一个token,然后用标准的Transformer来处理。

举个例子:假设你有一张224×224像素的图片。ViT会把它切成16×16的小块,每个小块是16×16像素。这样整张图就被切成了196个小块(14×14)。

然后,每个小块被"拉直"成一个向量(16×16×3 = 768维),就像把一个词转换成词向量一样。Transformer不关心这是图片还是文字,它只看到一堆向量,然后用注意力机制处理这些向量。

ViT vs CNN:不同的看图方式
CNN方式原始图片224×224卷积层提取局部特征池化层降低分辨率CNN关注局部特征逐层抽象ViT方式切成小块 (patch)Patch Embedding每个patch → 向量Transformer全局注意力ViT关注全局关系一次看全图
ViT是怎么工作的?
⚙️ 处理流程

ViT的处理流程可以分为四步:

1
切分图片(Patch Splitting)

把图片切成N个小方块。比如224×224的图,切成16×16的patch,得到196个patch。

2
Patch Embedding

每个patch(16×16×3=768个像素)通过一个线性层,映射成一个固定维度的向量(比如768维)。

3
添加位置编码

每个patch的位置信息很重要(左上角和右下角含义不同)。ViT给每个patch加上了位置编码,让Transformer知道每个patch的位置。

4
Transformer处理

196个patch向量 + 1个特殊的[CLS]token,总共197个token。Transformer通过自注意力机制,学习这些patch之间的关系。

Vision Transformer 完整架构
Step 1图片分块224×224 图片Step 2Patch → 向量196个patch向量Step 3加位置信息p1p2p3p4p5...p6p7位置编码Transformer Encoder (重复L层)Multi-Head Attention每个patch看到所有patch学习全局关系Add & NormFeed Forward (MLP)非线性变换Add & Norm[CLS] Token特殊的token用于分类任务聚合全局信息分类输出猫 / 狗 / 飞机 ...
ViT为什么这么强大?
🌟 核心优势

1. 全局感受野
CNN的卷积核一次只能看到一小块区域,需要堆很多层才能看到全局。ViT不一样,第一层就能看到整张图。每个patch可以通过注意力机制直接和其他任何patch交互。

2. 更好的可扩展性
ViT的结构更简单、更统一。要提升性能,只需要:更多数据、更大的模型、更多的计算。这比CNN的调参要简单得多。

3. 更适合大规模预训练
ViT在大规模数据集上预训练后,迁移到下游任务时效果非常好。这就是为什么GPT、CLIP等大模型都采用了Transformer架构。

ViT的局限性
⚠️ 需要注意的问题

📉 数据需求大

ViT需要大量数据才能训练好。在小数据集上,CNN往往表现更好。ViT的归纳偏置(inductive bias)比CNN弱,需要数据来学习图像的局部结构。

⏱️ 计算成本高

自注意力机制的计算复杂度是O(N²),N是patch的数量。图片分辨率越高,patch越多,计算量增长得很快。这也是为什么ViT处理的图片通常是224×224或384×384。

🖼️ 对细节敏感

ViT把图片切成patch,可能会丢失一些细节信息。比如,一个关键的小物体可能被切到两个patch的交界处,信息就被分散了。

ViT的进化
🚀 后续改进

ViT出现后,很多改进版本涌现:

  • Swin Transformer:引入层级结构,像CNN一样逐层降低分辨率,既保留了全局注意力,又减少了计算量
  • DeiT:通过知识蒸馏,让ViT在小数据集上也能训练好
  • MAE(Masked Autoencoder):用自监督学习,让ViT从海量未标注图片中学习
  • DINO:让ViT学会自监督的语义分割,不需要标注数据

📋 本篇要点

  • ✓ ViT把图片切成patch,每个patch当做token,用Transformer处理
  • ✓ 核心步骤:分块 → Patch Embedding → 加位置编码 → Transformer
  • ✓ 优势:全局感受野、可扩展性强、适合大规模预训练
  • ✓ 局限:需要大量数据、计算成本高、对细节敏感
  • ✓ [CLS]token用于分类任务,聚合全局信息
  • ✓ 后续改进:Swin、DeiT、MAE、DINO等解决了各种问题