ViT 详解:如何把一张图变成一段 token 序列
前言 本站的《Transformer 详解》讲了如何用注意力机制处理文本:把句子切分成 token,让任意两个位置直接交互。本文回答一个相关的问题:同一套机制,能不能用来处理图像? 答案是能,这个架构就是 ViT(Vision Transformer,视觉 Transformer),由 Google 在 2020 年提出。它的核心思路是:把图像切成固定大小的小块(Patch),每块展平成一个向量,再把这些向量按顺序组成序列输入 Transformer。像素是连续矩阵,文本是离散符号,两者结构原本不同;这一步变形把图像转换成了 Transformer 能够处理的序列形式。 ViT 是本站 VLM 专栏的基础:《CLIP 详解》的视觉编码器是 ViT,《LLaVA 详解》复用的也是它。理解了 ViT,就能理解这两篇文章中的图像特征是如何产生的。 阅读前提:已经读过本站《Transformer 详解》(理解自注意力、多头、位置编码),并会写基础的 PyTorch 代码。本文会与 CNN 做对比,但不要求你已经精通 CNN。 为什么视觉需要 Transformer CNN 的归纳偏置 在 ViT 之前,视觉任务的标准做法是 CNN(卷积神经网络)。CNN 有两个内在的设计假设: 局部性(Locality):CNN认为图上相邻的像素一定是有关系的,因此它让一个固定大小的 3*3 卷积核在图片上滑动,每个输出位置只"看"周围的一小片区域。要利用远处的信息,只能逐层堆叠卷积,逐步扩大感受野。 平移等变性(Translation Equivariance):同一个卷积核在整张图上共享权重,物体平移后,对应的特征也随之平移。也就是说,一个物体无论出现在一张图片中的哪一个地方,其特征都是一样的。 这两个假设统称归纳偏置(Inductive Bias),即用先验知识规定模型理解图像的方式。优点是数据效率高,用 ImageNet 规模的数据就能训练出不错的模型;缺点是这些先验限制了模型的表达能力:局部性意味着远距离信息只能通过加深网络来间接获取,而且这些先验并非在所有任务中都成立。 ViT 的选择:去掉归纳偏置 ViT 采取相反的思路:几乎完全去掉 CNN 的归纳偏置,只保留 Transformer 结构。图像被切成 patch 后,任意两个 patch 之间可以直接交互(自注意力),远距离依赖不再是问题;平移等变性也不再由结构保证,需要模型从数据中自行学习。 这种设计的代价是数据需求:归纳偏置越少,需要的数据就越多。ViT 论文的对比实验直接说明了这一点(详见"训练"一节):在 ImageNet(128 万张图)上从头训练时,ViT 的表现与同规模的 ResNet 相当;在更大的数据集(ImageNet-21k、JFT-300M)上预训练后,ViT 超过最强的 CNN 基线,而且数据规模越大,优势越明显。 ...