Vision Transformer(ViT)模型原理详解报告
摘要
Vision Transformer(ViT)是一种基于纯 Transformer Encoder 堆叠的视觉骨干网络,其核心思想是将图像拆分为一系列固定大小的 Patch,并将其视为类似自然语言处理中的 Token 序列,从而直接利用 Self-Attention 建模全局依赖关系。与传统 CNN 依赖卷积先验和局部结构偏置不同,ViT 通过大规模监督预训练展示了纯注意力架构在视觉识别任务中具有可比甚至更强的表示能力。
本文系统介绍了 ViT 的基本建模思想、关键模块与数学表达,包括 Patch 化、Patch Embedding、CLS Token、位置编码、Multi-Head Self-Attention、MLP Block 以及其与 CNN 的差异。ViT 由 Google Research 团队在 2020 年的论文 《An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale》 中提出,并为后续视觉基础模型与多模态模型提供了重要的视觉编码器基础。
1. 背景与动机
1.1 CNN 时代的视觉范式
在 ViT 问世前,CNN(如 ResNet, EfficientNet)统治了计算机视觉领域。CNN 的核心优势在于其内置的归纳偏置(Inductive Bias):
- 局部性(Locality):卷积层仅连接局部感受野(Local Receptive Field),利用自然图像局部区域通常具有较强相关性的统计特性。
- 参数共享(Weight Sharing):同一卷积核在整个空间范围内共享参数,显著减少模型参数量,并提高样本利用效率。
- 平移等变性(Translation Equivariance):由于卷积核在空间位置共享参数,输入发生平移时,输出特征图会产生相应的平移。
更严格地说,若平移算子 TΔT_{\Delta}TΔ 表示输入平移,则卷积算子 f(⋅)f(\cdot)f(⋅) 满足
f(TΔ(x))=TΔ(f(x))f(T_{\Delta}(x)) = T_{\Delta}(f(x))f(TΔ(x))=TΔ(f(x))
这就是平移等变性。需要注意的是,卷积本身具有的是平移等变性,而不是平移不变性;只有经过池化或全局平均池化后,特征才会在一定程度上获得平移不变性。
这些先验使得 CNN 在中小型数据集上拟合速度快、数据效率高;但在建模远距离依赖时,通常需要通过层层堆叠卷积核或额外模块逐步扩大有效感受野。
1.2 Transformer 范式的跨界
Transformer 在自然语言处理(NLP)中取得了巨大成功。与 CNN 不同,Self-Attention 机制允许模型在计算层面直接建立任意两个 Token 之间的信息交互。但"更强的全局建模能力"是经验结论而非理论必然——例如 ConvNeXt 和大卷积核 CNN 也具备很强的全局建模能力。ViT 的出发点极其简洁:能否摒弃卷积层级特征提取结构,将图像 Patch 序列直接输入 Transformer,从而在视觉任务中学习端到端的全局表示?
2. 整体架构与流程
ViT 的前向传播可以理解为:先将图像切分为 Patch 序列并进行嵌入表示,然后通过多层 Transformer Encoder 对序列进行逐层建模,最终通过 CLS 输出或分类头完成任务。其完整计算路径如下图所示:
[ Raw Image ] (H × W × C)
│
▼
[ Patch Split & Flatten ] ──► (N × P²C)
│
▼
[ Patch Embedding Projection ] ──► Patch Embeddings (N × D)
│
▼
[ Prepend [CLS] Token & Add Position Embeddings ] ──► ( (N+1) × D )
│
▼
[ Transformer Encoder × L ]
├── LayerNorm ── Multi-Head Attention (MHA) ── (+)
└── LayerNorm ── MLP (Feed Forward) ── (+)
│
▼
[ Extract [CLS] Output ]
│
▼
[ MLP Head Classification ] ──► Class Probabilities
3. 关键模块详解
3.1 图像 Patch 化与 Flatten
假设输入图像 X∈RB×C×H×WX \in \mathbb{R}^{B \times C \times H \times W}X∈RB×C×H×W,其中 BBB 为批量大小,CCC 为通道数,H,WH, WH,W 为空间分辨率。为了便于与后续数学推导对齐,本文采用 B×C×H×WB\times C\times H\times WB×C×H×W 的记号;在工程实现中,PyTorch 中常见的张量布局是 NCHWNCHWNCHW。设定 Patch 分辨率为 P×PP \times PP×P(例如 16×1616 \times 1616×16):
- 计算 Patch 数量 NNN:
若图像被卷积核大小 k=Pk=Pk=P、步长 s=Ps=Ps=P、padding p=0p=0p=0、dilation d=1d=1d=1 的卷积处理,则输出尺寸为:
Ho=⌊H+2p−d(k−1)−1s⌋+1,Wo=⌊W+2p−d(k−1)−1s⌋+1H_o = \left\lfloor \frac{H + 2p - d(k-1) - 1}{s} \right\rfloor + 1, \quad W_o = \left\lfloor \frac{W + 2p - d(k-1) - 1}{s} \right\rfloor + 1Ho=⌊sH+2p−d(k−1)−1⌋+1,Wo=⌊sW+2p−d(k−1)−1⌋+1
因此 Patch 数量为:
N=HoWoN = H_o W_oN=HoWo
在 ViT 原始设置中,通常取 k=P, s=P, p=0, d=1k=P,\, s=P,\, p=0,\, d=1k=P,s=P,p=0,d=1,于是退化为:
N=HP×WPN = \frac{H}{P} \times \frac{W}{P}N=PH×PW
更严格地说,若不一定整除,则应写为:
N=⌊HP⌋⌊WP⌋N = \left\lfloor \frac{H}{P} \right\rfloor \left\lfloor \frac{W}{P} \right\rfloorN=⌊PH⌋⌊PW⌋
以 224×224224 \times 224224×224 输入、P=16P=16P=16 为例:N=22416×22416=14×14=196N = \frac{224}{16} \times \frac{224}{16} = 14 \times 14 = 196N=16224×16224=14×14=196。
2. 展平(Flatten):
将每个 Patch 展开为一维向量 xpi∈RP2⋅Cx_p^i \in \mathbb{R}^{P^2 \cdot C}xpi∈RP2⋅C。
当 P=16,C=3P=16, C=3P=16,C=3 时,单一 Patch 展平后的维度为 16×16×3=76816 \times 16 \times 3 = 76816×16×3=768。
3.1.1 Patch Size 影响
Patch Size 不是一个普通超参数,而是决定 ViT 在“局部细节保真度”和“序列表示粒度”之间权衡的关键因素:
- 较大 Patch(如 16×1616 \times 1616×16):Token 数量更少,每个 Token 对应的空间覆盖区域更大(例如 16×16=25616 \times 16 = 25616×16=256 个像素),但信息压缩度高,空间粒度较粗,局部细节信息容易丢失。
- 较小 Patch(如 8×88 \times 88×8):Token 数量更多,每个 Token 对应的空间覆盖区域更小(例如 8×8=648 \times 8 = 648×8=64 个像素),能保留更细致的局部结构,但序列更长,表示粒度更细。
例如,在固定输入分辨率下,ViT-B/16 会得到 196196196 个 Token,而 ViT-B/8 会得到 784784784 个 Token。较小 Patch 会显著增加 Token 数量,从而提高序列长度和表示粒度;较大 Patch 则会降低序列长度,但也会让空间粒度更粗。不同 Patch Size 的选择会直接影响模型对局部细节的保留能力以及整体表达方式。
因此,Patch Size 对部署成本、分辨率敏感性和模型表达能力都有直接影响,尤其在端侧部署场景中极其关键。
3.2 Patch Embedding(线性投影/卷积投影)
Transformer 内部处理的向量维度固定为 DDD(如 ViT-Base 中 D=768D=768D=768)。Patch Embedding 由两个步骤组成:Patchify(将图像重排为 Patch)和线性投影。投影维度 DDD 可以与 Patch 展平维度相同,也可以不同;在原始 ViT 中,通常是把 P2CP^2CP2C 维向量映射到 DDD 维。
对于批量输入,Patch 展平后的张量可写为 Xpatch∈RB×N×(P2C)X_{\text{patch}} \in \mathbb{R}^{B \times N \times (P^2 C)}Xpatch∈RB×N×(P2C)。使用可学习的线性变换矩阵 E∈R(P2C)×DE \in \mathbb{R}^{(P^2 C) \times D}E∈R(P2C)×D 和偏置项 b∈RDb \in \mathbb{R}^{D}b∈RD,将每个 Patch 映射到维度 DDD:
Zpatch=XpatchE+b,E∈R(P2C)×D,b∈RD,Zpatch∈RB×N×DZ_{\text{patch}} = X_{\text{patch}} E + b, \quad E \in \mathbb{R}^{(P^2 C) \times D},\quad b \in \mathbb{R}^{D},\quad Z_{\text{patch}} \in \mathbb{R}^{B \times N \times D}Zpatch=XpatchE+b,E∈R(P2C)×D,b∈RD,Zpatch∈RB×N×D
其中 bbb 为一个共享的偏置向量,其在 Batch 维度和 Token 维度上默认广播。若只考虑单样本,则可简化为 z0i=xpiE+bz_0^i = x_p^i E + bz0i=xpiE+b,其中 xpi∈R1×(P2C)x_p^i \in \mathbb{R}^{1 \times (P^2 C)}xpi∈R1×(P2C) 表示第 iii 个 Patch 的展平向量;E∈R(P2C)×DE \in \mathbb{R}^{(P^2 C) \times D}E∈R(P2C)×D 为可学习投影矩阵。
工程实现技巧:在代码实现(如 PyTorch)中,通常直接使用一个
stride=P、kernel_size=P、padding=0、dilation=1、输出通道为 DDD 的 2D 卷积层(Conv2d)来高效实现 Patch 分割与线性映射。仅在stride=P、kernel_size=P、padding=0、dilation=1、无重叠 Patch 条件下,该卷积操作与逐 Patch Flatten 后进行 Linear Projection 在数学上才可视为等价。若这些条件不满足(如不同的 padding 或 stride),结果会不同。
3.3 [CLS] Token 机制
为了获得整张图像的全局特征表示,ViT 借鉴了 BERT 的设计,在 Patch 序列前插入一个可学习的分类 Token(即 [CLS] Token)。初始的可学习参数只有一个 xclass∈R1×1×Dx_{\text{class}} \in \mathbb{R}^{1 \times 1 \times D}xclass∈R1×1×D;在训练和推理时,将其在 Batch 维度上扩展(expand,不是复制)为:
Xcls=1B⊗xclass∈RB×1×DX_{\text{cls}} = \mathbf{1}_B \otimes x_{\text{class}} \in \mathbb{R}^{B \times 1 \times D}Xcls=1B⊗xclass∈RB×1×D
在严格的数学记号中,这表示将单个 CLS 向量 xclassx_{\text{class}}xclass 通过广播扩展到 batch 维度;工程实现中常用 Expand\mathrm{Expand}Expand 或 broadcast 表示同样的含义。随后将其与所有 Patch 嵌入拼接:
Z0=[Xcls; Zpatch]∈RB×(N+1)×DZ_0 = \left[ X_{\text{cls}};\, Z_{\text{patch}} \right] \in \mathbb{R}^{B \times (N+1) \times D}Z0=[Xcls;Zpatch]∈RB×(N+1)×D
其中 Zpatch∈RB×N×DZ_{\text{patch}} \in \mathbb{R}^{B \times N \times D}Zpatch∈RB×N×D 表示所有 Patch 的嵌入序列。
经过 LLL 层 Transformer Encoder 后,仅提取 [CLS] 对应的输出向量作为全图的特征表征,并送入最终的分类 Head。需要注意的是,CLS Token 本身并不是天然的全局池化算子,而是一个可学习查询,在多层 Self-Attention 中持续从其他 Token 聚合信息。更准确地说,它是在分类任务中学习得到的全局判别表示。现代视觉 Transformer 中也常采用均值池化、Token 池化或其他聚合策略来替代 CLS Token。
3.4 位置编码(Position Embedding)
对 Patch Token 而言,由于 Self-Attention、MLP、LayerNorm 与残差连接都保持排列等变性,因此在不加入位置编码时,整个 Transformer Encoder 对 Token 排列具有排列等变性(Permutation Equivariance)。因此若不加入位置编码,模型无法区分不同 Patch 的空间位置。加入位置编码后,Transformer 输入表示中才包含了空间位置信息,从而保留图像 Patch 的空间几何关系。ViT 引入了可学习的一维位置编码 Epos∈R1×(N+1)×DE_{\text{pos}} \in \mathbb{R}^{1 \times (N+1) \times D}Epos∈R1×(N+1)×D,并在批量场景下通过广播加法与输入序列相加:
Z0=[Xcls; Zpatch]+Epos,Epos∈R1×(N+1)×DZ_0 = \left[ X_{\text{cls}};\, Z_{\text{patch}} \right] + E_{\text{pos}}, \quad E_{\text{pos}} \in \mathbb{R}^{1 \times (N+1) \times D}Z0=[Xcls;Zpatch]+Epos,Epos∈R1×(N+1)×D
其中 EposE_{\text{pos}}Epos 在 Batch 维度上共享,即每个样本使用同一组位置编码;这里的加法默认沿 Batch 维度广播。若将二维图像坐标 (r,c)(r,c)(r,c) 映射为一维序号 idx=r⋅Wp+cidx = r \cdot W_p + cidx=r⋅Wp+c,其中 Wp=W/PW_p = W/PWp=W/P,则位置编码可视为对序号 idxidxidx 的可学习表征。
注:ViT 采用的是可学习的绝对位置编码(learnable absolute positional embedding),而不是 Transformer 原始论文中的 sin/cos 固定编码。原论文实验表明,在原始 ViT 的实验设置下,学习式 1D 位置编码与 2D 位置编码效果相近;这一结论仅适用于该特定设置。后续工作表明,相对位置编码、Rotary 位置编码等方案在不同任务中的效果差异较大,并非普遍规律。
3.5 Transformer Encoder 与 Self-Attention
Transformer Encoder 由 LLL 个相同的 Block 堆叠而成。每个 Block 包含:
1. Multi-Head Self-Attention (MSA)
对输入矩阵 X∈RB×(N+1)×DX \in \mathbb{R}^{B \times (N+1) \times D}X∈RB×(N+1)×D 先进行线性投影,得到全局的 Query, Key, Value 矩阵:
Q=XWQ,K=XWK,V=XWV(WQ,WK,WV∈RD×D)Q = X W_Q, \quad K = X W_K, \quad V = X W_V \quad (W_Q, W_K, W_V \in \mathbb{R}^{D \times D})Q=XWQ,K=XWK,V=XWV(WQ,WK,WV∈RD×D)
其中 X∈RB×(N+1)×DX \in \mathbb{R}^{B \times (N+1) \times D}X∈RB×(N+1)×D,因此 Q,K,V∈RB×(N+1)×DQ, K, V \in \mathbb{R}^{B \times (N+1) \times D}Q,K,V∈RB×(N+1)×D。严格来说,矩阵乘法是作用在最后一个特征维度 DDD 上,即对每个 batch 样本 Xb∈R(N+1)×DX_b \in \mathbb{R}^{(N+1) \times D}Xb∈R(N+1)×D 分别执行 Qb=XbWQQ_b = X_b W_QQb=XbWQ。
为了与现代深度学习框架的实现保持一致,常见做法是先得到全局 Q,K,VQ, K, VQ,K,V,再将最后一个维度重塑为 hhh 个 Head,并在工程实现中通过 reshape 与 transpose 对张量维度进行重排,得到 (B,h,N+1,dk)(B,h,N+1,d_k)(B,h,N+1,dk) 的形状。设 dk=D/hd_k = D / hdk=D/h,则:
Q~=reshape(Q,(B,N+1,h,dk)),K~=reshape(K,(B,N+1,h,dk)),V~=reshape(V,(B,N+1,h,dk))\tilde{Q} = \text{reshape}(Q, (B, N+1, h, d_k)),\quad \tilde{K} = \text{reshape}(K, (B, N+1, h, d_k)),\quad \tilde{V} = \text{reshape}(V, (B, N+1, h, d_k))Q~=reshape(Q,(B,N+1,h,dk)),K~=reshape(K,(B,N+1,h,dk)),V~=reshape(V,(B,N+1,h,dk))
随后将这三个张量重排为 (B,h,N+1,dk)(B,h,N+1,d_k)(B,h,N+1,dk) 的形状,记为 Q~′,K~′,V~′\tilde{Q}',\tilde{K}',\tilde{V}'Q~′,K~′,V~′。
第 iii 个 Head 的切片为:
Qi=Q~′[:,i,:,:]∈RB×(N+1)×dk,Ki=K~′[:,i,:,:]∈RB×(N+1)×dk,Vi=V~′[:,i,:,:]∈RB×(N+1)×dkQ_i = \tilde{Q}'[:, i, :, :]\in\mathbb{R}^{B \times (N+1)\times d_k},\quad K_i = \tilde{K}'[:, i, :, :]\in\mathbb{R}^{B \times (N+1)\times d_k},\quad V_i = \tilde{V}'[:, i, :, :]\in\mathbb{R}^{B \times (N+1)\times d_k}Qi=Q~′[:,i,:,:]∈RB×(N+1)×dk,Ki=K~′[:,i,:,:]∈RB×(N+1)×dk,Vi=V~′[:,i,:,:]∈RB×(N+1)×dk
在经典论文的理论写法中,也常把每个 Head 的投影单独写成 WQi,WKi,WVi∈RD×dkW_Q^i, W_K^i, W_V^i \in \mathbb{R}^{D \times d_k}WQi,WKi,WVi∈RD×dk,即:
Qi=XWQi,Ki=XWKi,Vi=XWViQ_i = X W_Q^i, \quad K_i = X W_K^i, \quad V_i = X W_V^iQi=XWQi,Ki=XWKi,Vi=XWVi
这两种写法分别对应工程实现和理论推导,本质上描述的是同一种 Multi-Head Attention;从参数化角度看,它们可以表示为完全等价的线性投影形式,参数量上也可保持一致。每个 Head 分别计算注意力,再通过拼接与输出投影融合:
headi=Attention(Qi,Ki,Vi)\text{head}_i = \text{Attention}(Q_i, K_i, V_i)headi=Attention(Qi,Ki,Vi)
MSA(X)=Concat(head1,…,headh)WO,WO∈RD×D\text{MSA}(X) = \text{Concat}(\text{head}_1, \dots, \text{head}_h)W_O,\quad W_O \in \mathbb{R}^{D \times D}MSA(X)=Concat(head1,…,headh)WO,WO∈RD×D
其输出维度为 RB×(N+1)×D\mathbb{R}^{B \times (N+1) \times D}RB×(N+1)×D。严格来说,先计算 Attention 权重矩阵:
Ai=softmax(QiKi⊤dk)∈RB×(N+1)×(N+1)A_i = \text{softmax}\left( \frac{Q_i K_i^{\top}}{\sqrt{d_k}} \right) \in \mathbb{R}^{B \times (N+1) \times (N+1)}Ai=softmax(dkQiKi⊤)∈RB×(N+1)×(N+1)
其中对每个 Batch 样本分别计算,Ki⊤K_i^{\top}Ki⊤ 表示对最后两个维度进行转置,即 transpose(Ki,−2,−1)\operatorname{transpose}(K_i,-2,-1)transpose(Ki,−2,−1);这样 Qi∈RB×(N+1)×dkQ_i \in \mathbb{R}^{B \times (N+1) \times d_k}Qi∈RB×(N+1)×dk 与 Ki⊤∈RB×dk×(N+1)K_i^{\top} \in \mathbb{R}^{B \times d_k \times (N+1)}Ki⊤∈RB×dk×(N+1) 的点积得到 (N+1)×(N+1)(N+1) \times (N+1)(N+1)×(N+1) 的权重矩阵。Softmax 按每个 Query 对所有 Key 的注意力分数进行归一化,即沿矩阵最后一个维度(Key 维)进行计算。 然后将权重矩阵作用于 ViV_iVi 得到最终输出:
Attention(Qi,Ki,Vi)=AiVi∈RB×(N+1)×dk\text{Attention}(Q_i, K_i, V_i) = A_i V_i \in \mathbb{R}^{B \times (N+1) \times d_k}Attention(Qi,Ki,Vi)=AiVi∈RB×(N+1)×dk
这里 dk\sqrt{d_k}dk 是缩放因子(dk=D/hd_k = D / hdk=D/h,hhh 为 Head 数量),用以防止点积幅值过大导致 Softmax 输出过度集中并使得部分位置的梯度趋近于 0。
由此可得单个 Head 的典型复杂度,按三个主要算法步骤:
QK:O(N2dk),Softmax:O(N2),AV:O(N2dk)\mathrm{QK}: O(N^2d_k),\quad \mathrm{Softmax}: O(N^2),\quad \mathrm{AV}: O(N^2d_k)QK:O(N2dk),Softmax:O(N2),AV:O(N2dk)
单个 Head 的整体 Attention 复杂度为 O(N2dk)O(N^2d_k)O(N2dk);全部 hhh 个 Head 合计 Attention 复杂度为 h×O(N2dk)=O(N2D)h \times O(N^2d_k) = O(N^2D)h×O(N2dk)=O(N2D)。
完整的 MSA 还包括 QKV 投影和输出投影:
QKV Projection:O(3ND2),Attention:O(N2D),Output Projection:O(ND2)\mathrm{QKV\,Projection}: O(3ND^2),\quad \mathrm{Attention}: O(N^2D),\quad \mathrm{Output\,Projection}: O(ND^2)QKVProjection:O(3ND2),Attention:O(N2D),OutputProjection:O(ND2)
因此整个 MSA 的总复杂度为:
MSA:O(N2D+ND2)\mathrm{MSA}: O(N^2D + ND^2)MSA:O(N2D+ND2)
忽略常数项后,通常简写为 O(N2D+ND2)O(N^2D + ND^2)O(N2D+ND2)。为简洁起见,下文将 (N+1)(N+1)(N+1) 近似记为 NNN,这在实际中的影响可以忽略。
整个 Transformer Block 的复杂度由 MSA 和 MLP 两部分组成:
Block:O(N2D+ND2)+O(ND2)=O(N2D+ND2)\mathrm{Block}: O(N^2D + ND^2) + O(ND^2) = O(N^2D + ND^2)Block:O(N2D+ND2)+O(ND2)=O(N2D+ND2)
其中 NNN 为 Token 数量,DDD 为 Embedding 维度,且 hdk=Dh d_k = Dhdk=D。
2. MLP 块与残差连接(Residual & Pre-LN)
一个标准 Transformer Block 的计算流程可以概括为:
x
│
LayerNorm
│
Multi-Head Attention
│
Residual Add
│
LayerNorm
│
MLP
│
Residual Add
│
y
原始 ViT Encoder Block 采用 Pre-LN(Layer Normalization 置于子层之前) 的结构,以提升深层网络训练的稳定性。这里的 LayerNorm 作用在最后一个特征维度 DDD,即对每个 Token 的特征向量进行归一化:
Z^l=MSA(LN(Zl−1))+Zl−1\hat{Z}_l = \text{MSA}(\text{LN}(Z_{l-1})) + Z_{l-1}Z^l=MSA(LN(Zl−1))+Zl−1
Zl=MLP(LN(Z^l))+Z^lZ_l = \text{MLP}(\text{LN}(\hat{Z}_l)) + \hat{Z}_lZl=MLP(LN(Z^l))+Z^l
于是整个 Encoder 的递推过程可视为:
Z^l=MSA(LN(Zl−1))+Zl−1,Zl=MLP(LN(Z^l))+Z^l\hat{Z}_l = \text{MSA}(\text{LN}(Z_{l-1})) + Z_{l-1},\quad Z_l = \text{MLP}(\text{LN}(\hat{Z}_l)) + \hat{Z}_lZ^l=MSA(LN(Zl−1))+Zl−1,Zl=MLP(LN(Z^l))+Z^l
最终,CLS Token 对应的输出 ZLclsZ_L^{\text{cls}}ZLcls 送入分类头:
y^=Softmax(WheadZLcls+bhead)\hat{y} = \mathrm{Softmax}(W_{\text{head}} Z_L^{\text{cls}} + b_{\text{head}})y^=Softmax(WheadZLcls+bhead)
其中 WheadW_{\text{head}}Whead 和 bheadb_{\text{head}}bhead 为分类头的可学习参数。注意:此部仅针对分类任务,而 ViT 作为 Backbone 并不限于分类——如 CLIP、DINO、SAM 不仅仅是分类任务。随后,MLP 块由两层线性层、GELU 激活函数以及 Dropout 组成。完整的计算流程为:
h1=GELU(tW1+b1)h_1 = \mathrm{GELU}(tW_1 + b_1)h1=GELU(tW1+b1)
h2=Dropout(h1)h_2 = \mathrm{Dropout}(h_1)h2=Dropout(h1)
MLP(t)=Dropout(h2W2+b2)\mathrm{MLP}(t) = \mathrm{Dropout}(h_2W_2 + b_2)MLP(t)=Dropout(h2W2+b2)
其中 W1∈RD×4DW_1 \in \mathbb{R}^{D \times 4D}W1∈RD×4D,W2∈R4D×DW_2 \in \mathbb{R}^{4D \times D}W2∈R4D×D,b1∈R4Db_1 \in \mathbb{R}^{4D}b1∈R4D,b2∈RDb_2 \in \mathbb{R}^{D}b2∈RD。这里的输入变量 ttt 代表单个 Token 的特征向量,即 t∈RDt \in \mathbb{R}^{D}t∈RD。在实际实现中,MLP 会同时作用于所有 Token,其输入张量记为 T∈RB×(N+1)×DT \in \mathbb{R}^{B \times (N+1) \times D}T∈RB×(N+1)×D;线性层仅作用于最后一个特征维度,因此会将 DDD 映射到 4D4D4D,再映射回 DDD。第一层线性变换的复杂度为 O(4ND2)O(4ND^2)O(4ND2),第二层线性变换的复杂度为 O(4ND2)O(4ND^2)O(4ND2),忽略常数后可统一写为 O(ND2)O(ND^2)O(ND2)。第一个 Dropout 作用于激活函数输出,第二个 Dropout 作用于第二层线性变换输出。
LayerNorm 可写为:
对于 X∈RB×N×DX \in \mathbb{R}^{B \times N \times D}X∈RB×N×D,其均值和方差向量分别为 μ,σ2∈RB×N×1\mu,\sigma^2 \in \mathbb{R}^{B \times N \times 1}μ,σ2∈RB×N×1,随后通过广播恢复到 B×N×DB \times N \times DB×N×D 的形状。于是:
LN(x)=γ⊙x−μσ2+ϵ+β\mathrm{LN}(x)=\gamma \odot \frac{x-\mu}{\sqrt{\sigma^2+\epsilon}} + \betaLN(x)=γ⊙σ2+ϵx−μ+β
其中 μ,σ2\mu, \sigma^2μ,σ2 均沿最后一个特征维度 DDD 计算。更严格地说,对每个 Token iii 的线性表达 xi∈RDx_i \in \mathbb{R}^{D}xi∈RD,其均值和方差分别为:
μi=1D∑d=1Dxi(d),σi2=1D∑d=1D(xi(d)−μi)2\mu_i = \frac{1}{D} \sum_{d=1}^{D} x_i^{(d)},\quad \sigma_i^2 = \frac{1}{D} \sum_{d=1}^{D} (x_i^{(d)} - \mu_i)^2μi=D1d=1∑Dxi(d),σi2=D1d=1∑D(xi(d)−μi)2
LayerNorm 对每个 Token 独立计算,仅沿特征维度 DDD 统计,不跨 Batch 维度和 Token 维度。原始 ViT 论文中常采用 MLP ratio = 4,但这属于具体配置,而非 Transformer 的理论必然属性;在许多变体中会使用其他比例。
4. ViT 与 CNN 的多维度对比
| 维度 | CNN (如 ResNet) | Vision Transformer (ViT) |
|---|---|---|
| 基本处理单元 | 像素(Pixel)/ 局部区域 | Patch 序列 |
| 核心计算机制 | 局部卷积(Convolution) | 全局自注意力(Self-Attention) |
| 感受野演变 | 随层数加深逐渐扩大 | 第一层即可计算任意 Patch 间的注意力权重,但这并不等价于第一层已经形成成熟的高层语义表示 |
| 归纳偏置(Prior) | 强(平移等变性、局部相关性) | 弱(依靠数据驱动自行学习) |
| 小数据集表现 | 表现良好,不易过拟合 | 从零训练时数据效率较低 |
| 大数据集上限 | 易达饱和瓶颈 | 规模扩展能力较强(在大规模预训练条件下表现出较好的规模扩展能力) |
| 主要瓶颈 | 卷积计算随空间分辨率与通道数增长 | Attention 交互随 Token 数量平方增长,MLP 计算随 Embedding 维度和 Token 数量增长 |
5. ViT 的优缺点与演进分析
5.1 核心优势
- 全局建模能力:自第一层起就能建立任意远距离 Patch 之间的信息交互。
- 较好的规模扩展能力:在超大规模数据集(如 JFT-300M、ImageNet-21k)预训练时,模型容量与数据集规模在合理范围内表现出较好的规模扩展能力。
- 架构统一:推动了 CV 与 NLP 模型架构的统一趋势,为 CLIP、DINO、SAM 等视觉基础模型提供了重要的视觉编码器基础。
5.2 瓶颈与缺点
- 数据饥渴(Data-Hungry):缺少局部先验导致原始 ViT 在 ImageNet-1K 小规模训练条件下通常弱于同规模 CNN,必须依赖超大规模预训练或强数据增强(如 DeiT 的知识蒸馏策略)。
- 序列长度敏感性:Self-Attention 机制会将不同 Patch 的信息直接交互,因此在高分辨率输入下,序列长度显著增加时,模型对长序列结构的建模压力也会变大。
- 缺少多尺度层级结构:原始 ViT 将所有 Patch 维持在统一尺度,缺少 CNN 那种从高分辨率到低分辨率、从局部到语义的层级特征金字塔,因此在目标检测、分割等密集预测任务中通常需要额外设计。对于这类任务,后续方法通常通过特征金字塔、多尺度表示与局部窗口机制来缓解,如 DETR、Swin Transformer 与 ViTDet 等。
6. 模型变体规格
官方论文中定义的配置规格如下:
| 模型变体 | Encoder 层数 (LLL) | 隐层维度 (DDD) | Attention Heads (hhh) | 参数量 (Params) |
|---|---|---|---|---|
| ViT-B/16 | 12 | 768 | 12 | 86 M |
| ViT-L/16 | 24 | 1024 | 16 | 307 M |
| ViT-H/14 | 32 | 1280 | 16 | 632 M |
常见表示如 ViT-B/16 意为:Base 规格,Patch 大小为 16×1616 \times 1616×16。
7. 边缘设备部署瓶颈与适配方案
针对端侧设备(如 RK3568、RK3588、i.MX8 或移动端 SoC),原生 ViT 的部署面临三大挑战:
- 访存压力:在资源受限设备上,Attention 中间矩阵的生成、转置与缓存容易带来较高的访存压力。
- Transformer 特有算子优化不足:部分端侧 NPU/DSP 对 LayerNorm、Softmax 和 GELU 这类归一化与激活算子的优化不足,可能导致算子无法充分利用 NPU,出现 CPU 参与计算或性能下降。
- 高分辨率下序列变长:高分辨率输入会显著增加 Patch 数量,导致序列长度变长,进而增加访存和缓存压力。
工业端侧优化范式
为解决上述问题,端侧通常采用轻量化/混合架构变体:
- Swin Transformer:基于移动窗口(Shifted Windows)将 Attention 限制在局部区域,减少全局依赖建模时的序列尺度压力。
- MobileViT / EfficientFormer:更准确地说,MobileViT 先由 CNN 提取局部表示,再把局部区域展开为 Transformer Token,经过 Transformer 建模后再投影回二维特征;这一思路兼顾局部建模与全局关系建模。
- 蒸馏与量化:通过 DeiT 范式蒸馏、网络剪枝以及 INT8/FP16 量化,改善端侧部署下的算子兼容性、内存占用与推理成本。
此外,注意力层中的 Softmax、LayerNorm 输出以及 GELU 等非线性激活的动态范围在 INT8 量化时较为敏感,通常需要结合 QAT、PTQ calibration 以及算子融合策略进行优化。
7.1 工业边缘部署结论
原始 ViT-B 级模型由于参数量较大、Attention 计算复杂、Transformer 算子对低算力 NPU 的支持有限,不适合作为低功耗、低内存工业边缘设备的默认部署方案。尤其是 RK3568 等低算力 NPU 平台,通常对 LayerNorm、Softmax、GELU 等 Transformer 高频算子的硬件加速支持有限。工业场景下通常更倾向于选择 MobileViT、EfficientFormer、TinyViT 等轻量化结构,并结合 INT8 量化、蒸馏与算子优化实现实时推理。
8. 结论与展望
ViT 的真正意义,并不在于"用 Transformer 替代卷积"这一表层结论,而在于它首次系统性地证明:在足够大的数据规模与足够强的预训练条件下,纯注意力架构能够在视觉任务中形成有效且可扩展的表示能力。更本质的创新在于:将二维图像离散化为 Token 序列,把视觉问题转换为序列建模问题,并利用标准 Transformer Encoder 直接处理视觉 Token。这一系统转化使得视觉任务能够受益于 NLP 领域积累的 Transformer 设计经验和扩展方法。
其后续演化也表明,视觉建模的核心竞争力已不再由卷积结构单独决定,而是逐步转向更灵活的表示学习范式、更高效的注意力机制以及更适配端侧部署的轻量化设计。未来的视觉基础模型,往往是卷积、注意力、局部窗口机制与多尺度结构共同作用的结果,而非单一范式的简单替代。
1万+



被折叠的 条评论
为什么被折叠?



