论文解读:ViT | AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE

发表时间:2021
论文地址:https://openreview.net/pdf?id=YicbFdNTTy
项目地址:https://github.com/lucidrains/vit-pytorch

虽然Transformer体系结构已经成为自然语言处理任务的基准,但它在计算机视觉中的应用仍然有限。在视觉中,注意力要么与卷积网络结合应用,要么用于替换卷积网络的某些组成部分,同时保持它们的整体结构。我们证明了这种对cnn的依赖是不必要的,而一个直接应用于图像patch sequence的纯Transformer可以很好地执行图像分类任务。当对大量数据进行预训练,并转移到多个中型或小型图像识别基准测试(ImageNet、CIFAR-100、VTAB等)时,与最先进的卷积网络相比,视觉Transformer(ViT)获得了良好的结果,同时需要更少的计算资源来训练。

关键总结

Transformers的特点
1、性能饱和慢,随着数据增长,性能可持续增长。文章中的实验效果也展示了这一点
2、Transformers的核心在于迁移,直接训练效果不如resnet;但在大数据集下预训练后迁移,性能提升显著
3、Transformers对于数据的归纳偏置较小(大数据下效果好),Conv对于数据的偏置较大(小数据下效果好)
4、在Transformers中的FeedForward层内是用GELU做激活函数,在整个Transformers中都是使用LayerNorm
5、CNN feature与Transformers的混合模型,在中等数据集下效果较好;Transformers模型在大数据集下效果好,更适合迁移学习。
6、ViT在最后分类时只使用class token进行预测(或使用平均值进行预测),只用class token下效果更好。其他的image token相当于被提炼出的垃圾

其他关键

1、self-attention在某些程度上取代了conv,但是受硬件加速限制,在实际应用上有限。Transformers估计也是如此;
2、在靠近输入的阶段,self-attention要求每个像素与所有像素做关联,而Transformers是在编码成token后管理;
3、在实现上一个Transformer_layer由多个Attention和FeedForward(复合MLP层)单元组成
4、在Transformer_layer中,多个Attention和FeedForward均是做加法,代码

论文正文之外的解读,请参考 https://blog.csdn.net/weixin_44866655/article/details/123926380

1 INTRODUCTION

基于self-attention的架构,特别是Transformers,已经成为自然语言处理(NLP)的首选模型。主要的方法是在大型文本语料库上进行预训练,然后在较小的特定任务数据集上进行微调。由于Transformers的计算效率和可伸缩性,训练具有超过100个B参数的超大尺寸模型已经成为可能。随着模型和数据集的增长,仍然没有性能饱和的迹象。《性能饱和慢,数据增长,性能可持续增长》

然而,在计算机视觉中,卷积架构仍然占主导地位。受NLP成功的启发,多种研究尝试将类似cnn的架构与self-attention结合起来,其中一些完全取代了卷积。后一种模型虽然在理论上很有效,但由于使用了专门的注意模式,尚未在现代硬件加速器上有效地进行扩展。因此,在大规模图像识别中,经典的ResNet类架构仍然是最先进的技术。

受NLP中Transformer缩放成功的启发,我们实验将标准Transformer直接应用于图像,以最少的修改。为此,我们将一个图像分割成一个patch,并提供这些patch的线性embeddings序列作为一个Transformer的输入。图像patch的处理方式与NLP应用程序中的token(单词)的处理方式相同。我们以有监督的方式训练该模型进行图像分类。

当在中等大小的数据集,如ImageNet上进行训练,没有强正则化,这些模型产生的精度比相当大小的ResNets低几个百分点。这种看似令人沮丧的结果可能是可以预料到的:Transformer缺乏一些CNN固有的归纳偏见,如平移不变性(translation equivariance)和局部共享性(locality),因此在不足的数据训练时不能很好地推广。

然而,如果模型在更大的数据集(14M-300M图像)上进行训练,图像就会发生变化。我们发现,大规模的训练胜过了归纳偏差。我们的视觉Transformer(ViT)在足够的规模的预训练和转移到数据点较少的任务时获得了优秀的结果。当在公共ImageNet-21k数据集或内部JFT-300M数据集上进行预训练时,ViT在多个图像识别基准上接近或击败了最新水平。特别是,最佳模型在ImageNet上准确率达到88.55%,在ImageNet-ReaL上准确率达到90.72%,在CIFAR-100上准确率达到94.55%,在VTAB的19个任务套件上准确率达到77.63%。

