DynamicViT

article/2025/11/9 5:37:37

又搬来了来自清华大学与UCLA的工作,提出了一种基于动态token稀疏化的高效视觉transformer,通过分层剪枝66%的输入tokens,可减少31%~37%的FLOPs,并将模型运行速度提高了40%以上,保证精度下降在0.5%以内,可应用于各种视觉 transformer模型中。动态 Token 稀疏化实现高效的视觉 Transformer (来自清华大学,周杰,鲁继文团队,UCLA)50 DynamicViT:动态 Token 

Transformer 是 Google 的团队在 2017 年提出的一种 NLP 经典模型,现在比较火热的 Bert 也是基于 Transformer。Transformer 模型使用了 Self-Attention 机制,不采用 RNN 的顺序结构,使得模型可以并行化训练,而且能够拥有全局信息。 这篇文章观察到视觉 Transformer 模型的最终预测结果往往是由一小部分信息量比较大的 tokens 决定的,而大部分的 tokens 其实是冗余的。因此,基于这一观察,本文提出了一种 token 稀疏化的框架,使得视觉 Transformer 模型在前向传播的过程中根据输入图片,动态地识别出冗余的 tokens 并剪掉。通过逐渐地剪掉约 66% 的输入图片的 tokens,DynamicViT 可以在将精度掉点控制在 0.5% 以内的前提下,节约 31%∼37% 的计算量,并提高 40% 以上的吞吐量。

论文地址:https://arxiv.org/pdf/2106.02034.pdf

计算机视觉领域的巨大进步和发展部分原因是以视觉 Transformer 架构为代表的通用视觉模型的发展带来的。视觉 Transformer 已经在目标检测,语义分割等诸多下游任务中取得了广泛的应用。就像针对 CNN 的研究那样,领域也同样致力于 Transformer 类模型加速算法的研究,希望这类模型能够更好地应用在实时移动设备上。之前领域大量研究致力于 CNN 的加速,比如剪掉 CNN 中不太重要的权重。在视觉 Transformer 模型中,我们有一种新的思路。因为 Transformer 将输入图像分割成多个独立的小块 (叫做 Patch 或者 token),这为我们提供了另一种引入稀疏性的正交方法,即我们可以剪掉不重要的 tokens,因为这些冗余的 tokens 对最终模型预测结果的影响很小。

DynamicViT 通过一个极其轻量化的预测模块,来动态地决定哪个 token 应该被剪掉,这个预测模块将被加到 Transformer 模型的多个层里面。对于每个输入图片,预测模块会产生一个针此输入的二进制决策掩码,以决定哪些 tokens 的信息量比较小,需要被剪掉,哪些 tokens 的信息量较大,需要被保留。

如下图1所示,预测模块添加到 Transformer 模型的多个层里面,这样一张输入图片可以在通过模型的过程中,逐渐地减小 tokens 的数量,也就是以一种分层的方式进行稀疏化。一旦一个 token 在某一层之后被剪掉,它就永远不会在模型的前向传播中使用。

虽然在模型中引入了这些额外的预测模块,但是它们所带来的额外计算开销与剪掉冗余 tokens 带来的计算开销的节省相比是相当小的。

预测模块的权重可以随着 Transformer 骨干模型的权重端到端地训练,为此,作者采取了两种专门的策略:

  1. 采用 Gumbel-Softmax[1] 来克服从分布中采样的不可微问题,从而实现端到端训练。

  2. 关于如何根据学习到的二进制决策掩码来剪掉冗余的 tokens:对于每个输入图片而言,其二进制决策掩码中0值的位置肯定是不一样的。因此,在训练过程中直接消除每个输入图片的冗余的 tokens 将无法实现并行计算,也无法计算预测模块的反向传播。而且,直接将被剪掉的 tokens 设置为零向量也不可以,因为零向量仍然会影响 Attention 矩阵的计算。

