【论文笔记】Visual Prompt Tuning

news/2024/12/16 23:13:18/

🍎个人主页:小嗷犬的个人主页
🍊个人网站:小嗷犬的技术小站
🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。


基本信息

标题: Visual Prompt Tuning
作者: Menglin Jia, Luming Tang, Bor-Chun Chen, Claire Cardie, Serge Belongie, Bharath Hariharan, Ser-Nam Lim
发表: ECCV 2022
arXiv: https://arxiv.org/abs/2203.12119

基本信息

摘要

当前在适应预训练模型的方法中,涉及更新所有骨干参数,即全量微调

本文介绍了视觉提示微调VPT),作为大规模视觉Transformer模型中全量微调的高效且有效的替代方案。

受到最近在大规模语言模型高效调优方面的进展的启发,VPT在保持模型骨干冻结的同时,仅在输入空间引入少量(小于模型参数的1%)可训练参数。

通过在广泛下游识别任务上的大量实验,我们表明VPT相较于其他参数高效调优协议实现了显著的性能提升。

最重要的是,VPT在很多情况下甚至优于全量微调,无论是在模型容量还是训练数据规模上,同时降低了每项任务的存储成本。

代码可在https://github.com/kmnp/vpt获取。

Visual-Prompt Tuning (VPT) vs. other transfer learning methods

方法

Preliminaries

对于一个具有 N N N 层的 ViT,输入图像被分割成 m m m 个固定大小的块 { I j ∈ R 3 × h × w ∣ j ∈ N , 1 ≤ j ≤ m } \{I_j \in \mathbb{R}^{3 \times h \times w} \mid j \in \mathbb{N}, 1 \leq j \leq m\} {IjR3×h×wjN,1jm}

h , w h, w h,w 分别是图像块的高度和宽度。

每个块首先被嵌入到 d d d-维的潜在空间中,并带有位置编码:

e 0 j = Embed ( I j ) e 0 j ∈ R d , j = 1 , 2 , … m \mathbf{e}_0^j = \text{Embed}(I_j) \quad \mathbf{e}_0^j \in \mathbb{R}^d, j = 1, 2, \ldots m e0j=Embed(Ij)e0jRd,j=1,2,m

我们表示图像块嵌入的集合为 E i = { e i j ∈ R d ∣ j ∈ N , 1 ≤ j ≤ m } \mathbf{E}_i = \{\mathbf{e}_i^j \in \mathbb{R}^d \mid j \in \mathbb{N}, 1 \leq j \leq m\} Ei={eijRdjN,1jm},作为输入到第 ( i + 1 ) (i+1) (i+1)-个Transformer层 ( L i + 1 ) (L_{i+1}) (Li+1)

与一个额外的可学习分类标记([CLS])一起,整个 ViT 可以表示为:

[ x i , E i ] = L i ( [ x i − 1 , E i − 1 ] ) i = 1 , 2 , … , N [\mathbf{x}_i, \mathbf{E}_i] = L_i([\mathbf{x}_{i-1}, \mathbf{E}_{i-1}]) \quad i = 1, 2, \ldots, N [xi,Ei]=Li([xi1,Ei1])i=1,2,,N

y = Head ( x N ) \mathbf{y} = \text{Head}(\mathbf{x}_N) y=Head(xN)

其中 x i ∈ R d \mathbf{x}_i \in \mathbb{R}^d xiRd 表示 [CLS] L i + 1 L_{i+1} Li+1 输入空间中的嵌入。

[ ⋅ , ⋅ ] [\cdot, \cdot] [,] 表示在序列长度维度上的堆叠和连接,即 [ x i , E i ] ∈ R ( 1 + m ) × d [\mathbf{x}_i, \mathbf{E}_i] \in \mathbb{R}^{(1+m) \times d} [xi,Ei]R(1+m)×d

每一层 L i L_i Li 包含多头自注意力(MSA)和前馈网络(FFN),以及层归一化和残差连接。

一个神经分类头用于将最终层的 [CLS] 嵌入 x N \mathbf{x}_N xN 映射到预测的类概率分布 y \mathbf{y} y

Visual-Prompt Tuning (VPT)

给定一个预训练的Transformer模型,我们在Embed层之后的输入空间中引入一组维度为 d d d 的连续嵌入,即提示(prompts)。

微调过程中,只有任务特定的提示被更新,而Transformer主干保持冻结。

根据涉及的Transformer层的数量,我们的方法有两种变体,VPT-Shallow和VPT-Deep,如图2所示。

Overview of our proposed Visual-Prompt Tuning

VPT-Shallow

提示仅被插入到第一个Transformer层 L 1 L_1 L1 中。

每个提示token是一个可学习的 d d d-维向量。

一组 p p p 个提示表示为 P = { p k ∈ R d ∣ k ∈ N , 1 ≤ k ≤ p } \mathbf{P} = \{\mathbf{p}^k \in \mathbb{R}^d \mid k \in \mathbb{N}, 1 \leq k \leq p\} P={pkRdkN,1kp},浅层提示的 ViT 为:

[ x 1 , Z 1 , E 1 ] = L 1 ( [ x 0 , P , E 0 ] ) [\mathbf{x}_1, \mathbf{Z}_1, \mathbf{E}_1] = \textcolor{blue}{L_1}([\textcolor{blue}{\mathbf{x}_0}, \textcolor{red}{\mathbf{P}}, \mathbf{E}_0]) [x1,Z1,E1]=L1([x0,P,E0])

[ x i , Z i , E i ] = L i ( [ x i − 1 , Z i − 1 , E i − 1 ] ) i = 2 , 3 , … , N [\mathbf{x}_i, \mathbf{Z}_i, \mathbf{E}_i] = \textcolor{blue}{L_i}([\mathbf{x}_{i-1}, \mathbf{Z}_{i-1}, \mathbf{E}_{i-1}]) \quad i = 2, 3, \ldots, N [xi,Zi,Ei]=Li([xi1,Zi1,Ei1])i=2,3,,N

y = Head ( x N ) \mathbf{y} = \textcolor{red}{\text{Head}}(\mathbf{x}_N) y=Head(xN)

其中 Z i ∈ R p × d \mathbf{Z}_i \in \mathbb{R}^{p \times d} ZiRp×d 表示由第 i i i-个Transformer层计算的特征,且 [ x i , Z i , E i ] ∈ R ( 1 + p + m ) × d [\mathbf{x}_i, \mathbf{Z}_i, \mathbf{E}_i] \in \mathbb{R}^{(1+p+m) \times d} [xi,Zi,Ei]R(1+p+m)×d

颜色红色 ∙ \textcolor{red}{\bullet} 和蓝色 ∙ \textcolor{blue}{\bullet} 分别表示可学习和冻结的参数。

值得注意的是,对于 ViT, x N \mathbf{x}_N xN 对提示的位置是不变的,因为它们是在位置编码之后插入的,例如, [ x 0 , P , E 0 ] [\mathbf{x}_0, \mathbf{P}, \mathbf{E}_0] [x0,P,E0] [ x 0 , E 0 , P ] [\mathbf{x}_0, \mathbf{E}_0, \mathbf{P}] [x0,E0,P] 在数学上是等价的。

这也适用于 VPT-Deep。

VPT-Deep

提示在每个Transformer层的输入空间中引入。

对于第 ( i + 1 ) (i+1) (i+1)-个层 L i + 1 L_{i+1} Li+1,我们表示输入可学习提示的集合为 P i = { p i k ∈ R d ∣ k ∈ N , 1 ≤ k ≤ m } \mathbf{P}_i = \{\mathbf{p}_i^k \in \mathbb{R}^d \mid k \in \mathbb{N}, 1 \leq k \leq m\} Pi={pikRdkN,1km}

深层提示的 ViT 可以表示为:

[ x i , _ , E i ] = L i ( [ x i − 1 , P i − 1 , E i − 1 ] ) i = 1 , 2 , … , N [\mathbf{x}_i, \_, \mathbf{E}_i] = \textcolor{blue}{L_i}([\mathbf{x}_{i-1}, \textcolor{red}{\mathbf{P}_{i-1}}, \mathbf{E}_{i-1}]) \quad i = 1, 2, \ldots, N [xi,_,Ei]=Li([xi1,Pi1,Ei1])i=1,2,,N

y = Head ( x N ) \mathbf{y} = \textcolor{red}{\text{Head}}(\mathbf{x}_N) y=Head(xN)

其中 x i \mathbf{x}_i xi 表示第 i i i-个Transformer层的输入, P i \mathbf{P}_i Pi 表示第 i i i-个Transformer层的可学习提示, E i \mathbf{E}_i Ei 表示第 i i i-个Transformer层的嵌入。

Storing Visual Prompts

VPT 在存在多个下游任务时是有益的。

我们只需要为每个任务存储学习到的提示和分类头,并重用预训练Transformer模型的原始副本,从而显著降低存储成本。

例如,给定一个具有8600万个参数(M)和 d = 768 d = 768 d=768 的 ViT-Base,50个浅层提示和深层提示分别产生额外的 p × d = 50 × 768 = 0.038 p \times d = 50 \times 768 = 0.038 p×d=50×768=0.038 M 参数和 N × p × d = 0.46 N \times p \times d = 0.46 N×p×d=0.46 M 参数,分别占所有 ViT-Base 参数的0.04%和0.53%。

实验

主实验

ViT-B/16 pre-trained on supervised ImageNet-21k

Performance comparison on different downstream data scales, averaged across 5 FGVC tasks

VPT vs. Full across model scales (ViT-B, ViT-L and ViT-H), for 3 VTAB task groups

Different Transformer architecture: Swin-B pre-trained on supervised ImageNet-21k as backbone

消融实验

Ablation on <a class=prompt location" />

Ablation on <a class=prompt length" />

Ablation on <a class=prompt depth" />

Ablation on final output

Analysis and Discussion

Visualization

t-SNE visualizations of the final [CLS] embedding xN of 3 VTAB tasks from the test set, from Tab. 1

Apply VPT to more vision tasks

Semantic Segmentation: ADE20k [90] validation results with SETR [89] on ViT-L

Apply VPT to more pre-training methods

Different pre-trained objectives: MAE [30] and MoCo v3 [11] with a ViT-B backbone

Apply VPT to ConvNets

Apply VPT to ConvNets: ResNet-50 and ConvNeXt-Base

总结

我们提出了一种名为视觉提示微调(Visual Prompt Tuning)的新参数高效方法,旨在利用大型视觉Transformer模型完成各种下游任务。

VPT在输入空间中引入了特定任务的可学习提示,同时保持预训练骨干网络不变。

我们表明,VPT在大幅降低存储成本的同时,可以超越其他微调协议(通常包括全量微调)。

我们的实验还提出了关于具有不同预训练目标的视觉Transformer微调动态的有趣问题,以及如何以高效的方式将其迁移到更广泛的视觉识别任务。

因此,我们希望我们的工作能够激发未来关于如何最大限度地发挥大型基础模型在视觉领域潜力的研究。


http://www.ppmy.cn/news/1555702.html

相关文章

python制造一个报错

在Python中&#xff0c;制造一个报错&#xff08;异常&#xff09;可以通过多种方式实现。最常见的方法之一是直接引发一个异常。以下是一些例子&#xff0c;展示了如何制造不同类型的报错&#xff1a; 引发ValueError异常&#xff1a; try:# 制造一个 ValueError 异常raise Va…

Vue3之TypeScript的支持

随着前端技术的飞速发展&#xff0c;Vue 3与TypeScript的组合已成为许多开发者的首选技术栈。Vue 3作为Vue.js的最新版本&#xff0c;引入了众多革新性的功能和优化&#xff0c;而TypeScript作为一种强大的静态类型检查语言&#xff0c;其严谨的类型系统和智能代码提示极大地增…

动态规划part03

文章参考来源代码随想录 题目参考来源leetcode 01背包问题 二维&#xff1a; 背包问题&#xff1a; 动规五部曲&#xff1a; 1.确定dp数组以及下标的含义&#xff1a; 其实这里由题目要我们求的就可以推出来了 把下标为0-i的物品装入容量为j的背包最大价值为dp[i][j]。 …

Mac/Windows端长期破解myBase8方法(无需安装火绒)

提醒 不管哪个端&#xff0c;都需要先退出myBase。 Mac 进入用户根目录/Users/c0ny100&#xff0c;即下边是Macintosh HD > 用户 > [你的用户名]这个界面然后按ShiftCommond.&#xff0c;显示隐藏文件。找到.Mybase8.ini文件 打开.Mybase8.ini文件&#xff0c;删除Fir…

机器学习—大语言模型:推动AI新时代的引擎

云边有个稻草人-CSDN博客 目录 引言 一、大语言模型的基本原理 1. 什么是大语言模型&#xff1f; 2. Transformer 架构 3. 模型训练 二、大语言模型的应用场景 1. 文本生成 2. 问答系统 3. 编码助手 4. 多语言翻译 三、大语言模型的最新进展 1. GPT-4 2. 开源模型 …

基于python的一个简单的压力测试(DDoS)脚本

DDoS测试脚本 声明&#xff1a;本文所涉及代码仅供学习使用&#xff0c;任何人利用此造成的一切后果与本人无关 源码 import requests import threading# 目标URL target_url "http://47.121.xxx.xxx/"# 发送请求的函数 def send_request():while True:try:respo…

Reactor 响应式编程(第一篇:Reactor核心)

系列文章目录 Reactor 响应式编程&#xff08;第一篇&#xff1a;Reactor核心&#xff09; Reactor 响应式编程&#xff08;第二篇&#xff1a;Spring Webflux&#xff09; Reactor 响应式编程&#xff08;第三篇&#xff1a;R2DBC&#xff09; Reactor 响应式编程&#xff08…

FPGA 17 ,FPGA 与 SR-IOV虚拟化技术,高性能计算与虚拟化技术的结合(FPGA 与 SR-IOV 和 PCI,高性能计算与虚拟化的完美融合)

目录 前言 一. SR-IOV 的起源与发展 1. SR-IOV 的起源与时间线 2. SR-IOV 的诞生原因 3. SR-IOV 的详细介绍 二. SR-IOV 和 PCI 之间的关系 三. PCI 的起源与演进 1. PCI 的起源与时间线 2. PCI 的关键特性 四. FPGA 的独特魅力 1. FPGA 的定义与特性 2. FPGA 的内…