ViT 论文逐段精读

这篇具有很好参考价值的文章主要介绍了ViT 论文逐段精读。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

https://www.bilibili.com/video/BV15P4y137jb

Vision Transformer 挑战了 CNN 在 CV 中绝对的统治地位。Vision Transformer 得出的结论是如果在足够多的数据上做预训练,在不依赖 CNN 的基础上,直接用自然语言上的 Transformer 也能 CV 问题解决得很好。Transformer 打破了 CV、NLP 之间的壁垒。

先理解题目:An image is worth 16 ∗ 16 16*16 1616 words: Transformers for Image Recognition at scale。题目中的 16 ∗ 16 16*16 1616 words 含义是把一张图片看作由很多 16 ∗ 16 16*16 1616 大小 patch 组成的整体。

Abstract

之前的注意力只是作为一个小模块替换 CNN 的某一部分。Vision Transformer 则是直接作用于图像块,而且效果也很好。尤其是当在大规模数据集做预训练,迁移到中小型数据使用,Vision Transformer 能达到跟最好的 CNN 相媲美的效果,而且使用的计算资源更少(但是对普通人来说,也很难获得)。

Introduction

Self-attention-based architecture,特别是 Transformer,成为 NLP 的首选模型。主要的方法是在大型文本语料库上进行预训练,然后在较小的特定任务数据集上进行微调(Bert 这篇文章提出的)。由于 Transformer 的计算效率和可扩展性,它可以训练前所未有的规模的模型,具有超过 100B 个参数。随着模型和数据集的增长,仍然没有出现性能饱和的迹象。(第一段)

在 CV 中,卷积架构仍然占主导地位。Transformer 难以应用在 CV 中,主要是因为图片对应的序列太长。如果 Transformer 用在 CV 上,那么要采取办法降低输入序列的长度,。受 NLP 成功的启发,许多论文尝试在 CV 中应用 self-attention:①、将类 CNN 的架构与 self-attention 结合(文章 Wang et al., 2018 使用网络中间的特征图作为 Transformer 的序列输入,而不是直接使用像素点);②、完全取代卷积,全部使用 self-attention (Ramachandran等人,2019;Wang et al ., 2020a)(第一篇文章使用局部窗口。通过控制窗口的大小,限制计算复杂度。第二篇文章是在 h 与 w 两个维度分别做两次 self-attention)。后一种模型虽然在理论上是有效的,但由于使用了专门的注意力模式,还没有在现代硬件加速器上有效地扩展。因此,在大规模图像识别中,经典的类 Resnet 架构仍然是最先进的(Mahajan等人,2018;谢等,2020;科列斯尼科夫等人,2020)。(第二段)

受 Transformer 在 NLP 的可扩展性的启发,将一个标准的 Transformer 直接应用于图像,且做很少的修改(不针对视觉任务做特定的改变)。此时,必须重新考虑前文的问题:Transformer 如何应对从图像转换来的如此长的序列。ViT 的处理: 先把一个 224 ∗ 224 224*224 224224 的图片打成很多个 16 ∗ 16 16*16 1616 的 patch。原先的序列长度是 50176 ( 224 ∗ 224 ) 50176(224*224) 50176224224;现在的“宽”“高”是 14 ∗ 14 ( 224 / 16 ) 14*14(224/16) 1414224/16,现在的序列长度是 196 ( 14 ∗ 14 ) 196(14*14) 1961414。然后,把每个 patch 当作一个元素,通过一个 fc layer 得到一个 linear embedding。最后,这些作为输入传给 Transformer。这些 image patch 可以看作是 NLP 中的单词 ———— 一个句子有多少个单词;一张图像有多少个 patch。基于有监督的图片分类训练这个模型。为何突出 有监督 的呢?因为 Transformer 都是用无监督的方式训练的,要么用 language modeling,要么用 mask language modeling。对于 CV,大部分的工作还是有监督的训练方式。(第三段)

ViT 把 CV 任务当作 NLP 任务处理去做,尤其中间的这个模型就是用一个 Transformer encoder,跟 Bert 是完全一样的。这篇论文告诉我们用 Transformer 处理 CV 任务也能达到很棒的效果。

如果不加比较强的约束,ViT 在中型数据集(如:ImageNet)训练的效果,跟同等大小的残差网络相比,要弱几个点。这个看起来不太好的结果是可预期的:Transformer 缺少卷积网络具有的 inductive biases(归纳偏置)。卷积网络具有先验信息,可以用较少的数据学习一个比较好的模型。Transformer 没有先验信息。它所有对现实世界的感知都需要从数据里自己学习。(第四段)