2 RELATED WORK

Transformer是由Vaswani等人(2017)提出的用于机器翻译的方法,并已成为许多NLP任务中的最新方法。基于大型Transformer的模型通常在大型语料库上进行预训练,然后对目标的任务进行微调: BERT(Devlin等人,2019)使用去噪self-attention的训练前任务,而GPT工作线使用语言建模作为其训练前任务(2018)。

对图像的self-attention,要求每个像素关注其他所有像素。由于像素数的平方增长,这不能扩展到实际的输入大小。因此,为了将Transformer应用于图像处理中,过去已经尝试过几种近似方法。Parmar等人(2018)只在每个查询像素的局部区域中应用自注意,而不是全局应用。这种局部多头点积self-attention块完全可以取代卷积(2019)。在另一项工作中,稀疏Transformer采用了对全局自关注的可扩展近似,以便适用于图像。另一种衡量注意力的方法是将其应用于不同大小的具备中(韦森伯恩等人,2019),在极端情况下仅沿着个别轴。许多这些专门的注意架构在计算机视觉任务上显示出了有希望的结果,但需要复杂的工程才能在硬件加速器上有效地实现。

与我们最相关的是科登尼尔等人(2020)的模型,该模型从输入图像中提取大小为2×2的patch,并在顶部应用完全的自我关注。这个模型与ViT非常相似,但我们的工作进一步证明,大规模的预训练使普通Transformer能够与最先进的cnn竞争(甚至更好)。此外,Cordonnier等人(2020)使用了2×2像素的小patch尺寸,这使得该模型仅适用于小分辨率图像,而我们能处理中等分辨率图像。

也有很多人对将卷积神经网络(CNN)与self-attention的形式相结合感兴趣,例如增强图像分类或进一步处理CNN的输出,例如目标检测,视频处理,图像分类,无监督对象发现或统一文本视觉任务。另一个最近的相关模型是图像GPT(iGPT),它在降低图像分辨率和颜色空间后,将Transformer应用于图像像素。该模型以无监督的方式作为生成模型进行训练,然后可以对结果表示进行微调或线性探测,以获得分类性能,在ImageNet上达到72%的最大准确率。

我们工作的兴趣在于探索超越ImageNet的大型数据集,使用额外的数据源可以在标准基准上实现最先进的结果。此外,Sun等人(2017)研究了CNN的性能如何随着数据集的大小而变化,科列斯尼科夫等人(2020);龙等人(2020)从ImageNet-21k和JFT-300M等大型数据集对CNN迁移学习进行了实证探索。我们也关注这两个数据集,但训练Transformer,而不是之前工作中使用的基于resnet的模型。

3 METHOD

在模型设计中,我们尽可能遵循原始Transformer(2017)。这种有意简单的设置的一个优点是,可伸缩的NLP Transformer架构——及其高效的实现,几乎可以开箱即用。

3.1 VISION TRANSFORMER (VIT)

图1描述了VIT模型的结构。标准Transformer接收一个Token embeddings的一维序列作为输入。处理二维图像,我们重塑图像 x ∈ R H × W × C x∈R^{H×W×C} xRH×W×C一系列扁平的2D pathces: x p ∈ R N × ( P 2 ⋅ C ) x_p∈R^{N×(P^2·C)} xpRN×P2C,其中(H,W)是原始图像的分辨率,C是通道的数量,(P,P)是每个图像patch的分辨率, N = H W / P 2 N=HW/P^2 N=HW/P2产生的patch,也作为Transformer的有效输入序列长度。Transformer在所有的层中使用恒定的潜在向量大小D,所以我们将patch变平,并通过一个可训练的线性投影(Eq1).我们将这个投影的输出称为patch embeddings。

上图中对应框架的实现代码如下所示,重点观察forword函数,to_patch_embedding将输入编码为token时时将patch size与channel合并到一起,token_len为 W ∗ H P w ∗ P w \frac{W*H}{P_w*P_w} PwPwWH

