Vision Transformer基础

Vision Transformer基础

模型介绍

ViT原论文中最核心的结论是,当拥有足够多的数据进行预训练的时候,ViT的表现就会超过CNN,突破transformer缺少归纳偏置的限制,可以在下游任务中获得较好的迁移效果。

但是当训练数据集不够大的时候,ViT的表现通常比同等大小的ResNets要差一些,因为Transformer和CNN相比缺少归纳偏置(inductive bias),即一种先验知识,提前做好的假设。CNN具有两种归纳偏置,一种是局部性(locality/two-dimensional neighborhood structure),即图片上相邻的区域具有相似的特征;一种是平移不变形(translation equivariance), f(g(x))=g(f(x))f(g(x))=g(f(x)) ,其中g代表卷积操作,f代表平移操作。当CNN具有以上两种归纳偏置,就有了很多先验信息,需要相对少的数据就可以学习一个比较好的模型

  • Transformer相较于CNN结构,缺少一定的平移不变性和局部感知性,因此在数据量不充分时,很难达到同等的效果。具体表现为使用中等规模的ImageNet训练的Transformer会比ResNet在精度上低几个百分点。

  • 当有大量的训练样本时,结果则会发生改变。使用大规模数据集进行预训练后,再使用迁移学习的方式应用到其他数据集上,可以达到或超越当前的SOTA水平。

ViT的结构

参考:

ViT将输入图片分为多个patch(16x16),再将每个patch投影为固定长度的向量送入Transformer,后续encoder的操作和原始Transformer中完全相同。但是因为对图片分类,因此在输入序列中加入一个特殊的token,该token对应的输出即为最后的类别预测。

img

Patch+Position Embedding

考虑到在Transformer结构中,输入是一个二维的矩阵,矩阵的形状可以表示为 (N,D),其中 N是sequence的长度,而 D 是sequence中每个向量的维度。因此,在ViT算法中,首先需要设法将 H×W×C的三维图像转化为 (N,D)的二维输入。

ViT中的具体实现方式为:将 H×W×C的图像,变为一个 N×(P2∗C)的序列。这个序列可以看作是一系列展平的图像块,也就是将图像切分成小块后,再将其展平。该序列中一共包含了 N=HW/P2个图像块,每个图像块的维度则是 (P2∗C)。其中 P 是图像块的大小C 是通道数量。经过如上变换,就可以将 N 视为sequence的长度了。

但是,此时每个图像块的维度是 (P2∗C),而我们实际需要的向量维度是 D,因此我们还需要对图像块进行 Embedding。这里 Embedding 的方式非常简单,只需要对每个 (P2∗C)的图像块做一个线性变换将维度压缩为D即可

图2 图像分块嵌入示意图

例如:输入图片大小为224x224,将图片分为固定大小的patch,patch大小为16x16,则每张图像会生成224x224/16x16=196个patch,即输入序列长度为196,每个patch维度16x16x3=768,线性投射层的维度为768xN (N=768),因此输入通过线性投射层之后的维度依然为196x768,即一共有196个token,每个token的维度是768。这里还需要加上一个特殊字符cls,因此最终的维度是197x768。到目前为止,已经通过patch embedding将一个视觉问题转化为了一个seq2seq问题。

Encoder:Multi-Head Attention

图3 多头注意力示意图

Transformer 结构中最重要的结构就是 Multi-head Attention,即多头注意力结构。具有2个head的 Multi-head Attention 结构如下图所示。输入 ai 经过转移矩阵,并切分生成 q(i,1)、q(i,2)、k(i,1)、k(i,2)、v(i,1)、v(i,2),然后 q(i,1)与 k(i,1)做 attention,得到权重向量 α,将 α 与 v(i,1)进行加权求和,得到最终的 b(i,1)(i=1,2,…,N),同理可以得到 b(i,2)(i=1,2,…,N)。接着将它们拼接起来,通过一个线性层进行处理,得到最终的结果。

图4 多头注意力

其中,使用 q(i,j)、k(i,j)与 v(i,j)计算 b(i,j)(i=1,2,…,N)的方法是缩放点积注意力 (Scaled Dot-Product Attention)。 首先使用每个 q(i,j)去与 k(i,j)做 attention,这里说的 attention 就是匹配这两个向量有多接近,具体的方式就是计算向量的加权内积,得到 α(i,j)。这里的加权内积计算方式如下所示:

α(1,i)=q1ki/dα(1,i)=q^1∗k^i/ \sqrt{d}

