一.Vision Transformer简介

 ViT是2020年Google团队提出的将Transformer应用在图像分类的模型,虽然不是第一篇将transformer应用在视觉任务的论文,但是因为其模型‘’简单”且效果好,可扩展性强(scalable,模型越大效果越好),成为了transformer在CV领域应用的里程碑著作,也引爆了后续相关研究。

ViT通过将图像分成一系列的图块(patches),并将每个图块转换为向量表示作为输入序列。然后,这些向量将通过多层的Transformer编码器进行处理,其中包含了自注意力机制和前馈神经网络层。这样可以捕捉到图像中不同位置的上下文依赖关系。最后,通过对Transformer编码器输出进行分类或回归,可以完成特定的视觉任务。

为什么图像不能直接作为Transformer的输入呢?

图像是按照像素像素来展开的,每个像素就是一个Patch(一个 Patch 类比 NLP 中的一个词),这样的话,如果以 224*224 的输入尺寸来说,Patch数 = 224 x 224 = 50176。这样的做的缺点就是 Patch数 太大了,是不可接受的,拿 BERT 对比一下,BERT 具有 4810 亿个参数,在 2048 块 TPUv4 下需要训练 20 个小时,而 BERT 的 Patch数 也不过 512 而已,所以这显然不行。

因此vit就诞生了。

二.ViT网络结构图

vit是将图像块应用于transformer。CNN是以滑窗的思想用卷积核在图像上进行卷积得到特征图。为了可以使图像仿照NLP的输入序列,我们可以先将图像分成块(patch),再将这些图像块进行平铺后输入到网络中(这样就变成了图像序列),然后通过transformer进行特征提取,最后再通过MLP对这些特征进行分类【其实就可以理解为在以往的CNN分类任务中,将backbone替换为transformer】。

三.结果展示

        论文中作者将ViT和之前视觉领域最优秀的架构BiT(以ResNet为baseline)做对比,发现在数据集较大时,模型表现和计算耗时都比BiT优秀。

可以看到,右图中,作者使用了谷歌制作的JFT-300M数据集,当数据量小于30M时,ViT的效果表现不如ResNet,但是当数据量逐渐增大时,ViT才会慢慢超越ResNet。由此可见ViT工作的局限性,它必须要在超大数据集上进行预训练,然后再拿到其它数据集上做迁移学习,才会有好的效果。

为什么在大的数据集上ViT的效果要比ResNet的效果更好呢,我认为主要是由于ViT模型中的归纳偏置导致的,那么什么是归纳偏置呢?

上图中箭头所指的两部分都属于同一栋建筑。在卷积中,我们可以用大小适当的卷积核将它们圈在一起。但是在ViT中,它们之间的位置却拉远了,如果我把patch再切分细一些,它们的距离就更远了。虽然attention可以学习到向量间的关系,但是ViT在空间局部性的维护上,确实没有卷积做的好。而在平移等边性上,由于ViT需要对patch的位置进行学习,所以对于一个patch,当它位置变换时,它的输出结果也是不一样的。所以,ViT的架构没有很好维护图像问题中的归纳偏置假设。这就是为什么在小的数据集上ViT的效果没有ResNet好的主要原因。当然,Transformer架构的模型都有一个广为人知的特性:大力出奇迹。只要它见过的数据够多,它就能更好地学习像素块之间的关联性,当然也能抹去归纳偏置的问题。

四.ViT整体流程

Vision Transformer的模型结构相比于Transformer来说更简单,在Transformer模型中,主要包含Encoder和Decoder结构,而ViT(Vision Transformer)仅借鉴了Encoder结构。

其处理流程为:

1. Patch Embedding

ViT 利用等分窗口图片块的思想,将图像分成块,每个小块称作Patch,每个Patch块看作NLP Transformer中的一个单词。

例如,假设原始图片尺寸大小为:224*224*3(H*W*C)。

每个Patch的尺寸设为16(P=16),则每个Patch下图片的大小为:16*16*3,Patch共有 (224/16) x (224/16) = 14 x 14=196个。

再将每一个Patch的矩阵拉伸成为一个1维向量,从而获得近似词向量堆叠的效果。

如上图所示,每个Patch对应着一个token,将每个Patch展平,则得到输入矩阵X,其大小为(196, 768),其中16*16*3=768,也就是每个token是768维。通过这样的方式,我们成功将图像数据处理成自然语言的向量表达方式。

那么现在问题来了,对于图中每一个16*16*3的小方块,我要怎么把它拉平成1*768维度的向量呢?

