一、ViT 的主要版本概览自 2020 年 Google Brain 提出原始 ViT 以来该系列已经发展出众多变体。主要版本包括原始 ViT、DeiT、Swin Transformer、BEiT、MAE、DINOv2、Swin V2、SAM 中的 ViT 骨干、ViT-22B 等。下面逐一介绍。二、各版本网络架构详解1. 原始 ViT2020Dosovitskiy et al., Google Brain论文An Image is Worth 16×16 Words: Transformers for Image Recognition at Scale这是整个系列的基础核心思想是将图像视为一系列 patch 的序列直接套用标准 Transformer Encoder。完整数据流程如下① Patch 切分与线性嵌入Patch Embedding给定输入图像x∈RH×W×Cx \in \mathbb{R}^{H \times W \times C}x∈RH×W×C将其切分为若干固定大小的 patch如 16×16。共得到NHWP2N \frac{HW}{P^2}NP2HW​个 patch。每个 patch 展平后形状为RP2⋅C\mathbb{R}^{P^2 \cdot C}RP2⋅C通过一个可学习的线性投影矩阵E∈R(P2⋅C)×DE \in \mathbb{R}^{(P^2 \cdot C) \times D}E∈R(P2⋅C)×D映射到 D 维嵌入空间即 patch embedding。② 加入 [CLS] Token 与位置编码在序列最前面拼接一个可学习的分类 tokenxclsx_{\text{cls}}xcls​这个 token 在经过 Transformer 后承载全局特征信息用于最终分类。同时加入可学习的一维位置编码Epos∈R(N1)×DE_{\text{pos}} \in \mathbb{R}^{(N1) \times D}Epos​∈R(N1)×D弥补 Transformer 缺乏位置感知的缺陷。③ Transformer EncoderL 层堆叠每一层包含LayerNorm前置 → 多头自注意力MSA → 残差连接然后 LayerNorm前置 → MLP Block → 残差连接。MLP Block 由两个线性层 GELU 激活构成维度通常为 4D。这种 Pre-Norm 设计比 Post-Norm 训练更稳定。④ 分类头取最终输出序列中 [CLS] token 对应的向量经过一个 MLP 分类头输出类别概率。三种规模配置模型Transformer层数隐藏维度 DMLP维度注意力头数参数量ViT-B/1612768307212~86MViT-L/16241024409616~307MViT-H/14321280512016~632M核心局限需要在超大数据集JFT-300M上预训练在中小型数据集上效果不如 CNN因为缺乏 CNN 固有的归纳偏置局部性、平移不变性。2. DeiT2021Touvron et al., Facebook AI论文Training>N2N2N2。训练时[CLS] token 对应真实标签的分类损失distillation token 对应教师模型通常是 RegNet 等 CNN输出的软标签损失两者加权求和。推理时可以只用 [CLS] token也可以将两者平均。训练策略强化使用 RandAugment、Mixup、CutMix、Random Erasing 等大量数据增强以及 Repeated Augmentation使得模型无需海量数据也能收敛。规模分为 DeiT-TiTiny、DeiT-SSmall、DeiT-BBase。3. Swin Transformer2021Liu et al., Microsoft Research Asia论文Swin Transformer: Hierarchical Vision Transformer using Shifted WindowsSwin 是目前最重要的 ViT 变体之一解决了原始 ViT 两个关键问题计算复杂度随图像大小二次增长以及缺乏多尺度特征无法用于检测、分割等密集预测任务。核心设计①层次化架构Hierarchical Feature Map类似 CNN 的 4 阶段设计Stage 14×4 的非重叠 patch 切分每个 patch 嵌入到 C 维C96 for Swin-TStage 2Patch Merging将相邻 2×2 patch 合并通道数变为 2C分辨率减半Stage 3再次 Patch Merging4CStage 4再次 Patch Merging8C这样就产生了类似 CNN Feature Pyramid 的多尺度特征图。核心设计②基于窗口的多头自注意力W-MSA与移位窗口SW-MSA标准 ViT 的全局自注意力复杂度是O(N2)\mathcal{O}(N^2)O(N2)对于大分辨率图像代价极高。Swin 的解决方案是在固定大小的局部窗口内默认 7×7 patch计算自注意力复杂度降为O(N)\mathcal{O}(N)O(N)相对于图像大小线性。但纯粹的窗口注意力没有跨窗口的信息交流因此 Swin 在相邻层交替使用W-MSA正常窗口划分和SW-MSA将窗口向右下方移位⌊M/2⌋\lfloor M/2 \rfloor⌊M/2⌋个 patch产生新的窗口划分。移位操作使相邻窗口之间实现了间接的信息传递。为了保持移位后窗口数量不变使用了 cyclic shift masking 技巧。相对位置偏置Relative Position BiasSwin 不用绝对位置编码而是在注意力计算中加入可学习的相对位置偏置矩阵BBB这对不同尺度的泛化更友好。Swin-T/S/B/L 四种规模参数量从 28M 到 197M。理解Swin Transformer 是一个骨干网络架构目标是让 Transformer 能像 CNN 一样做各种视觉任务不只是分类。原始 ViT 有两个问题特征图始终只有一个尺度没办法做检测和分割以及全局自注意力计算量太大。Swin 同时解决了这两个问题。结构上它模仿 CNN 的金字塔设计通过 Patch Merging 逐层把特征图从大变小产生多尺度特征这样就可以同时检测大物体和小物体。计算量上它把全局自注意力改成局部窗口内的自注意力每个窗口只有 49 个 patch 互相做注意力计算量和图像大小无关。为了让窗口之间也能交流信息相邻两层之间会把窗口整体移位一次让原来被隔离在不同窗口的 patch 能够间接交互。和 CNN 最本质的区别是窗口内用的是自注意力而不是卷积权重是根据当前输入内容动态计算的而不是固定的。一句话就是Swin 是一个用自注意力代替卷积、同时保留 CNN 金字塔结构的通用视觉骨干网络4. BEiT2021Bao et al., Microsoft Research论文BEiT: BERT Pre-Training of Image Transformers将 NLP 中 BERT 的掩码语言建模思想迁移到视觉掩码图像建模Masked Image Modeling, MIM。架构Backbone 仍然是标准 ViT区别在预训练策略。首先用一个离散 VAEdVAE将图像编码为离散视觉 tokenvisual tokens作为重建目标。训练时随机遮盖约 40% 的 image patch用 [MASK] token 替代让模型预测被遮盖位置对应的离散视觉 token ID分类任务。下游微调时与标准 ViT 相同。5. MAE2022He et al., Meta AI论文Masked Autoencoders Are Scalable Vision LearnersMAE 是当前影响力最大的 ViT 预训练方法之一核心亮点是非对称的编解码器设计极大降低了预训练成本。Encoder重型标准 ViT只处理未被遮盖的 patch约 25%。由于大量 patch 被掩盖Encoder 处理的序列很短计算量大幅减少约为处理完整图像的 1/4 ~ 1/8。Decoder轻型一个比 Encoder 窄得多的 Transformer。输入是 Encoder 输出的可见 patch 嵌入 被遮盖位置的 [MASK] token可学习向量加上位置编码后让 Decoder 重建被遮盖 patch 的原始像素值像素级重建MSE 损失。Decoder 仅在预训练中使用下游任务只用 Encoder。为什么高遮盖率75%有效图像相邻 patch 存在高度冗余低遮盖率会使任务过于简单靠周围 patch 插值即可高遮盖率迫使模型学习真正有语义价值的特征。MAE 的效率极高ViT-L 在 ImageNet 上预训练速度比有监督训练快约 3 倍。在做什么MAE 是一个预训练框架做的事情很简单把图像 75% 的 patch 随机遮盖掉让模型把被遮盖的像素还原出来。整个网络分两部分。Encoder 是一个标准 ViT只处理没被遮盖的 25% 的 patch输出这些 patch 的 latent 特征。Decoder 是一个很小很轻的 Transformer拿到 Encoder 的输出加上被遮盖位置的占位 token负责重建原始像素。训练完之后 Decoder 直接扔掉只留 Encoder。遮盖率高达 75% 是关键设计因为图像像素冗余度很高遮盖少了靠插值就能糊弄遮盖多了才能逼着模型真正理解语义才能合理推断被遮盖区域应该长什么样子。训练完的 Encoder 就是一个学到了丰富视觉特征的 ViT拿去接分类头、检测头等做各种下游任务效果很好。本质上就是视觉版的 BERT重建像素只是手段学到好特征才是目的。6. DINOv22023Oquab et al., Meta AI论文DINOv2: Learning Robust Visual Features without SupervisionDINOv2 是一个纯自监督框架结合了 DINOteacher-student 自蒸馏和 iBOT掩码图像建模损失。架构使用 ViT 作为 backboneViT-S/B/L/g教师网络是学生网络参数的指数移动平均EMA。训练时同一张图像的不同裁剪分别送入教师网络和学生网络通过最小化两者输出分布的差异来学习特征无需任何标签。DINOv2 特别注重高质量数据筛选从网络爬取 142M 图像并去重、筛选其特征在许多下游任务上可以直接作为冻结特征使用。核心思想DINO 的核心思想其实很简单用一个更稳定的自己来教一个更新的自己。具体来说有两个结构相同的 ViT一个叫教师一个叫学生。教师的参数是学生参数的滑动平均所以它变化很慢始终比学生稳定一些。训练时把同一张图像裁剪成大块和小块。大块同时给教师和学生看小块只给学生看。然后让学生的输出分布去匹配教师的输出分布尤其是学生只看到小块时也要输出和教师看完整大块时一样的分布。这个任务逼着学生必须从局部片段中理解全局语义比如只看到猫耳朵也要理解这是一只猫。而且整个过程没有任何人工标签教师产生目标学生去追学生更新完再慢慢带动教师进化就这样一直自举下去。训练完之后一个有趣的副产品是[CLS] token 对各个 patch 的注意力图天然地勾勒出了图像中物体的轮廓因为物体轮廓正是在所有裁剪中语义最稳定的部分模型不得不去关注它。7. Swin Transformer V22022Liu et al.在 Swin V1 基础上引入了三个改进Residual Post-Norm比 Pre-Norm 训练大模型更稳定、Scaled Cosine Attention用余弦相似度替代点积避免极端值导致的梯度问题、Log-spaced Continuous Position Bias使模型在不同分辨率间迁移更顺畅。最大版本 Swin-V2-G 达到 30亿参数。8. ViT-22B2023Dehghani et al., Google目前最大的 ViT220 亿参数。改进点在于将注意力层和 MLP 层并行计算而非串行提升了训练效率同时更好地支持跨模态任务。三、下游应用图像分类这是 ViT 的起源任务各种规模的 ViT 都在 ImageNet 等基准上达到 SOTA 水平。目标检测Swin Transformer 由于有层次化多尺度特征可以无缝替换 CNN 骨干网络与 Faster RCNN、DETR 等检测框架结合在 COCO 上刷新记录。ViTDetHe et al., 2022则研究了如何用简单 ViT 搭配特征金字塔做检测。语义/实例分割Swin Mask R-CNN 或 UperNet 在 ADE20K 等数据集表现优异。SAMSegment Anything Model使用 ViT-H 作为图像编码器实现了通用分割能力。多模态大模型CLIP、ALIGN 等视觉-语言预训练模型使用 ViT 作为视觉编码器。LLaVA、GPT-4V、Gemini 等多模态 LLM 也普遍以 ViT或 SigLIP 的 ViT 变体作为视觉塔。医学影像TransUNet、Swin-UNet 等将 ViT 用于医学图像分割ViT 对全局上下文的感知特别适合需要跨区域关联的病灶检测任务。自动驾驶BEVFormer 等使用 Transformer 处理多视角图像生成鸟瞰图特征用于 3D 目标检测。视频理解Video ViTViViT、TimeSformer 等在时空维度上扩展注意力机制用于动作识别和视频分类。生成模型DiTDiffusion Transformer用 ViT 替换 U-Net 作为扩散模型的骨干Stable Diffusion 3、FLUX 等最新扩散模型均采用此架构。四、面试常见问题与回答Q1ViT 相比 CNN 有哪些优缺点回答优点方面ViT 通过自注意力机制天然地建模全局长距离依赖关系每个 patch 在第一层就能与所有其他 patch 交互而 CNN 需要堆叠多层才能获得大感受野。ViT 具有更强的可扩展性在数据量和模型规模增大时收益更显著而 CNN 更容易趋于饱和。此外 ViT 的归纳偏置更少给模型更大的学习空间理论上上限更高。缺点方面原始 ViT缺乏 CNN 固有的归纳偏置局部连接、平移等变性在小数据集上容易过拟合。自注意力的计算复杂度是序列长度的平方O(N2)\mathcal{O}(N^2)O(N2)对高分辨率图像代价很高。此外 ViT 缺乏多尺度特征不适合直接用于目标检测和分割Swin 等变体解决了这个问题。Q2ViT 中为什么需要位置编码有哪些类型回答自注意力操作本身是**置换不变permutation invariant**的即将 patch 序列打乱顺序每个 patch 的输出不变。但图像的空间结构信息对于理解图像内容至关重要因此必须显式地注入位置信息。常见的位置编码类型有可学习的一维绝对位置编码原始 ViT 使用简单有效、二维绝对位置编码分别对行列编码再相加、相对位置偏置Swin Transformer 使用在注意力矩阵上加入相对位置可学习偏置对迁移到不同分辨率更友好、条件位置编码CPVT基于输入动态生成以及 RoPERotary Position Embedding在 LLM 中广泛使用部分 ViT 变体也采用。原始 ViT 的消融实验表明1D 和 2D 位置编码效果差别不大说明模型可以从 1D 编码中自行学习 2D 空间关系。Q3Swin Transformer 的 Shifted Window 是如何工作的为什么要做移位回答Swin 将 feature map 划分为不重叠的局部窗口如 7×7 patch在每个窗口内部独立计算自注意力将复杂度从O(N2)\mathcal{O}(N^2)O(N2)降到与窗口数量线性相关的O(N)\mathcal{O}(N)O(N)。但纯窗口注意力的问题是跨窗口没有信息交流感受野永远被限制在窗口内。Shifted Window移位窗口的解决方案是在相邻两个 Transformer 层交替使用两种窗口划分方式。偶数层用正常划分奇数层将窗口向右下方移位⌊M/2⌋\lfloor M/2 \rfloor⌊M/2⌋个 patch。这样本来处于不同窗口中的 patch 在移位后就进入同一个窗口实现了跨窗口的信息传递使感受野随着层数增加逐渐扩大至全局。移位后边缘会产生尺寸不同的小窗口为了保持批处理效率所有窗口尺寸一致使用cyclic shift attention mask技巧将图像做循环移位把边缘小块填充到对角再通过 attention mask 防止本不相邻的区域相互关注。Q4MAE 为什么使用高达 75% 的遮盖率为什么不像 BERT 那样只遮 15%回答这是图像和文本信息冗余程度不同决定的。自然语言中每个词都携带独特的语义信息遮盖一个词通常无法从周围的词精确恢复。而图像中相邻 patch 之间存在极高的像素级冗余相邻区域往往颜色和纹理相似如果遮盖率很低模型只需要简单地插值或复制周围 patch 就能完成重建学不到有意义的特征。75% 的高遮盖率迫使模型真正理解图像的语义结构才能从 25% 的可见 patch 中推断出遮盖区域的内容。此外高遮盖率也使 Encoder 只需处理约 1/4 的 patch训练速度提升 3 倍以上是一种兼顾效果与效率的设计。Q5ViT 中 [CLS] token 的作用是什么有没有替代方案回答[CLS] token 是一个可学习的向量拼接在 patch 序列最前面与所有 patch 一起参与自注意力计算。由于它没有对应任何图像区域只能通过与其他 patch 的注意力交互来聚合全局信息经过 L 层 Transformer 后它的输出向量理论上包含了对整个图像的全局摘要因此被用于分类。替代方案包括全局平均池化GAP直接对所有 patch 的最终输出取均值原始 ViT 论文的消融实验表明 GAP 效果与 CLS token 相当全局最大池化以及一些工作提出用可学习的交叉注意力来聚合特征如 Perceiver。DINOv2 的推理时同时使用 [CLS] token 和 patch 特征效果更好。Q6ViT 的自注意力复杂度是多少有哪些优化方法回答原始 ViT 对所有 N 个 patch 做全局自注意力计算复杂度为O(N2⋅d)\mathcal{O}(N^2 \cdot d)O(N2⋅d)其中 d 是特征维度。对于 224×224 的图像用 16×16 patchN196可以接受但对于 512×512 用 8×8 patchN4096计算代价急剧上升。优化方案局部窗口注意力Swin Transformer复杂度降为O(N)\mathcal{O}(N)O(N)线性注意力近似核方法如 Performer稀疏注意力只计算重要 token pair下采样PVT 等在早期阶段用大 stride 减少序列长度Flash AttentionIO 感知的算法优化在 GPU 上大幅加速注意力计算而不改变复杂度数量级。Q7为什么 ViT 在小数据集上不如 CNN如何改善回答CNN 具有强烈的归纳偏置局部连接卷积核只看局部区域和平移等变性同一特征检测器在图像各处共享权重。这些先验知识与自然图像的统计特性高度吻合使 CNN 能够从少量数据中高效学习。ViT 完全依赖数据来学习这些空间关系需要更多数据。改善方法知识蒸馏DeiT用 CNN 教师指导 ViT 学习 CNN 固有的局部偏置强数据增强Mixup, CutMix, RandAugment 等引入 CNN 结构元素如 CvT、LocalViT 在 patch 嵌入阶段用卷积引入局部感知大规模自监督预训练MAE, DINOv2 等在无标签数据上预训练再微调到下游任务更小的 patch size增加序列长度提供更细粒度的局部信息。Q8如果让你设计一个用 ViT 做目标检测的方案你会怎么做回答有两条主要路线。第一条是借鉴 Swin Transformer 的层次化设计将 Patch Merging 引入 ViT 构建多尺度特征图再搭配 FPNFeature Pyramid Network提取不同尺度的特征最后接 Faster-RCNN 或 FCOS 等检测头。这是目前工程实践中最常用的方案。第二条是ViTDetHe et al., 2022的思路坚持使用简单的非层次化 ViT通过最后一层特征做简单上采样/下采样模拟 FPN配合 Masked Attention 等技巧让 ViT 处理高分辨率输入在 COCO 上证明了非层次化 ViT 也能做到很好的检测性能。这条路线后来在 SAM 等工作中被采用。第三条是端到端的 DETR 系列DEtection TRansformer直接用 Transformer 做检测ViT 作为编码器用一组可学习的 object query 通过交叉注意力从图像特征中解码出检测框不需要 NMS架构更简洁优雅。