因此,作者提出了一种称为注意力掩码的策略,基于二进制决策掩码把注意力矩阵中被剪掉的 tokens 与其他 tokens 的 attention 丢弃。作者还改了原始的训练目标函数,增加了一项 loss 来限制剪掉 tokens 的比例。

在推断阶段,针对不同的每个输入图片,可以将冗余的 tokens 剪掉,不再需要考虑操作是否可微,这将大大加快模型的推理速度。

通过预测模块进行 Token 的分层稀疏化

这里 "分层 (Hierarchical)" 的含义是:随着模型的层数由浅到深,token 的数量逐渐减小,即随着计算的进行,逐渐丢弃无信息的 tokens。举个例子:前几层是1000个,中间几层是500个,最后几层只有200个。这个过程是 "分层 (Hierarchical)" 的。

局部特征编码了某个 token 的信息,而全局特征包含了整个图像的上下文,因此两者都包含了信息。

c) 因此,作者结合局部和全局特征来获得局部-全局嵌入,并将它们输入到另一个 MLP,以预测丢弃/保留 tokens 的概率:

 

通过注意力掩码进行端到端的训练 

Dynamic ViT 的训练和推理

 实验结果

ImageNet-1K 实验结果

在几种不同的视觉 Transformer 模型的结果如下图1所示。DynamicViT 适用于不同类型的 Transformer 模型中,作者汇报了 ImageNet-1K 精度,计算量和吞吐量 (吞吐量是在单个 NVIDIA RTX 3090 GPU 上测量的,Batch size 固定为32)。DynamicViT 可以减少 31%~37% 的计算成本,并在运行时加速 43%~54% 的推理速度,而性能影响可以忽略 (0.2%~0.5%)。

与 SOTA 模型对比

如下图3所示是 DynamicViT 与其他 SOTA 的分类模型对比的结果。可以观察到,DynamicViT 表现出良好的复杂性/精度权衡。值得注意的是 DynamicViT-LV-M/0.7 击败了先进的 CNN 模型 EfficientNet-B5 和 NFNet-F0。     whaosoft aiot http://143ai.com

DynamicViT 用于模型的缩放

可视化结果

为了进一步观察 DynamicViT 的行为,作者在下图5可视化了稀疏化的过程。图5展示了原始输入图像和3个阶段后的稀疏化结果,其中掩码表示相应的 tokens 被剪掉了。可以观察到每张图片都通过分层的 token 稀疏化,DynamicViT 都会逐渐丢弃掉信息量相对较少的 tokens,最终聚焦于图像中的物体。这一现象还说明,DynamicViT 可以有更好的可解释性,即:它可以定位图像中对分类结果贡献最大的重要部分。

 除了以上不同样本的可视化结果之外,作者还对稀疏化 token 决策的统计特征感兴趣。也就是说,DynamicViT 究竟从数据集学习了什么样一般的模式?作者使用 DynamicViT 为 ImageNet 验证集中的所有图像生成决策,并计算所有3个阶段中每个 token 的保留概率,如图6所示。作者将结果通过 Pooling 操作变成维度是 7×7,使得它们更容易可视化。作者发现图像中间的 tokens 往往被保留,这也是合理的。因为在大多数图像中,物体一般位于图片的中心。 

不同稀疏化策略的比较

如下图7所示,为了讨论动态稀疏化是否优于其他的稀疏化策略,作者进行了消融实验,结果如下图7所示。一种方法是结构化下采样 (structural downsampling),这种方法作者使用了一个 2×2 大小的 average pooling,这种方法与 DynamicViT 有类似的 FLOPs。另一种稀疏化的策略是静态 token 稀疏化 (static token sparsification),即稀疏化 token 与输入无关。通过实验可以发现,虽然这三种策略的计算复杂度相似,但 DynamicViT 的精度是最高的。

 

 总结一下哦

DynamicViT 是一种动态 token 稀疏化的框架,使得视觉 Transformer 模型在前向传播的过程中根据输入图片,动态地识别出冗余的 tokens 并剪掉。通过逐渐地剪掉约 66% 的输入图片的 tokens,DynamicViT 可以在将精度掉点控制在 0.5% 以内的前提下,节约 31%∼37% 的计算量,并提高 40% 以上的吞吐量。

 


