随着 Transformer 架构彻底改变了 Attention 的实现,并在自然语言处理领域取得了非常可喜的成果,其应用于计算机视觉领域只是时间问题。Vision Transformer (ViT) 的实现最终实现了这一目标。
在本教程中,您将了解 Vision Transformer 模型的架构及其在图像分类任务中的应用。
完成本教程后,您将了解:
- ViT 在图像分类背景下如何工作。
- ViT 的训练过程包含哪些内容。
- ViT 在归纳偏置方面与卷积神经网络的比较。
- ViT 在不同数据集上与 ResNet 的表现对比。
- ViT 如何在内部处理数据以实现其性能。
使用我的书《使用 Attention 构建 Transformer 模型》来启动您的项目。它提供了自学教程和可运行代码,指导您构建一个功能完备的 Transformer 模型,该模型可以
将句子从一种语言翻译成另一种语言的完整 Transformer 模型...
让我们开始吧。

Vision Transformer 模型
图片由 Paul Skorupskas 拍摄,保留部分权利。
教程概述
本教程分为六个部分;它们是:
- Vision Transformer (ViT) 简介
- ViT 架构
- 训练 ViT
- 与卷积神经网络的归纳偏置比较
- ViT 变体与 ResNet 的比较性能
- 数据的内部表示
先决条件
本教程假设您已熟悉以下内容:
Vision Transformer (ViT) 简介
我们已经看到了 Vaswani 等人(2017)的 Transformer 架构的出现如何彻底改变了 Attention 的使用,而无需像早期 Attention 模型那样依赖于循环和卷积。在他们的工作中,Vaswani 等人将他们的模型应用于自然语言处理 (NLP) 的特定问题。
然而,在计算机视觉中,卷积架构仍然占据主导地位……
受其在 NLP 领域成功的启发,Dosovitskiy 等人(2021)试图将标准 Transformer 架构应用于图像,我们很快就会看到。他们当时的目标应用是图像分类。
想开始构建带有注意力的 Transformer 模型吗?
立即参加我的免费12天电子邮件速成课程(含示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
ViT 架构
回想一下,标准 Transformer 模型接收一维词嵌入序列作为输入,因为它最初是为 NLP 设计的。相比之下,当应用于计算机视觉中的图像分类任务时,Transformer 模型的输入数据以二维图像的形式提供。
为了以类似于 NLP 领域中输入数据结构(即具有单个词序列)的方式构造输入图像数据,将高度为 $H$、宽度为 $W$、通道数为 $C$ 的输入图像“切分”成更小的二维块。这将产生 $N = \tfrac{HW}{P^2}$ 个块,其中每个块的分辨率为 ($P, P$) 像素。
在将数据输入 Transformer 之前,执行以下操作:
- 每个图像块被展平为长度为 $P^2 \times C$ 的向量 $\mathbf{x}_p^n$,其中 $n = 1, \dots N$。
- 通过将展平的块映射到 $D$ 维,并使用可训练的线性投影 $\mathbf{E}$,生成嵌入图像块序列。
- 一个可学习的类别嵌入 $\mathbf{x}_{\text{class}}$ 被添加到嵌入图像块序列的前面。$\mathbf{x}_{\text{class}}$ 的值表示分类输出 $\mathbf{y}$。
- 最终,补丁嵌入通过一维位置嵌入 $\mathbf{E}_{\text{pos}}$ 进行了增强,从而将位置信息引入输入,该信息也在训练期间学习。
上述操作产生的嵌入向量序列如下:
$$\mathbf{z}_0 = [ \mathbf{x}_{\text{class}}; \; \mathbf{x}_p^1 \mathbf{E}; \; \dots ; \; \mathbf{x}_p^N \mathbf{E}] + \mathbf{E}_{\text{pos}}$$
Dosovitskiy 等人使用了 Vaswani 等人的 Transformer 架构的编码器部分。
为了执行分类,他们将 $\mathbf{z}_0$ 输入到 Transformer 编码器中,该编码器由 $L$ 个相同层堆叠而成。然后,他们取编码器输出的第 $L$ 层中 $\mathbf{x}_{\text{class}}$ 的值,并将其输入到分类头中。
分类头在预训练时由一个带有一个隐藏层的 MLP 实现,在微调时由一个单一线性层实现。
构成分类头的多层感知器 (MLP) 实现了高斯误差线性单元 (GELU) 非线性。
因此,总而言之,ViT 采用了原始 Transformer 架构的编码器部分。编码器的输入是一个嵌入图像块序列(包括一个可学习的类别嵌入,预先附加到序列中),该序列还增加了位置信息。连接到编码器输出的分类头接收可学习类别嵌入的值,根据其状态生成分类输出。所有这些都由下图说明:

Vision Transformer (ViT) 的架构
摘自“一张图像胜过 16x16 个词:用于大规模图像识别的 Transformer”
Dosovitskiy 等人提出的另一个要点是,原始图像也可以选择先输入到卷积神经网络 (CNN) 中,然后再传递给 Transformer 编码器。图像块序列将从 CNN 的特征图获得,而随后的特征图块嵌入、添加类别标记和增加位置信息的处理过程保持不变。
训练 ViT
ViT 在更大的数据集(如 ImageNet、ImageNet-21k 和 JFT-300M)上进行预训练,并微调到更少的类别。
在预训练期间,连接到编码器输出的分类头由一个带有一个隐藏层和 GELU 非线性的 MLP 实现,如前所述。
在微调期间,MLP 被一个大小为 $D \times K$ 的单一(零初始化)前馈层替换,其中 $K$ 表示当前任务对应的类别数量。
微调是在比预训练期间使用的分辨率更高的图像上进行的,但输入图像被切割成的块大小在训练的所有阶段都保持不变。这导致微调阶段的输入序列长度比预训练期间使用的更长。
输入序列更长的含义是,微调需要比预训练更多的位置嵌入。为了解决这个问题,Dosovitskiy 等人根据原始图像中的位置对预训练位置嵌入进行二维插值,以获得与微调期间使用的图像块数量相匹配的更长序列。
与卷积神经网络的归纳偏置比较
归纳偏置是指模型为泛化训练数据和学习目标函数所做的任何假设。
在 CNN 中,局部性、二维邻域结构和平移等变性被嵌入到整个模型的每一层中。
在卷积神经网络 (CNN) 中,每个神经元仅连接到其邻域中的其他神经元。此外,由于位于同一层的神经元共享相同的权重和偏差值,当感兴趣的特征落在其感受野内时,这些神经元中的任何一个都会激活。这导致了一个与特征平移等变的特征图,这意味着如果输入图像被平移,则特征图也会相应地平移。
Dosovitskiy 等人认为,在 ViT 中,只有 MLP 层具有局部性和平移等变性。另一方面,自注意力层被描述为全局的,因为这些层中执行的计算不受局部二维邻域的限制。
他们解释说,关于图像二维邻域结构的偏差仅用于:
- 在模型的输入端,每个图像都被切割成块,从而固有地保留了每个块中像素之间的空间关系。
- 在微调时,预训练的位置嵌入根据其在原始图像中的位置进行二维插值,以生成与微调期间使用的图像块数量相匹配的更长序列。
ViT 变体与 ResNet 的比较性能
Dosovitskiy 等人让三个尺寸逐渐增大的 ViT 模型与两个不同尺寸的修改后的 ResNet 模型进行对比。他们的实验得出了一些有趣的发现:
- 实验 1 – 在 ImageNet 上进行微调和测试
- 当在最小数据集 (ImageNet) 上进行预训练时,两个较大的 ViT 模型表现不如其较小的对应模型。所有 ViT 模型的性能普遍低于 ResNet 模型。
- 当在更大的数据集 (ImageNet-21k) 上进行预训练时,三个 ViT 模型的表现彼此相似,也与 ResNet 模型相似。
- 当在最大的数据集 (JFT-300M) 上进行预训练时,较大 ViT 模型的性能超过了较小 ViT 模型和 ResNet 模型。
- 实验 2 – 在 JFT-300M 数据集的随机不同大小子集上进行训练,并在 ImageNet 上进行测试,以进一步研究数据集大小的影响
- 在较小的数据集子集上,ViT 模型比 ResNet 模型更易过拟合,并且性能明显较差。
- 在较大的数据集子集上,较大 ViT 模型的性能超过了 ResNet 模型。
这一结果强化了以下直觉:卷积归纳偏置对于较小数据集很有用,但对于较大数据集,直接从数据中学习相关模式是足够的,甚至是受益的。
数据的内部表示
在分析 ViT 中图像数据的内部表示时,Dosovitskiy 等人发现以下几点:
- 在 ViT 的第一层最初应用于图像块的已学习嵌入滤波器,类似于可以提取每个块内低级特征的基函数。

学习到的嵌入滤波器
摘自“一张图像胜过 16x16 个词:用于大规模图像识别的 Transformer”
- 在原始图像中空间上彼此接近的图像块,其学习到的位置嵌入也相似。

学习到的位置嵌入
摘自“一张图像胜过 16x16 个词:用于大规模图像识别的 Transformer”
- 模型最低层的几个自注意力头已经关注了大部分图像信息(基于它们的注意力权重),这表明自注意力机制能够整合整个图像的信息。

不同自注意力头关注的图像区域大小
摘自“一张图像胜过 16x16 个词:用于大规模图像识别的 Transformer”
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
论文
- 一张图片胜过 16x16 个词:用于大规模图像识别的 Transformer, 2021.
- 注意力就是你所需要的一切, 2017.
总结
在本教程中,您学习了 Vision Transformer 模型的架构及其在图像分类任务中的应用。
具体来说,你学到了:
- ViT 在图像分类背景下如何工作。
- ViT 的训练过程包含哪些内容。
- ViT 在归纳偏置方面与卷积神经网络的比较。
- ViT 在不同数据集上与 ResNet 的表现对比。
- ViT 如何在内部处理数据以实现其性能。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
感谢这个很棒的教程!
据我理解,如果我们使用图像,我们应该首先实现 CNN 来局部捕获空间特征,然后
将该输出作为 ViT(Attention)的输入,通过块来全局捕获空间特征?
嗨 DuX…您的理解是正确的!请告诉我们您模型的结果。
我还会问一个问题,attention 通常在 RNN (LSTM, ...) 中用于序列预测 (NLP),但是用于 CNN 的 Attention 是自注意力,即带有多头缩放点积注意力机制的 transformer 吗?
能否详细解释一下 TrOcr?
嗨 Malathi……这里有一个很好的概述,附有技术论文和代码示例,可以帮助您入门:
https://hugging-face.cn/docs/transformers/model_doc/trocr