尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Vision Transformer核心原理与实战:从图像分块到自注意力机制详解

Vision Transformer核心原理与实战:从图像分块到自注意力机制详解 1. 项目概述从卷积到注意力视觉领域的范式转移如果你在过去几年里一直关注计算机视觉领域那么“Vision Transformer”这个名字你一定不陌生。它就像一颗投入平静湖面的巨石彻底打破了卷积神经网络CNN长期以来的统治地位。我最初接触ViT时感觉就像第一次看到有人用螺丝刀拧开了啤酒瓶盖——工具用错了地方但效果却出奇地好。Transformer这个原本为自然语言处理NLP而生的架构竟然能在图像分类、目标检测等视觉任务上取得超越CNN的顶尖性能这本身就充满了颠覆性的魅力。简单来说Vision TransformerViT的核心思想是抛弃了CNN赖以成名的局部感受野和空间归纳偏置转而将一张图像视为一系列“图像块”的序列然后直接套用纯Transformer编码器对这些序列进行建模。它解决的核心问题是如何让模型摆脱对局部特征的过度依赖从而建立起图像中任意两个区域之间的长距离依赖关系。这对于理解图像的整体语义、处理复杂场景至关重要。无论是希望深入理解前沿模型架构的研究者还是寻求在项目中应用更强视觉基石的工程师ViT都是一个绕不开的里程碑。它并不简单但一旦理解了其设计精髓你会对“特征表示”这件事有全新的认识。2. ViT核心设计思路拆解为什么是“分块”与“注意力”要理解ViT绝不能把它看作Transformer在图像上的生硬套用。其每一个设计选择背后都有深刻的考量主要为了解决Transformer应用于视觉数据时面临的独特挑战。2.1 图像序列化从2D像素到1D令牌Transformer的输入是一个一维的令牌序列。图像是标准的二维网格数据如何适配ViT采用了一个极其直接却有效的策略分块嵌入。具体操作是将一张输入图像例如 224x224 像素3通道分割成固定大小的非重叠图像块。假设每个块大小为 16x16那么总共会得到 (224/16) * (224/16) 14 * 14 196 个图像块。每个图像块16x16x3768维被展平成一个向量然后通过一个可训练的线性投影层全连接层映射到模型隐藏维度 D例如768。这个线性投影层的作用类似于一个小的“特征提取器”将原始的像素信息投影到Transformer能够处理的语义空间。注意这个“分块”操作是ViT的第一个关键超参数。块尺寸越小序列长度越长如 8x8 块会得到 784 个令牌计算量呈平方级增长块尺寸越大序列越短但每个块包含的原始信息越粗糙可能丢失细节。16x16是原文中在精度与效率间的一个平衡点。2.2 可学习的位置编码弥补缺失的空间信息CNN通过卷积核的滑动天然地编码了像素间的空间邻近关系即空间归纳偏置。而Transformer的自注意力机制本身是排列不变的它对输入序列的顺序不敏感。打乱输入令牌的顺序自注意力计算的输出在数学上是等价的。这显然不符合图像数据的特性。因此ViT必须显式地注入空间位置信息。它采用了可学习的一维位置编码。为序列中的每一个图像块令牌加上一个额外的[class]令牌分配一个可学习的D维向量。这些位置编码向量与图像块嵌入向量直接相加作为Transformer编码器的输入。这里有一个重要的设计细节为什么用一维而不是二维位置编码理论上二维位置编码如分别编码行、列信息更符合图像直觉。但原文作者通过实验发现使用一维可学习位置编码已经能取得很好的效果且更简单。这暗示着模型有能力从数据中学习到足够的位置表示模式。2.3 [class]令牌全局语义的聚合器在NLP的BERT模型中有一个特殊的[CLS]令牌用于聚合整个句子的信息供下游分类任务使用。ViT借鉴了这一设计引入了一个可学习的分类令牌。在序列化之前我们预先准备一个维度为D的可学习向量称为[class]令牌。将这个令牌与所有的图像块令牌拼接在一起形成最终的输入序列[class_token, patch_1, patch_2, ..., patch_N]。这个[class]令牌会与所有图像块令牌一起经过所有Transformer层的自注意力计算。在最后一层Transformer的输出中我们取对应[class]令牌位置的输出向量将其送入一个轻量级的分类头通常是一个MLP即可得到最终的图像类别预测。其背后的思想是通过自注意力机制[class]令牌能够“看到”并聚合所有图像块的信息从而编码了整张图像的全局语义。实操心得有些后续研究如DeiT尝试不使用[class]令牌而是对所有图像块令牌的输出进行全局平均池化GAP作为图像表示。两种方式各有优劣。[class]令牌更像一个专门的“信息收集器”而GAP则是一种无参数的聚合方式。在实际应用中如果下游任务多样GAP有时更具灵活性。3. Transformer编码器在ViT中的核心运作机制ViT的主体结构是一个由L个相同层堆叠而成的标准Transformer编码器。每一层都包含两个核心子层多头自注意力层和前馈神经网络层每个子层前后都应用了层归一化和残差连接。这是ViT强大表征能力的引擎。3.1 多头自注意力机制建立任意块间的关联这是Transformer的灵魂也是ViT理解图像全局上下文的关键。对于输入序列X包含位置编码我们通过三个不同的线性变换矩阵W_Q, W_K, W_V为每个令牌生成查询向量、键向量和值向量。自注意力的计算过程可以这样理解假设你在一场会议中图像。每个与会者图像块都有一个想法值向量V。为了了解整个会议达成的共识每个与会者会提出一个问题查询向量Q并聆听其他所有人的观点陈述键向量K。注意力分数就是通过比较自己的问题Q与他人的陈述K的相似度来计算相似度越高说明那个人的观点对回答你的问题越重要他的想法V在你的最终总结中权重就越大。最后将所有与会者的想法按其重要性权重加权平均就得到了你基于全局信息的理解。公式上对于单个注意力头Attention(Q, K, V) softmax(QK^T / sqrt(d_k)) V。除以sqrt(d_k)是为了防止点积结果过大导致softmax梯度消失。“多头”的意义只使用一个注意力头模型只能从一个“视角”去建立关联。多头注意力允许模型并行地从多个不同的表示子空间即使用多组不同的W_Q, W_K, W_V学习信息。这好比让多个专家同时从不同角度颜色、纹理、形状、空间关系分析图像块之间的关系最后将他们的见解拼接起来形成更丰富、更稳健的表示。3.2 前馈神经网络与残差连接非线性变换与稳定训练经过自注意力层聚合了全局信息后每个令牌的表示被送入一个前馈神经网络。这是一个简单的两层MLP通常中间层的维度会扩大例如D768 - 中间层3072 - D768。它的作用是对每个令牌的表示进行独立的、复杂的非线性变换增强模型的表达能力。层归一化与残差连接是训练深层Transformer模型稳定的基石。每个子层MSA, MLP都被包裹在残差连接中即输出 子层(层归一化(输入)) 输入。层归一化被应用在子层之前Pre-NormViT采用的方式这有助于缓解梯度消失/爆炸使训练更稳定。残差连接则确保了信息可以跨层直接流动让模型能够轻松地学习恒等映射这对于构建数十甚至上百层的深度网络至关重要。4. 从零开始理解ViT的完整前向传播流程让我们把上述所有组件串联起来走一遍ViT处理一张图像的全过程。假设我们有一张224x224的RGB图片模型隐藏维度D768注意力头数12Transformer层数L12。步骤1图像分块与嵌入图像分割(224, 224, 3)- 分割成(14, 14)个(16, 16, 3)的图像块。展平每个块展平为长度16*16*3768的向量得到形状为(196, 768)的矩阵。线性投影通过一个可训练的矩阵E (768, 768)将每个块投影到D维空间得到图像块嵌入(196, 768)。添加[class]令牌准备一个可学习的向量(1, 768)拼接到图像块嵌入之前得到(197, 768)。添加位置编码准备一组可学习的位置编码(197, 768)与上一步的结果逐元素相加。至此输入序列Z_0准备完毕。步骤2Transformer编码器堆叠对于l 1 to L(共12层)第l层输入为Z_{l-1}。层归一化1对Z_{l-1}进行层归一化。多头自注意力对归一化后的序列计算12个头的注意力每个头维度为768/1264。计算完成后将12个头的输出拼接再经过一个输出线性层得到MSA输出。残差连接1Z‘_l MSA(LN(Z_{l-1})) Z_{l-1}。层归一化2对Z‘_l进行层归一化。前馈神经网络对归一化后的每个令牌独立通过一个两层MLP例如768-3072-768。残差连接2Z_l MLP(LN(Z‘_l)) Z‘_l。输出Z_l作为下一层的输入。步骤3分类头经过L层后我们得到最终序列Z_L形状为(197, 768)。提取[class]令牌对应的输出取Z_L的第0行得到(1, 768)的向量它代表了整张图像的编码。通过一个分类头通常是一个层归一化层可选加一个线性层将768维向量映射到目标类别数如ImageNet的1000维。输出类别概率。参数计算小贴士ViT-Base/16上述配置的参数主要在哪线性投影层E: 768768≈0.59M位置编码197768≈0.15M每个Transformer层MSA的QKV投影和输出投影约4768768≈2.36MMLP约 76830722≈4.72M加上两个层归一化的参数单层约7.1M12层共约85M分类头参数可忽略。总计约86M参数。这比同性能的某些大型CNN要少但计算量FLOPs可能更高主要因为自注意力是序列长度的平方复杂度。5. ViT训练的关键技巧与实战经验直接按照上述架构在ImageNet上从头训练一个ViT效果可能并不理想甚至不如ResNet。这是因为Transformer缺乏CNN固有的空间归纳偏置需要更多的数据才能学习到这些视觉先验。ViT的成功离不开一系列精妙的训练技巧和策略。5.1 大规模预训练数据饥渴的本质这是ViT论文最核心的结论之一Transformer在视觉任务上的表现强烈依赖于训练数据量。在ImageNet-1K130万张图上从头训练ViT的表现略逊于优秀的ResNet。但当在更大的数据集如JFT-300M3亿张私有标注图像上进行预训练后再迁移到ImageNet等下游任务进行微调ViT的性能实现了对CNN的显著超越。这揭示了ViT的本质它是一个数据饥渴型模型。其强大的建模能力尤其是长距离依赖需要海量数据来“喂养”以学习到从像素到高级语义的映射以及图像中复杂的空间关系。对于大多数研究者或工程师而言直接获取JFT级别的数据集不现实。因此一个实用的建议是优先考虑使用在超大数据集上预训练好的ViT模型作为起点在自己的任务上进行微调。这比从头训练要高效、可靠得多。5.2 微调策略分辨率调整与位置编码插值预训练通常在固定分辨率如224x224下进行。但在下游任务中尤其是目标检测、分割输入分辨率可能更高。直接上采样图像块会导致块序列长度变化而预训练的位置编码是固定长度的如197。ViT采用了一种巧妙的位置编码插值方法。假设预训练时图像大小为(H, W)块大小为P则位置编码序列长度为(H/P)*(W/P)1。微调时图像大小为(H‘, W’)。我们需要一个长度为(H‘/P)*(W’/P)1的新位置编码。做法是将预训练好的位置编码不包括[class]令牌对应的那个从形状(N, D)重塑为(sqrt(N), sqrt(N), D)的2D网格这隐含了其编码了2D位置信息然后使用双线性插值将其调整到新的2D尺寸(H‘/P, W’/P)最后再展平回(N‘, D)。这种方法能有效将位置信息迁移到新分辨率上通常只需要很少的微调步数就能适应。5.3 优化器与超参数选择训练ViT需要格外注意优化策略。AdamW优化器是标配因为它能很好地处理权重衰减。学习率需要采用带热启动的余弦衰减调度在训练初期用一个很小的学习率如1e-6进行几个epoch的“热启动”让模型稳定适应然后线性增加到预设的峰值学习率如3e-3之后按照余弦函数衰减到0。这种策略对Transformer家族的模型非常有效。另一个关键点是梯度裁剪。由于自注意力层的计算可能存在数值不稳定尤其是在训练初期对梯度范数进行裁剪例如设定阈值为1.0可以防止梯度爆炸保证训练平稳。6. 常见问题、实战陷阱与解决方案在实际使用和复现ViT时会遇到一些典型问题。以下是我在项目和实验中总结的一些“坑”和应对方法。6.1 显存溢出与计算效率问题问题自注意力机制的计算和内存复杂度与序列长度的平方成正比。对于高分辨率图像如384x384块大小为16时序列长度也有576这会导致巨大的计算图和显存占用。解决方案梯度检查点这是一种用时间换空间的技术。在前向传播时不保存某些中间激活值在反向传播需要时重新计算它们。虽然增加了计算量但能显著降低显存消耗。PyTorch中可以通过torch.utils.checkpoint轻松实现。混合精度训练使用Automatic Mixed Precision (AMP)将部分计算如前向传播和梯度计算转换为半精度浮点数FP16可以大幅减少显存占用并加速训练。但需注意权重更新仍需使用全精度FP32以保证稳定性。使用更高效的注意力变体这是研究热点。可以考虑使用诸如Swin Transformer中提出的窗口注意力移位窗口机制将全局注意力计算限制在局部窗口内同时通过窗口移位实现跨窗口连接复杂度从序列长度的平方降为线性。或者探索Performer、Linformer等基于核函数或低秩近似的线性注意力方法。6.2 训练不稳定或收敛缓慢问题模型Loss震荡、不下降或者收敛速度远慢于预期。排查与解决检查初始化与归一化确保所有线性层和卷积层如果有使用了正确的初始化如Transformer常用的截断正态分布。Pre-LayerNorm是必须的。检查层归一化的epsilon值是否合理通常为1e-6或1e-12。学习率与热启动如前所述没有热启动直接使用高学习率很容易导致训练崩溃。务必使用带热启动的学习率调度。权重衰减AdamW优化器中的权重衰减参数至关重要。对于ViT一个常见的值是0.05或0.1。过小的权重衰减可能导致过拟合过大则可能抑制模型能力。数据增强强度ViT相比CNN对强数据增强如RandAugment, Mixup, CutMix的依赖度更高。这些增强策略能有效提供正则化防止过拟合并提升模型鲁棒性。如果训练数据有限务必使用这些增强策略。6.3 下游任务适配难题问题将预训练的ViT用于目标检测或语义分割时如何提取多尺度特征图ViT默认输出是单尺度的序列。解决方案 ViT作为骨干网络用于密集预测任务时需要一些额外的设计特征金字塔构建一种简单的方法是使用Vision Transformer的中间层特征。不同深度的Transformer层捕获了不同抽象级别的特征。可以选取最后几层的输出经过上采样或卷积调整后融合成特征金字塔。使用分层ViT变体这是更主流和优雅的方案。例如Swin Transformer它通过“Patch Merging”操作在多个阶段逐渐下采样特征图并扩大感受野天然地构建了类似CNN的金字塔特征层次非常适合下游任务。Hybrid Architecture另一种思路是ViT论文中提到的混合架构。使用一个轻量级的CNN如ResNet的前几层作为“干细胞”将图像先转换成特征图再将特征图分块送入Transformer。这样CNN提供了低级的、具有空间结构的特征Transformer在此基础上建立高级语义关联。6.4 模型解释性注意力图可视化理解ViT究竟“看”到了什么对于调试和建立信任很重要。一个强大的工具是注意力图可视化。方法取出最后一层或你感兴趣的某一层中[class]令牌对所有图像块令牌的注意力权重。这个权重矩阵的形状是(1, num_heads, num_patches1)。我们可以对每个注意力头将权重排除[class]令牌自身重塑回(H/P, W/P)的二维网格然后上采样到原图尺寸叠加在原图上进行显示。解读你会发现不同的注意力头关注图像的不同区域。有些头可能专注于物体主体有些头关注背景上下文有些头可能建立了物体部件间的联系。这直观地展示了ViT如何通过自注意力机制整合全局信息来进行分类决策。如果发现注意力图非常分散或集中在无关区域可能意味着模型训练不充分或存在其他问题。
返回列表