Vision Transformer (ViT) 介绍
Vision Transformer (ViT) 是一项彻底改变计算机视觉格局的突破性工作。它将自然语言处理领域取得巨大成功的 Transformer 架构 直接应用于图像分类(后来扩展到几乎所有视觉任务),并证明了在足够数据量的支持下,纯 Transformer 模型可以超越当时最先进的卷积神经网络(CNN)。
文章链接:
2010.11929https://arxiv.org/pdf/2010.11929
核心思想
1.挑战 CNN 主导地位: 在 ViT 提出之前,CNN 是计算机视觉任务(尤其是图像分类)无可争议的王者。CNN 的卷积操作具有平移不变性和局部性的归纳偏置,非常适合图像数据。
2.Transformer 在 NLP 的成功: Transformer 凭借其强大的全局建模能力(自注意力机制)和并行计算优势,在 NLP 任务中取得了革命性进展。
3.关键问题: 能否将 Transformer 直接用于图像?图像是高度结构化的二维数据,而 Transformer 最初是为序列数据(一维)设计的。
4.ViT 的答案: 可以! 核心是将图像重塑(Re-formulate) 为一个序列(Sequence) 的 图像块(Patches),然后像处理 NLP 中的单词序列一样,将这些图像块输入标准的 Transformer 编码器。
ViT 模型架构详解
图1:模型架构概览。
我们将输入图像分割为固定尺寸的图像块,对每个块进行线性嵌入处理,加入位置编码后,将生成的向量序列输入标准Transformer编码器。为执行分类任务,采用常规方法在序列中额外添加一个可学习的"分类令牌"(classification token)。本图对Transformer编码器的图示灵感源自Vaswani等研究者(2017)的工作。
(1)输入图像预处理
-
输入: 一张 RGB 图像
(H x W x C)
,通常H=W=224
,C=3
。 -
分块(Patch Partitioning):
-
将图像分割成
N
个大小相等的方形块(Patches)。 -
例如,对于
224x224
的图像,使用16x16
的块大小,则N = (224 / 16) * (224 / 16) = 14 * 14 = 196
个块。 -
每个块
P_i
的维度是(16 x 16 x 3) = 768
。
-
-
块嵌入(Patch Embedding / Linear Projection):
-
将每个
(16x16x3)=768
维的块展平(Flatten)成一个长度为 768 的向量。 -
通过一个可学习的线性投影层(通常是一个全连接层或等效的卷积层) 将这个 768 维的向量映射到一个
D
维的嵌入空间(Embedding Space)。D
是 Transformer 模型的嵌入维度(Embedding Dimension),也是后续 Transformer 层处理的统一维度(如 768, 1024)。 -
输出:
N
个D
维的向量(N x D)
。这N
个向量构成了 Transformer 的输入序列。每个向量代表了图像的一个局部区域。
-
(2)添加 [CLS] Token (Classification Token)
-
借鉴 BERT 的做法,在输入序列的开头添加一个特殊的可学习向量
z_0^0 = [CLS]
(维度也是D
)。 -
这个
[CLS]
token 本身不包含任何图像块信息。在 Transformer 的层层传递过程中,它会聚合整个序列(即整个图像)的全局信息。 -
输出序列的第一个位置就是
[CLS]
token 的最终表示z_L^0
,它将被用于最终的图像分类预测。 -
现在序列长度变为
N+1
,维度(N+1 x D)
。
(3)添加位置编码(Positional Encoding)
-
问题: Transformer 本身是置换不变(Permutation Invariant) 的,即输入序列的顺序改变不会影响输出(除了位置信息)。但图像块的空间位置信息极其重要!左上角的块和右下角的块含义完全不同。
-
解决方案: 向输入序列(包含
[CLS]
token 和所有 Patch Embeddings)添加位置编码(Positional Encoding)E_pos
。 -
位置编码类型:
-
标准可学习位置编码: 创建一个可学习的矩阵
E_pos
,其形状为(N+1 x D)
。每一行代表一个位置(包括[CLS]
的位置)的编码。这是 ViT 论文中使用的主要方式。 -
正弦/余弦位置编码: 使用固定公式(如原始 Transformer 中的方法)生成编码。ViT 实验发现可学习编码效果与之相当或略好。
-
-
输入到 Transformer:
Z_0 = [z_CLS; z_P1; z_P2; ...; z_PN] + E_pos
。维度(N+1 x D)
。现在每个嵌入向量都包含了内容信息(来自图像块)和位置信息。
(4)Transformer 编码器(Transformer Encoder)
-
核心组件: ViT 使用 L 层堆叠的 标准 Transformer 编码器层。
-
单层结构:
-
层归一化(Layer Normalization - LN)
-
多头自注意力(Multi-Head Self-Attention - MSA)
-
残差连接(Residual Connection):
Z' = MSA(LN(Z)) + Z
-
层归一化(Layer Normalization - LN)
-
多层感知机(Multi-Layer Perceptron - MLP):包含 GELU 激活函数。
-
残差连接(Residual Connection):
Z = MLP(LN(Z')) + Z'
-
-
工作原理:
-
自注意力(Self-Attention): 允许序列中的每一个元素(
[CLS]
或 Patch Embedding) 根据其内容和位置,动态地关注序列中所有其他元素(包括自身)。这使得模型能够捕获图像块之间的长程依赖(Long-Range Dependencies) 和全局上下文(Global Context),不受局部感受野限制。这是 ViT 区别于 CNN 的关键能力。 -
MLP: 对每个位置的特征进行非线性变换和增强。
-
层归一化 & 残差连接: 加速训练,提高稳定性,缓解梯度消失/爆炸。
-
-
输出: 经过 L 层 Transformer 编码器处理后,输出一个增强后的序列
Z_L
,维度(N+1 x D)
。序列中的每个向量都融合了全局信息。
(5)MLP 分类头(MLP Head)
-
输入: 取出输出序列的第一个元素
z_L^0
(即[CLS]
token 的最终表示)。这个向量被认为编码了整个图像的全局表示。 -
结构: 通常由一个层归一化(LN) 和一个小型 MLP 组成。
-
y = MLP_Head(LN(z_L^0))
-
-
输出: 一个
K
维的向量,其中K
是图像分类任务的类别数。通常接一个 Softmax 得到每个类别的概率分布。
原论文中的公式如下:
方程 1:由图像块嵌入
、类别向量
和位置编码
构成嵌入输入向量
方程 2:由多头注意力机制、层归一化和跳跃连接 (Multi-Head Self-Attention,Layer Norm & Add) 构成的 MSA Block,可重复 L 个,其中第 𝑙 个输出为
方程 3:由前馈网络、层归一化和跳跃连接 (FFN,Layer Norm & Add) 构成的 MLP Block,可重复 L 个,其中第 𝑙 个输出为
方程 4:由 层归一化 (Layer Norm) 和 分类头 (MLP or FC) 输出 图像表示 𝑦
ViT 张量维度变化举例
本段参考:
【深度学习】详解 Vision Transformer (ViT)-CSDN博客https://blog.csdn.net/qq_39478403/article/details/118704747
(1)输入图像 (input images) 的 shape = (batch_size, c = 3, h = 256, w = 256)。
(2)输入图像 (input images) 被切分 (Split / Divide) 并展平 (Flatten) 为:batch size 仍为 b,通道数 c = 3、尺寸 P = 32、个数 N = (256×256) / (32×32) = 64 的图像块 (Patch),每个图像块 (Patch) 均有 P²c = 32×32×3 = 3072 个像素。
(3)图像块 (Patch) 馈入线性投影层 (Linear Projection),得到个数/长度 (length) 为 N = 64、像素数/大小/维度 (dimension) 为 D = (32×32×1) = 1024 的图像块嵌入 (Patch Embedding)。
每个图像块嵌入 (Patch Embedding) 按元素加 (Element-wise Summary) 入位置向量/嵌入后,尺寸仍为 N×D = 64×1024。
(4)具有位置嵌入的图像块嵌入 (Patch Embedding) 再于长度 (length) 维度 拼接 (Concat) 一个用于预测分类结果的 1×1024 可学习嵌入/向量,构成大小为 65×1024 完整嵌入 (长度 (length) N+1 = 64+1 = 65)。
(5)完整嵌入输入编码器经过一系列前向处理后,得到尺寸仍为 N×D = 65×1024 的输出。
(6)取出输出序列的第一个元素,这个向量被认为编码了整个图像的全局表示。经y = MLP_Head(LN(z_L^0))
后输出为一个 K 维的向量,其中 K 是图像分类任务的类别数。
ViT 的关键特点与优势
-
摒弃卷积: ViT 是第一个完全不使用任何卷积层,仅依赖 Transformer 架构就能在主流图像分类基准上达到 SOTA 的模型(在大规模预训练前提下)。这证明了 Transformer 在视觉任务中的强大潜力。
-
全局建模能力: 自注意力机制使模型能够从第一层开始就关注图像中任意两个位置之间的关系,不受局部感受野限制。这对于理解需要全局上下文的任务(如场景理解、物体关系)非常有利。
-
可扩展性 (Scalability):
-
模型规模: 类似于 NLP Transformer(如 BERT, GPT),ViT 模型可以很容易地通过增加 层数(L)、嵌入维度(D) 和 注意力头数(Heads) 来扩展为更大的模型(ViT-Large, ViT-Huge),性能通常随之提升。
-
数据规模: ViT 的性能极度依赖预训练数据量。在小数据集(如 ImageNet-1k)上从头训练,ViT 通常不如同等大小的 ResNet。但当在超大规模数据集(如 JFT-300M - 3亿张图像) 上预训练后,ViT 在迁移到 ImageNet 等下游任务时,性能显著超越 CNN。
-
-
计算效率: 虽然自注意力复杂度是
O((N+1)^2 * D)
(序列长度平方级),但由于 ViT 将图像压缩成相对较少的 Patches(如N=196
),其计算量在合理范围内。对于高分辨率图像,Patch 数量N
会增加,计算开销会显著上升(这是后续改进如 Swin Transformer 要解决的问题之一)。 -
更少的归纳偏置 (Less Inductive Bias): 相比于 CNN 内置的平移不变性和局部性,ViT 的归纳偏置更少,主要来自:
-
Patch 划分: 隐含了局部性和网格结构。
-
位置编码: 提供空间位置信息。
-
[CLS] Token: 引导模型学习全局表示。
-
这种较弱的归纳偏置意味着 ViT 更依赖从数据中学习视觉结构,这也解释了其对大数据的需求。
-
ViT 的挑战与局限性
-
数据饥渴 (Data Hungry): 如前所述,ViT 在小数据集上训练效果不佳,需要超大规模预训练才能发挥优势。这对计算资源和数据获取提出了很高要求。
-
计算复杂度: 自注意力的
O(N^2)
复杂度限制了其处理高分辨率图像或密集预测任务(如分割、检测)的效率。Patch 数量N
随图像分辨率平方增长。 -
缺乏局部性: 纯粹的全局注意力可能会忽略一些细粒度的局部细节,而这些细节在浅层 CNN 中能很好地捕获。
-
训练不稳定: 早期的 ViT 训练相对不稳定,需要仔细调整超参数(如学习率、权重衰减)和优化器(如 AdamW)。
-
位置编码的局限性: 标准的位置编码在处理不同分辨率图像或测试时未见过的位置时可能表现不佳。
ViT 的重要变体与改进
为了克服 ViT 的局限性,研究者们提出了大量改进模型:
-
DeiT (Data-efficient Image Transformers):
-
核心贡献: 提出知识蒸馏(Knowledge Distillation) 策略,使用一个 CNN(如 RegNet)作为教师模型来指导 ViT(学生模型)的训练。
-
效果: 显著降低了 ViT 对大数据预训练的依赖,使其能够在 ImageNet-1k 这样相对“小”的数据集上从头训练并取得优异性能(接近或超越 CNN)。
-
关键技术: Distillation Token(类似 [CLS] Token,用于学习教师输出)。
-
-
Swin Transformer:
-
核心贡献: 引入分层结构(Hierarchical Architecture) 和移位窗口(Shifted Windows)。
-
分层结构: 通过合并相邻 Patches(类似 CNN 的池化),构建不同尺度的特征图(类似于 CNN 的金字塔结构),使其天然适合密集预测任务(检测、分割)。
-
移位窗口自注意力: 将图像划分为不重叠的局部窗口(Local Windows),在窗口内计算自注意力(
O(窗口大小^2)
复杂度,远低于全局O(N^2)
)。通过周期性移位窗口,实现跨窗口连接,同时保持高效计算。 -
效果: 成为密集视觉任务的强大骨干网络,在 COCO 检测/分割等任务上取得 SOTA。
-
-
PiT (Pooling-based Vision Transformer):
-
核心贡献: 在 ViT 中显式地加入空间池化层(Spatial Pooling),减少空间维度同时增加通道维度,构建分层特征图。
-
效果: 提高计算效率,提升性能。
-
-
T2T-ViT (Tokens-To-Token Vision Transformer):
-
核心贡献: 设计了一个渐进式的 Tokens-to-Token (T2T) 模块 替代简单的线性 Patch Embedding。T2T 模块迭代地将相邻 Tokens 聚合(重组)成新的 Tokens,逐步建模局部结构并减少 Token 长度。
-
效果: 提升了模型捕捉局部结构的能力,在小数据集上表现更好。
-
-
位置编码改进:
-
相对位置编码: 建模元素之间的相对位置关系(如 i 在 j 的左边),比绝对位置编码更具泛化性(如处理不同分辨率)。
-
条件位置编码 (CPE): 位置编码基于图像内容动态生成,更具适应性。
-
无位置编码: 一些工作探索完全依赖模型从 Patch 内容和顺序中学习位置信息(如通过 zero-padding 或特定初始化),但通常需要更大模型或更复杂设计。
-
总结
-
范式转变: ViT 是计算机视觉领域的一个里程碑,证明了 Transformer 架构在视觉任务上的巨大潜力,挑战了 CNN 数十年来的主导地位,开启了 “Vision x Transformer” 研究热潮。
-
统一架构的曙光: ViT 及其变体为实现 NLP 和 CV 任务统一建模 迈出了重要一步,模型架构和处理范式更加接近。
-
推动视觉大模型: ViT 的可扩展性为训练视觉大模型(如 ViT-G, BEiT-3, PaLI-X)铺平了道路,这些模型在多个任务上展现出强大的少样本/零样本学习能力。
-
广泛应用: ViT 及其变体已成为图像分类、目标检测(DETR系列)、语义分割(SETR, SegFormer)、图像生成(ViT-VQGAN)、视频理解(ViViT, TimeSformer)、多模态(CLIP, ALIGN)等几乎所有视觉乃至多模态任务的强大骨干网络或基础架构。
-
核心思想精髓: 将图像视为 Patches 序列 + 标准 Transformer 编码器处理 + [CLS] Token 分类。这个简单而强大的公式是 ViT 的核心。
Vision Transformer (ViT) 通过将图像分割成块序列,并利用 Transformer 强大的全局注意力机制进行处理,在足够数据支持下实现了超越 CNN 的图像分类性能,引领了计算机视觉研究的新方向。虽然存在数据依赖和计算效率的挑战,但其变体(如 DeiT, Swin)已有效解决了诸多问题,并确立了 Transformer 作为现代视觉基础模型的地位。