其中,d 是 q 和 k 的维度,因为 q∗k 的数值会随着维度的增大而增大,因此除以 d\sqrt{d} 的值也就相当于归一化的效果。

接下来,把计算得到的 α(i,j) 取 softmax 操作,再将其与 v(i,j) 相乘。

多头注意力机制的详细计算过程参考:Transformer基础

Encoder:MLP(多层感知机)

图6 MLP多层感知机的结构

多层感知机由输入层、输出层和至少一层的隐藏层构成。网络中各个隐藏层中神经元可接收相邻前序隐藏层中所有神经元传递而来的信息,经过加工处理后将信息输出给相邻后续隐藏层中所有神经元。在多层感知机中,相邻层所包含的神经元之间通常使用“全连接”方式进行连接。多层感知机可以模拟复杂非线性函数功能,所模拟函数的复杂性取决于网络隐藏层数目和各层中神经元数目。多层感知机的结构如下图所示。

图7 多层感知机

DropPath

代码实现过程中还使用了DropPath(Stochastic Depth)来代替传统的Dropout结构,DropPath可以理解为一种特殊的Dropout。其作用是在训练过程中随机丢弃子图层(randomly drop a subset of layers),而在预测时正常使用完整的 Graph。

DropPath的主要优势在于它可以减少网络的复杂性,降低过拟合的风险,同时增加了网络的鲁棒性和泛化能力。

细节:Class Token

假设我们将原始图像切分成 3×3共9个小图像块,最终的输入序列长度却是10,也就是说我们这里人为的增加了一个向量进行输入,我们通常将人为增加的这个向量称为 Class Token。那么这个 Class Token 有什么作用呢?

我们可以想象,如果没有这个向量,也就是将 N=9个向量输入 Transformer 结构中进行编码,我们最终会得到9个编码向量,可对于图像分类任务而言,我们应该选择哪个输出向量进行后续分类呢?因此,ViT算法提出了一个可学习的嵌入向量 Class Token,将它与9个向量一起输入到 Transformer 结构中,输出10个编码向量,然后用这个 Class Token 进行分类预测即可。

其实这里也可以理解为:ViT 其实只用到了 Transformer 中的 Encoder,而并没有用到 Decoder,而 Class Token 的作用就是寻找其他9个输入向量对应的类别。

细节:Positional Encoding

按照 Transformer 结构中的位置编码习惯,这个工作也使用了位置编码。不同的是,ViT 中的位置编码没有采用原版 Transformer 中的 sincos编码,而是直接设置为可学习的 Positional Encoding。对训练好的 Positional Encoding 进行可视化,如下图所示。我们可以看到,位置越接近,往往具有更相似的位置编码。此外,出现了行列结构,同一行/列中的 patch 具有相似的位置编码。

图9 Positional Encoding

细节:MLP Head

得到输出后,ViT中使用了 MLP Head对输出进行分类处理,这里的 MLP Head 由 LayerNorm 和两层全连接层组成,并且采用了GELU激活函数。

GELU激活函数

参考:https://blog.csdn.net/liruihongbob/article/details/86510622

Gaussian Error Linerar Units(GELUS),GELUs其实是 dropout、zoneout、Relus的综合,GELUs对于输入乘以一个0,1组成的mask,而该mask的生成则是依概率随机的依赖于输入。假设输入为X, mask为m,则m服从一个伯努利分布(Φ(x) , Φ(x) = P( X <= x ) , X服从标准正态分布),这么选择是因为神经元的输入趋向于正态分布,这么设定使得当输入x减小的时候,输入会有一个更高的概率被dropout掉,这样的激活变换就会随机依赖于输入了。

数学表达如下:

GELU(x)=xP(X<=x)=xΦ(x)GELU(x)=xP(X<=x)=xΦ(x)

这里Φ(x)是正态分布的概率函数,可以简单采用正态分布N(0,1), 要是觉得不刺激当然可以使用参数化的正态分布N(μ,σ), 然后通过训练得到μ,σ。

模型特点

  • 作为CV领域最经典的 Transformer 算法之一,不同于传统的CNN算法,ViT尝试将标准的Transformer结构直接应用于图像,并对整个图像分类流程进行最少的修改。

  • 为了满足 Transformer 输入结构的要求,将整幅图像拆分成小图像块,然后把这些小图像块的线性嵌入序列输入到网络。同时,使用了Class Token的方式进行分类预测。

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2023-2024 Guijie Wang
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信