🍎个人主页:小嗷犬的个人主页
🍊个人网站:小嗷犬的技术小站
🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。
基本信息
标题: 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获取。
方法
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\} {Ij∈R3×h×w∣j∈N,1≤j≤m}。
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)e0j∈Rd,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={eij∈Rd∣j∈N,1≤j≤m},作为输入到第 ( 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([xi−1,Ei−1])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 xi∈Rd 表示 [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所示。
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={pk∈Rd∣k∈N,1≤k≤p},浅层提示的 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([xi−1,Zi−1,Ei−1])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} Zi∈Rp×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={pik∈Rd∣k∈N,1≤k≤m}。
深层提示的 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([xi−1,Pi−1,Ei−1])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%。
实验
主实验
消融实验
prompt location" />
prompt length" />
prompt depth" />
Analysis and Discussion
Visualization
Apply VPT to more vision tasks
Apply VPT to more pre-training methods
Apply VPT to ConvNets
总结
我们提出了一种名为视觉提示微调(Visual Prompt Tuning)的新参数高效方法,旨在利用大型视觉Transformer模型完成各种下游任务。
VPT在输入空间中引入了特定任务的可学习提示,同时保持预训练骨干网络不变。
我们表明,VPT在大幅降低存储成本的同时,可以超越其他微调协议(通常包括全量微调)。
我们的实验还提出了关于具有不同预训练目标的视觉Transformer微调动态的有趣问题,以及如何以高效的方式将其迁移到更广泛的视觉识别任务。
因此,我们希望我们的工作能够激发未来关于如何最大限度地发挥大型基础模型在视觉领域潜力的研究。