比如说,我先把第一个channel拉成一个向量,然后再往后依次接上第二个channel、第三个channel拉平的向量。但这种办法下,同一个pixel本来是三个channel的值共同表达的,现在变成竖直的向量之后,这三个值的距离反而远了。基于这个原因,你可能会想一些别的拉平方式,但归根究底它们都有一个共同的问题:太规则化,太主观。

ViT中最终采用CNN进行特征提取,具体方案如下:

采用768个16*16*3尺寸的卷积核,stride=16,padding=0。这样我们就能得到14*14*768大小的特征图。如图所示,特征图中每一个1*1*768大小的子特征图,都是由卷积核对第一块patch做处理而来,因此它就能表示第一块patch的token向量。

2. Class Embedding

Class Embedding 主要借鉴了BERT模型的用于文本分类时的思想,在每一个Patch Embedding之前增加一个类别值,通常是加在向量的第一位。例如,Patch Embedding得到的196维的向量加上 Class Embedding 后,变成197维。Class Embedding 用于最后的类别输出,可参考BERT 的 class token,整个过程示意如下图:

Class Embedding是可以学习的参数,经过网络的不断训练,最终以输出向量的第一个维度的输出来决定最后的输出类别。由于输入是 16x16个Patch,所以输出进行分类时是取16x16个Class Embedding进行分类。

当然,也可以用ResNet中采用全局平均池化来预测类别,这两种方式都是可行的,但是更倾向于使用 class token 是因为想把原滋原味的 transformer 直接应用到 CV 领域。这两种预测类别的方式,试验效果如下:

其中,**蓝色是 class token **,橙色和绿色是全局平均池化,橙色的存在告诉你需要好好调参,结果的好坏和你调参的姿态关系很大。

3. Position Embedding

将位置编码嵌入图像块,用于表达图像块在原图的位置信息。位置编码随位置变化,即位置差别越大,位置编码差别越大。

Position Embedding 操作会创建一个197维的可训练的向量,加入到经过 Class Embedding 的向量中。Position Embedding的长度和 Class Embedding 一致,两个embedding直接相加。

论文使用的是1-D的位置编码,即和Transformer论文中使用的位置编码一致,使用了正弦和余弦函数生成位置编码向量:

其中,( pos ) 表示位置,( i ) 表示维度,(d_{model})表示嵌入向量的维度。这些公式用于计算位置编码向量的值。

当然也许有读者会有疑问:为什么图片这种具有二维位置信息的数据仍然使用一维的位置编码,当然,位置编码存在很多种,其中包括:

  • Providing no positional information:不考虑位置信息;
  • 1-dimensional positional embedding:把 CV 当 NLP 来做,只考虑一维位置信息;
  • 2-dimensional positional embedding:考虑 CV 特殊的二维空间位置信息;
  • Relative positional embedding:相对位置编码,既考虑相对位置信息又考虑绝对位置信息;

那么为什么不使用符合直觉的2维位置编码呢,其实答案非常简单,论文作者在经过大量实验后证明在这个任务上使用三种编码方式几乎没有任何区别,网络都能很好的学习到位置信息:

我们看的使用三种位置编码得到的结果几乎一致,证明在此任务上三种编码都可以,我们使用最简单的一种。

作者随后也对一维位置编码的结果进行了可视化,结果如下图所示:

上图中是每一个Patch中各位置的位置编码相似性度量,越接近黄色的位置代表越靠近位置编码的中心位置,可以看到,即使是一维位置编码,同样可以比较好地记录二维信息。

4. Transformer Encoder

模型的设计如下:

Transformer Encoder是两个块的堆叠,然后再整体叠加 L 次。这两个块指的是:

  • LayerNorm + Multi-Head Attention;
  • LayerNorm + MLP;

4.1 层标准化

层标准化(Layer Normalization)是一种用于神经网络的归一化技术,用于增强模型的训练和泛化能力。它类似于批量归一化(Batch Normalization),但在不同的维度上进行归一化。

那在NLP里为啥不喜欢用 BN 呢?因为 NLP 里输入序列往往是动态的,即序列的长度不定,一个序列就是一个样本。而BN 计算的是样本间的归一化,这样做一定会导致值域波动很大;而LN是在样本内做,不用考虑类间差异,波动就相对小很多。简单理解,Batch Normalization是对每个通道的**所有样本(样本间)进行归一化,而Layer normalization是对每个样本(样本内)**的所有特征进行归一化。

具体来说,对于一层的输入,层标准化通过以下步骤进行:

  • 对于每个样本,计算其在特征维度上的均值和方差。
  • 使用计算得到的均值和方差对样本进行归一化。
  • 应用缩放和偏移操作,以学习适当的缩放因子和偏移量,从而保留网络的表达能力。

