Vision Transformer(ViT)模型原理详解报告

【论文阅读】Vision Transformer 模型详解 关于Vision Transformer模型的详解 ,末尾附原论文下载链接以及pytorch代码。 阅读详情

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):

  1. 计算 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=Ho​Wo​

在 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​=Xpatch​E+b,E∈R(P2C)×D,b∈RD,Zpatch​∈RB×N×D

其中 bbb 为一个共享的偏置向量,其在 Batch 维度和 Token 维度上默认广播。若只考虑单样本,则可简化为 z0i=xpiE+bz_0^i = x_p^i E + bz0i​=xpi​E+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​=Xb​WQ​。

为了与现代深度学习框架的实现保持一致,常见做法是先得到全局 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(dk​​Qi​Ki⊤​​)∈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​)=Ai​Vi​∈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(Whead​ZLcls​+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(h2​W2​+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​=D1​d=1∑D​xi(d)​,σi2​=D1​d=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 核心优势

  1. 全局建模能力:自第一层起就能建立任意远距离 Patch 之间的信息交互。
  2. 较好的规模扩展能力:在超大规模数据集(如 JFT-300M、ImageNet-21k)预训练时,模型容量与数据集规模在合理范围内表现出较好的规模扩展能力。
  3. 架构统一:推动了 CV 与 NLP 模型架构的统一趋势,为 CLIP、DINO、SAM 等视觉基础模型提供了重要的视觉编码器基础。

5.2 瓶颈与缺点

  1. 数据饥渴(Data-Hungry):缺少局部先验导致原始 ViT 在 ImageNet-1K 小规模训练条件下通常弱于同规模 CNN,必须依赖超大规模预训练或强数据增强(如 DeiT 的知识蒸馏策略)。
  2. 序列长度敏感性:Self-Attention 机制会将不同 Patch 的信息直接交互,因此在高分辨率输入下,序列长度显著增加时,模型对长序列结构的建模压力也会变大。
  3. 缺少多尺度层级结构:原始 ViT 将所有 Patch 维持在统一尺度,缺少 CNN 那种从高分辨率到低分辨率、从局部到语义的层级特征金字塔,因此在目标检测、分割等密集预测任务中通常需要额外设计。对于这类任务,后续方法通常通过特征金字塔、多尺度表示与局部窗口机制来缓解,如 DETR、Swin Transformer 与 ViTDet 等。

6. 模型变体规格

官方论文中定义的配置规格如下:

模型变体Encoder 层数 (LLL)隐层维度 (DDD)Attention Heads (hhh)参数量 (Params)
ViT-B/16127681286 M
ViT-L/1624102416307 M
ViT-H/1432128016632 M

常见表示如 ViT-B/16 意为:Base 规格,Patch 大小为 16×1616 \times 1616×16。


7. 边缘设备部署瓶颈与适配方案

针对端侧设备(如 RK3568、RK3588、i.MX8 或移动端 SoC),原生 ViT 的部署面临三大挑战:

  1. 访存压力:在资源受限设备上,Attention 中间矩阵的生成、转置与缓存容易带来较高的访存压力。
  2. Transformer 特有算子优化不足:部分端侧 NPU/DSP 对 LayerNorm、Softmax 和 GELU 这类归一化与激活算子的优化不足,可能导致算子无法充分利用 NPU,出现 CPU 参与计算或性能下降。
  3. 高分辨率下序列变长:高分辨率输入会显著增加 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 设计经验和扩展方法。

其后续演化也表明,视觉建模的核心竞争力已不再由卷积结构单独决定,而是逐步转向更灵活的表示学习范式、更高效的注意力机制以及更适配端侧部署的轻量化设计。未来的视觉基础模型,往往是卷积、注意力、局部窗口机制与多尺度结构共同作用的结果,而非单一范式的简单替代。

Vision Transformer原理 多头自注意力时,先将输入映射到q,k,v,如果只有一个头,qkv的维度都是197x768,如果有12个头(768/12=64),则qkv的维度是197x64,一共有12组qkv,最后再将12组qkv的输出拼接起来,输出维度是197x768,然后在过一层LN,维度依然是。最后会将特殊字符cls对应的输出z0 作为encoder的最终输出 ,代表最终的image presentation(另一种做法是不加cls字符,对所有的tokens的输出做一个平均),如下图公式(4),后面接一个MLP进行图片分类。 阅读详情

相关推荐

ViT( Vision Transformer)详解

VIT详解:( Vision Transformer):也希望大家Attention all you need。

源仔 1万+

Vision Transformer详解

论文名称: An Image Is Worth 16x16 Words: Transformers For Image Recognition At Scale 论文下载链接:https://arxiv.org/abs/2010.11929 原论文对应源码:https://github.com/google-research/vision_transformer Pytorch实现代码: pytorch_classification/vision_transformer 文章目录前言模型详解Vision

霹雳吧啦Wz 34万+

深入浅出理解ViT(Vision Transformer)模型

什么是ViT?ViT是一种基于Transformer的计算机视觉模型,将图像处理方式从传统的卷积神经网络(CNN)转变为序列处理。它将图像分割成小块(补丁),然后像处理文本一样,通过Transformer编码器分析这些补丁。工作原理补丁嵌入:将图像分割成固定大小的补丁(如16x16像素),每个补丁展平后通过线性投影转换为向量。位置编码:添加位置信息,确保模型知道补丁在图像中的位置。Transformer编码器:使用自注意力机制处理补丁序列,捕捉图像中不同区域的关系。分类。

likuoelie的博客 3285

Vision Transformer(ViT)论文解读与代码实践(Pytorch)

RGB为彩色图片,L为灰度图片= 'RGB':这里解释一下collate_fn这个静态方法:collate_fn方法的作用是定义数据加载时的批处理操作。在PyTorch中,数据加载器(DataLoader)将数据集按照指定的批次大小(batch size)加载到模型中进行训练或推断。当数据集中的样本具有不同的大小或形状时,需要对每个批次进行适当的处理,以便能够对其进行批处理计算。

qq_51957239的博客 2万+

视觉Transformer实战 | Vision Transformer(ViT)详解与实现

在计算机视觉领域,卷积神经网络 (CNN) 长期以来一直是处理图像任务的主流架构。然而,随着 Transformer 在自然语言处理领域的巨大成功,研究人员开始探索将这种基于自注意力机制的架构应用于视觉任务。Vision Transformer (ViT) 是这一探索的重要里程碑,它首次证明了纯 Transformer 架构在图像分类任务上可以超越最先进的 CNN 模型。本文将详细介绍 ViT 的技术原理,并使用 PyTorch 从零开始构建 ViT 模型用于图像分类任务。

盼小辉丶的博客 4万+

视觉Transformer实战 | Token-to-Token Vision Transformer(T2T-ViT)详解与实现

Vision Transformer (ViT) 在计算机视觉领域取得了巨大成功,但标准的 ViT 存在一些局限性,如需要大规模预训练数据、对局部结构建模不足等。Token-to-Token ViT (T2T-ViT) 通过引入渐进式分词过程改进了原始 ViT,使其能够在中小型数据集上取得更好的性能。本节将详细介绍 T2T-ViT 的技术原理,并使用 PyTorch 从零开始实现 T2T-ViT。

盼小辉丶的博客 4万+

【图像分类】Vision Transformer理论解读+实践测试

Vision Transformer是2021年谷歌在ICLR上提出的算法,算法原理并不复杂,但是其价值是开创性的。它首次将NLP领域火热的Transformer模型架构移植到了CV领域,打破了这两个领域壁垒,并取得不错的成效。论文名称: An Image Is Worth 16x16 Words: Transformers For Image Recognition At Scale。...

兴趣使然的创作者 1万+

Coze:手把手教你搭建 小红书二创 智能体

前一篇 “” ,讲了如何针对需求进行拆解,并拆解 ”小红书二创“ 智能体,分为四个内容模块。通过上述步骤,开始一步一步构建 “小红书二创” 智能体。用来测试的小红书地址:http://xhslink.com/a/quxWEDAj3J48。

保持敏感!保持学习! 1434

【Transformer系列】深入浅出理解ViT(Vision Transformer)模型

【Transformer系列】深入浅出理解ViT(Vision Transformer)网络模型

IT菜鸟 6万+

LLM - windows下的Dify离线部署:从镜像打包到无网环境部署(亲测,包含插件部署)

LLM - windows下的Dify离线部署:从镜像打包到无网环境部署(亲测,包含插件部署)

ocean00008899的博客 1284

SPSS&Mplus—共同方法偏差(Common Method Bias)控制与检验

共同方法偏差(Common Method Bias)的控制方法:程序控制(Procedural)和统计控制(Statistical)。

m0_54401011的博客 1万+

详解VIT(Vision Transformer)模型原理, 代码级讲解

详解VIT(Vision Transformer)模型原理, 代码级讲解

qq_43449643的博客 1万+

Android音频学习(十四)——加载音频设备

loadHwModule 是 Android 音频系统的核心初始化函数,负责加载音频硬件抽象层(HAL)的模块实现。它建立 AudioPolicyService 与底层硬件的桥梁,将配置文件(audio_policy_config.xml)中的标签<module>定义转化为可操作的硬件对象,加载的是音频硬件模块(HAL实现),每个模块对应一种音频设备类型,以动态库的形式存在,负责与底层音频硬件交互。

miemie2014的博客 1730

Vision Transformer(vit)原理分析以及特征可视化

Vision Transformer(ViT)是一种基于架构的深度学习模型,用于图像识别和计算机视觉任务。与传统的卷积神经网络(CNN)不同,ViT直接,并利用自注意力机制来处理图像中的像素关系。ViT通过将图像分成一系列的,并。然后,这些向量将通过多层的Transformer编码器进行处理,其中包含了。这样可以。最后,通过对Transformer编码器输出进行分类或回归,可以完成特定的视觉任务。为什么不能直接将transformer直接应用于图像处理中呢?

z240626191s的博客 3万+

动态SLAM中的YOLO与ORB-SLAM3融合:实时目标检测与动态点云滤除实战

本文介绍了如何结合YOLOv5目标检测与ORB-SLAM3视觉SLAM系统,实现动态环境下的目标检测与视觉SLAM任务。文章详细阐述了从源码下载、依赖安装(包括libtorch配置)、编译运行步骤(包括ROS环境和非ROS环境下的编译方法),到RGBD-TUM数据集准备与关联处理的全流程。同时针对常见错误提供了解决方案,如libtorch路径配置、ROS环境冲突等。最后展示了系统运行方法,并探讨了未来可能的优化方向,包括增强目标检测能力和改进动态环境下的地图构建。该集成系统为机器人智能导航和环境感知提供了有

LXY_LOVE36的博客 234

学Simulink——基于直流电机的建模与控制场景实例:直流电机带负载突变时的动态响应仿真

在实际应用中,直流电机经常需要应对各种工作条件的变化,例如负载突变。了解电机在这种情况下的动态响应特性对于确保系统的稳定性和可靠性至关重要。通过仿真分析,可以预测电机在不同负载条件下的表现,并优化控制系统的设计。本文将详细介绍如何使用来构建一个直流电机带负载突变时的动态响应仿真模型,并通过仿真展示其应用效果。本文介绍了如何使用构建一个直流电机带负载突变时的动态响应仿真模型,并通过仿真展示了其应用效果。

xiaoheshang_123的博客 114

ViT(vision transformer)原理快速入门

本专题需要具备的基础: 了解深度学习分类网络原理。 了解2017年的transformer。 Transformer 技术里程碑: ViT简介 时间:2020年CVPR 论文全称:《An Image is Worth 16*16 Words: Transformers for Image Recognition at Scale》 发明人:谷歌团队 简介:论文中提出了 Vision Transformer (ViT),能直接利用 Transformer 对图像进行分类,而不需要卷.

不精,不诚,不足以动人 2万+

华为OD新系统机试真题-文章特征提取

华为OD机试新系统真题 【文章特征提取】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统机试真题【文章特征提取】

qq_45776114的博客 728

Vision Transformer——ViT代码解读

官方提供的代码:https://github.com/google-research/vision_transformer 大佬复现的版本:https://github.com/lucidrains/vit-pytorch 对不起,我好菜,官方给的代码我确实看不懂啊,所以看了第二个版本的代码。第二个版本的代码超级受欢迎且易使用,我看的时候,Git rep已经被star 5.7k次。大家直接 pip install vit-pytorch就好。 所以作为初次接触vit的同学们来说,推荐看第二个版本,结构清晰明

qq_37297763的博客 7532

conda install出现CondaValueError: Malformed version string invalid character(s)解决方案

本文主要介绍了conda install出现Solving environment:failed、CondaValueError: Malformed version string invalid character(s),希望能对新手有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 步骤一 2.2 步骤二 2.3 步骤三

weixin_43178406的博客 6万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

CV攻城狮入门VIT(vision transformer)之旅——VIT原理详解篇

​  在上一篇,我已经详细为大家介绍了NLP邻域中的,足足写了10000+字,酝酿了好多天才下笔,也写了很久,自认为写的还算是通俗全面。如若你对Transformer还没什么了解,建议你点击☞☞☞了解详情。​  其实,作为CV程序猿的我们,学习NLP邻域的Transformer更像是被迫之举,毕竟现在基于Transformer的算法在CV邻域可谓是大杀特杀。那么今天我就为大家带来将Transformer引入到视觉物体分类中的一篇文章,标题为download📥📥📥。

秃头小苏的博客 6871

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【Transformer专题】Vision Transformer(ViT)原理 + 代码

Vision Transformer

qq_38253797的博客 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

CV攻城狮入门VIT(vision transformer)之旅——VIT代码实战篇

​​  在上一篇,我们已经介绍了VIT的原理,是不是发现还挺简单的呢!对VIT原理不清楚的请点击☞☞☞了解详细。🌿🌿🌿那么这篇我将带大家一起来看看VIT的代码,主要为大家介绍VIT模型的搭建过程,也会简要的说说训练过程。​​  这篇VIT的模型是用于物体分类的,我们选择的例子是花的五分类问题。关于花的分类,我之前也有详细的介绍,是用卷积神经网络实现的,不清楚可以点击下列链接了解详情:基于pytorch搭建AlexNet神经网络用于花类识别 🍁🍁🍁基于pytorch搭建VGGNet神经网络用于花类

秃头小苏的博客 7905

Vision Transformer(VIT模型)

MLP Head 是指位于模型顶部的全连接前馈神经网络模块,用于将提取的图像特征表示转换为最终的分类结果或其他预测任务输出。MLP Head 通常跟在 Transformer Encoder 的输出之后,作为整个模型的最后一层。可以简单理解为一个全连接层,若需要类别概率需要再接上一个softmax激活函数。

m0_61595251的博客 2079

Vision Transformer (ViT)初识:原理详解及代码

CV 领域的 transformer : ViT (Vision transformer) 原理详解h和代码注释,及宝藏学习参考资源大全

weixin_46833029的博客 4858

Vision Transformer (ViT)原理

flyfish

二分掌柜的 1907
上一篇: 机器学习中的统计波动控制与表征几何优化原则:从函数稳定性到隐空间结构学习
下一篇: 工业音频异常检测技术选型简报:CNN 与 Transformer 的抉择
大鹏的NLP博客
博客等级 码龄16年 375粉丝 351原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值