Vision Transformer学习笔记

自学ViT过程记录,内容以原论文为主,参考博客为辅,文中挂有具体链接,如有错误,欢迎指正🙏

论文链接:[2010.11929] An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale (arxiv.org)

Abstract

尽管Transformer架构已经成为自然语言处理任务的标准,其在计算机视觉领域的应用仍然受限。在视觉领域,注意力不仅被应用在卷积网络的联接,同时也在保证总体结构情况下替换某些卷积网络的主要组成部分。我们展示了这种对于CNNs的依赖不是必要的,并且一个完全纯净的transformer可以直接被应用在一系列的图像补丁上并在图像分类任务上表现良好。当在大量数据上进行预训练或者转化为大量中型或小型图像时,Vision Transformer 相较于卷积网络表现出优秀结果,同时在训练时需要较少的计算量。

1.Introduction

自注意力机制的架构,尤其是Transformer,成为自然语言处理方面的首选模型。该领域方法是提前在一个较大的文本对上进行预训练,然后将其应用在较小的特定任务数据集上进行微调。得益于Transformer的计算高效性和扩展性,它可以训练前所未有的超过100B参数模型大小。随着模型和数据集的发展,且目前未出现饱和现象。

然而,在计算机视觉l领域,卷积结构仍占主流。受启发于NLP的成功,大量的工作尝试将类似CNN的结构与自注意力机制结合,一些甚至完全取代了卷积。后来的一些模型,理论上是高效的,但由于其特殊的注意力结构并未在硬件上取证。因此,在大规模的图像识别领域,经典的ResNet类似结构仍占据主流地位。

受启发于Transformer在NLP领域的成功,我们直接将标准Transformer应用在图像上进行实验,采用最少的修改。我们把一张图像切分成patches,并提供一系列的线性编码使这些图像作为Transformer的输入。图像patches同样被作为tokens在NLP应用中。我们以监督学习方式进行在图像分类上的模型训练。

在训练例如ImageNet这样没有强烈正则化的中型数据集时,这些模型的准确度不高,比同等规模的 ResNets 低几个百分点。这似乎看起来得不到理想输出:Transformer缺少从CNN继承的一些inductive bias,such as translation equivariance and locality。因此在较少训练数据上生成效果不佳。

然而,如果模型训练在较大数据集上图像将改变。我们发现大规模训练引发inductive bias。ViT在充足的数据规模上预训练和转换为更少的数据点的任务上表现良好。当预训练在公共数据集Image-Net21K上或者in-house JFT-300M数据集上,在多项图像识别基准测试中,ViT 接近或超越最新技术水平。其中,最佳模型在 ImageNet 上的准确率为 88:55%,在 ImageNet-ReaL 上的准确率为 90:72%,在 CIFAR-100 上的准确率为 94:55%,在包含 19 项任务的 VTAB 套件上的准确率为 77:63%。

2.Related works

Transformer自2017年被Vaswani用于机器翻译提出,至今被广泛应用于愈多NLP任务。大型的基于Transformer的模型经常在大型体系上进行预训练,然后再进行微调:BERT使用一个去噪自监督预训练任务,GPT使用语言建模作为预训练任务。

自注意力机制在图像上的简单应用需要每个像素都与其他每个像素相关联。pixel方面存在二次成本,这与实际的输入大小不符。因此,为了使Transformer应用在图像处理领域,一些近似的方法在过去被尝试。Parmar将自注意力机制仅应用在每平方像素点局部的区域而不是全局。这种局部多头点积自注意力机制块能够完全代替卷积。Sparse Transformer采用了可扩展的全局自注意近似方法,以便适用于图像。另一种将注意力规模化的方法是将其应用于不同大小的区块中(Weissenborn 等人,2019 年),极端情况下仅沿单个轴线应用(Hoet 等人,2019 年;Wang 等人,2020a)。这些专门化的注意力机制结构证明它在计算机视觉任务上的理想结果,但需要复杂的工程设计才能在硬件加速器上有效实施。 

与我们最相关的是 Cordonnier 等人(2020 年)的模型,该模型从输入图像中提取大小为 2 × 2 的patches,并在其上应用完全自注意。该模型与 ViT 非常相似,但我们的工作更进一步证明,大规模预训练使得 vanilla transformers 可以与最先进的 CNN 竞争(甚至更胜一筹)。此外,Cordonnier 等人(2020 年)使用了 2 × 2 像素的小补丁尺寸,这使得该模型仅适用于小分辨率图像,而我们也能处理中等分辨率图像。

人们对将卷积神经网络(CNN)与自我注意形式相结合也很感兴趣,例如通过增强特征图进行图像分类,或使用自我注意进一步处理 CNN 的输出,例如用于物体检测、视频处理、图像分类、无监督物体发现,视频处理、图像分类、无监督对象发现或统一文本视觉任务。

