AAAI2023| FacT: Factor-Tuning for Lightweight Adaptation on Vision Transformer
- 论文链接:https://arxiv.org/pdf/2212.03145.pdf
- 源码链接:https://github.com/JieShibo/PETL-ViT
简介
近期研究已经探索了将预训练的ViT模型通过调整较少比例的参数自适应并改善存储效率。该方法称为Parameter Efficient Transfer Learning (PETL)。目前PETL方法已经展示了只调整0.5%比例参数,ViT在下游任务中可以获得比完整微调方法更好的性能。
LoRA: Low-Rank Adaptation of Large Language Models还表明,优化密集层的权重增量的低秩分解矩阵是适应大模型的一种有前途的方法。虽然LoRA的矩阵分解显著减少了微调的密集层的存储,但离利用神经网络低秩分解的属性到极致还差的很远。
PETL相关工作
Adapter
典型的方法是瓶颈(bottlenect)模块,包含两个全连接层,权重分别是 W d o w n ∈ R d × h W_{down}\in \mathbb{R}^{d\times h} Wdown∈Rd×h与 W u p ∈ R h × d W_{up}\in \mathbb{R}^{h\times d} Wup∈Rh×d,且满足 h ≪ d h\ll d h≪d。
LoRA
将查询变换
W
q
W_{q}
Wq和值变换
W
v
W_{v}
Wv的增量分解成
A
q
/
v
∈
R
d
×
r
A_{q/v}\in \mathbb{R}^{d\times r}
Aq/v∈Rd×r与
B
q
/
v
∈
R
r
×
d
B_{q/v}\in \mathbb{R}^{r\times d}
Bq/v∈Rr×d,且满足
r
≪
d
r\ll d
r≪d。查询和键计算可以表述为:
Q
/
V
←
X
W
q
/
v
+
s
⋅
X
A
q
/
v
B
q
/
v
Q/V \leftarrow XW_{q/v} + s\cdot XA_{q/v}B_{q/v}
Q/V←XWq/v+s⋅XAq/vBq/v
VPT
Visual Prompt Transformer(VPT)将输入 X X X与可训练的提示 P ∈ R l × d P\in \mathbb{R}^{l\times d} P∈Rl×d在传入Transformer层前合并。
本文方法
张量化ViT
向量化神经网络意味着使用单一向量表示参数。之前视觉模型如ResNet通常使用不同层不同大小的权重。该属性限制了张量化的能力。然而由于ViT模型中Transformer层的一致性,可以使用更简单的方式张量化ViT。
除了块嵌入和分类头模块,ViT模型包括两种模块:多头自注意力(Multi-head self-attention,MHSA)和前向反馈模块(Feed-forward network, FFN)。MHSA模块中,查询键值和输出变换分别参数化为
W
q
W_{q}
Wq,
W
k
W_{k}
Wk,
W
v
W_{v}
Wv,
W
o
∈
R
d
×
d
W_{o} \in R^{d\times d}
Wo∈Rd×d。这些变换划分为
N
h
N_{h}
Nh个头:
{
W
q
i
}
i
=
1
N
h
,
{
W
k
i
}
i
=
1
N
h
,
{
W
v
i
}
i
=
1
N
h
,
{
W
o
i
}
i
=
1
N
h
\{W_{q}^{i}\}_{i=1}^{N_{h}},\{W_{k}^{i}\}_{i=1}^{N_{h}},\{W_{v}^{i}\}_{i=1}^{N_{h}},\{W_{o}^{i}\}_{i=1}^{N_{h}}
{Wqi}i=1Nh,{Wki}i=1Nh,{Wvi}i=1Nh,{Woi}i=1Nh。MHSA可以描述为:
M
H
S
A
(
X
)
=
∑
i
=
1
N
h
s
o
f
t
m
a
x
(
X
W
q
(
i
)
W
k
(
i
)
T
X
T
d
)
X
W
v
(
i
)
W
o
(
i
)
T
MHSA(\mathbf{X}) = \sum_{i=1}^{N_{h}} softmax(\frac{XW_{q}^{(i)}W_{k}^{(i)^{T}}X^{T}}{\sqrt{d}})XW_{v}^{(i)}W_{o}^{(i)^{T}}
MHSA(X)=i=1∑Nhsoftmax(dXWq(i)Wk(i)TXT)XWv(i)Wo(i)T
FFN块包括两个全连接层。忽略偏置参数,FFN可以描述为:
F
F
N
(
X
)
=
G
E
L
U
(
X
W
u
p
)
W
d
o
w
n
FFN(X) = GELU(XW_{up})W_{down}
FFN(X)=GELU(XWup)Wdown
W
u
p
∈
R
d
×
4
d
W_{up}\in \mathbb{R}^{d\times4d}
Wup∈Rd×4d,
W
d
o
w
n
∈
R
4
d
×
d
W_{down}\in \mathbb{R}^{4d\times d}
Wdown∈R4d×d 是两个全连接层的权重。
FFN也可以是作为多头模块。将
W
u
p
W_{up}
Wup和
W
d
o
w
n
W_{down}
Wdown划分为四个大小为
d
×
d
d\times d
d×d的矩阵
{
W
u
p
(
i
)
}
i
=
1
4
\{W_{up}^{(i)}\}_{i=1}^{4}
{Wup(i)}i=14与
{
W
d
o
w
n
(
i
)
}
i
=
1
4
\{W_{down}^{(i)}\}_{i=1}^{4}
{Wdown(i)}i=14。FFN可以重写为:
F
F
N
(
X
)
=
∑
i
=
1
4
G
E
L
U
(
X
W
u
p
(
i
)
)
W
d
o
w
n
(
i
)
FFN(X) = \sum_{i=1}^{4} GELU(XW_{up}^{(i)})W_{down}^{(i)}
FFN(X)=i=1∑4GELU(XWup(i))Wdown(i)
在每一层中,MHSA块有四个
d
×
d
d\times d
d×d矩阵,FFN中存在8个
d
×
d
d\times d
d×d矩阵。假设ViT模型中层数量为
L
L
L,可以将Transformer层所有的权重堆积成为一个
12
L
×
d
×
d
12L\times d\times d
12L×d×d张量。
W
=
{
{
W
q
j
,
W
k
j
,
W
v
j
,
W
o
j
}
∪
{
W
u
p
j
,
(
i
)
}
i
=
1
4
∪
{
W
down
j
,
(
i
)
}
i
=
1
4
}
j
=
1
L
∈
R
12
L
×
d
×
d
\begin{array}{r} \mathcal{W}=\left\{\left\{\boldsymbol{W}_{q}^{j}, \boldsymbol{W}_{k}^{j}, \boldsymbol{W}_{v}^{j}, \boldsymbol{W}_{o}^{j}\right\} \cup\left\{\boldsymbol{W}_{u p}^{j,(i)}\right\}_{i=1}^{4} \cup\right. \\ \left.\left\{\boldsymbol{W}_{\text {down }}^{j,(i)}\right\}_{i=1}^{4}\right\}_{j=1}^{L} \in \mathbb{R}^{12 L \times d \times d} \end{array}
W={{Wqj,Wkj,Wvj,Woj}∪{Wupj,(i)}i=14∪{Wdown j,(i)}i=14}j=1L∈R12L×d×d
值得注意的,分类头、块嵌入、正则化和所有的偏置参数没有考虑如张量形式,因为他们是稀少且不规则的。本文方法对分类头不张量化,其他模块在微调阶段冻结。
Factor-Tuning
预训练阶段ViT权重定义为
W
0
\mathcal{W}_{0}
W0,微调后ViT权重更新为
W
f
t
\mathcal{W}_{ft}
Wft,定义
Δ
W
=
W
f
t
−
W
0
\Delta\mathcal{W} = \mathcal{W}_{ft} - \mathcal{W}_{0}
ΔW=Wft−W0。微调阶段,梯度可以描述为:
g
W
=
∂
L
(
D
;
W
)
∂
W
g_{\mathcal{W}} = \frac{\partial \mathcal{L}(\mathcal{D};\mathcal{W})}{\partial \mathcal{W}}
gW=∂W∂L(D;W)
另一种形式:
g
W
=
∂
L
(
D
;
W
0
+
Δ
W
)
∂
W
g_{\mathcal{W}} = \frac{\partial \mathcal{L}(\mathcal{D};\mathcal{W}_{0}+\Delta\mathcal{W})}{\partial \mathcal{W}}
gW=∂W∂L(D;W0+ΔW)。
传统的全微调方法需要更新ViT内所有参数,这意味着需要存储至少 Δ W \Delta W ΔW或 W f t W_{ft} Wft的参数,每个任务需要复杂度为 O ( L d 2 ) \mathcal{O}(Ld^{2}) O(Ld2)。
由于 Δ W \Delta W ΔW矩阵的冗余性,可以通过很多方式提升存储效率。这里考虑多种形式:
Matrix-Batch形式
此方法类似LoRA方法中使用的形式。将
Δ
W
\Delta \mathcal{W}
ΔW第一个维度视作为batch维度,独立分解batch每一个维度的
d
×
d
d\times d
d×d。正式地,
Δ
W
\Delta\mathcal{W}
ΔW分解为
U
∈
R
12
L
×
d
×
r
U \in \mathbb{R}^{12L\times d\times r}
U∈R12L×d×r和
V
∈
R
12
L
×
r
×
d
V\in \mathbb{R}^{12L\times r\times d}
V∈R12L×r×d:
Δ
W
i
,
:
,
:
=
s
⋅
U
i
,
:
,
:
V
i
,
:
,
:
\Delta \mathcal{W}_{i,:,:} = s\cdot U_{i,:,:}V_{i,:,:}
ΔWi,:,:=s⋅Ui,:,:Vi,:,:
LoRA方法的存储复杂度为
O
(
L
d
r
)
\mathcal{O}(Ldr)
O(Ldr),且
r
≪
d
r\ll d
r≪d。
Tensor-Train形式
Δ
W
\Delta \mathcal{W}
ΔW分解为
U
∈
R
d
×
r
1
U\in \mathbb{R}^{d\times r_{1}}
U∈Rd×r1,
V
∈
R
d
×
r
2
V\in \mathbb{R}^{d\times r_{2}}
V∈Rd×r2,
Σ
∈
R
12
L
×
r
1
×
r
2
\Sigma \in \mathbb{R}^{12L\times r_{1}\times r_{2}}
Σ∈R12L×r1×r2:
Δ
W
=
s
⋅
Σ
×
2
U
⊤
×
3
V
⊤
\Delta \mathcal{W}=s \cdot \boldsymbol{\Sigma} \times_{2} \boldsymbol{U}^{\top} \times_{3} \boldsymbol{V}^{\top}
ΔW=s⋅Σ×2U⊤×3V⊤
×
i
\times_{i}
×i是模式-i乘积:
Δ
W
=
s
⋅
∑
t
1
=
1
r
1
∑
t
2
=
1
r
2
Σ
i
,
t
1
,
t
2
U
j
,
t
1
V
k
,
t
2
\Delta \mathcal{W} = s\cdot \sum_{t_{1}=1}^{r_{1}}\sum_{t_{2}=1}^{r_{2}}\Sigma_{i,t_{1},t_{2}}U_{j,t_{1}}V_{k,t_{2}}
ΔW=s⋅t1=1∑r1t2=1∑r2Σi,t1,t2Uj,t1Vk,t2
简洁起见,设置
r
=
r
1
=
r
2
≪
d
r=r_{1}=r_{2}\ll d
r=r1=r2≪d。存储大小:
2
d
r
+
12
L
r
2
∼
O
(
d
r
+
L
r
2
)
2dr+12Lr^{2}\sim{\mathcal{O}(dr+Lr^{2}})
2dr+12Lr2∼O(dr+Lr2)。
Tucker形式
Δ
W
\Delta \mathcal{W}
ΔW分解为
U
∈
R
d
×
r
2
U\in \mathbb{R}^{d\times r_{2}}
U∈Rd×r2,
V
∈
R
d
×
r
3
V\in \mathbb{R}^{d\times r_{3}}
V∈Rd×r3,
P
∈
R
12
L
×
r
1
P\in \mathbb{R}^{12L\times r_{1}}
P∈R12L×r1。
Δ
W
=
s
⋅
C
×
1
P
T
×
2
U
T
×
3
V
T
\Delta \mathcal{W} = s\cdot C\times_{1}P^{T}\times_{2} U^{T}\times_{3} V^{T}
ΔW=s⋅C×1PT×2UT×3VT
且满足:
Δ
W
i
,
j
,
k
=
s
⋅
∑
t
1
=
1
r
1
∑
t
2
=
1
r
2
∑
t
3
=
1
r
3
C
t
1
,
t
2
,
t
3
P
i
,
t
1
U
j
,
t
2
V
k
,
t
3
\Delta \mathcal{W}_{i,j,k} = s\cdot \sum_{t_{1}=1}^{r_{1}}\sum_{t_{2}=1}^{r_{2}}\sum_{t_{3}=1}^{r_{3}}C_{t_{1},t_{2},t_{3}}P_{i,t_{1}}U_{j,t_{2}}V_{k,t_{3}}
ΔWi,j,k=s⋅t1=1∑r1t2=1∑r2t3=1∑r3Ct1,t2,t3Pi,t1Uj,t2Vk,t3
简洁起见,设置
r
=
r
1
=
r
2
=
r
3
≪
d
r=r_{1}=r_{2}=r_{3}\ll d
r=r1=r2=r3≪d。存储大小:
2
d
r
+
12
L
r
+
r
3
∼
O
(
d
r
+
L
r
+
r
3
)
2dr+12Lr+r^{3}\sim{\mathcal{O}(dr+Lr+r^{3})}
2dr+12Lr+r3∼O(dr+Lr+r3)。
这里使用分解后训练的范式。微调钱分解 Δ W \Delta \mathcal{W} ΔW,在微调期间更新因子。
在后两种形式中,因子
V
V
V初始化为0,另外两个因子随机初始化使
Δ
W
\Delta \mathcal{W}
ΔW随机初始化为0张量。分解后端到端优化因子。以Tensor-Train形式为例,
U
U
U的梯度可以表示为:
g
U
=
∂
L
(
D
;
W
0
+
Δ
W
)
∂
U
=
s
⋅
g
W
∂
Σ
×
2
U
T
×
3
V
t
∂
U
g_{U} = \frac{\partial \mathcal{L}(\mathcal{D};\mathcal{W_{0}}+\Delta \mathcal{W})}{\partial U} = s\cdot g_{\mathcal{W}}\frac{\partial \Sigma\times_{2}U^{T}\times_{3}V^{t}}{\partial U}
gU=∂U∂L(D;W0+ΔW)=s⋅gW∂U∂Σ×2UT×3Vt