class ViT(nn.Module):
    def __init__(self, *, image_size, patch_size, num_classes, dim, depth, heads, mlp_dim, pool = 'cls', channels = 3, dim_head = 64, dropout = 0., emb_dropout = 0.):
        super().__init__()
        image_height, image_width = pair(image_size)
        patch_height, patch_width = pair(patch_size)

        assert image_height % patch_height == 0 and image_width % patch_width == 0, 'Image dimensions must be divisible by the patch size.'

        num_patches = (image_height // patch_height) * (image_width // patch_width)
        patch_dim = channels * patch_height * patch_width
        assert pool in {
    
    'cls', 'mean'}, 'pool type must be either cls (cls token) or mean (mean pooling)'

        self.to_patch_embedding = nn.Sequential(
            Rearrange('b c (h_n p1) (w_n p2) -> b (h_n w_n) (p1 p2 c)', p1 = patch_height, p2 = patch_width),
            nn.LayerNorm(patch_dim),
            nn.Linear(patch_dim, dim),
            nn.LayerNorm(dim),
        )

        self.pos_embedding = nn.Parameter(torch.randn(1, num_patches + 1, dim))
        self.cls_token = nn.Parameter(torch.randn(1, 1, dim))
        self.dropout = nn.Dropout(emb_dropout)

        self.transformer = Transformer(dim, depth, heads, dim_head, mlp_dim, dropout)

        self.pool = pool
        self.to_latent = nn.Identity()

        self.mlp_head = nn.Sequential(
            nn.LayerNorm(dim),
            nn.Linear(dim, num_classes)
        )

    def forward(self, img):
        x = self.to_patch_embedding(img)
        b, n, _ = x.shape

        cls_tokens = repeat(self.cls_token, '1 1 d -> b 1 d', b = b)
        x = torch.cat((cls_tokens, x), dim=1)
        x += self.pos_embedding[:, :(n + 1)]
        x = self.dropout(x)

        x = self.transformer(x)

        x = x.mean(dim = 1) if self.pool == 'mean' else x[:, 0]

        x = self.to_latent(x)
        return self.mlp_head(x)

与BERT的[class]token类似,我们在embeddings的patch序列( z 0 0 = x c l a s s z^0_0 = x_{class} z00=xclass)中准备了一个可学习的embeddings,其在Transformer编码器( z L 0 z^0_L zL0)输出处的状态作为图像表示y (Eq。 4).在训练前和微调过程中,一个分类头都被附加在 z L 0 z^0_L zL0上。分类头由在训练前时间有一个隐藏层的MLP和在微调时由一个线性层实现。

class token在代码实现上为一个可训练的参数,在forward时由被随机扩充了batchsize倍,然后与image token相连接,使序列长度变化N+1

    def __init__():
        self.cls_token = nn.Parameter(torch.randn(1, 1, dim))
    def forward(self, img):
        cls_tokens = repeat(self.cls_token, '1 1 d -> b 1 d', b = b)
        x = torch.cat((cls_tokens, x), dim=1)

位置embeddings被添加到patchembeddings中,以保留位置信息。我们使用标准的可学习的一维位置embeddings,因为我们没有观察到使用更先进的二维感知位置embeddings的显著性能提高(附录D.4)。所得到的embeddings向量序列作为编码器的输入。

pos_embedding是一个与image token维度相同的随机可训练参数,然后与token直接做了加法

    def __init__():
        self.pos_embedding = nn.Parameter(torch.randn(1, num_patches + 1, dim))
    def forward(self, img):
        x += self.pos_embedding[:, :(n + 1)]
        x = self.dropout(x)

Transformer编码器(Vaswani et al.,2017)由多层多头自注意(Multiheaded self-attention,MSA)和MLP块构成。在每个块之前应用Layernorm(LN),在每个块之后应用残差连接。

Transformer的对应实现代码如下,一个Transformer_layer由Attention和FeedForward单元组成
注:PreNorm(先Norm数据,然后进行函数),在诸多实验中证明PreNorm比PostNorm好

class Transformer(nn.Module):
    def __init__(self, dim, depth, heads, dim_head, mlp_dim, dropout = 0.):
        super().__init__()
        self.layers = nn.ModuleList([])
        for _ in range(depth):
            self.layers.append(nn.ModuleList([
                PreNorm(dim, Attention(dim, heads = heads, dim_head = dim_head, dropout = dropout)),
                PreNorm(dim, FeedForward(dim, mlp_dim, dropout = dropout))
            ]))
    def forward(self, x):
        for attn, ff in self.layers:
            x = attn(x) + x
            x = ff(x) + x
        return x
def pair(t):
    return t if isinstance(t, tuple) else (t, t)

# classes

class PreNorm(nn.Module):
    def __init__(self, dim, fn):
        super().__init__()
        self.norm = nn.LayerNorm(dim)
        self.fn = fn
    def forward(self, x, **kwargs):
        return self.fn(self.norm(x), **kwargs)

class FeedForward(nn.Module):
    def __init__(self, dim, hidden_dim, dropout = 0.):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(dim, hidden_dim),
            nn.GELU(),
            nn.Dropout(dropout),
            nn.Linear(hidden_dim, dim),
            nn.Dropout(dropout)
        )
    def forward(self, x):
        return self.net(x)