http://chatgpt.dhexx.cn/article/sY7k7FZ7.shtml

相关文章

involution理解

最好的参考来自论文作者的知乎:CVPR 2021 | involution:超越convolution和self-attention的神经网络新算子 其他餐卡: https://zhuanlan.zhihu.com/p/400402288 https://zhuanlan.zhihu.com/p/356960359 https://blog.csdn.net/P_LarT/articl…

网络中的pvid与native vlan(本征vlan)区别以及详解

一:pvid与native vlan分别属于华为和思科交换里面的概念,虽然说法不同,但是本质都是缺省vlan 缺省vlan默认为1,各个端口都有一个缺省的vlan,该值支持修改。 2.作用概念,pvid存在于trunk中,且&…

VTP、PVID、ACCESS、trunk

一、VTP详解 VTP有server、client、transparent三种模式、VTP多用于在多vlan的网络环境中,在核心交换机或者根节点交换机中配置Server,在下层的交互机中配置client,VTP在服务模式下,可以创建、删除、修改VLAN,并且转发…

不同VLAN下实现网络互相通信(配置port trunk pvid vlan进行数据转发)

1. 两台交换机同一网段&#xff0c;不同VLAN实现网络互通&#xff0c;逻辑拓扑图如下&#xff1a; 需求&#xff1a;实现VLAN 10与VLAN20之间的PC网络互通 在LSW 12交换机进行如下命令行配置&#xff1a; <HuaWei>system-view #切换系统视图 [Huawei]sysname…

VLAN Tag,PVID