inductive biases 可以看作一种先验知识,或者提前做好的假设。卷积网络的两个常见的 inductive biases:①、locality —— 卷积网络以滑动窗口的形式在图片上一点一点地进行卷积。因此,假设图片相邻的区域有相邻的特征。②、translation equivariance —— 不论是先卷积再平移,还是先平移再卷积,得到的结果都是一样的。卷积网络的卷积核相当于一个 template(模板),不论图片中同样的物体移到哪里,同样的输入遇到同样的卷积核,那么输出应该永远是一样的。

在第五段,作者用在更大的数据集预训练,迁移到小数据集,在小数据集上获得近似或者比顶级卷积网络更好的结果。(18:16 —— 19:19)

Introduction 的总结 19:19 —— 20:25

Conclusion

20:30 —— 24:34

Transformer 在图像识别中的直接应用。与之前在计算机视觉中使用自注意的工作不同,除了初始 patch 提取步骤外,我们没有将特定于图像的归纳偏差引入体系结构。相反,我们将图像解释为一系列 patch,并通过 NLP 中使用的标准 Transformer 编码器对其进行处理。当与大型数据集的预训练相结合时,这种简单但可扩展的策略效果出奇地好。因此,Vision Transformer 在许多图像分类数据集上达到或超过了最先进的水平,同时预训练相对便宜。(第一段)

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

Related Work

Transformer 是由 Vaswani 等人(2017)提出的用于机器翻译的方法,并且已经成为许多 NLP 任务中最先进的方法。基于大型 Transformer 的模型通常在大型语料库上进行预训练,然后针对具体任务进行微调:BERT (Devlin等人,2019)使用去噪自监督预训练任务(“完形填空”);而 GPT 的工作线使用语言建模(预测下一个单词)作为其预训练任务(Radford等人,2018;2019;Brown et al., 2020)。(第一段)

应用在图像领域的 self-attention 要求每个像素都关注其他像素。由于像素数量的代价是二次的( n 2 n^2 n2),因此不能按实际的输入大小进行缩放。直接在像素层面使用 Transformer 是不现实的。因此,为了在图像领域应用 Transformer,过去已经尝试了几种近似方法。Parmar等人(2018)仅在局部邻域对每个查询像素应用自关注,而不是全局。这种局部多头点积自注意块可以完全取代卷积(Hu et al., 2019;Ramachandran等人,2019;赵等,2020)。在不同的工作中,稀疏变形器(Child等人,2019)采用可扩展的全局自关注近似,以便适用于图像。另一种扩展注意力的方法是将其应用于不同大小的块(Weissenborn等人,2019),在极端情况下,仅沿着单个轴(Ho等人,2019;Wang et al., 2020a)。许多这些专门的注意力架构在计算机视觉任务上显示出有希望的结果,但需要复杂的工程才能在硬件加速器上有效地实现。(第二段)

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

可以说,ViT 是第三段的这篇文章的 “后续之作”。ViT 采纳了它的研究方法,并将之应用在更大的数据集。

第四段介绍 CNN 与 self-attention 相结合的研究工作。

另一个最近的相关模型是 image GPT(iGPT)(Chen et al ., 2020a),该模型在降低图像分辨率和色彩空间后,将 Transformer应用于图像像素。该模型以无监督的方式作为生成模型进行训练,然后可以对结果表示进行微调或线性探测以获得分类性能,在ImageNet上实现72%的最大准确率。(第五段)

iGPT 是一个生成式模型。CV 中的大多数模型是判别式的。

有些论文探索了比标准 ImageNet 数据集更大规模的图像识别。使用额外的数据集可以在标准基准上获得最先进的结果(Mahajan等人,2018;Touvron等人,2019;谢等,2020)。此外,Sun等人(2017)研究了 CNN 性能如何随数据集大小而扩展,Kolesnikov等人(2020);Djolonga等人(2020) 在 ImageNet-21k 和 JFT-300M 等大规模数据集上对 CNN 迁移学习进行了实证探索。我们也关注后两个数据集,但是训练 Transformer 而不是在之前的作品中使用的基于 Resnet 的模型。(第六段)

Method(ViT)

在模型设计中,我们尽可能地遵循原始 Transformer (Vaswani et al ., 2017)。这样是为了高效的利用 NLP 领域的 Transformer 的优点。

Vision Transformer(ViT)


ViT 论文逐段精读

(时间段 30:45-38:20 讲解 Fig.1。Fig.1 是 ViT 的整体架构图)