class Attention(nn.Module):
    def __init__(self, dim, heads = 8, dim_head = 64, dropout = 0.):
        super().__init__()
        inner_dim = dim_head *  heads
        project_out = not (heads == 1 and dim_head == dim)

        self.heads = heads
        self.scale = dim_head ** -0.5

        self.attend = nn.Softmax(dim = -1)
        self.dropout = nn.Dropout(dropout)

        self.to_qkv = nn.Linear(dim, inner_dim * 3, bias = False)

        self.to_out = nn.Sequential(
            nn.Linear(inner_dim, dim),
            nn.Dropout(dropout)
        ) if project_out else nn.Identity()

    def forward(self, x):
        qkv = self.to_qkv(x).chunk(3, dim = -1)
        q, k, v = map(lambda t: rearrange(t, 'b n (h d) -> b h n d', h = self.heads), qkv) #将qkv 拆解为8个头的q, k, v

        dots = torch.matmul(q, k.transpose(-1, -2)) * self.scale

        attn = self.attend(dots)
        attn = self.dropout(attn)

        out = torch.matmul(attn, v)#一次性实现8个头的attention
        out = rearrange(out, 'b h n d -> b n (h d)')
        return self.to_out(out)#将8头的attention转换为一个头的数量

Inductive bias. 我们注意到视觉Transformer比cnn具有更少的图像特异性感应偏差。在cnn中,局部性、二维邻域结构和平移等方差被embeddings到整个模型的每一层中。在ViT中,只有MLP层是局部的和平移等变的,而自注意层是全局的。二维邻域结构的使用非常谨慎:在模型的开始,通过将图像切割成patch,并在fine-tuning时调整不同分辨率的图像的位置embeddings(如下所述)。除此之外,初始化时的位置embeddings不包含关于patch的二维位置的信息,patch之间的所有空间关系都必须从头开始学习。

Hybrid Architecture. 作为原始图像patch的替代方案,输入序列可以由CNN的特征图形成。在这种混合模型中,patch embeddings投影(Eq1)应用于从CNN特征图中提取的patch。作为一种特殊情况,patch的空间大小可以为1x1,这意味着输入序列是通过简单地将特征图的空间维变平并投影到Transformer维来获得的。分类输入embeddings和位置embeddings可以作为描述信息进行补充。

3.2 FINE-TUNING AND HIGHER RESOLUTION

通常,我们会在大型数据集上对ViT进行预训练,并对(较小的)下游任务进行微调。为此,我们去掉了预先训练好的预测头,并附加了一个zero-initialized的D×K前馈层,其中K是下游类的数量。与训练前相比,以更高的分辨率进行微调往往有益的。当输入更高分辨率的图像时,我们保持patch大小相同,这导致更大的有效序列长度。视觉Transformer可以处理任意的序列长度(直到内存限制),然而,预先训练的位置embeddings可能不再有意义。因此,我们根据预先训练好的位置embeddings在原始图像中的位置,进行二维插值。请注意,这种分辨率调整和patch提取将图像二维结构中的唯一一点归纳偏置,手动注入视觉Transformer。

4 EXPERIMENTS

