ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ViT论文解读

2021-12-07 16:33:14  阅读:403  来源: 互联网

标签:Transformer 卷积 论文 patch 解读 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组成的。
在这里插入图片描述

摘要

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

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

引言

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

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

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

而现在我们要把Transformer用在视觉领域,第一个最重要的难点就是如何把2D的图像用1D序列形式表现出来,最初的想法是将2D元素的每个像素点拉直,然后拼接成一个1D序列,如下图一样。
在这里插入图片描述
这样的想法是很好的,但是在实际的应用中,图片的大小一般是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的工作流程:/
首先将一张图片分割为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部分。

具体公式:
具体公式

实验结果

使用的数据集为ImageNet-1K
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

结论

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

标签:Transformer,卷积,论文,patch,解读,ViT,序列,长度,图片
来源: https://blog.csdn.net/qq_39064418/article/details/121767058

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有