【读论文】VIT(Vision Transformer)

这篇博客探讨了将NLP领域的Transformer模型应用于计算机视觉(CV)任务的难点,如序列长度过长导致的计算复杂度问题。文章介绍了ViT(Vision Transformer)模型,它将图像切割成小块并输入Transformer,通过预训练和微调在ImageNet等数据集上取得良好效果。研究发现,Transformer在视觉任务中展现出强大的全局建模能力,但缺乏卷积网络的归纳偏置。实验表明,大规模预训练对于Transformer在视觉任务上的性能提升至关重要。同时,论文还讨论了位置编码和特殊token(如clstoken)的作用,并进行了相关消融实验。


论文连接:
AN IMAGE IS WORTH 16X16 WORDS:TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE
在这里插入图片描述

An Image is Worth 16*16 Words:Transformers for Image Recogniztion at Scale

NLP领域的transformer应用到CV领域有哪些难点?

算attention时是两两相互的,如果输入序列的长度是n,那么该过程的时间复杂度是O( n 2 n^2 n2)。在NLP中,目前硬件能支持的序列长度n一般是几百或上千。在BERT中,n=512。

  • 2d的图片如何变成1d的序列或集合
    最简单的直接将图像(假设尺寸为224x224)拉直,每个像素点当成序列中的元素,序列长度为224*224=50176,相当于是BERT中序列长度的100倍,会使计算attention的时候时间复杂度太高。此外,对于分类任务通常输入的是224x224,但对于检测和分割任务会达到600x600或800x800或者更大。

Abstract

  • transformer是NLP领域的标准(BERT、GPT3、T5…),但很少应用于CV领域。
  • CV领域中,attention要么是和卷积网络一起使用,要么是用attention替换卷积,并保持整体结构不变。(注:比如一个残差网络resnet50,有4个stage:res2,res3,res4,res5,只是用attention去取代每个block的操作)
  • 我们的工作表明CV任务中,卷积网络并不是必要的,纯transformer可以直接应用于序列图片的图像分类任务。
  • 当在大数据集上预训练再在迁移到中小数据集(ImageNet,CIFAR-100,VTAB,etc)上做识别VIT有很好的效果(和最好的卷积网络相媲美)。

Introduction

  • transformer在NLP领域中扩展得很好,越大的数据,越大的模型最后得performance会一直上升,没有饱和的现象,那么transformer在视觉任务上,performance是不是也能获得大幅度的提升?
  • 为了将transformer用于视觉任务,就要降低输入序列的长度,有论文将卷积后的特征图输入到transformer中,即将卷积和自注意力相结合
  • 有的将卷积全部替换成自注意力机制:Stand-ALone Attention(孤立注意力,控制一个局部的小窗口的大小来控制输入序列的长度,有点像回到卷积的一个操作,因为卷积也是在局部的一个window里做的),Axial Attention(轴注意力,N=H*W,将一个在2d矩阵上的自注意力操作变成两个在1d的向量上的自注意力操作)
  • 全部替换的这种自注意力操作理论上是高效的,但是Stand-ALone Attention和Axial Attention都是比较特殊的自注意力操作,没有在现在的硬件上加速,很难用它去训练一个大模型,所以基于Stand-ALone Attention都不会很大和Axial Attention的模型和百亿、千亿参数的transformer大模型相差甚远。在大规模的图像识别任务上,传统的残差网络还是效果最好的。
  • 本论文的特点(本文想讲的故事) 是:直接用一个标准的transformer作用于图像,做尽可能少的修改(不做任何针对视觉任务的改变),这样的transformer能不能在视觉领域中扩展得很大。本文是如何解决输入序列过长的问题的呢?将一个图片分割成16*16个patch,如果输入图片是224 * 224,将每个patch作为输入序列的元素,那么输入的序列长度就是14 * 14=196。
  • 本论文训练模型采用的是有监督的训练方式。强调这个是因为NLP领域中,transformer都是用无监督的方式训练(language modeling/mask language modeling),对于视觉任务大都是用有监督的baseline去训练。
    在这里插入图片描述
  • 如果在ImageNet数据集上不加较强的约束(regularization),VIT模型和同等大小的resnet相比要弱几个点,这是因为transformer跟卷积神经网络相比缺少归纳偏置(inductive bias)。Inductive bias是指我们的先验知识或提前做好的假设。对于卷积神经网络就有两个归纳偏置:locality:局部相关性(卷积神经网络是以滑窗的形式在图片上一点一点卷积的,所以它假设图片上相邻的区域会有很多相邻的特征)和translation equivariance:平移等变性 f ( g ( x ) ) = g ( f ( x ) ) f(g(x))=g(f(x)) f(g(x))=g(f(x)) f f f理解为卷积, g g g理解为平移。f和g的处理顺序对结果没有影响)。但是对于transformer来说,它没有这些先验信息,这些感知信息transformer全都要从数据里自己学。所以本论文上大数据集(14M-300M images),效果拔群。得出在transformer上大规模的预训练在下游任务上迁移学习比卷积的归纳偏置效果要好的结论。