我们评估了ResNet、视觉Transformer(ViT)和混合Transformer的表示学习能力。为了理解每个模型的数据需求,我们对不同大小的数据集进行了预训练,并评估了许多基准测试任务。当考虑到预训练模型的计算成本时,ViT表现得非常好,以较低的训练前成本在大多数识别基准上达到了最先进的水平。最后,我们进行了一个使用self-attention的小实验,并证明了self-attention的ViT对未来很有前景。

4.1 SETUP

Datasets 探索模型的可伸缩性,我们使用ILSVRC-2012的ImageNet1k类中的1.3M图像(ImageNet),其超集ImageNet-21k有21k类和14M图像,和JFT有18k类和303M的高分辨率图像。我们将训练前的数据集w.r.t.,在Kolesnikov等人(2020年)之后的下游任务的测试集。我们将在这些数据集上训练的模型转移到几个基准任务中:ImageNet原始标注和修正后的真实标注,CIFAR-10/100,Oxford-IIIT宠物和Oxford Flowers-102。对于这些数据集,预处理遵循Kolesnikov等人(2020年)的设置。

我们还评估了包含19个任务的VTAB分类套件(Zhai等人,2019b)。VTAB为每个任务使用1 000个训练示例。这些任务被分为三组:Natural-tasks,如上述任务,宠物,CIFAR等。Specialized-医疗和卫星图像,以及Structured的任务,需要几何理解,如局部化。

Model Variants 我们基于BERT中使用的ViT配置,如表1所示。“Base”和“Large”模型直接采用了BERT,我们添加了更大的“HUge”模型。在接下来的内容中,我们使用简短的符号来表示模型大小和输入patch大小:例如,ViT-L/16表示具有16×16输入patch大小的“Large”变体。请注意,Transformer的序列长度与patchsize的平方成反比,因此patch较小的模型的计算成本更高。

对于基线cnn,我们使用ResNet(He等人,2016年),但将批处理归一化层替换为组归一化,并使用标准化卷积。这些修改改善了迁移效果,我们将修改后的模型表示为“ResNet(BiT)”。对于混合体,我们将中间特征映射输入具有一个“pixel”的patch大小的ViT。为了实验不同的序列长度,(i)我们取常规ResNet50的第4阶段的输出,(ii)或者删除第4阶段,在第3阶段中放置相同数量的层(保持层的总数),并取这个扩展阶段3的输出。操作(ii)导致一个4倍长的序列长度,和一个更昂贵的ViT模型。

Training & Fine-tuning. 我们使用Adam做优化器(β1 = 0.9,β2 = 0.999),批大小为4096,并应用0.1的做权重衰减。我们发现这对所有模型的迁移很有用(附录D.1表明,与常见的做法相比,Adam对resnet的设置效果比SGD稍好)。我们使用线性学习率预热和衰减,见附录B.1的细节。对于微调,我们使用具有动量的SGD,批处理大小为512,对于所有模型,请参见附录B.1.1。对于表2中的ImageNet结果,我们以更高的分辨率进行了微调:ViT-L/16为512,ViT-H/14为518,同时还使用了Polyak &Juditsky(1992)平均系数为0.9999

Metrics。我们通过few-shot和fine-tuning来报告下游数据集的结果。fine-tuning精度可以在对各自的数据集进行微调后捕获每个模型的性能。few-shot精度是通过求解一个正则化最小二乘回归问题来获得的,该问题将训练图像子集的(冻结)表示映射到 − 1 , 1 K {−1,1}^K 1,1K个目标矢量。这个公式使我们能够恢复封闭形式的精确解。虽然我们主要关注微调性能,但我们有时会使用线性的few-shot精度来进行快速的动态评估,因为微调成本太高。

4.2 COMPARISON TO STATE OF THE ART

我们首先将最大的模型-ViT-H/14和ViT-L/16与文献中最先进的cnn进行了比较。第一个比较点是Big Transfer(BiT),它使用大型ResNets执行监督迁移学习。第二个是Noisy Student(Xie et al.,2020),这是一个大型的EfficientNet,使用在ImageNet和JFT-300M上的半监督学习训练,去掉标签。目前,Noisy Student最新的状态在ImageNet和BiT-L在其他数据集报告在这里。所有模型都在TPUv3硬件上进行训练,我们报告了对每个模型进行预训练所需的TPUv3核天数,即用于训练的TPU v3核数(每个芯片2个)乘以几天的训练时间。