与批量归一化相比,层标准化具有以下特点:

  • 不依赖于批次大小:批量归一化的归一化操作是在每个批次上进行的,因此对于较小的批次大小可能会引入噪声。而层标准化是在每个样本上进行归一化,因此不受批次大小的影响。
  • 更适用于循环神经网络(RNN):由于RNN的序列长度可能不同,批量归一化在序列长度变化时会面临困难。层标准化在每个样本上进行归一化,因此适用于处理变长序列。
  • 提供更强的表达能力:层标准化允许每个特征维度上的自适应归一化,可以更好地保留模型的表达能力。

4.2 多头自注意力机制(Multi-Head Attention)

Multi-Head Attention 多头注意力机制,来源于论文《Attention Is All You Need》,示意如下

多头即将模型分为多个头,形成多个子空间,让模型去关注不同方面的信息,将 Scaled Dot-Product Attention 过程做 h 次,再把输出做 cat。这样做的目的是为了使网络能够综合利用多方面角度提取更加准确的表示,从而可以捕捉到更加丰富的特征,可以类比 CNN 中多个核分别提取特征的作用。

简单来说,多头注意力的计算过程如下:

输入包括查询(Q)、键(K)和值(V)的特征矩阵。
对于每个注意力头,计算注意力权重:
使用查询矩阵Q和键矩阵K计算注意力分数。
将注意力分数进行缩放和softmax操作,得到注意力权重。
使用注意力权重对值矩阵V进行加权求和,得到每个注意力头的注意力输出。
对于所有注意力头的输出,进行拼接或加权求和,得到多头注意力的最终表示。
多头注意力的优势在于它能够捕捉不同的注意力集中模式,从而提高模型对于不同关系和特征的建模能力。每个注意力头可以关注序列中不同的上下文信息,从而提供更全面的表示。此外,多头注意力还可以提高模型的并行计算能力,加速训练和推理过程。

具体实现流程可参考:Transformer模型理解

4.3 MLP层

MLP层的结构如下:

这个多层感知机并不复杂,就是两个线性层和GELU激活函数和Dropout用于增强模型泛化性。

4.4 MLP Head(全连接头)

上面通过Transformer Encoder 后输出的shape和输入的shape是保持不变的,以ViT-B/16为例,输入的是[197, 768]输出的还是[197, 768]。

  • 注意,在Transformer Encoder后其实还有一个Layer Norm没有画出来,后面有细画的 ViT 的模型可以看到详细结构。
  • 这里我们只是需要分类的信息,所以我们只需要提取出[class]token生成的对应结果就行,即[197, 768]中抽取出 [class]token(也就是添加的分类向量) 对应的[1, 768]。
  • 接着我们通过MLP Head得到我们最终的分类结果。MLP Head原论文中说在训练ImageNet21K时是由Linear+tanh激活函数+Linear组成。
  • 但是迁移到ImageNet1K上或者你自己的数据上时,只用一个Linear即可。

五. ViT意义何在

  • 证明了一个统一框架在不同模态任务上的表现能力。在ViT之前,NLP的SOTA范式被认为是Transformer,而图像的SOTA范式依然是CNN。ViT出现后,证明了用NLP领域的SOTA模型一样能解图像领域的问题,同时在论文中通过丰富的实验,证明了ViT对CNN的替代能力,同时也论证了大规模+大模型在图像领域的涌现能力(论文中没有明确指出这是涌现能力,但通过实验展现了这种趋势)。这也为后续两年多模态任务的发展奠定了基石。
  • 虽然ViT只是一个分类任务,但在它提出的几个月之后,立刻就有了用Transformer架构做检测(detection)和分割(segmentation)的模型。而不久之后,GPT式的无监督学习,也在CV届开始火热起来。
  • 工业界上,对大部分企业来说,受到训练数据和算力的影响,预训练和微调一个ViT都是困难的,但是这不妨碍直接拿大厂训好的ViT特征做下游任务。同时,低成本的微调方案研究,在今天也层出不穷。长远来看,2年前的这个“庞然大物”,已经在逐步走进千家万户。

六. 参考链接

原始论文:An Image Is Worth 16x16 Words: Transformers For Image Recognition At Scale

https://cameronrwolfe.substack.com/p/vision-transformers

MobileViT模型简介

https://blog.csdn.net/m0_37605642/article/details/133821025

再读VIT,还有多少细节是你不知道的



 


 


 

更多推荐