Fig 1 把左下角给定的这张图打成 9 宫格,然后把这 9 个 patch 转换为一个序列。每个 patch 通过 Linear Projection 得到一个特征,即论文中提到的 “patch embedding”。self-attention 是所有元素之间两两交互计算,不存在先后次序问题。但是对于左下角的图来说,由九宫格而来的序列是有序的;如果顺序颠倒,图片也不再是原有的图片。NLP 保持序列的顺序的方法是为 patch embedding 加上 position embedding。同样地,ViT 也为由九宫格而来的序列的 9 个元素添加了 position embedding。此时,这 9 个 token 也就具有图像块的图像信息和位置信息。接下来的操作与 NLP 完全一样:把 token 交给 Transformer encoder 计算,从而得到相应的输出。

问题是有 9 个输出,使用哪个输出用于图像分类呢?ViT 借鉴 BERT 的 extra learnable embedding(cls token),即 Fig 1 中序列最左端的 “0”。因为所有的 token 彼此间都有在交互(self-attention 计算),所以可以相信 “0号embedding” 能够从其他 embedding 里学到有用的信息,从而根据 “0号embedding” 做图像分类判断即可。Fig 1 中的 “MLP Head” 是一个通用的分类头。最后,用交叉熵函数进行模型训练。

Fig 1 的右侧给出了 Transformer encoder 的结构。它的流程简单,多次叠加后,成为 ViT 的主体。


用具体的数字把 Fig 1 的流程走一遍:

图片 x x x 大小为: 224 ∗ 224 ∗ 3 224*224*3 2242243;每个 patch 的大小为 16 ∗ 16 16*16 1616;可知共有 22 4 2 1 6 2 = 196 \frac{224^2}{16^2}=196 1622242=196 个patch(图像块);每个图像块的维度为 16 ∗ 16 ∗ 3 = 768 16*16*3=768 16163=768。故 x  的大小变化为 : 224 ∗ 224 ∗ 3 → 196 ∗ 768 x\ 的大小变化为:224*224*3 \rightarrow 196*768 x 的大小变化为:2242243196768

Linear Projection 是一个全连接层,文章中用 E E E 表示, E E E 的大小为 768 ∗ 768 768*768 768768(第一个 768 表示每个图像块的大小;第二个 768 是可以变化的,文章用 D D D 表示,如果图片变大, D D D 也可以变大)。

patch 通过 Linear Projection 的计算是矩阵计算: X ( 196 , 767 ) ∗ E ( 768 , 768 ) = R e s u l t ( 196 , 768 ) X_{(196,767)}*E_{(768,768)}=Result_{(196,768)} X(196,767)E(768,768)=Result(196,768)。结果含义是有 196 个 token,每个 token 向量维度是 768。再为每个 token 加上原图像块的 position embedding。最后加上一个 cls token,便得到了最终进入 Transformer 的序列;它的大小是 197 ∗ 768 197*768 197768

(Fig 1 右侧流程)
Transformer 的输入 embedded patches 就是一个大小为 197 ∗ 768 197*768 197768 T e n s o r Tensor Tensor

T e n s o r Tensor Tensor 进行 L a y e r N o r m Layer Norm LayerNorm 处理。

进行 M u l t i − H e a d   a t t e n t i o n Multi-Head\ attention MultiHead attention 计算。 H e a d Head Head 12 12 12。每个 H e a d Head Head K , Q , V \pmb{K},\pmb{Q},\pmb{V} K,Q,V 维度为 197 ∗ 64 197*64 19764 64 = 768 12 64=\frac{768}{12} 64=12768)。最后把所有 H e a d Head Head 的输出拼接(concatenate), M u l t i − H e a d   a t t e n t i o n Multi-Head\ attention MultiHead attention 的最终结果维度还是 197 ∗ 768 197*768 197768

进行 L a y e r N o r m Layer Norm LayerNorm 处理。

进行 MLP 处理。MLP 先把维度放大四倍,再投射为原大小( 197 ∗ 3072 → 197 ∗ 768 197*3072 \rightarrow 197*768 1973072197768),最后输出。



标准的 Transformer 需要一系列 1D 的 token 作为输入。对 2D 的 image 处理是把图片 X ∈ R H ∗ W ∗ C \pmb{X}\in\pmb{R}^{H*W*C} XRHWC 打成多个小 patch X p ∈ R N ∗ ( P 2 ⋅ C ) \pmb{X}_p\in\pmb{R}^{N*(P^2·C)} XpRN(P2C)。C 是 channel 数,(P,P) 表示每个图像块, N = H W P 2 N=\frac{HW}{P^2} N=P2HW 是 patch 总数。Transformer 使用 D D D 作为向量长度。因此,用一个可训练的线性层(linear projection)把每个 patch 拉伸为 D 维。这个输出作为 patch embedding。(第一段)

