ViT 攻击前置笔记:Vision Transformer 理论与训练流程

本文暂不涉及攻击代码实现。

ViT 攻击通常会涉及 FGSM、PGD、attention rollout 等内容。如果在没有梳理 Vision Transformer 基础结构的情况下直接进入攻击部分,后续的扰动位置、梯度传播路径和注意力变化都不容易解释清楚。因此,本文整理 ViT 的基本流程:图像如何被转换为 token,class token 的作用是什么,位置编码补充了哪些信息,以及训练阶段为什么常采用预训练模型并替换分类头。

本文主要参考 Vizuara AI Labs 的文章 Vision Transformers。文中图片直接引用原文图片链接,并在图下注明来源;正文部分为基于该文章和 ViT 论文的整理。代码实现将在后续部分单独记录。

Vision Transformers overview

图源,Vizuara AI Labs,Mayank Pratap Singh,Vision Transformers。

ViT 的建模动机

CNN 处理图像时具有明确的局部归纳偏置。卷积核在图像上滑动,每次关注一个局部窗口;浅层网络通常提取边缘、纹理、角点等低级特征,深层网络再逐步组合出物体部件和整体语义。这种设计引入了局部性和平移等变性等视觉先验,因此在中小规模数据集上通常具有较好的稳定性。

ViT 采用了不同的建模方式。它将图像划分为固定大小的 patch,并将这些 patch 视为序列 token 输入 Transformer encoder。其主要优势是可以较早地建模全局关系:在第一层 encoder 中,任意两个 patch 之间都可以通过 self-attention 建立联系,而不需要像 CNN 那样依赖多层卷积逐步扩大感受野。

CNN and ViT comparison

图源,Vizuara AI Labs,Mayank Pratap Singh,Vision Transformers。

Vision Transformer intuition

图源,Vizuara AI Labs,Mayank Pratap Singh,Vision Transformers。

这也是研究 ViT 攻击时需要重点关注的结构差异。CNN 中的扰动往往与局部纹理、边缘特征相关;而在 ViT 中,扰动不仅可能改变 patch token 的表示,还可能通过 self-attention 影响 patch 之间的信息传递。因此,在讨论攻击方法之前,需要先明确 ViT 内部的信息流动方式。

从文本 token 到图像 token

Transformer 最初主要用于 NLP 任务。文本天然具有序列结构,句子可以被拆分为 token,每个 token 被映射为 embedding,再加入位置编码,随后输入 encoder 或 decoder。

图像并不具备类似文本 token 的天然离散单元。ViT 的处理方式是将图像划分为固定大小的 patch,将每个 patch 展平为向量,再通过线性层映射到 Transformer 所需的表示维度。经过这一步后,一张图像就被转换为一个 patch 序列。

From text transformers to vision transformers

图源,Vizuara AI Labs,Mayank Pratap Singh,Vision Transformers。

Image as a sequence

图源,Vizuara AI Labs,Mayank Pratap Singh,Vision Transformers。

设输入图像为

patch 大小是 $P \times P$,那么 patch 数量是

每个 patch 展平后长度是

以常见的 $224 \times 224$ RGB 图像为例,当 patch size 取 16 时,有

即一张图像会被转换为 196 个 patch token。每个 patch 的原始展平维度为 $16 \times 16 \times 3 = 768$。ViT-Base 的 hidden size 也为 768,但二者在概念上并不相同:前者是 patch 展平后的像素维度,后者是 Transformer 内部的表示维度。

Patch embedding

划分 patch 只是图像序列化的第一步。Transformer 的输入不是原始像素块,而是 embedding,因此每个 patch 还需要经过一个可学习的线性投影。

Patch splitting

图源,Vizuara AI Labs,Mayank Pratap Singh,Vision Transformers。

Patch sequence

图源,Vizuara AI Labs,Mayank Pratap Singh,Vision Transformers。

把第 $i$ 个 patch 记作

线性投影矩阵是

投影后得到

其中 $D$ 是 Transformer 的 hidden dimension。所有 patch 共享同一个投影矩阵。这与文本中的词向量表示有一定相似之处,但 patch embedding 并不是查表操作,而是对像素向量进行线性变换。

Patch embedding without convolution

图源,Vizuara AI Labs,Mayank Pratap Singh,Vision Transformers。