Related Work

(1)BERT

a denoising self-supervised pre-training task:去噪的自监督方式(类似于一个完形填空,有一个句子,把其中某些词划掉,然后再把这些词predict出来)

(2)GPT

uses language modeling as its pre-training task :language modeling的自监督方式(我们已经有一个句子,我要预测下一个词是什么,next word prediction)

(3)self-attention在CV领域的应用

  • 直接在像素层面上做自注意力,时间复杂度O( n 2 n^2 n2)过大,很难应用到真实尺寸的图片上
  • 不用整张图,而用local neighborhoods做自注意力:local multi-head dot-product self attention blocks
  • Sparse Transformers:只对稀疏的点做自注意力,相当于全局注意力的近似
  • Axial Attention:现在横轴上做自注意力,再在纵轴上做自注意力
    以上特制的自注意力结构在视觉任务上的表现都是可以的,但是需要很复杂的工程去加速算子,从而在CPU或GPU上跑得很快,让训练一个大模型称为可能。
  • image GPT(iGPT),一个生成型模型,采用无监督的方式训练。拿训练好的模型去做微调,或者把它当成特征提取器,在imagenNet上最高的准确率只能达到72%。(注:在MAE之前生成式网络在视觉任务上是没办法跟判别式网络比的)

Method

在这里插入图片描述

整个前向传播过程

  • 将图像(X:224 * 224 * 3)打成一个九宫格(默认每个patch是16 * 16),再将得到的九宫格排成一个序列(包含14 * 14个token,此时得到的数据维度:196 * 16 * 16 * 3=196 * 768
  • Patch Embedding:通过一个linear projection of flattenned patches(线性投射层,就是一个全连接层E,维度为768 * 768,前面这个768是从图像patch算来的16 * 16 * 3=768;后面的768就是文章中提到的D,这个D是可变的,如果transformer更大,D也可以相应地变得更大)得到一个特征(X·E=(196 * 768) * (768 * 768),即X·E的维度是196 * 768)。此外,除了图像本身带来的token外,还要加一个额外的特殊token cls token(1 * 768),这个token是一个可以学习的特征,和图像的特征有相同的维度768。因此最后进入Transformer的整体序列长度是197 * 768。我们最终会对输出进行切片,将cls token当成整个图像的特征,其输出当成是整个transformer模型的输出。这是因为自注意力操作是两两token交互的,最终可以认为这个cls token会包含整个图像的特征。
  • Position Embedding:得到的9宫格本身是有顺序的,但是自注意力操作只是输入序列patch的两两交互,失去了这个顺序信息,因此要加入位置编码postion embedding,这样整体的token就既包含图片块原本有的图像信息,又包含了图像块所在的位置信息。关于位置编码,并不是直接用序列标号1,2,3…197(加上了额外的特殊字符cls token的位置编码)而是我们会有一个表(197 * 768),每一行是一个向量,向量的维度是D=768,这个向量也是可以学的。然后将位置信息加(不是concat) 到所有的token中,得到的序列Embedded Patches维度还是197 * 768。至此,完成所有的图片预处理。
  • Transformer Encoder
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

verse_armour

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值