2018
年Google AI
研究院提出了一种预训练模型BERT
,该模型在11项NLP
任务中夺得SOTA
结果,而BERT
取得成功的一个关键因素是Transformer
的强大作用。Transformer
改进了RNN
最被人诟病的训练慢的缺点,利用self-attention
机制实现快速并行。并且Transformer
可以增加到非常深的深度,充分发掘DNN
模型的特性,提升模型准确率。由此Transformer
也开始走进不同领域深度学习算法工程师们的视野。本文从Transformer
的基础原理和在一些领域的代表性论文来总结对Transformer
在计算机视觉领域中的应用。
Transformer 基本原理
Transformer
这一结构的概念本身可以追溯到Google
在2017
年的一篇论文Attention Is All You Need。该论文首次没有使用LSTM
等RNN
结构来构建NLP
任务的神经网络,也没有像FAIR
一样通过CNN
来实现自然语言翻译,而是仅使用Attention
模块堆叠就能够出色的完成相关的任务。Google
给这个多层Attention
堆叠的结构起名为Transformer
。由下图可以看出,一个标准的Transformer
由一个encoder
和一个decoder
组成,encoder
包括一个自注意力层和一个前馈神经网络,decoder
包括一个自注意力层、一个编码-解码注意力层和一个前馈神经网络。
Transformer
中比较重要的几个结构是Scaled Dot-Product Attention
、 Multi-Head Attention
、 Position-wise Feed-Forward Networks
和 Positional Encoding
。
Scaled Dot-Product Attention
通过Q
、K
、V
对embedding
后的数据进行Attention
的计算,其分别对应的是Query
,Key
接Value
。
Multi-Head Attention
则是通过h
个不同的线性变换对Q
,K
,V
进行投影,最后将不同的attention
结果拼接起来。
Position-wise feed-forward networks
这层主要是提供非线性变换。Attention
输出的维度是[bszseq_len, num_headshead_size],第二个sub-layer
是个全连接层,之所以是position-wise
是因为过线性层时每个位置i的变换参数是一样的。
Transformer
抛弃了RNN
,而RNN
最大的优点就是在时间序列上对数据的抽象,所以文章中作者提出两种Positional Encoding
的方法,将encoding
后的数据与embedding
数据求和,加入了相对位置信息。
一次self-attention
的运算可以通过以下步骤完成:
从每个编码器的输入向量(每个单词的词向量)中生成三个向量。也就是说对于每个单词,我们创造一个查询向量
Q
、一个键向量K
和一个值向量V
。这三个向量是通过词嵌入与三个权重矩阵后相乘创建的。假设词向量x
的大小为1x4
,权重矩阵Wq
的大小为4x3
,其相乘后就可以得到大小为1x3
的查询向量q
。假设我们为第一个词
Thinking
计算自注意力向量,我们需要拿输入句子中的每个单词对Thinking
打分。这些分数决定了在编码单词Thinking
的过程中有多重视句子的其它部分。这些分数是通过打分单词(所有输入句子的单词)的键向量与Thinking
的查询向量相点积来计算的。所以如果我们是处理位置最靠前的词的自注意力的话,第一个分数是q1
和k1
的点积,第二个分数是q1
和k2
的点积。将分数除以
8
(8
是论文中使用的键向量的维数64
的平方根,这会让梯度更稳定。这里也可以使用其它值,8
只是默认值),然后通过softmax
传递结果。softmax
的作用是使所有单词的分数归一化,得到的分数都是正值且和为1
。这个softmax
分数决定了每个单词对编码当下位置单词的贡献。显然,已经在这个位置上的单词将获得最高的softmax
分数,但有时关注另一个与当前单词相关的单词也会有帮助。将每个值向量乘以
softmax
分数,这里的直觉是希望关注语义上相关的单词,并弱化不相关的单词(例如,让它们乘以0.001
这样的小数)。-
对加权值向量求和,然后即得到自注意力层在该位置的输出。自注意力的另一种解释就是在编码某个单词时,就是将所有单词的表示(值向量)进行加权求和,而权重是通过该词的表示(键向量)与被编码词表示(查询向量)的点积并通过
softmax
得到。
Multi-Head Attention
为每个头保持独立的查询/键/值权重矩阵,从而产生不同的查询/键/值矩阵。这些集合中的每一个都是随机初始化的,在训练之后,每个集合都被用来将输入词嵌入(或来自较低编码器/解码器的向量)投影到不同的表示子空间中。它扩展了模型专注于不同位置的能力并且给出了注意力层的多个“表示子空间”。
为了理解输入单词的顺序,Transformer
为每个输入的词嵌入添加了一位置个向量。这些向量遵循模型学习到的特定模式,这有助于确定每个单词的位置,或序列中不同单词之间的距离。这里的直觉是,将位置向量添加到词嵌入中使得它们在接下来的运算中,能够更好地表达的词与词之间的距离。论文中使用了sin
和cos
的方法进行位置编码,其中pos
是位置,i
是维度。
视觉应用
虽然Transformer
结构在NLP
领域得到了广泛的应用,但是在视觉领域的应用仍然有限。在视觉领域,attention
或者是和CNN
网络共同使用或者是代替CNN
中特定的组件。想要将 Transformer
应用到视觉任务中,我们首先需要构建一些类似于VGG
、ResNet
之类的backbone
。
Backbone
VIT
github: Implementation of Vision Transformer, a simple way to achieve SOTA in vision classification with only a single transformer encoder, in Pytorch
VIT(VISION TRANSFORMER)
是Google
在2020
年提出的一种使用Transformer
进行图像分类的backbone
。
VIT
在模型结构上保持了和原版Transformer
相近。为将2D
图像变成对应的1-D
的序列patch embedding
输入,对于一张图像 ,首先将其切分成为N
个PxP
的patch
,其中N=WH / P^2
,最终获得N
个P^2 ⋅ C
大小的矩阵。然后将图像拉平转化为一维的序列输入,并通过MLP
层将其线性映射到一个固定的维度,实现embedding
的效果。作者指出,图像块序列可以来自于原始图像,也可以来自于CNN
的特征图。对于CNN
特征图,甚至可以将区块大小设置为1*1。
作者在经过Embedding
后的序列的最前面加上了一个D
维的class embedding
,类似于BERT
中的class token
,在positional encoding
之后一起作为 transformer encoder
的输入。输出部分,VIT
去掉了decoder
的部分,encoder
得到的特征直接送入MLP head
,最后通过softmax
进行分类处理。
DeiT
github: facebookresearch/deit: Official DeiT repository
DeiT(Data-efficient Image Transformers)
是facebookresearch
在2021
年提出的一种基于知识蒸馏来学习的image transformer
。相比VIT
,DeiT
需要更少的数据和更少的计算资源就能生成高性能的图像分类模型。研究人员仅用一台 8-GPU
的服务器对 DeiT
模型进行 3
天训练,该方法就在 ImageNet
基准测试中达到了84.2%
的top-1
准确率,并且训练阶段未使用任何外部数据,该结果可以与顶尖的卷积神经网络媲美。
DeiT
首个重要的组件是其训练策略。研究者在最初用于卷积神经网络的现有研究基础上进行了调整与改进,并提出了一种基于蒸馏token
的新型蒸馏流程,它的作用与class token
相同,不过其目的在于复制教师网络估计的标签。实验结果表明,这种特定Transformer
策略大幅度优于vanilla
蒸馏方法。
蒸馏流程如下图所示。研究者仅添加了一个新的蒸馏token
,它通过自注意力层与class token
和patch token
交互作用。蒸馏token
的作用与class token
类似,不过前者的目的是复制教师网络预测的(硬)标签,而不是正确标签。Transformer
的class token
和蒸馏token
输入均通过反向传播学得。
和ViT
的class token
类似,distillation token
是在图像块序列后面加上的token
。然后它经过transformer encoder
之后的输出用于和teacher model
的输出计算loss
。作者发现class token
和distillation token
会收敛于不同的向量,cos
距离为0.06
,随着层数的加深,两者embedding
的相似度逐渐上升,最终cos
距离为0.93,说明他们希望得到相似但不相同的target
。为了证明distillation token
的有效是由于knowledge distillation
的作用,而不是只由于多了一个token
导致的,作者做了对比试验,不是在后面加distillation token
,而是再加一个class token
,发现他们最终收敛结果的相似性达到0.999,并且性能弱于前者,证明了加入distillation token
的意义。
TNT
github:lucidrains/transformer-in-transformer: Implementation of Transformer in Transformer, pixel level attention paired with patch level attention for image classification, in Pytorch
TNT
是华为诺亚实验室在2021
年提出的一种基于Transformer
的网络架构。TNT
通过内外两个Transformer
联合提取图像局部和全局特征,通过堆叠TNT
模块,研究者搭建了全新的纯Transformer
网络架构。作者表示它的表现优于谷歌的ViT
和Facebook
的DeiT
。
TNT
网络主要由若干个TNT block
堆叠构成。TNT block
有 2 个输入,一个是pixel embedding
,一个是patch embedding
。对应地,TNT block
包含 2 个标准的transformer block
。对于输入的图像,TNT
和VIT
一样将图像切块,构成patch
序列。不过TNT
不把patch
拉直为向量,而是将patch
看作像素(组)的序列。
具体地说,TNT
将图像转化成patch embedding
序列和pixel embedding
序列。图像首先被均匀切分成若干个patch
,每个patch
通过im2col
操作转化成像素向量序列,像素向量通过pytorch unfold
操作将patch
转化成m
个像素向量,然后用一个全连接层将m
个像素向量映射为m
个pixel embedding
。而patch embedding
(包括一个 class token
)是一组初始化为零的向量。对每个patch embedding
加一个patch position encoding
,对每个pixel embedding
加一个pixel position encoding
,两种 Position encoding
在训练过程中都是可学习的参数。最终,TNT block 输出处理过后的pixel embedding
和patch embedding
,最后通过一个MLP
层输出结果。
ViT G/14
2021
年,Google
原ViT
团队的几位成员又尝试将ViT
模型进行扩展,使用到了包含30
亿图像的JFT-3B
数据集,并提出了参数量高达20
亿参数的ViT
变体模型ViT G/14
,在ImageNet
图像数据集上实现了新的SOTA Top-1
准确率。论文主要研究了预训练ViT
模型用于图像分类任务的迁移性能的扩展规则。特别是,研究者试验了从500
万到20
亿个参数不等的模型、从3000
万到30
亿个训练图像不等的数据集以及从低于 1
个 TPUv3
核每天到超过10000
个核每天的计算预算。其主要贡献是描述ViT
模型的性能计算边界。
具体任务
检测
github: facebookresearch/detr: End-to-End Object Detection with Transformers
DETR
是facebookresearch
在2020
年提出的一种基于Transformer
的目标检测模型。整个DETR
架构很容易理解,它包含三个主要组件:CNN
的backbone
、transformer
的编码器-解码器和一个前馈网络。通过卷积backbone
得到的feature map
拉平成一维特征图,加上position
信息之后送到基于Transformer
的编码器。该编码器的输出是N
个固定长度的embedding feature
,其中N
是模型假设的图像中的对象数,论文中N=100
。基于Transformer
的解码器借助自身和编码器-解码器注意机制将这些特征并行解码为边界框坐标。最后,前馈神经网络预测边界框的标准化中心坐标,高度和宽度,最后的线性层使用softmax
函数预测类别标签。
DETR
有趣的地方在于,DETR
给予一组固定的可学习的目标query
集合,推理目标坐标和图片上下文直接输出最终的预测结果。也就是其一次性预测所有的目标,而不是先找出所有的候选框,然后通过手工设计的组件(编码先验锚框或者NMS处理)来过滤出真正的物体。从直觉上DETR
的方式更接近人的识别方式,也可以将DETR
视为一种No Anchor
的方法。个人感觉是通过position embedding
和query
代替了anchor
。
图中的object queries
是一组可以学习的变量的集合,从作者的代码中能够看出其是一个大小为100 × 2 × 256
的变量。这里的100
是个超参数,表示对于每张图片,预测100
个bboxes
。设为100
的原因是数据集中有90
个类别,100
刚好合适。object queries
的意思就是告诉模型要100
个实例,然后decoder
根据得到特征的位置和显著性解码出100
个instance
,其中部分是前景部分是背景,前景的就class loss
+box loss
,背景的就当背景。
最后N
个预测值与真值是如何对应的呢,文中通过匈牙利算法来实现的二分最大匹配。所谓二分的最大匹配,即保证预测值与真值实现最大的匹配,保证预测的N
个实例(包括∅)按照位置与真值对应起来。实现一一对应之后,便能够利用分类Loss
以及boundingbox Loss
进行优化。这种一一对应的关系,同时也另一个好处是,不会多个预测值对应到同一个真实值上,然后再通过NMS
进行后处理。
分割
github: Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective with Transformers
SETR
是在CVPR 2021
上提出的一种基于Transformer
的语义分割模型。整体结构基本如下图所示,ViT
作为encoder
加上一个卷积组成的decoder
,这个decoder
也是常规的上采样加上跨特征融合。根据最后的实验结果,个人感觉文章证明了一次卷积特征叠加许多个transformer
的情况下,配合巨量数据的pretrain
,也能达到同类卷积分割模型的效果。不过这个Transformer
的参数量和运行速度都与现有的语义分割模型相差很大,基本做不到实用的地步。
车道线检测
github: liuruijin17/LSTR: This is an official repository of End-to-end Lane Shape Prediction with Transformers
LSTR
是在WACV 2021
上提出的一种基于Transformer
的车道线检测模型,能够在1080TI
的显卡上实现420 FPS
的检测速度。作者借助于对车道线曲线和相机内参的描述,采用多项式参数模型来描述车道线,并配以Bipartite Matching Loss
函数,实现端到端训练,网络的目标成为预测几个参数,这无需后处理且降低了计算量。
网络的backbone
是ResNet18
,通过8
倍的下采样取得特征后送入一个Transformer
模块,这一块基本和vit
类似。使用Transformer
的原因是,对于细长线条Transformer
能学习更丰富的结构和上下文信息。LSTR
预测的值并不是图片上的像素坐标,而是车道线近似为一条三次曲线后从道路到图片上的投影方程的参数,学到参数后通过y
来计算x的
位置。对于预测N
条固定的曲线(N
大于典型数据集中车道线数量的最大值),预测的曲线为H
,真实曲线的像素排列为s
,真实曲线为L
。Bipartite matching
求的是预测曲线与真实曲线之间的距离,目标是使得距离之和最少(其中使用了Hungarian algorithm
)。这种方法求解三次方程速度比较快,但是对水平线相当的不友好。
ReID
github: michuanhaohao/AICITY2021_Track2_DMT: The 1st place solution of track2 (Vehicle Re-Identification) in the NVIDIA AI City Challenge at CVPR 2021 Workshop. (github.com)
DMT
是在CVPR 2021
上提出的一种基于Transformer
的车辆ReID
模型,同时也是NVIDIA AI CITY Challenge 2021 Track2
的冠军方案。具体结构没什么好说的,把去年的冠军方案的ResNet101
的backbone
换成了VIT
,loss
和训练策略还是常规的ReID
思路。此外作者还用到了UDA Training
,即用聚类的方法给测试集分配伪标签然后用来训练。
除了Transformer
的backbone
和UDA Training
,在测试过程中还用到了Augmentation Test
,Re-Ranking
, Weighted Tracklet Features
,Camera Verification
,Inter-Camera Fusion
和Camera and Orientation Bias
等技巧来提升测试结果。
Reference
图解Transformer(完整版)_龙心尘-CSDN博客_transformer
Attention Is All You Need
BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
Training data-efficient image transformers & distillation through attention
Transformer in Transformer
Scaling Vision Transformers
End-to-End Object Detection with Transformers
Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective with Transformers
End-to-end Lane Shape Prediction with Transformers
An Empirical Study of Vehicle Re-Identification on the AI City Challenge