VLAN(Virtual Local Network&#xff0c;虚拟局域网)&#xff0c;对于VLAN的划分方法有很多种&#xff1a;基于端口划分&#xff0c;基于MAC地址划分&#xff0c;基于网络协议划分&#xff0c;基于IP地址划分&#xff0c;基于策略划分等等。但是就上述而言&#xff0c;对VLAN的…

trunk vlan pvid 学习实验整理 2

实验总结&#xff1a; trunk vlan vlan1 vid pvid 等关系。 实验场景二&#xff1a; 上述条件不变【实验场景一】&#xff0c;将PC1 加入vlan10 [SW1]interface Ethernet 0/0/1 [SW1-Ethernet0/0/1]port link-type access [SW1-Ethernet0/0/1]port default vlan 10 >>…

trunk vlan pvid 学习实验整理 1

实验总结&#xff1a; trunk vlan vlan1 vid pvid 等关系。 实验场景一&#xff1a; 将PC1/PC2/PC3,都置于同一网段&#xff1a;192.168.1.0/24 1.PC1 不加入任何vlan&#xff0c;PC2 不加入任何vlan&#xff0c;PC3加入vlan10 2.trunk链路允许vlan 10 20通过。 配置&#xf…

PVID(pvid vlan是什么意思)

26tpwinet如何设置端口pvid25口设置为trunk口&#xff1f; 首先你要确定你的电脑有没有USB转com口线&#xff0c;或者你的笔记本是否支持com口 如果你是win7系统确实没有超级终端那么你可以下一个SecureCRT&#xff0c;然后在设备管理器里面看一下自己是COM几口&#xff0c;波…

PVID和VID的理解

VID解释 VID&#xff08;VLAN ID&#xff09;是VLAN的标识&#xff0c;在交换机里面用来划分端口。比如一个交换机有8个端口&#xff0c;现在将port1&#xff0c;port2&#xff0c;port5三个端口的VID设置成1111&#xff0c;那么这三个端口就能接收vlantag1111的数据包。   …

2、PVID(本征VLAN)实验配置步骤

实验拓扑图&#xff1a; 实验配置思路&#xff1a; 将VLAN10配置为本征VLAN 本征VLAN通过Trunk接口时不打tag标记 实验摘要重点命令&#xff1a; [SW1]int g0/0/1 //进入接口 [SW1-GigabitEthernet0/0/1]port trunk pvid vlan 10 //将VLAN10设置为本征VLAN [SW1-Gig…

华为交换机PVID与VLAN ID及TAG 、UNTAG学习记录

一、PVID和VLAN ID 1、PVID是端口的属性&#xff0c;端口的标识&#xff0c;具有唯一性&#xff0c;交换机默认未配置Vlan的情况下&#xff0c;因为全局vlan1的原因&#xff0c;所有端口的PVID都是1。如下图&#xff1a; 2、交换机里面display port vlan命令可以查看未配置状态…

switch中的PVID、VID、untag、tag概念

以openwrt为例&#xff0c;下图是mt7621&#xff08;glinet mt1300&#xff09;中switch配置图 该switch一共有7个port&#xff0c;一个连接CPU&#xff0c;还有6个可供外部使用&#xff0c;上图只显示了6个port&#xff1b; 一个switch可以设置多个VLAN&#xff08;虚拟局域网…

springboot @Qualifier 注解的作用

Qualifier 注解的用法和要解决的问题 现在这两个类都实现了同一个接口。 controller 要注入这个接口 启动服务日志显示在容器中找到俩个实现类 spring不知道要实现那个 1 有两种方式 既然spring不知道那就直接指明你要实现的类 直接注入实现类 这样有点粗鲁 也能解决问题。…

Spring中的@Qualifier注解

国庆期间闲来无事&#xff0c;写了一个简单的小程序&#xff0c;小程序名称叫做 IT藏经楼。目的是分享这些年自己积累的一些学习材料&#xff0c;方面大家查找使用&#xff0c;包括电子书、案例项目、学习视频、面试题和一些PPT模板。里面所有材料都免费分享。目前小程序中只发…

@Qualifier的用处

Qualifier的用处 可以对于一个接口&#xff0c;多个实现类&#xff0c;指定具体注入哪个实现类到这个接口类 在Server 实例化的时候没有指明名称&#xff0c;在atuoWire的时候没有用Quality指明用哪一个的时候&#xff0c;这这时会用容器中仅有的那一个对象&#xff08;单利&am…

@Autowired和@Qualifier

Autowired 的作用是什么&#xff1f; 1、Autowired 是一个注释&#xff0c;它可以对类成员变量、方法及构造函数进行标注&#xff0c;让 spring 完成 bean 自动装配的工作。 Autowired 默认是按照类去匹配&#xff0c;配合 Qualifier 指定按照名称去装配 bean。 可以这样理解为…

spring注解@Qualifier的详细用法

环境&#xff1a;springboot2.3.10 一般使用在项目中使用Qualifier来限定注入的Bean。 由于项目中我习惯用Resource注解&#xff0c;所以这里先对Autowired和Resource进行个简单的说明。 Autowired和Resource区别 相同点&#xff1a; Autowired与Resource都可以用来装配Be…

Spring 注解 @Qualifier 详细解析

文章目录 1. 概述2. 痛点3. Qualifier4. Qualifier VS Primary5. 通过名称来自动注入6. 总结 1. 概述 今天带你了解一下 Spring 框架中的 Qualifier 注解&#xff0c;它解决了哪些问题&#xff0c;以及如何使用它。我们还将了解它与 Primary 注解的不同之处。更多的技术解析请…

@Qualifier注解作用

Qualifier 注解作用就是为了给Bean打上一个标记&#xff0c;用来查找bean&#xff0c;代码示例: 创建一个java bean package com.gupaoedu.springcloud.example.demo;public class TestClass {private String name; // getter setter 略 }编写配置类&#xff0c;将这个bean装载…

Spring的注解@Qualifier用法

Spring的注解Qualifier用法 在Controller中需要注入service那么我的这个server有两个实现类如何区分开这两个impl呢&#xff1f; 根据注入资源的注解不同实现的方式有一点小小的区别 下面上铺垫图 请忽略我的红线 ##在Controller中使用 Autowired注入时 Qualifier的意思是合格…