另一个最新的相关模型是图像 GPT(iGPT)(Chen 等人,2020a),它在降低图像分辨率和色彩空间后,将变换器应用于图像像素。该模型以生成模型的无监督方式进行训练,所生成的表示可以进行微调或线性调整,以提高分类性能,在 ImageNet 上达到了 72% 的最高准确率。

我们的研究为越来越多的论文集增添了新的内容,这些论文探讨了比标准ImageNet数据集更大规模的图像识别问题。此外,Sun 等人(2017 年)研究了 CNN 性能如何随数据集大小而缩放,Kolesnikovet 等人(2020 年)和 Djolonga 等人(2020 年)从 ImageNet-21k 和 JFT-300M 等大型数据集对 CNN 转移学习进行了实证探索。我们同样关注后两个数据集,但训练的是 Transformers,而不是之前工作中使用的基于 ResNet 的模型。

3.Method

在模型设计方面我们尽量遵循最初的Transformer。这种有意简单设置的优势在于,可扩展的 NLP 转换器架构及其高效实现几乎可以开箱即用。

3.1 VISION TRANSFORMER (VIT)

上图是模型的概览。标准转换器接收输入的一维标记嵌入序列。为了处理二维图像,我们将图像  重塑为其中 (H,W ) 是原始图像的分辨率,C 是通道数。(P,P ) 是每个图像补丁的分辨率,N = HW/P ^2是得到的图像片段数,也是变换器的有效输入序列长度。变换器的所有层都使用恒定的潜向量大小 D,因此我们使用可训练的线性投影将补丁平铺并映射到 D 维。我们将该投影的输出称为补丁嵌入。 

与 BERT 的[class]标记类似,我们在嵌入的补丁序列前加上一个可学习的嵌入,其在变换器编码器输出端的状态作为图像表示 y。在预训练和微调过程中,都会附加一个分类头。在预训练和微调时,分类头都是由一个带有一个隐藏层的 MLP 来实现的。

位置嵌入被添加到补丁嵌入中,以保留位置信息。我们使用标准的可学习一维位置嵌入,因为我们没有观察到使用更先进的二维感知位置嵌入能显著提高性能。由此产生的嵌入向量序列将作为编码器的输入。

Transformer 编码器由多头自注意(MSA,见附录 A)和 MLP 块(等式 2、3)交替层组成。在每个区块之前应用 Layernorm(LN),在每个区块之后应用残差连接。MLP 包含两个具有 GELU 非线性的层。

indudctive bias:我们注意到,与 CNN 相比,Vision Transformer 的图像indudctive bias要小得多。在 CNN 中,局部性、二维邻域结构和平移等差性贯穿整个模型的每一层。在 ViT 中,只有 MLP 层具有局部性和平移等价性,而自我注意层则具有全局性。二维邻域结构的使用非常少:在模型开始时,将图像切割成patch;在微调时,针对不同分辨率的图像调整位置嵌入(如下所述)。除此以外,初始化时的位置内嵌不包含任何有关补丁二维位置的信息,补丁之间的所有空间关系都需要从头开始学习。

混合架构:作为原始图像补丁的替代方案,输入序列可以由 CNN 的特征图构成。在这种混合模型中,补丁嵌入投影 E(公式 1)应用于从 CNN 特征图中提取的补丁。作为一种特例,补丁的空间尺寸可以是 1x1,这意味着输入序列可以通过简单地平铺特征图的空间维度并投影到变换器维度来获得。

3.2 微调和更高分辨率

通常,我们在大型数据集上对 ViT 进行预训练,然后根据(较小的)下游任务进行微调。为此,我们会移除预训练的预测头,并附加一个零初始化的 D × K feedforwardlayer,其中 K 是下游类的数量。与预训练相比,在更高分辨率下进行微调通常是有益的(Touvron 等人,2019;Kolesnikov 等人,2020)。当输入更高分辨率的图像时,我们会保持补丁大小不变,这样就能获得更大的有效序列长度。视觉转换器可以处理任意长度的序列(受内存限制),但是,预训练的位置嵌入可能不再有意义。因此,我们根据预训练位置嵌入在原始图像中的位置,对其进行二维插值。需要注意的是,只有在调整分辨率和提取补丁时,才会手动向视觉转换器注入有关图像二维结构的归纳偏差。

上面即为原论文内容,说实话看过一遍没咋看懂,下面是参考b站讲解

链接:11.1 Vision Transformer(vit)网络详解_哔哩哔哩_bilibili

1️⃣首先我们输入一张图片,把图片分为许多patches,每个patches大小即为ViT-H/14中的“14×14”.