为了最后的分类,借鉴 BERT 的 class token(cls token)。它是一个可学习的特征,维度也是 D。经过很多层的 Transformer Encoder 后,把 cls token 作为 ViT 的输出,也就是整个图像的特征。最后,加个 MLP 的分类头用于图像分类即可。(第二段)

ViT 使用标准的可学习的 1D position embedding(也就是 BERT 里的位置编码)。作者也用了 2D-aware position embedding。发现二者的效果差不多。(第三段)(在附录里有更详细的消融实验)

z 0 = [ x c l a s s ;   x p 1 E ;   x p 2 E ;   . . . ;   x p N E ]   +   E p o s s , E ∈ R ( P 2 ⋅ C ) ∗ D , E p o s s ∈ R ( N + 1 ) ∗ D (公式一) \pmb{z}_0 = [x_{class};\ x^1_p\pmb{E};\ x^2_p\pmb{E};\ ...;\ x^N_p\pmb{E}]\ +\ \pmb{E}_{poss},\pmb{E}\in\pmb{R}^{(P^2·C)*D},\pmb{E}_{poss}\in\pmb{R}^{(N+1)*D} (公式一) z0=[xclass; xp1E; xp2E; ...; xpNE] + EpossER(P2C)DEpossR(N+1)D(公式一)
z l ′ = M S A ( L N ( z l − 1 ) )   +   z l − 1 , l = 1... L (公式二) z'_l = MSA(LN(z_{l-1}))\ + \ z_{l-1},l=1...L(公式二) zl=MSA(LN(zl1)) + zl1l=1...L(公式二)
z l = M L P ( L N ( z l ′ ) )   +   z l ′ , l = 1... L (公式三) z_l = MLP(LN(z'_{l}))\ + \ z'_{l},l=1...L(公式三) zl=MLP(LN(zl)) + zll=1...L(公式三)
y = L N ( z L 0 ) (公式四) \pmb{y}=LN(\pmb{z}^0_L)(公式四) y=LN(zL0)(公式四)

以上是对 ViT 的文字描述。下面的 Inductive bias、Hybrid Architecture 是作者对 ViT 的补充分析。

Inductive bias。 我们注意到 Vision Transformer 比 CNN 具有更少的图像特定的感应偏置。在 CNN 中,locality、two-dimensional neighborhood structure、translation equivariance 等被嵌入到整个模型的每一层中。在 ViT 中,只有 MLP 层是 locality、translation equivariance 的,而 self-attention layer 是全局的。two-dimensional neighborhood structure 的使用非常少:在模型开始时通过将图像切割成小块,以及在微调时用于调整不同分辨率图像的位置嵌入(如下所述)。除此之外,初始化时的位置嵌入不携带关于 patch 的二维位置信息,所有 patch 之间的空间关系都需要从头学习。

Hybrid Architecture. 作为原始图像补丁的替代方案,输入序列可以由 CNN 的特征映射形成(LeCun et al, 1989)。在该混合模型中,将 patch embedding 投影 E \pmb{E} E(Eq. 1)应用于从 CNN feature map 中提取的 patch。作为一种特殊情况,patch 的空间大小可以是 1x1,这意味着输入序列是通过简单地将 feature map 的空间维度平坦化并投影到 Transformer 维度来获得的。如上所述添加分类输入嵌入和位置嵌入。

Fine-tuning And Higher Resolution

通常,我们在大型数据集上预训练 ViT,并对(较小的)下游任务进行微调。为此,我们移除预训练的预测头,并附加一个零初始化的 D × K \pmb{D} × \pmb{K} D×K 前传层,其中 K \pmb{K} K 是下游类的数量。与预训练相比,在更高分辨率下进行微调通常是有益的(Touvron等人,2019;Kolesnikov et al, 2020)。当输入更高分辨率的图像时,我们保持 patch 大小不变,从而获得更大的有效序列长度。Vision Transformer 可以处理任意序列长度(直到内存限制),但是,预训练的位置嵌入可能不再有意义。因此,我们根据预训练的位置嵌入在原始图像中的位置对其进行二维插值。请注意,此分辨率调整和补丁提取是将图像的2D结构的感应偏置手动注入 Vision Transformer 的唯一点。

Experiments

(52:18 – 1:09:53)

我们评估了 ResNet、Vision Transformer (ViT) 和 hybrid 的表示学习能力。为了了解每个模型的数据需求,我们在不同大小的数据集上进行预训练,并评估许多基准任务。当考虑到预训练模型的计算成本时,ViT 表现非常好,以较低的预训练成本在大多数识别基准上达到最先进的水平。最后,我们使用 self-supervison 进行了一个小实验,并表明 self-supervision 的 ViT 在未来是有希望的。文章来源地址https://www.toymoban.com/news/detail-447552.html

到了这里,关于ViT 论文逐段精读的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包