点击上方
“
小白学视觉
”,选择加"
星标
"或“
置顶
”
重磅干货,第一时间送达![](http://mmbiz.qpic.cn/mmbiz_jpg/ow6przZuPIENb0m5iawutIf90N2Ub3dcPuP2KXHJvaR1Fv2FnicTuOy3KcHuIEJbd9lUyOibeXqW8tEhoJGL98qOw/640?wx_fmt=other&wxfrom=5&wx_lazy=1&wx_co=1&tp=webp)
扫描下方二维码,加入前沿学术论文交流星球
!
可以获得最新顶会/顶刊论文的idea解读、解读的PDF
和
CV从入门到精通资料,及最前沿应用
!
论文题目
:
SwiftFormer: Efficient Additive Attention for Transformer-based Real-time Mobile Vision Applications
中文题目:
SwiftFormer:针对基于Transformer的实时移动视觉应用的高效加性注意力
论文链接:
https://openaccess.thecvf.com/content/ICCV2023/papers/Shaker_SwiftFormer_Efficient_Additive_Attention_for_Transformer-based_Real-time_Mobile_Vision_Applications_ICCV_2023_paper.pdf
官方github:
https://github.com/Amshaker/SwiftFormer
所属机构:
穆罕默德·本·扎耶德AI大学、加州大学默塞德分校、延世大学、谷歌研究中心、Linköping大学
关键词:
SwiftFormer, Transformer, 自注意力, 移动视觉应用, 实时性能, 混合设计
图1:延迟与准确率对比。与最近的EfficientFormer-L1相比,我们的SwiftFormer-L1在相同的延迟下,无需任何神经架构搜索,就实现了1.7%的top-1准确率绝对提升。
图4:在COCO 2017验证集上进行物体检测和实例分割的示例。SwiftFormer-L1模型能够准确地在图像中检测和分割实例。图5:在ADE20K验证集上进行语义分割的定性示例。上图:真实掩码。下图:语义分割结果。我们的模型能够准确地分割各种室内和室外场景。
研究背景:
-
视觉应用中的自注意力机制:
自注意力机制已成为捕获各种视觉应用中全局上下文的默认选择。然而,其与图像分辨率的二次方计算复杂度限制了其在实时应用中的使用,尤其是在资源受限的移动设备上部署时。
-
混合方法的提出:
为了结合卷积和自注意力的优势,提出了混合方法以获得更好的速度-准确性权衡。但是,自注意力中的昂贵矩阵乘法操作仍然是瓶颈。
-
效率提升的需求:
开发更高效、灵活的模型,结合CNN和Transformer的优势,对于移动设备等计算资源有限的平台尤其重要。
-
高效加性注意力:
提出了一种新的高效加性注意力机制,该机制用线性逐元素乘法有效替代了二次矩阵乘法操作。显著降低了模型的计算复杂性,而不会牺牲任何精度。
-
SwiftFormer架构:
基于EfficientFormer提出了SwiftFormer,通过引入4D MetaBlocks和3D MetaBlocks,分别用于学习局部表示和编码全局上下文。利用提出的高效加性注意力,构建了一系列名为“SwiftFormer”的模型,在准确性和移动推理速度方面都达到了最先进的性能。小版本在iPhone 14上实现了78.5%的顶级ImageNet- 1K精度,只有0.8 ms的延迟,比MobileViT-v2更准确,速度快2倍。
-
总体结论:
SwiftFormer通过引入高效的加性注意力机制和一致的混合设计,显著提升了Transformer模型在移动视觉应用中的性能。SwiftFormer不仅在准确率上取得了新的最先进水平,而且在移动设备上的推理速度也得到了显著提升,为实时移动视觉应用提供了新的可能性。
三、方法
(a)是在ViTs中使用的典型自注意力。(b)是EdgeNeXt中使用的转置自注意力,在这种情况下,自注意力操作是在通道特征维度(d×d)上应用,而不是在空间维度(n×n)上。(c)是MobileViT-v2的可分离自注意力,它使用逐元素操作从Q和K矩阵的交互中计算上下文向量。然后,将上下文向量乘以V矩阵以产生最终输出。(d)我们提出的高效加法自注意力。这里,查询矩阵与可学习的权重相乘并进行池化以产生全局查询。然后,矩阵K与广播的全局查询逐元素相乘,从而得到全局上下文表示。
Efficient Additive Attention避免了昂贵的矩阵乘法操作,将计算复杂度从二次降低到线性,从而使得自注意力机制可以在所有网络阶段使用,而不会显著增加计算负担。使得Efficient Additive Attention特别适合于资源受限的移动设备上的实时视觉应用,实现过程:
1.
输入嵌入:
输入的特征矩阵x被转换为查询(Query)和键(Key)矩阵Q和K,使用两个矩阵Wq和Wk进行转换,其中Q,K∈Rn×d,Wq,Wk∈Rd×d,n是标记长度,d是嵌入向量的维度。
2.
全局查询向量:
查询矩阵Q与可学习的参数向量wa相乘,以学习查询的注意力权重,产生全局注意力查询向量α。这个过程可以表示为α=Q·wa/√d。
3. 池化操作:
根据学习到的注意力权重对查询矩阵Q进行池化,得到单一的全局查询向量q。
4. 键-全局查询交互:
使用元素乘法操作对全局查询向量q和键矩阵K进行交互,形成全局上下文表示。这个过程可以表示为x=Q+T(K*q),其中T表示线性变换。
5. 输出表示:
最终的输出表示是查询矩阵Q和通过线性变换学习到的全局上下文表示的和。
图3:上排:我们提出的架构概览。输入图像被送入补丁嵌入层,然后经过四个不同尺度的层次阶段 {1/4,1/8,1/16,1/32}。每个阶段都是一致的,并由卷积编码器块后跟SwiftFormer编码器组成。在两个连续阶段之间,我们加入了下采样层以将空间尺寸减小两倍并增加特征维度。下排:我们展示了卷积编码器(左)和SwiftFormer编码器(右)的设计。卷积编码器旨在学习有效的局部表示,并由3×3深度可分离卷积组成,后面跟着两个逐点卷积进行通道混合。SwiftFormer编码器旨在学习丰富的局部-全局表示。它以局部卷积层开始以提取局部特征,随后是高效的加性注意力模块(见图2 (d))和线性层。
1. ImageNet-1K:
用于图像分类任务的实验。实验结果显示,SwiftFormer模型在ImageNet-1K数据集上取得了优异的性能,其中SwiftFormer-L1模型在iPhone 14上的延迟为1.1毫秒,Top-1准确率为80.9%。此外,SwiftFormer的其他变体也在ImageNet-1K上取得了与MobileViT-v2和EfficientFormer等模型相比更优的性能。
2. MS-COCO 2017:
用于对象检测和实例分割任务的实验。SwiftFormer-L1模型在MS-COCO 2017数据集上取得了41.2 AP box和38.1 AP mask的性能,超越了EfficientFormer-L1等模型。
3. ADE 20K:
用于语义分割任务的实验。SwiftFormer-L1模型在ADE 20K数据集上取得了41.4%的mean intersection over union (mIoU)分数,同样超越了EfficientFormer-L1等模型。
温馨提示:
对于所有推文中出现的代码,
如果您在微信中复制的代码排版错乱,请复制该篇推文的链接,在任意浏览器中打开,再复制相应代码,即可成功在开发环境中运行!或者进入官方github仓库找到对应代码进行复制!
import torch
from torch import nn
import einops
# 论文题目:SwiftFormer: Efficient Additive Attention for Transformer-based Real-time Mobile Vision Applications
# 中文题目: SwiftFormer:针对基于Transformer的实时移动视觉应用的高效加性注意力
# 论文链接:https://openaccess.thecvf.com/content/ICCV2023/papers/Shaker_SwiftFormer_Efficient_Additive_Attention_for_Transformer-based_Real-time_Mobile_Vision_Applications_ICCV_2023_paper.pdf
# 官方github:https://github.com/Amshaker/SwiftFormer
# 所属机构:穆罕默德·本·扎耶德AI大学、加州大学默塞德分校、延世大学、谷歌研究中心、Linköping大学
# 关键词:SwiftFormer, Transformer, 自注意力, 移动视觉应用, 实时性能, 混合设计
# 微信公众号:AI缝合术
class EfficientAdditiveAttnetion(nn.Module):
"""
Efficient Additive Attention module for SwiftFormer.
Input: tensor in shape [B, N, D]
Output: tensor in shape [B, N, D]
"""
def __init__(self, in_dims=512, token_dim=256, num_heads=2):
super().__init__()
self.to_query = nn.Linear(in_dims, token_dim * num_heads)
self.to_key = nn.Linear(in_dims, token_dim * num_heads)
self.w_g = nn.Parameter(torch.randn(token_dim * num_heads, 1))
self.scale_factor = token_dim ** -0.5
self.Proj = nn.Linear(token_dim * num_heads, token_dim * num_heads)
self.final = nn.Linear(token_dim * num_heads, token_dim)
def forward(self, x):
query = self.to_query(x)
key = self.to_key(x)
query = torch.nn.functional.normalize(query, dim=-1) #BxNxD
key = torch.nn.functional.normalize(key, dim=-1) #BxNxD
query_weight = query @ self.w_g # BxNx1 (BxNxD @ Dx1)
A = query_weight * self.scale_factor # BxNx1
A = torch.nn.functional.normalize(A, dim=1) # BxNx1
G = torch.sum(A * query, dim=1) # BxD
G = einops.repeat(
G, "b d -> b repeat d", repeat=key.shape[1]
) # BxNxD
out = self.Proj(G * key) + query #BxNxD
out = self.final(out) # BxNxD
return out
if __name__ == "__main__":
# 测试输入张量
batch_size = 4
num_tokens = 64
in_dims = 512
input_tensor = torch.randn(batch_size, num_tokens, in_dims)
# Efficient Additive Attention 参数
token_dim = 256
num_heads = 2
# 初始化 Efficient Additive Attention 模块
attention_module = EfficientAdditiveAttnetion(
in_dims=in_dims,
token_dim=token_dim,
num_heads=num_heads
)
# 转换到 GPU(如果可用)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
attention_module.to(device)
input_tensor = input_tensor.to(device)
# 前向传播
output = attention_module(input_tensor)
# 输出结果
print(f"输入张量形状: {input_tensor.shape}")
print(f"输出张量形状: {output.shape}")