搜索了很多关于Transformer的资料,找到李宏毅老师的Transformer的讲解,里面的内容通俗易懂,作为入门是一份不错的资料。同时在知乎上找到几篇大佬写的关于Transformer的理解。于是我打算写一篇博客记录我对Transfomer,为了节省时间,里面的图可能直接引用李宏毅老师视频截图以及几位大佬写的博文的图。
Tranformer的诞生来源于Google的一篇《Attention is all you need》。在训练RNN的时候,由于RNN当前输出是取决于当前的状态以及前几个状态,因此无法使用并行计算,导致无法使用GPU加速训练。Google大佬们就想能不能用CNN来代替RNN来进行并行加速,于是有了Transformer,但是并不能说明Transformer等同于CNN,只是Transformer可以替代RNN以及CNN,所以论文的名字称为“Attention is all you need”。
Transformer可以说是seq2seq加上self-attention,本质是一个encoder-decoder结构,如下图所示。因此接下来我们来看下self-attention。
Self-Attention如下图所示。
它的计算公式是: A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q, K, V) = softmax(\frac{QK^T}{\sqrt{d}_{k}})V Attention(Q,K,V)=softmax(dkQKT)V里面包含了 Q , K , d Q, K, d Q,K,d参数, Q Q Q表示query, K K K表示的是key, d d d表示的是 Q Q Q, K K K的维度,除此之外计算过程中还涉及 V V V,个人感觉类似bias的作用, Q , K , d Q, K, d Q,K,d论文里面并没有提到它是什么意思,详解Transformer里面有如下解释:
在式子中,除以 d \sqrt{d} d的目的,直观的解释是 Q Q Q和 K K K做点积,随着它们的dimension越大,避免点积的值越大产生误差。
一个向量经过verctor是如何计算可以参考以下从李宏毅教授讲授截图:
在上述计算过程比较简单,没有涉及到position,现在我们来看下self-attention是如何能够运用GPU并行计算,同样以截图的方式说明,图来自李宏毅教授的视频:
self-attention可以设置成与单词位置信息相关,即在输入向量然后embedding的时候假如位置参数变量,如下图所示:
具体的内容如下所示,其中红点处的 W p W^p Wp是人为设置的
位置编码的公式:
上面两式中, p o s pos pos表示单词的位置, i i i表示单词的维度。作者这么设计的因为除了单词的绝对位置,单词的相对位置也非常重要。根据公式 sin ( α + β ) = sin α cos β + cos α sin β \sin(\alpha+\beta)=\sin\alpha\cos\beta+\cos\alpha\sin\beta sin(α+β)=sinαcosβ+cosαsinβ和 cos ( α + β ) = cos α cos β − sin α sin β \cos(\alpha+\beta)=\cos\alpha\cos\beta-\sin\alpha\sin\beta cos(α+β)=cosαcosβ−sinαsinβ说明 k + δ k+\delta k+δ的位置向量可以表示为位置 k k k的特征向量线性变化。
Decoder部分与encoder部分相同,用self-attention去替代RNN。
考虑到残差模块:
可以看到decoder部分有输入,该部分的输入是已经decoder出来的向量,如下图所示:
关于可视化的结果详情查看参考里面的博客。
这一部分主要摘自:计算机视觉中的transformer模型创新思路总结
对于一张图像,先将其分割成 N × N N\times N N×N个patches,把Patches进行Flatten,再通过一个全连接层映射成token,对每一个token加入位置编码(position embedding),会随机初始化一个tokens,concate到通过图像生成的tokens后,再经过transformer的Encoder模块,经过多层Encoder后,取出最后的tokens再通过全连接层作为分类网络进行分类
渐进采样式vision transformer,论文:Vision Transformer with Progressive Sampling(ICCV2021),代码:https://github.com/yuexy/PS-ViT。ViT采用了一种朴素的标记化(tokennization)方案,该方案将一副图像分割成一系列规则间隔的patches,这些patches将线性投影到tokens中。通过这种方式,图像将转换成数百个视觉tokens。这种方法有个缺点是首先硬分割可能会分离出一些高度相关的区域,这些区域应该用同一组参数建模,这破坏了固有的对象结构,并使输入patches的信息量变得较少。其次tokens被防止在规则网格上,而与底层图像内容无关。
人类视觉系统以一种完全不同的方式组织视觉信息,而不是一次不加区别地处理整个场景。取而代之的是,它循序渐进地、选择性地将注意力集中在视觉空间的有趣部分,无论何时何地需要它,而忽略不感兴趣的部分,随着时间的推移,结合来自不同注视的信息来理解场景。受上述过程的启发,论文提出了一种新的基于transformer的渐进采样(Progressive Sampling)模块,该模块能够 学习从哪里看图像,以缓解ViT中简单的tokens化方案带来的问题。
论文提出的模块不是从固定位置采样,而是以迭代的方式更新采样位置。如图所示,在每次迭代中,当前采样步骤的tokens被馈送到transformer编码层,并预测一组采样偏移量以更新下一步的采样位置。该机制利用transformer的能力来捕获全局信息,通过结合本地上下文和当前tokens的位置来估计对感兴趣区域的偏移量。这样,注意力就会像人类视觉一样,一步一步地集中到图像的可辨别区域。
论文:Rethinking and Improving Relative Position Encoding for Vision Transformer(ICCV2021)
代码:https://github.com/microsoft/Cream/tree/main/iRPE
transformer位置表示的编码方法主要有两类。一个是绝对的,另一个是相对的。绝对方法将输入tokens的绝对位置从1编码到最大序列长度**。也就是说,每个位置都有单独的编码向量**。然后将编码向量与输入Tokens组合,以将位置信息输入给模型。相对位置方法对输入tokens之间的相对距离进行编码,并学习tokens之间的成对关系。相对位置编码(relative position encoding, RPE)通常通过具有与self-attention模块中的 query 和 key 交互的可学习参数的查询表来计算。这样的方案允许模块捕获Tokens之间非常长的依赖关系。相对位置编码在自然语言处理中被证明是有效的。然而,在计算机视觉中,这种效果仍然不清楚。最近很少有文献对其进行阐述,但在Vision Transformer方面却得出了有争议的结论。例如,Dosovitski等人观察到相对位置编码与绝对位置编码相比没有带来任何增益。相反,Srinivaset等人发现相对位置编码可以诱导明显的增益,优于绝对位置编码。此外,最近的工作声称相对位置编码不能和绝对位置编码一样好用。这些工作对相对位置编码在模型中的有效性得出了不同的结论,这促使我们重新审视和反思相对位置编码在Vision Transformer中的应用。另一方面,语言建模采用原始相对位置编码,输入数据为一维单词序列。但对于视觉任务,输入通常是2D图像或视频序列,其中像素具有高度空间结构。目前尚不清楚:从一维到二维的扩展是否适用于视觉模型;方向信息在视觉任务中是否重要?
改进思路:
论文分析了相对位置编码中的几个关键因素,包括相对方向、上下文的重要性、query、key、value和相对位置嵌入之间的交互以及计算代价。该分析对相对位置编码有了全面的理解,并为新方法的设计提供了经验指导。
提出了一种高效的相对编码实现方法,计算成本从原始O()降低到O(nkd)(其中k<
综合考虑效率和通用性,提出了四种新的vision transformer的相对位置编码方法,称为image RPE(IRPE)。这些方法很简单,可以很容易地插入self-attention层。实验表明,在不调整任何超参数和设置的情况下,该方法在ImageNet和COCO上分别比其原始模型DeiTS和DETR-ResNet50提高了1.5%(top-1ACC)和1.3%(MAP)。
实验证明,在图像分类任务中,相对位置编码可以代替绝对编码。同时,绝对编码对于目标检测是必要的,其中像素位置对于目标定位是重要的。
关于Encoder的改进,大部分都是在将transformer用于具体任务时,针对各个任务的特点或出现的问题进行改进的。虽然不一定是一个通用的模型,但其在改进过程中体现的改进思路仍值得学习和借鉴。
论文:TransFER: Learning Relation-Aware Facial Expression Representations With Transformers(ICCV2021)
表情识别具有类内相似性小、类间相似性大的特点。同时,需要提取不同的局部表征来对不同的表情进行分类。即使某些局部块(patches)不可见,更多样化的局部块也可以发挥作用。同时,不同的局部块可以相互补充。
例如,如图所示,仅根据嘴巴区域(列2)很难区分惊讶(第1行)和愤怒(第2行)。我们提出的TransFER模型探索了不同的关系感知面部部位,如眼睛(第3列,第1行)和眉毛之间的区域(第3列,第2行),这有助于区分这些不同的表情。
因此,应该在全局范围内探索不同局部块(patches)之间的关系,突出重要的块(patches),抑制无用的块(patches)。
论文提出了TransFER模型来学习不同关系感知的FER局部表示。
首先,提出了随机丢弃注意力图的多注意丢弃算法(Multi-Attention Dropping, MAD)。通过这种方式,推动模型去探索除最具区分性的局部斑块之外的综合局部斑块,自适应地聚焦于不同的局部斑块。当某些部位因姿势变化或遮挡而不可见时,此方式特别有用。
其次,Vision Transformer(VIT)适用于FER,称为VIT-FER,用于对多个局部块之间的连接进行建模。由于采用全局范围对每个局部块进行增强,充分挖掘了多个局部块之间的互补性,提高了识别性能。
第三,多头自我注意(multi-head self-attention)使VIT能够在不同位置共同关注来自不同信息子空间的特征。然而,由于没有明确的指导,可能会建立冗余关系。为解决这一问题,提出了随机丢弃一个自我注意的多头自我注意丢弃(Multi-head Self-Attention Dropping, MSAD)方法。在这种情况下,如果放弃了self-attention,模型就被迫从其他地方学习有用的关系。因此,不同局部块之间的丰富关系被挖掘出来,从而使FER受益。
结合新的MAD和MSAD模块,提出了最终的体系结构,称为TransFER。如图所示,与VIT-FER基线(列2)相比,TransFER定位更多样化的关系局部表示(列3),从而区分这些不同的表达式。它在几个FER基准上达到了SOTA性能,显示了它的有效性。
论文:SOTR: Segmenting Objects with Transformers(ICCV2021)
代码:https://github.com/easton-cau/SOTR
transformer用于语义分割方面还在一些不足。一方面,transformer在提取低层特征时表现不佳,导致对小目标的错误预测。另一方面,由于特征映射的广泛性,需要大量的内存和时间,特别是在训练阶段。
改进思路:
为了克服这些缺点,论文提出了一种创新的自下而上模型SOTR,该模型巧妙地结合了CNN和transformer的优点。
SOTR的重点是研究如何更好地利用transformer提取的语义信息。为了降低传统self-attention机制的存储和计算复杂度,论文提出了双注意力,它采用了传统注意力矩阵的稀疏表示。
设计了双注意力,这是一种新的position-sensitive self-attention机制, 是为transformer量身定做的。与原来的transformer相比,SOTR这种设计良好的结构在计算量和内存上都有很大的节省,特别是对于像实例分割这样的密集预测的大输入。
除了纯粹基于transformer的模型外,提出的SOTR不需要在大数据集上进行预训练,就可以很好地推广归纳偏差。因此,SOTR更容易应用于数据量不足的情况。
在MS Coco基准上,SOTR的性能达到了使用ResNet-101-FPN主干的AP的40.2%,在精确度上超过了大多数最SOTA方法。此外,由于twin transformer对全局信息的提取,SOTR在中型物体(59.0%)和大型物体(73.0%)上表现出明显更好的性能。
论文:PnP-DETR: Towards Efficient Visual Analysis With Transformers
代码:https://github.com/twangnh/pnp-detr
将transformer网络应用于图像特征映射可能在计算上代价高昂,这主要是由于对长展平的特征向量的注意操作。这些特征可能是冗余的: 除了感兴趣的对象之外,自然图像通常包含巨大的背景区域,这些背景区域可能在相应的特征表示中占据很大一部分;而且,一些区分特征向量可能已经足以检测对象。
现有的提高transformer效率的工作主要集中在加速注意操作上,很少考虑上面讨论的空间冗余。
改进思路:
为了解决上述局限性,论文开发了一个可学习的轮询和池化(Poll and Pool, PnP)采样模块。 它的目的是将图像特征图压缩成由精细特征向量和少量粗略特征向量组成的抽象特征集。
从输入特征图中确定性地采样精细特征向量,以捕捉精细前景信息,这对于检测目标是至关重要的。粗略特征向量聚合来自背景位置的信息,所产生的上下文信息有助于更好地识别和定位对象。然后,transformer对细粗特征空间内的信息交互进行建模,并获得最终结果。
由于抽象集比直接扁平化的图像特征图短得多,因此transformer的计算量大大减少,并且主要分布在前景位置。这种方法与提高transformer效率的方法是正交的,可以进一步与它们结合得到更有效的模型。
论文:Rethinking Spatial Dimensions of Vision Transformers
代码:https://github.com/naver-ai/pit
CNN 以大空间尺寸和小通道尺寸的特征开始,并逐渐增加通道尺寸,同时减小空间尺寸。由于称为空间池化的层,这种维度转换是必不可少的。现代 CNN 架构,包括 AlexNet、ResNet和 EfficientNet,都遵循这一设计原则。池化层与每一层的感受野大小密切相关。一些研究表明,池化层有助于网络的表现力和泛化性能。然而,与 CNN 不同的是,ViT 不使用池化层,而是在所有层中使用相同大小的空间。
改进思路:
首先,论文验证了 CNN 上池化层的优势。实验表明,池化层证明了 ResNet 的模型能力和泛化性能。为了将池化层的优势扩展到 ViT,论文提出了一种基于池化的视觉transformers (PiT)。
PiT 是一种与池化层相结合的transformer架构。它可以像在 ResNet 中一样减少 ViT 结构中的空间大小。
最后,为了分析 ViT 中池化层的效果,论文测量了 ViT 的空间交互比,类似于卷积架构的感受野大小。论文展示了池化层具有控制自注意力层中发生的空间交互大小的作用,这类似于卷积架构的感受野控制。
论文: Swin Transformer: Hierarchical Vision Transformer using Shifted Windows
代码:https://github. com/microsoft/Swin-Transformer
论文试图扩展Transformer的适用性,使其可以作为计算机视觉的通用主干,就像它在NLP中所做的那样,也可以像CNNs在视觉中所做的那样。论文提到,将transformer在语言领域的高性能转换到视觉领域的重大挑战可以用这两种模式之间的差异来解释。这些不同之处之一涉及到规模。与作为语言transformer中处理的基本元素的单词tokens不同,视觉元素在尺度上可以有很大的变化,这是一个在诸如目标检测之类的任务中受到关注的问题。在现有的基于transformer的模型中,tokens都是固定比例的,这一特性不适合这些视觉应用。另一个不同之处在于,与文本段落中的文字相比,图像中像素的分辨率要高得多。存在许多视觉任务,如语义分割,需要在像素级别进行密集预测,这对于高分辨率图像上的Transformer来说是很困难的,因为它的self-attention的计算复杂度是图像大小的二次方。
改进思路:
为了克服这些问题,论文提出了一种通用的Transformer骨干网,称为Swin Transformer,它构造了分层的特征映射,并且计算复杂度与图像大小成线性关系。
如图1(A)所示,Swin Transformer通过从小块(灰色轮廓)开始,逐渐合并更深的Transformer层中的相邻块来构建分层表示。
有了这些分层的特征图,Swin Transformer模型可以方便地利用先进的技术进行密集预测,如特征金字塔网络(FPN)或U-Net。线性计算复杂度是通过在分割图像(红色轮廓)的非重叠窗口内局部计算self-attention来实现的。每个窗口中的patches数量是固定的,因此复杂度与图像大小成线性关系。
这些优点使得Swin Transformer适合作为各种视觉任务的通用主干,而不是以前基于Transformer的架构,后者生成单一分辨率的特征地图,并且具有二次方复杂性。
Swin Transformer的一个关键设计元素是窗口分区在连续的self-attention层之间的移动,如图2所示。移动的窗口桥接了前一层的窗口,提供了它们之间的连接,显著增强了建模能力。
这种策略在实际延迟方面也是有效的:一个窗口内的所有query patch都共享相同的key集,这便于硬件中的内存访问。相反,较早的基于滑动窗口的self-attention方法由于不同query像素的不同key集而在一般硬件上受到低延迟的影响。
实验表明,所提出的移位窗口方法比滑动窗口方法具有更低的延迟,但在建模能力上是相似的。事实证明,移位窗口方法对于全MLP体系结构也是有益的。
对于视频中的transformer,主要改进思路是将patches在空间上和时间上分开进行attention。这里列举一篇。
论文:Is Space-Time Attention All You Need for Video Understanding?
代码:https://github.com/lucidrains/TimeSformer-pytorch
视频理解与NLP有很多的相似的地方。首先,视频和语句都具有序列性;而且,一个字只能与语句中其它字联系才能理解,在视频行为中一个片段也需要与视频的上下文相关联。于是,论文期望NLP中这种long-range self-attention模型可以在视频模型中也有很高的表现。
在视频领域,2D或3D卷积是用来提取时空特征的主流操作,但卷积操作比较明显的一个问题是感受野是有限的,若要获得全局感受野,需要堆叠很多层卷积层,它们的信息传播路径比较长。而self-attention这种操作可以很轻松地获得全局感受野,捕获局部和长范围的依赖关系。
卷积操作的另一个问题是受到内存的限制,特别是视频领域,往往需要在高分辨率和长范围帧之间权衡。而最近几年一些研究者的工作指出Transformer可以比CNN获得更快的训练和推理,因此在同样计算量预算下,transformer可以使用更大学习容量。
标准的self-attention需要计算所有tokens相互之间的相似性,这样的做法就是计算量比较大,因此需要考虑如何利用self-attention来处理图像块。论文比较了这方面的几种处理方式:Joint Space-Time Attention、Sparse Local Global Attention 和Axial Attention。这几种方式的共同点是采用ViT中的方式将图像进行分块,而它们之间的区别在于如何用self attention来处理这些块。论文提出Divided attention的方式具有最好的表现。
论文:End-to-End Object Detection with Transformers
代码:https://github.com/facebookresearch/detr
DETR中似乎没有介绍为何这么设计结构,而只是在说要做一个End-to-End的transformer模型。因此这里只介绍一下它的结构。
优点:创造性提出一种self-attention block,在NLP或者CV领域里面最根本的RNN和CNN并且取到不错的效果,这个设计足够创新。另外如前文所述,解决了RNN的并行训练问题,最大化使用GPU。另一方面它的缺点是缺少CNN或者RNN提取捕捉局部特征的能力,另外transformer丢失了位置信息,在vector embedding的时候人为地添加embedding position。