Less-Attention Vision Transformer
利用了在多头自注意力(MHSA
)块中计算的依赖关系,通过重复使用先前MSA
块的注意力来绕过注意力计算,还额外增加了一个简单的保持对角性的损失函数,旨在促进注意力矩阵在表示标记之间关系方面的预期行为。该架构你能有效地捕捉了跨标记的关联,超越了基线的性能,同时在参数数量和每秒浮点运算操作(FLOPs
)方面保持了计算效率。来源:晓飞的算法工程笔记 公众号
论文: You Only Need Less Attention at Each Stage in Vision Transformers
Introduction
近年来,计算机视觉经历了快速的增长和发展,主要得益于深度学习的进步以及大规模数据集的可获得性。在杰出的深度学习技术中,卷积神经网络(Convolutional Neural Networks
, CNNs
)被证明特别有效,在包括图像分类、目标检测和语义分割等广泛应用中展现了卓越的性能。
受到Transformer
在自然语言处理领域巨大成功的启发,ViT
(Vision Transformers
)将每幅图像划分为一组标记。这些标记随后被编码以生成一个注意力矩阵,作为自注意力机制的基础组成部分。自注意力机制的计算复杂度随着标记数量的增加而呈平方增长,且随着图像分辨率的提高,计算负担变得更加沉重。一些研究人员尝试通过动态选择或标记修剪来减少标记冗余,以减轻注意力计算的计算负担。这些方法在性能上已证明与标准ViT
相当。然而,涉及标记减少和修剪的方法需要对标记选择模块进行细致设计,可能导致关键标记的意外丢失。在本研究中,作者探索了不同的方向,并重新思考自注意力的机制。发现在注意力饱和问题中,随着ViTs
层数的逐渐加深,注意力矩阵往往保持大部分不变,重复前面层中观察到的权重分配。考虑到这些因素,作者提出以下问题:
在网络的每个阶段,从开始到结束,是否真的有必要始终一致地应用自注意力机制?
在本文中,作者提出通过引入少注意力ViT
(Less-Attention Vision Transformer
)来修改标准ViT
的基本架构。框架由原始注意力(Vanilla Attention
, VA
)层和少注意力(Less Attention
, LA
)层组成,以捕捉长范围的关系。在每个阶段,专门计算传统的自注意力,并将注意力分数存储在几个初始的原始注意力(VA
)层中。在后续的层中,通过利用先前计算的注意力矩阵高效地生成注意力分数,从而减轻与自注意力机制相关的平方计算开销。此外,在跨阶段的降采样过程中,在注意力层内集成了残差连接,允许保留在早期阶段学习到的重要语义信息,同时通过替代路径传输全局上下文信息。最后,作者仔细设计了一种新颖的损失函数,从而在变换过程中保持注意力矩阵的对角性。这些关键组件使作者提出的ViT
模型能够减少计算复杂性和注意力饱和,从而实现显著的性能提升,同时降低每秒浮点运算次数(FLOPs
)和显著的吞吐量。
为验证作者提出的方法的有效性,在各种基准数据集上进行了全面的实验,将模型的性能与现有最先进的ViT
变种(以及最近的高效ViT
)进行了比较。实验结果表明,作者的方法在解决注意力饱和并在视觉识别任务中取得优越性能方面非常有效。
论文的主要贡献总结如下:
-
提出了一种新颖的
ViT
架构,通过重新参数化前面层计算的注意力矩阵生成注意力分数,这种方法同时解决了注意力饱和和相关的计算负担。 -
此外,提出了一种新颖的损失函数,旨在在注意力重新参数化的过程中保持注意力矩阵的对角性。作者认为这一点对维护注意力的语义完整性至关重要,确保注意力矩阵准确反映输入标记之间的相对重要性。
-
论文的架构在包括分类、检测和分割在内的多个视觉任务中,始终表现优异,同时在计算复杂度和内存消耗方面具有类似甚至更低的特点,胜过几种最先进的
ViTs
。
Methodology
Vision Transformer
令 x ∈ R H × W × C \mathbf{x} \in \mathbb{R}^{H \times W \times C} x∈RH×W×C 表示一个输入图像,其中 H × W H \times W H×W 表示空间分辨率, C C C 表示通道数。首先通过将图像划分为 $N = \frac{HW}{p^{2}} $ 个块来对图像进行分块,其中每个块 P i ∈ R p × p × C ( i ∈ { 1 , … , N } ) P_i \in \mathbb{R}^{p \times p \times C}\left(i \in \{1, \ldots, N\} \right) Pi∈Rp×p×C(i∈{ 1,…,N}) 的大小为 p × p p \times p p×p 像素和 C C C 通道。块大小 p p p 是一个超参数,用于确定标记的粒度。块嵌入可以通过使用步幅和卷积核大小均等于块大小的卷积操作提取。然后,每个块通过不重叠的卷积投影到嵌入空间 Z ∈ R N × D \boldsymbol{Z} \in \mathbb{R}^{N\times{D}} Z∈RN×D ,其中 D D D 表示每个块的维度。
首先提供一个关于处理块嵌入的经典自注意力机制的简要概述,该机制在多头自注意力块(MHSAs
)的框架内工作。在第 l l l 个MHSA
块中,输入 Z l − 1 , l ∈ { 1 , ⋯ , L } \boldsymbol{Z}_{l-1}, l \in \{1,\cdots, L\} Zl−1,l∈{
1,⋯,L} 被投影为三个可学习的嵌入 { Q , K , V } ∈ R N × D \{\mathbf{Q,K,V}\} \in \mathbb{R}^{N \times D} {
Q,K,V}∈RN×D 。多头注意力旨在从不同的视角捕捉注意力;为简单起见,选择 H H H 个头,每个头都是一个维度为 N × D H N \times \frac{D}{H} N×HD 的矩阵。第 h h h 个头的注意力矩阵 A h \mathbf{A}_h Ah 可以通过以下方式计算:
KaTeX parse error: Undefined control sequence: \label at position 145: …^{N \times N}. \̲l̲a̲b̲e̲l̲{eq:attn} \end{…
A h , Q h \mathbf{A}_h, \mathbf{Q}_h Ah,Qh 和 K h \mathbf{K}_h Kh 分别是第 h h h 个头的注意力矩阵、查询和键。还将值 V \mathbf{V} V 分割成 H H H 个头。为了避免由于概率分布的锐性导致的梯度消失,将 Q h \mathbf{Q}_h Qh 和 K h \mathbf{K}_h Kh 的内积除以 d \sqrt{d} d