部分实现会使用 kernel size 和 stride 都等于 $P$ 的卷积层完成 patch embedding。虽然形式上是卷积,但每次卷积正好覆盖一个 patch,并且 patch 之间不重叠,因此可以将其理解为一种高效实现的 patch 切分与线性投影。

Patch embedding with convolution

图源,Vizuara AI Labs,Mayank Pratap Singh,Vision Transformers。

Class token

分类任务需要一个向量表示整张图像。ViT 在 patch 序列前加入一个可学习的 class token。该 token 初始时只是一个参数向量;经过多层 self-attention 后,它会聚合来自各个 patch 的信息,并作为分类头的输入。

输入序列可以写成

其中

其中额外的 1 对应 class token 的位置。

Class token and patch tokens

图源,Vizuara AI Labs,Mayank Pratap Singh,Vision Transformers。

在后续攻击分析中,class token 是一个重要观察对象。分类头通常只读取 class token 的最终输出表示。如果输入扰动改变了 class token 聚合图像信息的方式,最终 logits 也会发生相应变化。

位置编码

Transformer 的 self-attention 本身不包含顺序信息。如果只输入一组 patch embedding,模型可以获得每个 patch 的内容表示,但无法区分这些 patch 在原图中的空间位置。左上角、右下角和中心区域的空间关系,都需要通过位置编码显式补充。

ViT 会给每个 token 加一个可学习的位置向量

class token 同样具有对应的位置向量。通过加入位置编码,模型可以区分相同纹理出现在不同图像位置时所对应的不同语义。

Positional encoding in ViT

图源,Vizuara AI Labs,Mayank Pratap Singh,Vision Transformers。

Adding positional embeddings

图源,Vizuara AI Labs,Mayank Pratap Singh,Vision Transformers。

这也为后续攻击分析提供了一个重要切入点。对于 CNN,局部平移通常不会完全改变模型提取到的特征;而 ViT 依赖 patch 切分和位置编码,patch 边界、token 顺序和位置向量都会参与最终表示。因此,在分析 patch-level attack 或 token-level behavior 时,需要将位置因素纳入考虑。

Encoder 里发生了什么

ViT 使用 encoder-only 结构。每一层 encoder block 主要包含 multi-head self-attention 和 MLP 两个模块,并配合 LayerNorm 与残差连接。

单头 attention 可以写成

多头 attention 会将多个 head 的结果进行拼接:

每个 encoder block 可以简化表示为

Encoder-only ViT

图源,Vizuara AI Labs,Mayank Pratap Singh,Vision Transformers。

Self-attention inside ViT

图源,Vizuara AI Labs,Mayank Pratap Singh,Vision Transformers。

其中 $\mathbf{Q}\mathbf{K}^T$ 对应注意力分数。对于图像任务,可以将其理解为 patch 与 patch 之间的关系强度。每个 patch 不仅可以关注局部邻域,也可以与远处 patch 建立联系。

这种全局建模能力也带来了计算成本。attention 矩阵大小约为

因此,随着 token 数增加,计算量和显存占用都会上升。ViT-Base 在 $224 \times 224$ 输入、patch size 为 16 时共有 197 个 token;如果 patch size 更小,token 数会进一步增加,attention 的计算成本也会随之上升。

分类头

经过 $L$ 层 encoder 后,取最后一层 class token 的输出向量

分类头一般是一个线性层

再经过 softmax 得到类别概率

训练分类任务时常用交叉熵

当标签采用 one-hot 表示时,交叉熵主要惩罚真实类别对应预测概率过低的情况。

Classification head

图源,Vizuara AI Labs,Mayank Pratap Singh,Vision Transformers。

Class token to logits

图源,Vizuara AI Labs,Mayank Pratap Singh,Vision Transformers。

至此,ViT 用于图像分类的基本链路已经完整。

整体流程可以概括为:图像被划分为 patch,patch 被映射为 embedding,随后加入 class token 和位置编码,输入多层 Transformer encoder;最后取 class token 的输出表示,接分类头,并通过 softmax 与交叉熵完成分类训练。

ViT 的优势与局限

ViT 适合建模全局关系。当目标的不同部分距离较远,或者分类需要同时考虑前景与背景关系时,self-attention 比局部卷积更直接。此外,ViT 具有较好的扩展性,在数据规模和模型规模足够大时通常能够取得较强性能。