表2显示了结果。在JFT-300M上预训练的较小的ViT-L/16模型在所有任务上都优于BiT-L(在同一数据集上预训练),但训练所需的计算资源要少得多。更大的模型ViT-H/14进一步提高了性能,特别是在更具挑战性的数据集——ImageNet、CIFAR-100和VTAB套件上。

有趣的是模型仍然比之前的技术要少得多。然而,我们注意到,训练前的效率不仅会受到架构选择的影响,还会受到其他参数的影响,如训练计划、优化器、权重衰减等。我们在第4.4节中提供了对不同架构的性能与计算的受控研究。最后,在公共ImageNet-21k数据集上预训练的ViT-L/16模型在大多数数据集上也表现良好,同时花费更少的资源:它可以在大约30天内使用8核的标准云TPUv3进行训练。

图2将VTAB任务分解为各自的组,并与此基准上之前的SOTA方法进行比较:BiT,VIVI-一个ResNet网络,在ImageNet和Youtube、S4L上进行半监督训练的模型。ViT-H/14在自然任务和结构化任务上优于BiT-R152x4和其他方法。在专业化方面,前两种模型的性能相似。

4.3 PRE-TRAINING DATA REQUIREMENTS

视觉Transformer在一个大型的JFT-300M数据集上进行预训练时表现良好。比ResNets对视觉的归纳偏差更少,数据集的大小有多重要?我们进行了两个系列的实验。

首先,我们在规模不断增大的数据集上对ViT模型进行了预训练: ImageNet、ImageNet-21k和JFT- 300M。为了提高在较小的数据集上的性能,我们优化了三个基本的正则化参数——权值衰减、dropout和标签平滑。图3显示了对ImageNet进行微调后的结果(在其他数据集上的结果如表5所示)。当在最小的数据集ImageNet上进行预训练时,ViT-Large模型的表现不如ViT-Base模型,尽管使用了正则化。通过ImageNet-21k的预训练,他们的表现也很相似。只有使用JFT-300M,我们才能看到更大型号模型的全部好处。图3展示了由不同大小的BiT模型的跨区域性能。BiT cnn在ImageNet上的表现优于ViT,但随着更大的数据集,ViT超过了BiT。

其次,我们在9M、30M和90M的随机子集以及完整的JFT-300M数据集上训练我们的模型。我们不对较小的子集执行额外的正则化,而是对所有设置使用相同的超参数。这样,我们就可以评估模型的内在性质,而不是正则化的影响。然而,我们确实使用了early-stopping,并报告了在训练期间获得的最佳验证准确性。为了节省计算量,我们报告了few shot的线性精度,而不是fine-tuning精度。图4包含了这些结果。在较小的数据集上,视觉Transformer比ResNets过拟合更多。例如,ViT-B/32比ResNet50略快;它在9M子集上表现得更差,但在90M+子集上表现得更好。ResNet152x2和ViT-L/16也是如此。这一结果强化了一种直觉,即卷积归纳偏差对于较小的数据集是有用的,但对于较大的数据集,直接从数据中学习相关模式就足够了,甚至是有益的

总的来说,ImageNet上的few shot(图4),以及VTAB上的低数据结果(表2)似乎很适合low-data transfer。进一步分析ViT的few-shot特性是未来工作的一个令人兴奋的方向。

4.4 SCALING STUDY

我们通过评估来自JFT-300M的transfer性能,对不同的模型进行了控制尺度研究。在这种设置下,数据大小不会瓶颈模型的性能,我们评估每个模型的性能与训练前的成本。模型集包括:7个ResNet,R50x1、R50x2 R101x1,R152x1、R152x2,预训练7个epoch,加上R152x2和R200x3预训练14个epoch;6个视觉Transformer、ViT-B/32、B/16、L/32、L/16,预训练7个epoch,加上L/16和H/14预训练14个epoch;5个混合模型,R50+ViT-B/32、B/16、L/16、L/32、L/16预训练7个epoch,加上R56+ViT-L/16预训练14个epoch(混合模型,模型名称结束时的数字不代表patch大小,而是ResNet主干的总降采样比)。

