核心要点

  • 把图像切成固定大小 patch,每个 patch 拉平后线性投影成一个 token

  • 加入位置编码补回空间信息,常拼一个 [CLS] token 用于分类

  • token 序列送入标准 Transformer 编码器,靠自注意力做全局建模

  • 缺乏 CNN 的局部归纳偏置,需大规模数据或预训练才能超越 CNN

标准回答

核心思路:把图像变成序列

ViT 把图像当作"由 patch 组成的句子",复用 NLP 的 Transformer 编码器:

  1. Patch 切分:将图像分成不重叠的固定大小小块(如 16×16)。
  2. 线性嵌入:每个 patch 展平后经线性投影成定长向量(patch embedding)。
  3. 位置编码:Transformer 本身对顺序无感知,需加位置编码补回 patch 的空间位置。
  4. [CLS] token:拼一个可学习的分类 token,其最终表示送入 MLP 头做分类。
  5. Transformer 编码器:多层多头自注意力 + FFN,让任意两个 patch 直接交互,实现全局感受野

与 CNN 的关键差异

CNN 自带局部性、平移等变等归纳偏置,小数据也能学好;ViT 几乎不带这些先验,自由度高但依赖大规模数据/预训练(如在大数据集预训练后迁移),数据不足时易过拟合、弱于 CNN。

演进:后续 DeiT(蒸馏提升数据效率)、Swin(局部窗口注意力 + 层级结构,复杂度更友好)、以及 MAE/DINO 等自监督预训练,缓解了数据饥渴并扩展到检测/分割。详见 图像分类:从 AlexNet 到 EfficientNet

常见误区

⚠️ 常见踩坑

ViT 不是"小数据也能吊打 CNN"——缺少局部归纳偏置使其在数据不足时反而更差;自注意力对序列长度是平方复杂度,高分辨率图像 patch 数多时计算昂贵。

追问

追问 1ViT 为什么需要位置编码?去掉会怎样?

自注意力对输入是置换不变的,打乱 patch 顺序结果不变,会丢失图像的空间结构。去掉位置编码后模型无法区分 patch 的相对/绝对位置,分类与定位性能显著下降。

追问 2Swin Transformer 相比原始 ViT 改进了什么?

Swin 用局部窗口注意力把全局平方复杂度降为近线性,并通过移位窗口实现跨窗口信息交互;同时构建多尺度层级特征,更适配检测、分割等密集预测任务,也更省算力。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。

🛠️ AI 工具

  • Pytorch

    Meta 开源的深度学习框架,100K+ stars。以动态计算图和 Pythonic 风格著称,在学术界和工业界都有广泛应用,支持分布式训练、移动端部署和 ONNX 导出

  • Transformers

    Hugging Face 核心模型库,159,648+ stars。支持 200K+ 预训练模型,覆盖 NLP、计算机视觉、音频、多模态等全领域,提供统一 API 接口,是 AI 开发者的必备基础设施