Vision Transformer (2021):一张图像胜过16×16个词:大规模图像识别的Transformer模型,Transformer首次引入视觉

Vision Transformer (2021):一张图像胜过16×16个词:大规模图像识别的Transformer模型,Transformer首次引入视觉

导出时间:2025/11/23 20:23:46

1、研究背景和动机

在计算机视觉(CV)的发展中,卷积神经网络(CNN)一直是主角。自 AlexNet (2012) 横扫 ImageNet 开始,到 ResNet、DenseNet、EfficientNet,CNN 的改进几乎支撑了过去十年的视觉任务(分类、检测、分割等)。

🔹 Transformer 崛起与融合探索(2020–2021)

  • 在自然语言处理(NLP)领域,Transformer(2017,Attention is All You Need) 完全颠覆了传统 RNN/LSTM。
  • Transformer 的核心是 自注意力机制(Self-Attention),可以直接建模任意两个词之间的关系。
  • 这种“看全局”的能力,让 BERT、GPT 系列在 NLP 中大获成功。
👉 于是研究者开始思考: “既然文字可以用 Transformer,那图像能不能也用 Transformer?”

🔹ViT 的提出(2020)

  • 谷歌研究院提出 Vision Transformer (ViT),第一次把 Transformer 结构原封不动地搬到图像分类任务中
  • 关键想法是:
    • 把图片切成小块(patch),就像把图像当作“句子”;
    • 每个小块就像“词语”;
    • 用 Transformer 去建模小块之间的全局关系。

🔹 动机总结(通俗类比)

可以这样形象理解:
  • CNN 就像“显微镜工人”,拿着放大镜一点点扫描图片,逐步组合成整体。
  • ViT 就像“上帝视角”,直接把图片拆成拼图块,然后一眼就能捕捉所有拼图块之间的关系。

2、Vision Transformer (ViT) 的创新点

ViT 的最大贡献就是——把图像看作一句话,用 NLP 的 Transformer 来处理图像。这看起来很大胆,但效果惊人。下面分几个点来说:

(1) 图像 → 图像块(Patch) → 类似“词”

  • 传统 CNN:一张图片会被卷积核滑动提取局部特征。
  • ViT:直接把图片切成一块一块的小方格(比如 16×16 像素),然后把每一块拉平成一个向量,就像一句话里的一个“单词”。
  • 这样,一张图就变成了由很多“词”组成的句子,Transformer 就能直接处理。

(2) 自注意力(Self-Attention)全局建模

  • CNN 的卷积核是“看局部”的,要一层层叠加才能捕捉全局信息。
  • ViT 通过自注意力机制,可以让每个图像块直接和所有其他块建立联系,一步就能看到全局。
就像开会时,CNN 是“逐级汇报”,每个人只能和临近的人交流;ViT 是“全员群聊”,所有人能即时沟通。

(3) 分类标记 (CLS Token)

  • 在 NLP 的 BERT 里,有一个特别的 [CLS] 标记用来代表整句话的含义。
  • ViT 借鉴了这个方法,专门加了一个“分类 token”,经过所有 Transformer 层后,这个 token 就代表整张图片的语义,用来做分类。
👉 形象理解:
就像开会时,虽然大家都在说话(图像块),最后有一个“秘书”(CLS token)把所有人的意见整理,输出结论(猫 / 狗 / 车)。

(4) 弱归纳偏置,强依赖大数据

  • CNN 天生有“归纳偏置”,比如卷积天然就擅长捕捉局部相邻像素的关系。
  • ViT 完全放弃了这些人为设计的先验知识,几乎不假设图像的结构,全靠数据学。
  • 这意味着在小数据集上,ViT 不如 CNN,但在大规模数据(比如 JFT-300M)上,它能学出更强大的模式,甚至超过 CNN。
👉 形象理解:
CNN 像是“有经验的老教师”,一开始就会用一些固定套路;ViT 像是“白纸的新生”,啥都不会,但只要见识足够多,就能学出比老师更灵活的思维。

(5) 简单可扩展

  • ViT 的结构非常干净:图像块嵌入 + Transformer 编码器 + 分类头。几乎没什么花哨的模块。
  • 好处是:NLP 里成熟的 Transformer 优化、加速技巧可以直接拿来用。
  • 扩展也很方便:只要增加层数或隐藏维度,就能从 ViT-Base → ViT-Large → ViT-Huge,不需要重新设计复杂的卷积结构。


3、 基于图解的 ViT 网络结构讲解

image.png
  1. 图像切块 → Patch + Position Embedding
  • 左下角:输入一张图片(比如一栋建筑)。
  • 把它切成很多 小方块(patch),每个小块就是模型的输入单元。
  • 然后每个小块被“展开(flatten)”,经过线性变换投影到固定维度。
  • 最后还要加上 位置编码(Position Embedding),告诉模型“这个小块在图片的哪里”。
👉 类比:把整张图片变成拼图小块,还在每个小块背面写上编号(位置标签)。

  1. 加入 [CLS] Token(图中的 0)*
  • 在所有 patch 前面,插入一个特殊的 [CLS] 向量。
  • 经过整个 Transformer 处理后,这个 token 会变成“全图的摘要”。
👉 类比:像开会请了一个秘书(CLS),他从头到尾听所有人的发言,最后写总结报告。

  1. Transformer Encoder(中间大方块)
