Vision Transformer

📅 2026/7/3 2:46:38
Vision Transformer
依然能够发挥作用于是 Vision Transformer 应运而生。它尝试回答的问题便是如果抛开卷积结构仅依赖注意力机制能否完成视觉任务的建模我们以此为出发点展开 Vision Transformer即ViT的逻辑。1. ViT 的核心思想#ViT 提出于 2020 年的论文An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale它首次证明了纯 Transformer无卷积可以在视觉任务上达到 SOTA。你会发现 ViT 的提出距离原始 Transformer 的发表已经过去三年了但这并不意味着Transformer 的发展进入了停滞期。实际上这三年正是 Transformer 爆炸式扩展的阶段只不过主要发生在 NLP 内部在语言任务中完成充分验证之后Transformer 逐渐被视为一种通用的序列建模框架。在此基础上向视觉等其他模态的扩展才成为顺理成章的下一步。再回到 ViT 自身其核心思路不难理解可以一句话概括把图像切成“块Patch”然后当作 token 序列送入 Transformer 的 encoder 。2.ViT 的数据处理#要说明的是对标 CV 任务ViT 只使用了 Transformer 的 encoder 逻辑因此其重点其实是在对数据的处理上。2.1 Patch 划分#首先我们要把图像分割成一个个等大不重叠的块即 Patch :原始 ViT 设计输入图像大小为 224×224×3而 patch 大小是 16×16 。于是最终得到 patch 数量即为224×22416×1614×14196很好理解再简单推广一下对于输入图像∈××如果设计每个 patch 大小为 ×那么得到的 patch 数量就是22.2 展平#现在我们已经把一张二维图像拆成了 个小块。但仍然存在问题Transformer 并不能直接处理二维结构的数据它只能接收“向量序列”。因此接下来要做的事情就很明确了把每一个 Patch 转换为一个向量。而转换方法就是最基本的展平即对于每一个 patch其原始形状为××我们将其按通道展开为一个一维向量∈2⋅以 ViT 中的配置 16、3 为例则∈16×16×3768现在每一个 patch 已经变成了一个固定长度的向量表示。但是我们在很早之前的图像处理基础中就提到过展平会带来空间信息的损失。在这一步处理后数据就无法再提供类似“鼻子要在嘴巴上面”的空间信息了这也是我们在卷积内容中提到的用全连接网络处理图像的弊端之一。显然ViT 会采用别的措施来弥补这个问题我们继续2.3 线性映射#完成展开后我们已经得到了每个 patch 的序列表示但这里还有一个细节问题展平后的向量维度是 2而 Transformer 的输入维度通常是一个统一的隐藏维度 。因此我们将每个 patch 展平后的向量通过一个线性变换映射到目标维度现在一个 patch 就变成了一个 token。不过显然一个明显的问题就是如果 2 ,那这一步是不是就没有必要了答案当然是否定的在这里我们不仅要看维度关系还要想到线性层本身在这里的语义作用如果我们不对原始二维信息“序列化”那么在一个常见的卷积网络中我们会使用卷积层来进行特征提取其运算逻辑本身仍是可学习参数下的加权求和。而现在我们把 patch 转换为 token 输入线性层本身仍然是特征提取的过程类比来说patch 就相当于感受野而权重就是卷积核。而我们最终得到的向量其实就相当于完成了对 patch 的词嵌入过程。2.4 [CLS] token#在正式进入模型前我们对输入的处理仍没有结束我们把一幅图像转变为一组 token 那么一个问题是在分类任务中我们应该使用哪一个 token 来代表整张图像如果发散来想可能的做法包括对所有 token 做平均或拼接所有 token 后再融合等。但 ViT 的选择是引入一个专门用于“汇聚全局信息”的 token即 [CLS] token。在更广的应用任务中也叫全局 token。展开来说对于原本划分为 个 token 的图像[1,2,…,]我们在最前面拼接一个 [CLS] token[,1,2,…,]这里的 是一个随机初始化的可学习参数与其他 token 具有完全相同的维度。要强调的是[CLS] token 是一个可学习参数所以这里的“汇聚全局信息”是我们为其赋予的语义并在之后的逻辑里实现的。我们先继续传播过程在下面就会展开其具体逻辑2.5 位置编码 PE#现在我们还有一个遗留问题由patch 转换得到 token 失去了彼此之间的“位置信息”。不像 CNN 现在模型并不知道哪个 patch 在左上角、哪个 patch 在右下角、哪些 patch 是相邻的。这显然是不合理的因为在视觉任务中位置本身就是一种极其重要的信息。因此ViT 延续了 NLP 中的机制位置编码。但和原始 Transformer 的正余弦固定编码不同ViT 使用的是可学习位置编码展开来说在 ViT 中位置编码被建模为一组可学习的参数矩阵模型为每一个 token 位置都分配一个对应的向量表示这些向量在训练过程中与模型参数一起被优化。假设输入序列包含 1 个 token其中包含 1 个 [CLS] token 和 个 patch token则位置编码可以表示为∈(1)×其中每一行都对应一个位置的可学习向量以此完成 PE 的注入。到这里我们就完成了数据的所有处理我们留下了两个问题没有详细展开ViT 究竟如何弥补空间信息的损失[CLS] token 如何“汇聚全局信息”二者在 ViT 的 Transformer 逻辑便可以被解答。3. ViT 的 Transformer 逻辑#就像最开始说的ViT 只使用了 Transformer 的 encoder ,我们在前面的内容里已经详细展开过了这里我们摆一下原论文中的完整传播图网络结构本身十分清晰我们从刚刚的问题出发展开这部分里要理解的内容3.1 ViT 究竟如何弥补空间信息的损失#对于这个问题可能在刚刚的位置编码可能会有所启发既然 PE 是可学习的那难道空间信息是训练出来体现在 PE 中的吗如果只停留在这里就片面甚至错误了。实际上真正完成“空间关系建模”的是自注意力机制。展开来说首先我们已经不只一次提到过自主力机制的全局建模能力了也就是说当patch 转换成的 token 序列输入自注意力中后每一个 patch token都可以直接和所有其他 patch 建立联系。通过注意力我们可以学习得到不同 patch 间的相关性但是仅仅知道这个不够的如果向量里没有位置信息我们就无法学习到位置上的关联因此 PE 仍然必不可少。二者结合虽然模型不知道“左上角”这个概念但它可以学到哪些 patch 经常一起出现例如眼睛和鼻子。哪些 patch 存在相对结构例如天空通常在地面上方。到这里关键点就出现了ViT 不同于卷积让空间结构作为已知信息加入训练空间信息其实是 ViT 的统计学习结果。其实从直觉角度对这种逻辑先想到的应该是它的局限对数据量的高要求。但它的优势在于全局建模能力CNN 想看到全局必须叠很多层或者用大卷积核但 ViT 一步到位第一层注意力就已经是全局感受野。最终对这个问题的答案是ViT 并没有“恢复”空间结构而是用“位置编码 自注意力”在数据中重新学习空间结构。3.2 [CLS] token 如何“汇聚全局信息”#