图5包含了transfer性能与总训练前的计算相比(关于计算成本的详细信息见附录D.5)。每个模型的详细结果见附录中的表6。我们可以观察到一些模式。首先,视觉Transformer在性能/计算权衡上主导了ResNets。ViT使用大约2−4×的计算来获得相同的性能(平均超过5个数据集)。其次,混合模型在较小的计算预算下的性能略优于ViT,但在较大的模型中,差异消失了。这个结果有些令人惊讶,因为人们可能会期望卷积局部特征处理来帮助任何大小的ViT。第三,视觉Transformer似乎没有在试验范围内饱和,激励了未来的研究。

4.5 INSPECTING VISION TRANSFORMER

为了开始理解视觉Transformer如何处理图像数据,我们分析了它的内部表示。视觉Transformer的第一层线性地投射了扁平的patch到一个低维空间(Eq。 1).图7(左)显示了学习到的embeddings过滤器的顶部主成分。这些组件类似于每个patch内精细结构的低维表示的可信基函数。

投影结束后,将学习到的位置embeddings添加到patch表示中。从图7(中)可以看出,模型通过位置embeddings的相似性来学习对图像内的距离进行编码,即越近的patch往往具有更多相似的位置embeddings。此外,还会出现行-列结构;同一行/列中的patch具有类似的embeddings。最后,对于较大的网格,正弦结构有时是明显的(附录D)。位置embeddings学习了表示二维图像拓扑,这解释了为什么手工制作的二维感知embeddings变体没有产生改进(附录D.4)。

self-attention允许ViT整合整个图像的信息,即使是在最低的层。我们研究了网络在多大程度上利用了这种能力。具体来说,我们根据注意力权重计算信息在被整合过的图像空间中的平均距离(图7,右)。这种“注意距离”类似于cnn中的接受野大小。我们发现,一些头部关注了已经在最低层的大部分图像,这表明模型确实使用了全局集成信息的能力。其他的注意力头脑在低层的注意距离一直很小。这种高度局部化的注意在Transformer之前应用ResNet的混合模型中不那么明显(图7,右),这表明它可能在cnn中具有与早期卷积层类似的功能。此外,注意距离随着网络深度的增加而增加。在全局范围内,我们发现该模型关注的是与分类有语义相关的图像区域(图6)

4.6 SELF-SUPERVISION

Transformer在NLP任务上的表现出了令人印象深刻的表现。然而,他们的成功不仅来自他们优秀的可伸缩性,而且来自大规模的self-attention预训练。我们还模拟了BERT中使用的掩码语言建模任务,对self-attention的掩码patch预测进行了初步的探索。通过self-attention预训练,我们较小的ViT-B/16模型在ImageNet上达到了79.9%的准确率,比从头开始训练显著提高了2%,但仍比监督预训练低4%。附录B.1.2包含了更多的细节。我们将对比预训练的探索(Chen等人,2020b;他等人,2020年;Bachman等人,2019年;H‘enaff等人,2020年)留给未来的工作。

5、 CONCLUSION

我们探索了Transformer在图像识别中的直接应用。与之前在计算机视觉中使用自注意的工作不同,除了最初的patch提取步骤外,我们没有在架构中引入特定于图像的归纳偏差。相反,我们将图像解释为一系列patch,并使用NLP中使用的标准Transformer编码器对其进行处理。这种简单但可扩展的策略在结合大型数据集上的预训练时,工作得惊人地好。因此,视觉Transformer在许多图像分类数据集上匹配或超过了最先进的状态,而是相对便宜的预训练。

虽然这些初步结果令人鼓舞,但仍存在许多挑战。一是将ViT应用于其他计算机视觉任务,如检测和分割。我们的研究结果,加上Carion等人(2020年)的研究结果,表明了这种方法的前景。另一个挑战是继续探索self-attention的训练前方法。我们最初的实验表明,self-attention预训练有所改进,但self-attention预训练和大规模监督预训练之间仍存在很大的差距。最后,ViT的进一步扩展可能会导致性能的提高。

猜你喜欢

转载自blog.csdn.net/a486259/article/details/129802747