ViT论文解读

ViT论文解读

本文主要记录Yi Zhu大佬对于ICLR 2021的一篇论文精读

AN IMAGE IS WORTH 16x16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE

论文地址:https://arxiv.org/pdf/2010.11929.pdf
源码地址:https://github.com/google-research/vision_transformer

标题部分

AN IMAGE IS WORTH 16x16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE
一张图片等价于很多16X16大小的单词

这里的等价指的是把图片看作是很多的patch,每个patch的大小是16x16,那么这张图片就是很多16x16patch组成的。
ViT论文解读

摘要

作者阐述了Transformer在NLP领域已经大放异彩了,但是在CV视觉领域还是很有限的。在CV的研究中,以往的模型要么是将Transformer中的Attention部分拿出来和卷积神经网络一起使用,要么是把卷积神经网络中的卷积部分用Attention替换使用,整体的卷积神经网络结构是不变的。

作者通过这篇文章证明了Transformer对于卷积结构是完全不依赖的,用一个纯粹的Transformer也可以直接作用于一个图像块,而且在大规模数据集上的效果要比卷积的效果可以媲美。

引言

首先作者介绍了自注意力机制网络已经是NLP的必选模型了,目前主流的方式是在一个大规模的数据集上去做预训练,然后再在特定领域的小数据集上做微调,因为Transformer的高效性和可扩展性,现在已经可以训练超过1000亿的参数模型了。但是随着模型和数据集的增长,仍然没有看到Transformer有饱和的现象,说明它的潜力还是很大的。

这里用一个翻译任务简单介绍一下Transformer

ViT论文解读
因为在做自注意力机制时,序列元素之间是两两相互计算的,所以计算复杂度和序列的长度呈平方倍的,就目前的计算机能力而言,能够计算的序列只有几百或者几千的长度,例如BERT中的序列长度为512。

而现在我们要把Transformer用在视觉领域,第一个最重要的难点就是如何把2D的图像用1D序列形式表现出来,最初的想法是将2D元素的每个像素点拉直,然后拼接成一个1D序列,如下图一样。
ViT论文解读
这样的想法是很好的,但是在实际的应用中,图片的大小一般是224X224个像素点,如果把图片里的每一个像素点都当做序列里的元素来看待,那么这个序列的长度就是224X224=50176了。显然以现在的计算机水平,处理这样长度的序列是不可行的。而且现在的目标检测或者图像分割使用的图片数据格式已经是600X600或者800X800了,这样形成的序列长度更长了。

所以在视觉领域,仍然是以卷积神经网络为主导地位,像AlexNet、ResNet等。在之前的论文中分析出因为序列长度问题导致Transformer无法直接作用于图像上,那么就提出了将卷积之后的特征图进行Transformer操作,如使用Res50之后特征图大小为14X14,拉平成1D序列长度为196,这样就降低了序列长度。但是作者分析出这种模型不适用于大规模的图像识别中,对比传统的残差网络,并没有提升。

作者提出的想法是将一张224X224的图片按照16X16的大小分割,这样可以得到宽度W=224/16=14,高度H=224/16=14,这样整张图片就可以变成了14X14=196长度的1D序列了,这样的长度对于Transformer来说是可以接受的。同时使用有监督的训练方式进行模型训练。

在引言的最后一段,作者指出了ViT模型在中小型数据集(如ImageNet)上的效果对比ResNet是比较弱的,这是因为Transformer和卷积神经网络相比,缺少了一些卷积神经网络拥有的归纳偏置,即一种先验知识。对于卷积神经网络来说,以一种滑动窗口的方式对图片进行卷积,所以可以假设图片上相邻的区域有相关特征,而在卷积和平移操作过程中,无论先后,结果是一样的。对于Transformer来说,没有先验知识,一切都需要自己去学习,所以在较大的数据集上,Transformer学习的能力比ResNet效果相近。同时Transformer的稳健性也很好。

Method

ViT论文解读
根据上图,可以看出ViT的工作流程:/
首先将一张图片分割为n个patch,上图中将一幅图片分割为9个patch块,然后将这9个patch变成一个序列,长度为9,每个patch会通过一个线性投射层的操作得到一个特征,即图中的patch embedding,同时因为patch是按顺序排列的,所以给每一个patch加一个位置编码,进而使得整体的序列即包含了图片块的信息,也包含了图片位置信息。在序列中,起始位置是一个特殊字符cls,代表序列的开始信息。然后将序列送入Transformer进行训练,再通过MLP Head通用分类头,再经过交叉熵损失函数去进行模型的训练。
在Transformer内部,首先序列生成的Embedded Patches先经过一个laynorm,然后再作Multi-Head Attention操作,再laynorm,MLP进而输出。

预处理操作:

设输入的图像格式为:224X224X3,patch块大小为16X16X3
经过分割之后的patch块数量n=2242/162=196
所以原始图像就标成了196分patch块,每个patch块的维度为16X16X3=768
然后经过全连接层(768,D),本文中D=768,这样得到196个token,每个token维度为768,另外在序列的起始位置也需要一个token作为标识,所以序列为197X768
接着给每个序列元素增加一个位置编码信息,这里使用sum进行计算,所以序列格式依然为197X768
至此,图片的预处理操作就完成了

进入模型:

首先序列进入laynorm层,计算后的格式仍然为197X768
接着要进入多头自注意力,本文中使用head数量为12,这里的Q K V 格式就是197X(768/12),即197X64,同时QKV有12个,经过注意力之后输出的格式仍然为197X768
再进入laynorm层,然后再过一层MLP,MLP会把维度相应的放大,本文中是放大4倍,即197X3072,然后再缩小4倍投射回去,又变成了197X768
然后就可以输出了
所以一个Transformer block就计算完成了,因为格式不变,所以可以经过多个block操作,L层的Transformer block即为Transformer Encoder部分。

具体公式:
ViT论文解读

实验结果

使用的数据集为ImageNet-1K
ViT论文解读
ViT论文解读
ViT论文解读
ViT论文解读

结论

作者使用NLP领域中标准的Transformer来做CV问题,并且与之前的使用自注意力机制的方法不同,本文的方法没有使用图像的归纳偏置,而是直接将图片分割为patch后送入Transformer进行训练,这样的好处是不需要对CV领域有很多的了解,把图片理解为一个序列,简单明了。而且在和大规模训练结合起来的时候,效果很好。
接着作者又对未来的ViT做了展望,指出了ViT在目标检测和语义分割等方向会有更好的发展前景。另外还有探索ViT自监督的预训练方案。

上一篇:VIT网络结构及讲解(全网看到最详细的)


下一篇:001-centos6.5下安装jenkins