①emdedding层:然后将patches输入到embedding层,也就是图中的Linear Projection of Flatterned Patches,输出得到一个个向量,称之为token。每一个patches都会得到一个token。在最前面加上一个class token(图中0*)。对所有token加上位置信息positon enbedding。

②Transformer Encoder层:token+class token+position emdedding全部输入到Transformer Encoder。将右侧的block重复堆叠L次。

③MLP head层:将class token的输出输入到MLP head,得到最终分类结果。

2️⃣下面是对三个层的详细讲解:

①Embedding层:

我们期望Transformer的输入是一个token序列,token代表向量,即期望输入是一个二维矩阵[num_token,token_dim]。在代码实现过程中,Linear Projection of Flatterned Patches通过一个卷积层实现。以ViT-B/16为例,使用卷积核大小为16×16(同时也是patches大小),stride=16,卷积核个数768(即为token_dim)。

[224,224,3]→[14,14,768]→[196,768]

首先是224×224的RGB图像,变成224/16=14大小,最后将图像展平14×14=196.即最终得到num_token=196,token_dim=768.

第二步拼接一个class token[1,768],拼接后变为[197,768]

第三步叠加positon embedding[197,768],直接相加对结果无影响。

❓position embedding对于结果影响?

论文附录中进行了不使用和使用不同位置编码对于实验结果影响的对比试验。结果表明,使用位置编码相较于不使用位置编码准确率提升3个百分点,而不同位置编码的对比影响不大。源码中使用1-D位置编码效果较好。

❓position embedding怎么看图?

每个patches与自身和其他patches的位置编码之间计算余弦相似度,黄色代表相似度=1.相似度最高(图中黄色块)则代表最终学习到的编码。

这里的patches是32×32,原图224/32=7,所以是7×7大小。针对每一个patches的位置编码就是一个向量。右侧Cosine similarity从上到下依次代表1到-1.

②Transformer Encoder层:

首先输入一个Norm层,即为一个Layer Normalization,然后是一个Multi-Head Attention层,将输出y1与最初的输入x0进行一个add相加操作,作为新的输入x1进入新的Layer Norm,接着是MLP Block.此时将输出y2与x1进行add拼接得到Encoder最终输出y3.

其中MLP为全连接层1+GELU激活+Dropout+全连接层2+Dropout,全连接层1将输入维度扩大四倍(768→3071),全连接层2将维度变回去。

③MLP Head

❓在Transformer Encoder中Norm层之后会带有一个Dropout(论文中未体现,但是代码中有),此处在MLP之前有一个Layer norm(同样未体现)。

MLP可以简单理解为一个全连接层。后可以接一个激活函数softmax。

下面是b站作者手绘的图。霹雳吧啦Wz的个人空间-霹雳吧啦Wz个人主页-哔哩哔哩视频

4.Experiment

Layers代表Transformer Encoder中重复堆叠Encoder Block个数,Hidden size是通过Embedding后每个token的dim。MLP size代表Transformer Encoder中MLP Block第一个全连接节点个数(Hidden size的四倍),Heads代表Transformer中头数。

首先在自己的数据集上进行预训练,ViT-H/14,代表patches大小是14.

采用b站代码复现,链接:11.2 使用pytorch搭建Vision Transformer(vit)模型_哔哩哔哩_bilibili

5.Conclusion

我们探索了Transformer在图像识别中的直接应用。与之前在计算机视觉中使用自注意的工作不同,除了最初的patch提取步骤外,我们没有在架构中引入特定图像的conductive bias。相反,我们将图像解释为一连串的patches,并通过 NLP 中使用的标准变换器编码器进行处理。因此,Vision Transformer 在许多图像分类数据集上都达到或超过了目前的技术水平,同时预训练成本相对较低。 

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

完结撒花*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。(看来也要复习一下CNN和Transformer了,要学的东西好多,嘤嘤嘤)

  • 16
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Swin Transformer是一种基于移动窗口的Hierarchical Vision Transformer。它的目标是实现Vision Transformer在非自然场景下的迁移学习。Swing Transformer的设计灵感主要来自于CNN,它融合了CNN的一些思想并将其应用于Transformer模型中。通过引入移动窗口的概念,Swin Transformer能够实现多尺度的特征提取,这使得它可以作为一个通用的backbone,为检测、分割等计算机视觉下游任务提供更好的支持。Swing Transformer在非自然场景下的迁移学习表现较好,这是因为Transformer本身不需要过多的inductive bias,并且已有的一些工作已经证明了将NLP预训练模型直接应用于计算机视觉任务的有效性。因此,我认为Swin Transformer具有较好的迁移学习能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Swin-Transformer学习整理](https://blog.csdn.net/weixin_43856821/article/details/123243178)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Swin Transformer 学习笔记](https://blog.csdn.net/qq_36936443/article/details/124296075)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值