但 ViT 对数据规模更敏感。CNN 通过结构设计引入了局部性和平移相关的视觉先验,而 ViT 需要从数据中学习更多视觉规律。因此,在小数据集上从头训练 ViT 往往不如基于预训练模型进行 fine-tuning。另一个限制是 attention 的计算成本较高,尤其在高分辨率图像或较小 patch size 的设置下更为明显。

ViT full flow

图源,Vizuara AI Labs,Mayank Pratap Singh,Vision Transformers。

ViT architecture summary

图源,Vizuara AI Labs,Mayank Pratap Singh,Vision Transformers。

训练流程整理

参考文章的 hands-on 部分使用 Oxford-IIIT Pet 数据集,共包含 37 个类别。训练思路不是从零训练 ViT,而是使用已经在大规模数据上预训练的 ViT-Base,并替换最后的分类头,使其适配宠物品种分类任务。

Oxford-IIIT Pet setup

图源,Vizuara AI Labs,Mayank Pratap Singh,Vision Transformers。

本节只记录训练流程和关键设置,代码实现将在后续部分补充。

使用的预训练模型为 $\text{ViT-Base-Patch16-224}$。模型名称包含了几个关键信息:Base 表示模型规模,Patch16 表示 patch size 为 16,224 表示输入图像分辨率为 $224 \times 224$。

输入图像需要处理为预训练模型所使用的格式。参考文章中使用的归一化均值和方差为

训练阶段的数据增强主要包括随机裁剪到 $224 \times 224$ 和随机水平翻转;验证阶段则使用 resize、center crop 和相同的 normalize。数据增强不会改变模型结构,其作用是提高输入变化的多样性,降低分类头对训练样本的过拟合风险。

Sample images

图源,Vizuara AI Labs,Mayank Pratap Singh,Vision Transformers。

fine-tuning 通常有两种设置。

一种方式是冻结 backbone,只训练分类头。这种方式训练成本较低,也更稳定,适合用于验证完整训练流程。另一种方式是解冻部分或全部 encoder,与分类头一起微调。后者可能获得更好的性能,但对学习率设置更敏感,也更容易出现过拟合。

参考文章选择先冻结 backbone,只训练 head。此时可训练参数主要是

这些参数对应前文分类头中的权重和偏置。预训练 ViT 已经具备较强的视觉特征提取能力,新分类头需要学习的是如何将这些特征映射到 37 个宠物类别。

优化器使用 AdamW,学习率是

weight decay 是

AdamW 可以理解为在 Adam 的动量和二阶矩估计基础上,将 weight decay 从梯度更新中解耦。其简化更新形式可以写为

学习率调度使用 cosine schedule,并在前 10% steps 进行 warmup。warmup 可以降低训练初期更新过大带来的不稳定性,尤其适用于分类头刚初始化的场景。

如果总训练步数是 $T$,warmup 步数是

warmup 阶段可以近似表示为

warmup 之后进入 cosine decay 阶段:

训练目标仍然是交叉熵。每个 batch 进行前向传播并得到 logits,随后计算 loss、执行反向传播并更新分类头参数。验证阶段不更新参数,只记录 loss 和 accuracy。

Training progress

图源,Vizuara AI Labs,Mayank Pratap Singh,Vision Transformers。

训练完成后,除了观察 accuracy,还需要分析混淆矩阵。accuracy 只能反映整体正确率,而混淆矩阵可以显示模型更容易混淆哪些类别。Oxford-IIIT Pet 中部分猫狗品种外观相近,因此混淆矩阵比单一准确率指标提供了更细粒度的错误信息。

Confusion matrix

图源,Vizuara AI Labs,Mayank Pratap Singh,Vision Transformers。

攻击部分的衔接位置

本文到训练流程为止。后续分析 ViT 攻击时,可以从以下几个位置衔接。

  1. 输入图像 $\mathbf{x}$。攻击可以直接在像素空间中添加扰动,常见约束为
  1. patch embedding。输入扰动会首先改变 patch token 的表示
  1. attention map。扰动可能改变不同 patch 之间的注意力分布
  1. class token。分类结果最终依赖 class token 的输出表示

后续进入攻击部分时,可以先使用训练好的 ViT 分类器完成 baseline inference,再实现基础的 untargeted attack。在像素级攻击验证完成后,再进一步分析 patch-level 和 attention-level 的变化。

参考

Mayank Pratap Singh, Vizuara AI Labs, Vision Transformers, accessed on 2026-07-06.

Dosovitskiy et al., An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale.