当前位置: 首页 > article >正文

E2VPT: An Effective and Efficient Approach for Visual Prompt Tuning

论文汇总

存在的问题

1.以前的提示微调方法那样只关注修改输入,而应该明确地研究在微调过程中改进自注意机制的潜力,并探索参数效率的极限。

2.探索参数效率的极值来减少可调参数的数量?

解决办法

提示嵌入进行transformer中

提示剪枝

Token-wise Pruning

Token-wise Pruning对prompt生成一个mask, ρ = { ρ 1 , ρ 2 , … , ρ M } , ρ k ∈ { 0 , 1 } \rho=\{\rho_1,\rho_2,\ldots,\rho_M\},\rho_k\in \{0,1\} ρ={ρ1,ρ2,,ρM},ρk{0,1} ( M M M为可视提示符的长度)。 ρ k ∈ { 0 , 1 } \rho_k\in \{0,1\} ρk{0,1} 代表第 i i i 个token的重要程度,0代表这个token被丢弃, P ~ k = ρ k ⋅ P k \tilde{P}_k=\rho_k\cdot {P}_k P~k=ρkPk

Segment-wise修剪

Segment-wise修剪对Token-wise Pruning之后的Token做进一步的剪枝,具体来说就讲Token-wise Pruning之后的Token分为 R R R 个part,将每个part视为一个整体。每一个part也有一个类似于Token-wise Pruning的 ρ \rho ρ 变量,表示每一个part的Token是否需要被抛弃。

摘要

随着基于transformer的模型的规模不断增长,为新任务微调这些大规模预训练的视觉模型已经变得越来越参数密集。参数高效学习是为了减少微调过程中可调参数的数量。尽管这些方法显示出很好的结果,但与完全微调相比,仍然存在显着的性能差距。为了解决这一挑战,我们提出了一种有效和高效的视觉提示调谐(E2VPT)方法,用于大规模基于变压器的模型自适应。具体来说,我们在自注意层和输入层分别引入了一组可学习的键值提示和视觉提示,以提高模型微调的有效性。此外,我们设计了一个提示剪枝程序,在保持模型性能的同时系统地修剪低重要性提示,大大提高了模型的效率。实证结果表明,我们的方法在两个基准上优于几个最先进的基线,参数使用率相当低(例如,VTAB-1k上的模型参数使用率为0.32%)。我们的代码可在https://github.com/ChengHan111/E2VPT上获得。

1. 介绍

人工智能(AI)的发展不仅应优先考虑性能进步,还应强调可持续部署[64,78,80,87]。尽管人们对视觉相关任务的性能改进有着迷人的追求,但目前模型的规模一直在迅速增加,这导致了能量密集型和计算成本高昂的训练[31,73,92]。基于transformer的架构目前主导着视觉相关模型,如ViT-Huge [12] (632M)和Swin-Large [54] (197M),它们的参数明显多于卷积神经网络(CNN)像ResNet [26] (25M)。从头开始训练如此大的模型存在着数据有限[5,20,75]和低精度下缓慢收敛[37,47]等挑战。克服这些挑战的一个常见范例是预训练-然后微调,它减少了对大量训练数据的需求,并加快了各种视觉任务的处理速度。然而,传统的全调优涉及到为每一个任务存储和部署backbone参数的完整副本[34],计算成本很高,不适合快速模型部署。

图1所示。在预训练之后微调的范式下,$ \text{E}^2 \text{VPT} $(我们的)与其他工作(即部分调谐[91],额外模块[6]和提示调谐[34]方法)。与最先进的微调方法相比,我们的方法获得了可靠的性能提升,并且在采用预训练的ViT-Base/16[12]作为主干的广泛分类任务上具有完全微调的竞争力,参数使用量相当低(见表1)。颜色分别表示VTAB-1k[96]上的结果:Specialized, Natural和Structure。

为了解决这个问题,已经开发了各种方法,可分为三大类(见图1):部分调优、额外模块和提示调优方法。部分调优方法[10,35,58]只对骨干的一部分进行微调,如分类器头部或最后几层,而冻结其他部分。额外的模块方法将可学习的偏置项[6]或额外的适配器[70,98]插入网络以进行适应。提示调谐方法在变压器的输入层添加提示令牌[34,36,94],而不改变或微调主干本身。所有这些方法都是在预训练后微调的模式下运行的,与完全微调相比,这减少了可学习参数的数量[10,35,58,70,98]。

然而,尽管取得了令人鼓舞的结果,但现有的参数高效方法存在两个主要局限性。首先,他们没有仔细检查transformer自关注机制的核心架构,导致完全微调的性能差距很大。其次,它们通常需要对相对大量的参数进行微调以达到合理的性能,而无法探索参数效率的极值。

以上概述的观点引出了两个基本问题:

1:我们如何才能为大规模基于transformer的视觉模型建立快速调整的有效性?

2:我们如何探索参数效率的极值来减少可调参数的数量?

这两个问题是我们工作的基础。直觉是,我们不应该像以前的提示调整方法那样只关注修改输入,而应该明确地研究在微调过程中改进自注意机制的潜力,并探索参数效率的极限

为了回答问题1,我们讨论并分析了transformer的自关注机制,该机制对于在全局上下文中捕获远程令牌依赖关系至关重要[21,38,49]。除了输入视觉提示外,我们还引入了可学习的键值提示,并将它们集成到自注意层的键值矩阵中。在微调期间,键值提示与输入可视提示一起学习。这种方法有效地利用了设计良好的transformer提示体系结构,从而显著提高了性能。此外,它为电流互感器架构提供了一个通用的即插即用提示模块,其微调解决方案在概念上不同于前面提到的视觉领域的所有技术。

在问题2的激励下,我们提出了一种修剪策略,在保持模型性能的同时进一步减少参数的数量。我们的方法从彩票假设(LTH)中获得灵感[16,102],它假设对于给定的任务,存在一个子网络,该子网络可以匹配原始过参数化网络的测试精度,而不需要不必要的权重[22,23,41,43,44]。在此范例的基础上,我们重新审视了提示调优方法的核心设计,并进一步减少了可学习参数的数量。具体来说,我们的目标是保留对性能有重大贡献的提示令牌,同时在微调期间修剪冗余或不必要的提示令牌。通过修剪这些不必要的提示,我们可以在保持性能的同时显著提高提示调优效率。

为了回答问题1-2,我们提出$ \text{E}^2 \text{VPT} $,即Effective and Efficient Visual Prompt Tuning。e2vpt是一种新颖的提示调优框架,它既具有架构意识,又具有修剪锚定(见图1)。在§2中,我们进行了文献综述并讨论了相关工作。我们提出的方法在§3中提出,在那里我们详细描述了我们如何设计视觉和键值提示,以更少的参数实现卓越的性能。在§4中,我们在各种基准、主干和不同的预训练目标上提出了令人信服的实验结果。具体来说,我们的方法在VTAB-1k上的准确率比完全调优平均提高了5.85%,比VPT平均提高了1.99%[34]。此外,我们的方法使用的可学习参数比现有方法少得多,平均只占VTAB-1k主干参数的0.32%,而VPT平均需要0.68%(见图1)。我们进一步证明并解释了我们的方法比双曲可视化的VPT的优越性。最后,我们在附录中展示了我们的方法在语言领域的强大算法泛化。我们相信这项工作能为相关领域提供有价值的见解。

2. 相关工作

2.1. 视觉Transformers

受transformer在自然语言处理(NLP)中取得的巨大成功的启发[5,11,52,69,79,83],研究人员将transformer架构扩展到各种监督视觉任务,包括图像分类[12,53,54,56],图像分割[46,51,74,82,84,86,100],目标检测[4,7,50,66,93,101]和姿态估计[29,30,48,90])。自监督预训练范式[3,10,24]也得到了探索,并得到了最先进的结果。与卷积神经网络(cnn)相比,transformer因其优越的性能和可扩展性而在视觉相关学科中占据主导地位[27,34]。然而,使transformer适应各种视觉任务所需的大量计算和参数开销也不容忽视[15,33,97]。例如,最近基于transformer的模型,如MViTv2Large [45] (218M)、vitg [95] (1.8B)、SwinV2-G [53] (3.0B)和V-MoE [72] (14.7B),会产生大量的计算成本。因此,我们提出$ \text{E}^2 \text{VPT} $,旨在降低基于transformer的架构的计算成本,同时在预训练-然后微调范式中保持高性能。

2.2. 参数高效微调

高效的模型训练已经引起了视觉界的广泛关注,尤其是随着视觉transformer的兴起[1,8,12,54,85]。然而,尽管这些模型非常有效并被广泛使用,但它们对于实际部署和调整来说往往过于庞大。因此,通常采用预训练-然后微调范式。虽然完全微调确保了强大的性能,但这是一种涉及更新所有网络参数的昂贵方法[27,75]。为了克服这一挑战,研究人员正在探索平衡参数效率和鲁棒性能的替代方案,可大致分为三组:部分调优、额外模块和提示调优方法。

部分调优方法被广泛用于参数高效的微调。这些方法包括冻结大部分主干,只微调一小部分参数,如线性[32]或MLP磁头[9],或主干的几个块/层[24,65,91,99]。虽然这些方法直接且易于实现[10,35,58],但与完全微调相比,它们通常存在很大的性能差距。额外的模块方法设计了额外的可学习的插件架构进行微调。例如,[98]中的工作在冻结原始网络的同时交替引入了一个侧结构。[6,70]中的作品将额外的残余单元插入主干。然而,这些方法的一个缺点是插入的模块通常是针对特定的体系结构定制的,可能无法推广到其他体系结构。

此外,与部分调优方法相比,这些模块通常消耗更多的参数。提示调整或提示[28,42,57,89]最初被提出用于语言领域的快速模型自适应。这些方法将一组可学习的向量添加到主干的输入中,并且仅在微调期间更新这些特定于任务的提示。最近,在视觉领域引入了视觉相关提示[18,34,88],它在输入序列中设计视觉提示,并在完全微调的情况下显示出具有竞争力的性能。然而,目前的方法没有考虑基于transformer的体系结构的内部设计,导致不太有效的提示解决方案。相比之下,我们的方法注意到架构并锚定在修剪上,这在概念上将其与上述方法区分开来。

3. 我们的E2VPT方法

在本节中,我们将介绍E2VPT,这是一种新颖的视觉提示调谐方法,用于有效和高效的大规模基于transformer的模型微调。我们首先在§3.1中定义这个问题和记号。在§3.2中介绍了通过设计视觉和键值提示符进行有效的提示调优,然后在§3.3中介绍了有效的提示修剪。总体框架如图2所示。

3.1. 问题定义

在本节中,我们定义了 E 2 VPT \text{E}^2 \text{VPT} E2VPT 问题并提供了相关符号。假设我们有一个主干视觉transformer器模型 T \textbf{T} T,它在大量数据和任务上进行了预训练。视觉transformer的输入是一系列图像补丁 I = { I 1 , I 2 , … , I m } I=\{I_1,I_2,\ldots,I_m\} I={I1,I2,,Im},其中 m m m为图像补丁总数。然后用位置编码将每个patch投影到 d d d维嵌入中,即 E = { E j ∣ 1 ≤ j ≤ m } E=\{E_j|1\le j\le m\} E={Ej∣1jm},其中 E j = Emb ( I j ) E_j=\text{Emb}(I_j) Ej=Emb(Ij)。视觉transformer T \textbf{T} T N N N 个相同的transformer层组成,表示为:

这里的每个transformer层都是多头自关注(MSA)和前馈网络(FFN)的堆栈:

给定一个新的视觉任务,目标是微调一个模型 T ^ \hat{\textbf{T}} T^,在只调整少量参数的情况下,在任务上提供良好的性能。在视觉提示调优的上下文中, T ^ = { T , P } \hat{\textbf{T}}=\{\textbf{T},\textbf{P}\} T^={T,P},其中包括一个冻结的主干 T \textbf{T} T,以及具有很少可调参数的可训练提示 P \textbf{P} P

3.2. 有效的提示

图2。E2VPT框架概述。在预训练-然后微调范式下,只有transformer输入和主干(§3.2)中的提示在微调过程中更新,而所有其他组件保持冻结。在(d)中,我们进一步在两个粒度级别(即,标记明智和分段明智)上引入修剪(§3.3),以消除倒带期间不利的输入提示。

大多数现有的提示调优方法侧重于通过将一组视觉提示添加到transformer层的输入序列来调优,而没有考虑变压器体系结构的内部设计。然而,为了提高提示调优的有效性并实现最佳的微调性能,我们提出了一种新的方法,在我们的视觉提示调优框架中,除了输入视觉提示( P I \textbf{P}_I PI )外,还包含一组键值提示( P K \textbf{P}_K PK P V \textbf{P}_V PV )。直观地,输入视觉提示被插入到每个编码器层的输入序列中,这些编码器层学习表示新任务。键值提示与自注意模块中的键和值参数矩阵连接在一起,该模块学习从数据中捕获新的注意模式。

视觉提示。视觉提示是一组与输入视觉标记具有相同维度的 d d d 维嵌入向量。它们被附加到每个transformer编码器层的输入序列中,并与所有输入令牌交互。视觉提示的作用与传统提示调优方法中的提示符号类似[34,42],它们学习特定于任务的嵌入,以指导模型在新任务上执行。

正式地,这些视觉提示被定义为 P I = { P I 1 , P I 2 , … , P I N } P_I=\{P^1_I,P^2_I,\ldots,P^N_I\} PI={PI1,PI2,,PIN},其中 P I i P^i_I PIi 为可学习视觉在第i层编码器中提示, N N N为总层数。然后编码器层表示为:

其中 Z i Z^i Zi 表示由第 i i i层编码器计算的上下文嵌入。不同的颜色分别表示可训练参数和固定参数。对于输入图像patch E E E的嵌入,它们是用主干的冻结Emb投影进行初始化的。

键-值提示。视觉提示对于学习新任务的知识很有用。然而,它们在指导transformer编码器层之间的信息交互方面存在不足。原因是当对新数据进行微调时,图像分布可能与用于预训练骨干模型的图像示例中的图像分布有很大不同。因此,增强模型从微调数据中捕获新信息的能力以及在输入令牌之间进行更有效的关注以学习新模式是至关重要的。

为此,我们提出了一种新的方法,通过引入一组新的键值提示, P K P_K PK P V P_V PV,它们被合并到每个编码器层的注意力模块中(如图2(a)所示)。这些键-值提示是只有几列的小矩阵,但与原始注意力模块中的键和值矩阵共享相同的行数。为了执行新的注意力计算,键和值矩阵分别与相应的 P K P_K PK P V P_V PV 提示符相连接。这个过程定义如下:

其中FFN为前馈网络,MSA为编码器层内的多头注意。 h h h 表示第 h h h 个头。 K ′ K' K V ′ V' V 是新的键和值嵌入矩阵,定义为:

其中, K K K V V V 表示主干中的原始键矩阵和值矩阵。通过这种方式,键值提示可以帮助指导模型适应新数据。在我们的实现中,我们更进一步,在每个transformer层中启用 P K P_K PK P V P_V PV 提示的参数共享,而不是调整单独的可学习向量。我们的动机是双重的:首先,我们的实验结果表明,在共享提示的情况下,跨实例的微调性能持续提高;其次,使用共享提示向量将可学习transformer部分的参数使用减少了一半,使其更具参数效率。我们在§4.3中提供了关于探索提示位置(即,在 K K K V V V 之前或之后)的讨论。

值得注意的是,查询矩阵 Q Q Q 是自注意机制中的另一个关键元素。然而,不需要对 Q Q Q 进行额外的提示,原因有二:首先,对 Q Q Q 进行提示类似于对 K K K 进行前置以计算每对 Q Q Q K K K 之间的注意分数,因此,对 Q Q Q K K K 都进行提示是不必要的;其次, Q Q Q 的变化会影响注意力图的输出形状,需要对下一层不匹配的维度进行额外的线性投影。在参数高效设计下,这是无法承受的。更多的实验和讨论将在附录中提供。

3.3. 有效的促使

我们的有效提示方法旨在提高微调模型的性能。然而,一个自然的问题出现了:我们能否在不牺牲模型性能的情况下减少可调提示的数量?彩票假设(lottery ticket hypothesis, LTH)[16,102]指出,对于给定的任务,存在一个子网络,在不需要不必要的权重的情况下,可以达到与原始过参数化网络相同的测试性能。在这一假设的推动下,我们进行了一个实验,我们掩盖了不同的视觉提示,发现不同的提示对模型的性能有不同的影响,有些甚至有负面影响。这一观察结果与以往的研究一致[43,57]

基于我们的发现,我们提出了一种对视觉提示进行快速修剪的方法。这种方法的主要目标是保留最有影响的提示,同时消除冗余或不必要的提示。通过删除不太重要的提示,我们可以在保持性能的同时显著提高提示调优的效率。

为了实现这一目标,我们设计了一个级联修剪策略,该策略在两个粒度级别上运行,即令牌修剪和分段修剪,如图2(d)所示。标记智能修剪最初识别并删除最不重要的视觉提示。在此步骤之后,分段式修剪将每个剩余提示划分为多个片段并过滤掉负面片段。通过共同减少可学习视觉提示中的参数使用,我们的两级修剪方法创建了软过滤提示,可以在倒带阶段重新训练。

Token-wise修剪。我们引入一个可学习掩模变量 ρ = { ρ 1 , ρ 2 , … , ρ M } \rho=\{\rho_1,\rho_2,\ldots,\rho_M\} ρ={ρ1,ρ2,,ρM} ( M M M为可视提示符的长度),并将其与各transformer层的输入可视提示符相关联。式中 ρ k ∈ { 0 , 1 } \rho_k\in \{0,1\} ρk{0,1},其中0表示对相应的可学习输入提示进行剪枝。然后,屏蔽版本的视觉提示变成 P ~ k = ρ k ⋅ P k \tilde{P}_k=\rho_k\cdot {P}_k P~k=ρkPk 。为了确定修剪位置,我们计算每个提示符号的重要性分数[16,57],并消除得分最低的位置。重要性分数定义为模型对掩模变量 ρ k \rho_k ρk 的期望灵敏度[60]:

式中, L \mathcal{L} L 为损失函数, D x \mathcal{D}_x Dx 为训练数据分布[60]。分配给每个视觉提示的重要性分数反映了它对微调性能的贡献。低重要性分数表明提示对微调过程的贡献很小,甚至是负的。相反,高重要性分数表明提示是有意义和有用的,对微调过程有重大贡献。

Segment-wise修剪。我们进一步研究了分段修剪,以排除每个提示内的负面提示段。每个提示令牌的嵌入首先平均分成$ R $部分。每个部分作为一个独立的单元,可以共同优化。类似于标记式修剪,然后我们为提示标记内的每个片段分配一个掩码变量,并过滤掉那些重要性分数低的片段。

Rewinding。在执行两级级剪枝之后,权值倒卷阶段的重点是重新训练软过滤的提示令牌。这个过程包括在修剪阶段对每个层的重要性评分进行排序,当其重要性评分相对较低时,将相应的掩码变量设置为0。接下来,在微调过程中,使用学习率和权重衰减的原始组合,将软过滤输入提示与其他可学习参数一起重新训练。

4. 实验

参考资料

论文下载(ICCV 2023)

https://arxiv.org/abs/2307.13770

代码地址

https://github.com/ChengHan111/E2VPT

参考资料

https://zhuanlan.zhihu.com/p/671299605


http://www.kler.cn/a/313525.html

相关文章:

  • 《C++在金融领域的技术革命:高效、安全与创新的融合》
  • 基于迭代重加权最小二乘法的算法及例程
  • 【STM32】基于SPI协议读写SD,详解!
  • DHCP与FTP
  • OpenGL【C++】台灯
  • vue el-date-picker 日期选择器禁用失效问题
  • 系统架构设计师教程 第5章 5.1 软件工程 笔记
  • 面向过程和面向对象思想
  • Linux:开源世界的璀璨明珠
  • 深度学习-13-小语言模型之SmolLM的使用
  • 【Linux 从基础到进阶】OpenStack 私有云平台搭建
  • SpringBoot使用@Scheduled注解实现定时任务
  • MavenMyBatis
  • 0基础跟德姆(dom)一起学AI 数据处理和统计分析04-Panda入门
  • 【操作系统】01.冯·诺伊曼体系结构
  • Flask-WTF的使用
  • 【C++】透析string类
  • 力扣300-最长递增子序列(Java详细题解)
  • 软考无损连接判断
  • Apache Airflow如何使用
  • Python编码系列—Python策略模式:灵活应对变化的算法策略
  • Java 在 GIS 领域的学习路线?
  • 硬件工程师笔试面试——开关
  • 数据飞轮崛起:数据中台真的过时了吗?
  • 基于python+django+vue的旅游网站系统
  • 【script】java武魂技展示:在java中使用不同的脚本语言 一文体现java生态的强大