作为一名深度学习研究者,假如你对自然语言处置处罚(NLP)领域的Transformer架构了如指掌,那么你一定不会对它在序列建模中的强大本事感到陌生。然而,2021年由Google Research团队在ICLR上发表的论文《AN IMAGE IS WORTH 16x16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE》却将这一认识的架构带入了一个全新的领域——计算机视觉,提出了Vision Transformer(ViT)。这篇博客将为你详细剖析ViT的原理,连合你对Transformer的深厚理解,带你走进这一开创性的模型。
配景:从NLP到视觉的跨界思考
在NLP领域,Transformer(Vaswani et al., 2017)凭借其自注意力机制(Self-Attention)彻底改变了序列建模的范式。通过预练习大规模语言模型(如BERT、GPT),Transformer展现了惊艳的泛化本事和计算效率。然而,在计算机视觉领域,卷积神经网络(CNN)一直是无可争议的主宰,凭借其局部性、平移不变性等归纳偏置(Inductive Bias),在图像分类、目标检测等任务中占据主导职位。
ViT的核心思想大胆而简单:假如Transformer在NLP中能处置处罚单词序列(Token Sequence),为什么不能将图像也看作一种序列呢?作者提出,通过将图像分割成固定大小的Patch,并将这些Patch作为输入序列直接交给标准Transformer处置处罚,可以完全抛弃CNN的架构。这一实验不仅挑战了CNN的统治职位,还展现了大规模数据预练习对模型性能的深远影响。
ViT的架构:从图像到序列的转变
图像分割:给定一张输入图像 ( x ∈ R H × W × C x \in \mathbb{R}^{H \times W \times C} x∈RH×W×C )(H、W为高宽,C为通道数,通常是RGB的3),ViT将其分割为固定大小的Patch,例如 ( P × P P \times P P×P )(论文中常用 ( 16 × 16 16 \times 16 16×16 ))。这会生成 ( N = H W / P 2 N = HW / P^2 N=HW/P2 ) 个Patch,每个Patch是一个 ( P 2 ⋅ C P^2 \cdot C P2⋅C ) 维的向量。
线性投影:这些Patch被展平后,通过一个可练习的线性层映射到一个固定维度 ( D D D ) 的嵌入空间,形成Patch Embedding。这与NLP中的词嵌入过程险些一模一样,只是这里的“词”是图像Patch。
最终,输入序列为:
z 0 = [ x class ; x p 1 E ; x p 2 E ; ⋯ ; x p N E ] + E pos \mathbf{z}_0 = [\mathbf{x}_{\text{class}}; \mathbf{x}_p^1 \mathbf{E}; \mathbf{x}_p^2 \mathbf{E}; \cdots; \mathbf{x}_p^N \mathbf{E}] + \mathbf{E}_{\text{pos}} z0=[xclass;xp1E;xp2E;⋯;xpNE]+Epos
此中,( E ∈ R ( P 2 ⋅ C ) × D \mathbf{E} \in \mathbb{R}^{(P^2 \cdot C) \times D} E∈R(P2⋅C)×D ) 是投影矩阵,( E pos ∈ R ( N + 1 ) × D \mathbf{E}_{\text{pos}} \in \mathbb{R}^{(N+1) \times D} Epos∈R(N+1)×D ) 是位置编码。
2. 分类标记(Class Token)
假如你认识BERT(可以参考笔者的另一篇博客:BERT模型详解:双向Transformer的语言理解革命(预练习和微调代码实现)),你一定知道它的 [CLS] Token。ViT也借鉴了这一设计,在Patch序列前添加一个可学习的分类标记(Class Token),记为 ( x class \mathbf{x}_{\text{class}} xclass )。这个Token的作用是在Transformer编码后,作为整个图像的表示,用于后续分类任务。
3. Transformer编码器
接下来,ViT将序列 ( z 0 \mathbf{z}_0 z0 ) 输入标准Transformer编码器,与NLP中的架构完全一致:
经过 ( L L L ) 层Transformer编码后,输出序列为 ( z L \mathbf{z}_L zL )。此中,( z L 0 \mathbf{z}_L^0 zL0 )(即Class Token的输出)被用作图像表示:
y = LN ( z L 0 ) \mathbf{y} = \operatorname{LN}(\mathbf{z}_L^0) y=LN(zL0)
4. 分类头
在预练习阶段,( y \mathbf{y} y ) 被送入一个带有单隐藏层的MLP进行分类;在微调阶段,则简化为一个线性层,输出类别数 ( K K K ) 的预测。
关键特性:极简与归纳偏置的取舍
Vision Transformer以其简洁而大胆的设计,冲破了CNN在计算机视觉中的把持职位。它告诉我们,当数据和算力足够时,模型可以从头学习复杂的空间关系,而无需依赖传统归纳偏置。作为一名NLP领域的深度学习研究者,你是否也从中看到了Transformer无限可能的未来?欢迎留言分享你的见解! 参考文献
Dosovitskiy, A., et al. (2021). An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale. ICLR 2021.
ViT代码实现
以下是一个基于 PyTorch 的 Vision Transformer (ViT) 的完整、可运行的代码实现。这个实现参考了原始论文《An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale》的核心思想,包含了 Patch Embedding、Multi-Head Self-Attention 和 Transformer Encoder 的紧张组件,并以 MNIST 数据集为例进行练习和测试。为了确保代码可运行,尽量保持简洁并提供解释。
环境要求
深层(如第 10 层或更深):通过堆叠卷积和池化层,感受野扩展,逐步学习高级语义特征,如对象部件(例如猫的耳朵)或整体形状(例如整只猫)。数学上,感受野扩展遵循公式:
R F l = R F l − 1 + ( k − 1 ) ⋅ ∏ i = 1 l − 1 s i RF_l = RF_{l-1} + (k-1) \cdot \prod_{i=1}^{l-1} s_i RFl=RFl−1+(k−1)⋅i=1∏l−1si
此中 ( R F l RF_l RFl ) 是第 ( l l l ) 层的感受野大小,( k k k ) 是卷积核大小,( s i s_i si ) 是之前各层的步幅。这使得深层 CNN 能捕获全局上下文。
这种条理结构是 CNN 的归纳偏置(inductive bias),使其在数据量有限时体现良好。
ViT 的层级行为:从 Patch 到语义
ViT 的灵活性:ViT 缺乏这种固有条理结构,早期层已能全局整合信息,深层更多是精炼注意力,聚焦语义相关地域。这种数据驱动的特性使其在大数据集上体现优异,但小数据集时可能不如 CNN。
研究论文与结论
以下是关键研究:
[1] Dosovitskiy, A., et al. (2021). An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale. ICLR 2021. 分析了注意力距离,体现深层更全局,附录 D.7 提供详细可视化。