基于视觉Transformer (ViT) 的图像分类算法
字数 3270 2025-12-15 16:31:11
基于视觉Transformer (ViT) 的图像分类算法
题目描述
视觉Transformer (ViT) 是一种将自然语言处理领域取得巨大成功的Transformer架构应用于计算机视觉任务(特别是图像分类)的开创性算法。与传统的卷积神经网络(CNN)不同,ViT将输入图像分割成一系列不重叠的图像块(patches),将这些图像块线性嵌入为向量序列,并加上位置编码,然后将这个序列直接输入到标准的Transformer编码器中进行处理。其核心思想是将图像视为一个“序列”,利用Transformer强大的全局建模能力来捕获图像中长距离的依赖关系。我们将详细解析ViT如何将图像转换为适合Transformer处理的格式,其模型结构如何工作,以及其优势与挑战。
解题过程(循序渐进讲解)
-
问题分析与核心思想拆解
- 传统方法的局限:在ViT之前,图像分类主要依赖CNN。CNN通过局部感受野和卷积核的滑动窗口,有效地捕获图像的局部特征(如边缘、纹理),并通过堆叠层和池化操作逐步整合全局信息。然而,CNN在建模图像中相距很远的像素或区域之间的长距离依赖关系时,效率相对较低,需要很深的网络。
- Transformer的启发:Transformer在NLP中通过自注意力机制,能够直接计算序列中任意两个元素(如单词)之间的关系,天生擅长捕获长距离依赖。ViT的核心思想是:能否将一张图片也看作一个“序列”,从而利用Transformer来处理?
- 关键挑战:图片的像素是二维结构,而Transformer处理一维序列。如何将2D图像映射为1D序列,并保留其空间信息,是首要难题。
-
第一步:图像序列化 (Image to Sequence)
- 这是ViT的第一步,也是最关键的一步,将图像“打碎”成块并编码。
- 图像分块 (Patch Embedding):
- 输入:一张图像
X∈ ℝ^(H×W×C),其中H是高度,W是宽度,C是通道数(如RGB图像的C=3)。 - 分割:将图像
X分割成N个固定大小的、不重叠的方形块(Patches)。假设每个块的尺寸为P×P,那么总共的块数N = (H × W) / (P × P)。例如,输入224x224的图像,P=16,则N = (224×224)/(16×16) = 196个图像块。 - 扁平化:将每个图像块
x_p∈ ℝ^(P×P×C) 拉伸成一个一维向量,维度为 P²·C。对于P=16, C=3,这个向量长度为768。 - 线性变换:通过一个可训练的线性投影(全连接层)将这个长度为P²·C的向量映射到一个模型固定的隐层维度D上。这个操作被称为“图像块嵌入”(Patch Embedding)。经过此步骤,我们得到了一个形状为 (N, D) 的矩阵。其中,每一行代表一个图像块的嵌入表示。
- 输入:一张图像
- 位置编码 (Position Embedding):
- 问题:Transformer的自注意力机制本身是对“集合”的操作,不包含顺序信息。但图像块的位置(上下左右)是至关重要的信息。
- 解决方案:为每个图像块(对应序列中的一个位置)分配一个可学习的位置编码向量,其维度也是D。将这个位置编码向量加到对应的图像块嵌入向量上。这样,模型就能在后续处理中“知道”每个块原本在图像中的位置。
- 分类令牌 (Class Token):
- 在序列的开头,额外添加一个可学习的嵌入向量,称为
[class]令牌。这个令牌本身不携带任何图像块信息,其作用类似于一个“占位符”或“汇集器”。 - 经过Transformer编码器处理后,这个
[class]令牌的输出状态(对应于序列的第一个位置)将被用来输入一个分类头(MLP),用于最终的图像分类预测。它聚合了整个图像序列的全局信息。
- 在序列的开头,额外添加一个可学习的嵌入向量,称为
-
第二步:Transformer编码器处理序列
- 输入序列:经过第一步,我们得到了一个形状为 (N+1, D) 的序列,其中“+1”就是额外添加的
[class]令牌。 - Transformer编码器结构:这个序列会被送入一个由L个完全相同的Transformer编码器层堆叠而成的模块。每个编码器层主要由两个核心子层构成:
- 多头自注意力层 (Multi-Head Self-Attention, MSA):
- 这是Transformer的核心。对于序列中的每一个元素(例如,一个图像块嵌入加上位置编码),它会计算它与序列中所有其他元素(包括自己)的“注意力分数”。
- 自注意力机制:通过计算查询(Query)、键(Key)、值(Value)向量,得到一个加权和。简单来说,它允许模型“关注”图像中任意两个块之间的关系,无论它们相距多远。例如,要判断一张图片是否是“鸟”,模型可以同时关注“鸟喙”所在的块和“翅膀”所在的块,并建立它们之间的联系。
- 多头 (Multi-Head):将注意力机制并行执行多次(例如12次),每次使用不同的、可学习的线性变换来生成Q、K、V。这允许模型从不同的“表示子空间”中共同关注信息,增强了模型的表征能力。最后,将所有头的输出拼接并线性变换。
- 多层感知机 (MLP):
- 对自注意力层的输出进行非线性变换。通常由两个全连接层和激活函数(如GELU)组成,用于特征增强和转换。
- 残差连接 (Add) 与层归一化 (Norm):
- 每个子层(MSA和MLP)的输出在传入下一层或下一个子层前,都会先与它的输入进行残差连接(相加),然后再进行层归一化。即:
y = LayerNorm(x + Sublayer(x))。这种结构极大地缓解了深层网络训练中的梯度消失问题,是Transformer能够堆叠很多层的关键。
- 每个子层(MSA和MLP)的输出在传入下一层或下一个子层前,都会先与它的输入进行残差连接(相加),然后再进行层归一化。即:
- 多头自注意力层 (Multi-Head Self-Attention, MSA):
- 输入序列:经过第一步,我们得到了一个形状为 (N+1, D) 的序列,其中“+1”就是额外添加的
-
第三步:分类与输出
- Transformer编码器输出一个 (N+1, D) 的序列。
- 我们只取出序列的第一个位置,即对应
[class]令牌的输出向量z_L^0∈ ℝ^D。 - 将这个向量通过一个简单的多层感知机分类头(MLP Head),通常由一个层归一化、一个线性层(有时会先接一个小的MLP)组成。
- 最终,分类头输出一个长度为类别数的向量,再经过Softmax函数得到每个类别的预测概率。
-
模型特点、优势与挑战
- 优势:
- 全局建模能力:得益于自注意力机制,ViT能从第一层就开始建立图像中任意两个块之间的依赖关系,擅长捕获图像的全局结构。
- 可扩展性强:模型性能随着数据量、模型大小(深度D、头数、层数L)和计算资源的增加而稳定提升,展现出强大的缩放规律。
- 结构简洁:核心就是标准的Transformer编码器,没有复杂的CNN设计(如空洞卷积、各种池化等)。
- 挑战与后续改进:
- 数据饥渴:原始的ViT在中等规模数据集(如ImageNet-1k)上训练,效果不如同等规模的CNN。它需要在大规模数据集(如JFT-300M)上预训练,才能发挥出超越CNN的优势。这催生了DeiT(Data-efficient Image Transformer) 等算法,通过知识蒸馏等技术,让ViT能在ImageNet-1k上有效训练。
- 计算复杂度:自注意力机制的计算复杂度与序列长度N的平方成正比。当图像分辨率很高、N很大时(例如N=196已经不小),计算开销巨大。后续出现了Swin Transformer等算法,通过引入局部窗口注意力、层次化结构等,显著降低了计算复杂度,并使其能更灵活地处理下游任务(如检测、分割)。
- 优势:
总结:ViT算法将图像视为一系列图像块的序列,通过“图像分块嵌入 + 位置编码”巧妙地将2D图像数据转化为适合Transformer处理的1D序列。其核心是利用Transformer编码器中的多头自注意力机制,对图像的全局上下文进行建模。这一范式打破了CNN在视觉任务中的长期主导地位,开辟了Vision Transformer这一广阔的研究方向,引领了后续许多基于Transformer的视觉模型发展。