该论文最终修订于2021年1月30日,主要介绍了transformer在计算机视觉领域的发展。
(1)2017年6月,完全基于注意力机制,提出了transformer,transformer在nlp任务中表现出出色的性能;
(2)2018年10月,提出的BERT,使得预训练的transformer模型开始在nlp领域占主导地位;
(3)2020年5月,提出的GPT-3模型,具有170B参数的大型transformer,朝着通用nlp模型迈出了一大步;
(4)2020年5月,提出的DERT模型,通过将目标检测视为直接集预测问题,实现了简单有效的高水平视觉框架;
(5)2020年7月,提出的iGPT模型,使基于nlp的transformer也可以用于图像预训练;
(6)2020年10月,提出的ViT模型,使纯transformer架构可很好地用于视觉识别;
(7)2020年12月,提出的IPT模型,是通过结合多任务实现低层次视觉的第一个transformer模型;
(8)2021年3月25日,提出的Swin Transformer,在图像分类、目标检测和语义分割等识别任务上取得了很好的效果。
作者根据应用场景将基于视觉的transformer分为backbone、高/中级别视觉、低级别视觉和视频处理四类。高级视觉处理的是对图像所见内容的解释和使用,中级视觉处理的是如何将这些信息组织成我们所体验到的物体和表面,但是这两类的界限越来越模糊,所以把它们分为一类;低层次图像处理的典型应用包括超分辨率、图像去噪和样式转换,transformer在这一类应用的比较少;Transformer天生非常适合用于视频任务,在视频任务中它的性能开始与传统的cnn和rnn相当。还有一部分人研究更高效的transformer,代表性成果如下表格:
Transformer首次用于NLP领域的机器翻译,如下图所示,它是由一个编码器模块和一个解码器模块组成,该模块具有多个相同架构的encoder/decoder,每个encoder由自注意层和前馈神经功能网络组成,每个decoder比encoder多包含一个编码器-解码器注意层,在Transformer 用于翻译句子之前,句子中的每个单词都需要嵌入到dmodel= 512维的向量中。框架图如下:
为了使自注意层具有捕捉句子中单词位置信息的能力,用如下公式在原始输入嵌入中添加位置编码
其中pos表示单词在句子中的位置,i表示位置编码的当前维度。
然后将位置编码后的512维度和embedding后的512维度相加,得到最后的512维度作为transformer的输入。
在自注意层中,首先将输入向量转化为三个不同的向量:查询向量q、关键向量k和值向量v,其维数为dq = dk = dv = dmodel = 512。由不同输入导出的向量被打包成三个不同的矩阵,即Q、K和V。随后,计算不同输入向量之间的注意函数,函数如下:
点乘是一个向量在另一个向量投影上的长度(是一个标量),点乘可以反映两个向量的相似度,两个同维度空间中的单位向量越相似,点乘(余弦相似度)结果越大;因为q和k相乘后值很大,softmax反向传播的时候值很小,则很容易造成梯度消失,所以要除以根号dk;softmax之后,再和v矩阵相乘,即求出每个值向量乘以概率的和。
X1、X2分别和WQ、WK、WV相乘就可以得到Q、K、V;WQ、WK、WV通过训练得来的。
更深层次的理解:向量点积得出来的结果,表示关注程度,实际上表示的是当前状态和所有时刻状态的关系,也就是当前时刻状态和所有时刻状态的高纬度编码关系。
解码器模块中的编码器-解码器:该模块的注意层与编码器模块中的自注意层相似,但有以下不同之处:关键矩阵K和值矩阵V由编码器模块导出,查询矩阵Q由前一层导出。
多头注意力机制:这是通过给注意层不同的表示子空间来实现的。具体来说,不同的头使用不同的查询矩阵、键矩阵和值矩阵,这些矩阵由于随机初始化,训练后可以将输入向量投射到不同的表示子空间中,也就是用多套参数,捕捉到更多特征信息。
残差和LN:把输入时的X和注意力机制输出的Z对位相加就可以得到残差,然后经过LayerNorm输出。残差主要缓解了梯度消失的出现;LayerNorm对一个样本的所有单词做缩放。
前馈神经网络:由两个线性变换层和其中一个非线性激活函数组成。
decoder最后一层:解码器的最后一层用于将向量堆栈转换回一个单词,这是通过一个线性层和一个softmax层来实现的。
小结:transformer主要利用自注意机制来提取内在特征,与只关注局部特征的CNN相比,transformer可以捕捉到长距离特征,这意味着它可以很容易地获得全局信息。与必须依次处理隐藏状态的RNN相比,transformer的效率更高,因为自注意层和全连接层的输出可以并行计算,并且易于加速。
文本和图像有如下区别:
(1)文本需要一维的表征,图像需要二维的表征,导致计算量剧增;
(2)图像涉及到更多的尺寸、噪声和冗余模态,因此需要更强的提取能力。
transformer做图像分类的backbone有如下两种方法:
有人提出采用ResNet作为baseline,使用visual transformer代替最后阶段的卷积,即使用卷积层来提取低级特征,然后将这些特征输入visual transformer。visual transformer就是使用tokenizer将像素分组为少量的visual tokens,每个visual token表示图像中的一个语义概念,这些visual token直接用于图像分类,transformer用于建模tokens之间的关系,最后输出的tokens直接被用来做分类或者处理一下恢复成特征图用于实例分割。
使用纯transformer进行图像分类的模型包括iGPT,ViT和DeiT,最近的大部分工作也是使用纯transformer。这些模型的核心区别在于:得到token的方式;训练的方式;评估的方式。得到token,才能像NLP一样使用transformer;有训练目标才能训练模型;有评估方式才能知道模型的优劣。
iGPT(image GPT)使用的GPT-2的网络结构进行图像的特征建模,然后将特征直接应用到下游分类任务中,iGPT包含预训练和微调两个步骤。
token:将原始图像进行预处理得到低分辨率,然后从左到右、从上到下重塑为一维序列,每个像素相当于一个单词;
预训练:两种预训练方式:(1)像自编码器一样逐像素预测(预测第i个像素时,mask掉i+1之后的所有像素);(2)像bert一样mask一部分像素后预测。
微调:两种微调方式:(1)增加一个小分类头,用于优化分类目标并调整所有权重;将预训练的模型视为特征提取器,增加一个分类头,只训练这个分类头。
值得一提的是,iGPT在图像补全上效果很好,如下图:
iGPT缺点如下:对计算资源的要求十分高,参数量是同性能卷积网络的2-3倍;iGPT只能处理低分辨率图片,导致丢失图片信息;iGPT生成的补全图像依赖输入数据的分布,可能导致数据偏差。
参考链接:iGPT
ViT的思路很简单:把图像分成固定大小的patch,通过线性变换得到一维的patch embedding,同时也使用了positional embedding,然后将二者相加送入tansformer(只用了transformer中的encoder部分)就可以提取特征进行分类了,transformer的输出是一系列的patch features,但是应用于图像分类,输出应该是image feature,所以ViT增加一个class token来预测分类类别,网络结构如下:
使用transformer进行目标检测大致可以分为两种方法:将目标检测视为集合预测问题(如DERT);将transformer作为目标检测的backbone(如ViT-FRCNN),如下图:
DERT:DETR是一种简单且完整的端到端目标检测器,它将目标检测任务视为一个直观的集合预测问题,消除了传统手工制作的组件,如anchor生成和NMS后处理,架构如下:
token获取方式:通过CNN将图像下采样,然后将数据压缩成一维,加上positional encoding。
DETR是一个基于transformer的对象检测框架的新设计,在COCO数据集上,在精度和速度上可达到与Faster R-CNN差不多的性能,然而它具有训练时间长,对小物体检测性能差的缺点。
基于DERT的方法:Deformable DETR更关注参考点周围的一组关键位置,而不是像最初的多头注意机制那样查看feature map的所有空间位置,实现了更好的性能并提高了推理速度;ACT取代预先训练的DETR模型的自注意模块,而不需要任何再训练,这种方法大大降低了计算成本,但只略微降低了精度;有研究人员发现DERT的收敛慢的原因就是decoder中的交叉注意模块;有学者在NLP的预训练transformer得到灵感,通过随机查询patch检测进行无监督目标检测预训练(UP-DERT),在小数据集上显著提高了精度,在大数据集上也比原始的DERT精度高。
ViT-FRCNN:ViT-FRCNN将ViT与传统的检测框架融合,使用transformer的encoder作为backbone提取特征,与ViT处理图像的方式一致,但是输出的patch feature重新调整为一个图像的特征图送入传统检测模型。与基于cnn的目标检测方法相比,基于transformer的方法在准确率和速度方面表现出了强大的性能。
行人检测:由于在遮挡和人群场景中,目标的分布非常密集,使用DETR或deformable DETR时,稀疏均匀查询和解码器中的弱注意会导致性能下降。有人提出了PED,它使用了一个新的解码器(DQRF)支持密集查询,缓解查询的噪声或狭窄注意域;还提出了V-Match,通过充分利用可见注释来实现额外的性能改进。
车道线检测:在PolyLaneNet的基础上,有人提出了LSTR,该方法通过学习transformer的全局上下文来提高曲线车道检测的性能。
目标分割:Max-DeepLab在DETR的解码器上附加一个掩模头,就扩展到了全景分割任务;VisTR是基于transformer的视频实例分割模型,用于从输入图像序列中产生实例预测结果;cell-DETR基于DETR全景分割模型,增加跳跃连接,将骨干CNN和CNN解码器之间的特征桥接起来,以增强特征融合,cell-DETR实现了最先进的性能从显微镜图像细胞实例分割;SETR是基于基于transformer的语义分割网络,利用一个类似于ViT的编码器作为编码器从输入图像中提取特征,采用多级特征聚合模块进行像素级分割;点云学习有关的分割模型如Point Transformer。
姿态估计:目的是从输入的图像中预测联合坐标或网格顶点,HOT-Net用于三维手-对象姿态估计;METRO用于从单一RGB图像中预测3D人体姿态和网格。
该类任务如图像超分辨率、图像生成等,通常以图像作为输出,高/中级视觉任务输出是label或box,研究把transformer应用到这个领域的学者比较少。
将图像分为patch,以该序列作为encoder的输入,decoder就能成功生成所需的图像, 为不同的图像处理任务设计合适的体系结构将是一个有意义的方向。整体框架如下:
transformer在基于序列的任务上表现得出奇地好,视频处理需要利用空间和时间信息,因此transformer在许多视频任务(如帧合成,动作识别,视频检索等)中应用得越来越多。
图像生成:图像生成任务是指从自然图像数据集生成图像,由于可并行结构预测像素块的效率高而备受关注。有一种方法是基于似然生成模型,利用transformer生成图像,将局部注意模块集成到image transformer中,以预测连续的像素块。
活动识别:活动识别任务包括在一群人中识别一个人的活动,以前适用于这类任务的方法是基于个别行动者的地点。有人提出了一个actor-transformer架构来学习表示,使用二维和三维网络生成的静态和动态表示作为输入,transformer的输出是预测的活动。
人类行为识别:就是识别和定位视频中的人体动作,情境(如其他人和物体)在识别人类行为中扮演着关键角色,有人提出了action transformer来模拟人和周围环境之间的潜在关系。
人脸对齐:基于视频的人脸对齐任务旨在定位面部地标,这类任务的整体性能在很大程度上依赖于时间依赖性和空间信息,然而以往的方法不能同时捕获连续帧上的时间信息和静止帧上的互补空间信息,因此有人提出了two-stream transformer,可以分别学习时间和空间特征,以端到端的方式联合优化两个流,并对特征进行加权,以获得最终的预测结果。
视频检索:基于内容的视频检索的关键是找到视频之间的相似度,有人建议仅利用视频级的图像级特征来克服相关的挑战,使用transformer来建模长期语义依赖。
视频目标检测:在检测视频中的目标时,既需要全局信息,也需要局部信息,有人提出了一种spatiotemporal transformer来聚合时空信息,在三维视频目标检测任务中表现良好。
多任务学习:未修剪的视频通常包含许多与目标任务无关的帧,因此剔除冗余信息就显得尤为重要,有人提出了video multi-task transformer,该网络处理未修剪视频的多任务学习。
帧/视频合成:帧合成任务涉及合成两个连续帧之间或一帧序列之后的帧,而视频合成任务涉及合成一个视频。有人提出了ConvTransformer,它由特征嵌入、位置编码、编码器、查询解码器和综合前馈网络五个部分组成。
视频修复:视频修复任务包括完成帧内任何缺失的区域,这个具有挑战性,因为它要求沿空间和时间维度的信息被合并,有人提出spatial-temporal transformer,将所有输入帧作为输入并并行填充,利用时空对抗损耗对transformer进行优化。
自注意是transformer的关键部分,有很多学者专门为计算机视觉设计基于自注意的模型,应用于一些任务比如语义分割、实例分割、目标检测、关键点检测和深度估计。
虽然transformer模型在各种任务中都取得了成功,但它们对内存和计算资源的高要求阻碍了它们在资源有限的设备(如手机)上的实现,很多学者研究压缩和加速transformer的有效实施,比如网络剪枝、低秩分解、知识精馏、网络量化和紧凑架构设计。
修剪和分解:在基于transformer的预训练模型(例如BERT)中,多个注意操作是并行执行的,以独立地建模不同标记之间的关系,但是特定的任务并不需要使用所有的头。有人发现在测试时去掉很大比例的注意头,不会显著影响性能,不同层所需头数量不同,有些层甚至可能只需要一个头,因此有人提出根据重要性分数来估计每个头对最终输出的影响,不重要的头可以被删除;还可以通过减少深度(层的数量)和矩阵分解(用多个小矩阵近似大矩阵)等方法提高推理效率。
知识蒸馏:知识精馏的目的是通过从大型教师网络中转移知识来训练学生网络,与教师网络相比,学生网络的架构通常更薄、更浅,更容易在资源有限的资源上部署,有人使用预先训练的BERT作为教师,利用大量未标记的数据来指导小模型的训练;有人训练学生网络模仿预先训练的教师模型中的自注意层的输出;有人还引入了教师助理,减少了大型预训练transformer模型和紧凑的学生网络之间的差距,从而促进了模仿;由于transformer模型中存在不同类型的层(即自我注意层、嵌入层和预测层),有人设计了不同的目标函数来将知识从教师传递给学生。
量化:量化的目的是减少表示网络权值或中间特征所需的比特数。
紧凑的架构设计:有人提出了一种将全连接层和卷积层结合起来的名为跨层动态卷积的新模块,简化了自注意的计算。
总:剪枝和分解方法通常需要预定义的具有冗余的模型,具体来说,如上图所示,剪枝侧重于减少transformer模型中的组件(如层、头)数量,而分解则用多个小矩阵表示原始矩阵。紧凑的模型也可以直接手动设计或自动设计,得到的紧凑模型可以通过量化方法进一步用低比特表示,以便在资源有限的设备上有效部署。
transformer以其优异的性能和巨大的潜力成为计算机视觉领域的研究热点,但是计算机视觉中transformer的潜力还没有得到充分的探索,这意味着仍有一些挑战需要解决。
挑战:尽管研究人员已经提出了许多基于transformer的模型来处理计算机视觉任务,但这些工作只是这个领域的第一步,还有很多改进的空间。
(1)比如ViT中的transformer架构遵循了NLP的标准transformer,但专门为CV设计的改进版本仍有待探索。
(2)计算机视觉transformer的泛化和鲁棒性也具有挑战性,与cnn相比,纯transformer缺乏一些归纳偏差,并且严重依赖于大量数据集进行大规模的训练。
(3)虽然ViT在CIFAR、VTAB等下游图像分类任务中表现出色,但直接将ViT骨干应用于目标检测并没有达到比CNNs更好的效果,以更一般的预训练transformer去完成一般的视觉任务还有很长的路要走。
(4)并没有解释清楚为什么transformer能在视觉任务中出色的表现,受transformer中大量使用参数的启发,过度参数化可能是视觉transformer可解释性的一个潜在点。
(5)为计算机视觉开发高效的transformer模型仍然是一个问题,transformer模型通常体积巨大,计算成本昂贵,例如基本的ViT模型需要180亿次浮点运算才能处理一张图像,相比之下,轻量级的CNN模型GhostNet只需约6亿次浮点就能实现类似的性能。虽然已经提出了几种压缩transformer的方法,但它们仍然非常复杂,而这些方法原本是为自然语言处理设计的,可能并不适用于CV,因此迫切需要高效的transformer模型,以便在资源有限的设备上部署可视transformer。
未来展望:
(1)提高transformer在计算机视觉中的有效性和效率。
(2)现有大多数用于计算机视觉的transformer都被设计成只处理单一任务,而一些NLP模型比如GPT-3可以在一个模型中处理多个任务,因此可以尝试使用一个transformer模型处理多个计算机视觉任务。
2021年3月提出的Swin Transformer最大的贡献是提出了一个可以广泛应用到所有计算机视觉领域的backbone,但是Swin Transformer在诸多的CNN已经取得非常好的效果的领域还未得到充分验证,通过github发现该模型所需计算量如下图:
查阅资料发现CNN所需计算量如下图:
一个MFLOPS(megaFLOPS)等于每秒一百万(=106)次的浮点运算;一个GFLOPS(gigaFLOPS)等于每秒十亿(109)次浮点运算。