右边的框细化了 Encoder 内部,它由 L 层重复堆叠,每层有两部分:
  1. Multi-Head Attention(多头自注意力)
    • 每个小块可以和所有其他小块交流,建立全局联系。
    • 多头机制 = 不同的“注意力通道”,能从不同角度去看关系。 👉 类比:所有拼图块都进入群聊,每个人都能和所有人沟通。
  2. MLP(前馈全连接层)
    • 在每次群聊之后,每个小块再单独进行一次“思考”。
    • 帮助提升特征表达能力。 👉 类比:大家群聊后,各自做笔记,思考更深入。
⚙️ 这两步之间还有 Norm(规范化)和残差连接,保证训练稳定。

  1. 分类头 MLP Head(图上方)
  • 最后,模型只取 [CLS] 这个“秘书 token”,送到一个 MLP 分类头
  • 输出结果是具体的类别,比如“鸟 / 球 / 汽车 / 建筑”。
👉 类比:会议结束后,由秘书(CLS)写总结,交给老板(分类器),老板给出最终结论。


4、ViT 的致命缺陷

(1) 训练需要极其庞大的数据

  • ViT 几乎没有利用 CNN 的“先验知识”(比如卷积的局部平移不变性)。
  • 这意味着 ViT 在小数据集上很容易 过拟合,表现比不上 ResNet。
  • 在论文中,ViT 只有在 JFT-300M 这种上亿级别数据 上训练,才真正超过 CNN。
👉 类比:
CNN 就像是“有经验的老老师”,即便学生只有 100 个人,他也能快速总结规律;
ViT 像是“白纸新生”,啥都要靠自己学,结果需要 100 万学生才能学会一样的东西。

(2) 计算和存储开销大

  • 自注意力机制需要计算每个 patch 与所有其他 patch 的关系,复杂度是 O(N²)(N = patch 数量)。
  • 当输入图片更大、patch 更多时,显存和计算量会急剧上升。
  • 这让 ViT 在高分辨率任务(检测、分割)中,训练和推理都很昂贵。
👉 类比:
CNN 的计算像“邻居之间聊天”,高效;
ViT 是“所有人都要进大群聊”,群里人越多,聊天越慢。

5、 后续改进方向

  1. 数据依赖太大 → 引入训练技巧(DeiT, 2020)
  • 问题:ViT 需要超大数据集(JFT-300M),在小数据集(比如 ImageNet-1k)表现不佳。
  • 解决方案:DeiT(Data-efficient Image Transformer)引入了 知识蒸馏 技巧:
    • 用一个 CNN(比如 ResNet-50)做“老师”,给 ViT 当“辅导班”。
    • 这样 ViT 在只有 ImageNet-1k 这种中等规模数据时,也能学得很好。
👉 类比:
原版 ViT 是个“自学狂”,没有教材很难学;DeiT 给它找了个“经验丰富的家教老师”,结果学习效率大幅提升。

  1. 计算开销大 → 降低注意力复杂度(Swin Transformer, 2021)
  • 问题:ViT 的自注意力是全局的,复杂度 O(N²),图片越大计算越夸张。
  • 解决方案:Swin Transformer 提出 分层 + 窗口注意力
    • 先在局部小窗口里做自注意力(降低计算量)。
    • 再通过滑动窗口(Shifted Window)逐步建立全局联系。
    • 同时采用 金字塔结构,特征逐渐下采样,适合检测、分割等任务。
👉 类比:
原版 ViT = 所有人都在一个超大群里聊天(费时费力)。
Swin = 先分小组开会(窗口注意力),再小组代表开大会(层次化),既高效又全面。

  1. 缺乏归纳偏置 → 融合 CNN 特性(CvT, CoAtNet 等, 2021)
  • 问题:ViT 完全不利用 CNN 的局部结构优势,导致小数据上泛化差。
  • 解决方案
    • CvT(Convolutional ViT):在输入嵌入和注意力计算里引入卷积,增强局部建模能力。
    • CoAtNet(CNN + Transformer):把 CNN 的归纳偏置和 Transformer 的全局建模结合。
    • ConvNeXt:纯 CNN,但用 ViT 的设计经验做“现代化改造”,性能媲美 ViT。
👉 类比:
ViT 是“纯靠大数据训练的学霸”;这些改进让它也学点“常识”,就算没那么多训练样本,也能举一反三。

  1. 实用性改进 → 轻量化与高效部署(MobileViT, 2022)
  • 问题:ViT 原版太大,不适合移动端或嵌入式设备。
  • 解决方案
    • MobileViT:在 MobileNet 的框架下引入小型 Transformer,轻量高效。
    • LeViT:混合 CNN + Transformer,专为推理速度优化。
👉 类比:
原版 ViT = 一台超大服务器。
MobileViT = 便携式“小型机”,能放进手机里运行。

✅ 总结

后续改进主要分 4 条路:
  1. 数据高效(DeiT) → 找老师帮忙,减少对大数据的依赖。
  2. 降低计算(Swin Transformer) → 用“分组开会”代替“大群聊”,大幅提高效率。
  3. 引入归纳偏置(CvT、CoAtNet) → 借鉴 CNN 的“常识”,增强小数据表现。
  4. 轻量化部署(MobileViT、LeViT) → 让 ViT 能跑在手机和嵌入式设备上。