原文链接:http://arxiv.org/abs/2404.02948
ABSTRACT
随着大型语言模型 (LLMs) 参数的增加, 整个模型的微调计算成本变得不可承受。为解决这一挑战, 我们提出了一种参数效率微调 (PEFT) 方法, Principal Singular values and Singular vectors Adaptation (PiSSA), 它在优化显著减少的参数空间的同时, 达到或超过全参数微调的性能。PiSSA的灵感来源于Intrinsic SAID, 它表明预训练的过度参数化模型处于低内在维度的空间中。因此,PiSSA通过两个可训练矩阵
A
∈
R
m
×
r
A {\in} {\mathbb{R}}^{m {\times} r}
A∈Rm×r 和
B
∈
R
r
×
n
B {\in} {\mathbb{R}}^{r {\times} n}
B∈Rr×n (其中
r
≪
min
(
m
,
n
)
r {\ll} \min(m,n)
r≪min(m,n) ) 的乘积来表示模型中的矩阵
W
∈
R
m
×
n
W {\in} {\mathbb{R}}^{m {\times} n}
W∈Rm×n ,并加上一个用于错误校正的残差矩阵
W
res
∈
R
m
×
n
W^{\text{res }} {\in} {\mathbb{R}}^{m {\times} n}
Wres ∈Rm×n 。使用奇异值分解 (SVD) 对
W
W
W 进行因子分解,然后使用
W
W
W 的主奇异值和向量初始化
A
A
A 和
B
B
B 。残差奇异值和向量初始化残差矩阵
W
r
e
s
W^{res}
Wres ,并在微调过程中保持冻结。值得注意的是, PiSSA与低秩适应 (LoRA) 具有相同的架构, LoRA假设模型参数变化
Δ
W
\Delta W
ΔW 形成一个低秩矩阵。然而,LoRA通过两个矩阵的乘积近似
Δ
W
,
A
\Delta W,A
ΔW,A 使用高斯噪声初始化,
B
B
B 使用零初始化,而PiSSA使用原始矩阵
W
W
W 的主奇异值和向量初始化
A
A
A 和
B
B
B 。由于主奇异值和向量捕捉了低秩矩阵的本质, PiSSA在开始时通过改变关键部分并冻结 “噪声” 部分, 能更好地近似全参数微调的结果。相比之下, LoRA冻结原始矩阵并更新“噪声”。这种区别使得PiSSA比LoRA收玫得更快, 最终性能也更好。在五个常用基准上, PiSSA在除了不同的初始化设置外, 与LoRA使用完全相同的设置时, 在所有基准上都优于LoRA。在GSM8K上, 使用PiSSA微调的Mistral-7B模型达到了
72.86
%
72.86\%
72.86% 的准确率,比LoRA的
67.7
%
67.7\%
67.7% 提高了
5.16
%
5.16\%
5.16% 。由于相同的架构, PiSSA继承了LoRA的许多优点, 如参数效率和对量化兼容性。利用快速的SVD方法, PiSSA的初始化仅需几秒钟, 切换成本几乎可以忽略不计。
1 Introduction
微调大型语言模型 (LLMs) 是一种非常有效的技术, 可以显著提升它们在各种任务中的性能 因(3), 确保模型遵循指令 6.7, 并赋予模型期望的行为, 同时消除不良行为 (8.9)。然而, 对非常大的模型进行微调的过程伴随着高昂的成本。例如, 对具有65亿参数的LLaMA进行常规16位微调, 需要超过780GB的GPU内存 [10], 而训练GPT-3 175亿参数的模型所需的VRAM消耗甚至达到1.2TB [11]。
因此, 为了减少微调所需的参数数量和内存使用, 各种参数效率优化 (PEFT) 方法被提出 (12, 13)。由于能够在不增加推理延迟的情况下保持全量微调的性能, 低秩适应 (LoRA) (II)作为一种流行的PEFT方法应运而生。
LoRA (1) 假设在微调过程中参数矩阵的修改具有低秩特性。如图 所示,对于预训练权重矩阵
W
∈
R
m
×
n
W {\in} {\mathbb{R}}^{m {\times} n}
W∈Rm×n , LoRA使用低秩分解
Δ
W
=
A
B
\Delta W = AB
ΔW=AB 来替换更新,其中
A
∈
R
m
×
r
A {\in} {\mathbb{R}}^{m {\times} r}
A∈Rm×r 和
B
∈
R
r
×
n
B {\in} {\mathbb{R}}^{r {\times} n}
B∈Rr×n ,秩
r
≪
min
(
m
,
n
)
r {\ll} \min(m,n)
r≪min(m,n) 。对于计算 $h = $
W
x
Wx
Wx ,修改后的前向传播计算表达为:
h
=
(
W
+
Δ
W
)
x
=
(
W
+
A
B
)
x
.
h = (W + \Delta W)x = (W + AB)x.
h=(W+ΔW)x=(W+AB)x.
使用随机高斯初始化对矩阵
A
A
A ,并对
B
B
B 使用零初始化,使得训练开始时
A
B
=
0
AB = 0
AB=0 ,从而在初始阶段,插入适应器不会影响模型的输出。LoRA避免了计算原矩阵的梯度或维护优化器状态的需求, 而是优化注入的、显著更小的低秩矩阵。因此, 它可以将可训练参数的数量减少 10,000 倍, GPU内存需求减少3倍。此外, LoRA通常能实现与全参数微调相当或更好的性能, 表明对于下游任务, 调整部分全参数就足够了。
通过整合预训练模型的量化, LoRA还能够将平均内存需求减少16倍 [10]。同时, 适应器仍然可以使用更高的精度权重, 因此量化通常不会降低全精度基模型的性能。
受 Intrinsic SAID理念的启发 [14, 15], 我们的主成分奇异值和向量适应器 (PiSSA) 与LoRA及其后续版本不同,不是专注于近似
Δ
W
\Delta W
ΔW ,而是关注
W
W
W 。与Intrinsic SAID一致,我们假设预训练模型中的矩阵
W
W
W 具有低 (内在) 秩特性。因此,我们对矩阵
W
W
W 应用奇异值分解 (SVD)。根据奇异值的大小,我们将
W
W
W 分为两部分: 主成分矩阵
W
p
r
i
W^{pri}
Wpri 和残差矩阵
W
r
e
s
W^{res}
Wres 。主成分矩阵
W
p
r
i
W^{pri}
Wpri 是低秩的,可以表示为
A
∈
R
m
×
r
A {\in} {\mathbb{R}}^{m {\times} r}
A∈Rm×r 和
B
∈
R
r
×
n
B {\in} {\mathbb{R}}^{r {\times} n}
B∈Rr×n 的乘积,其中
r
≪
min
(
m
,
n
)
r {\ll} \min(m,n)
r≪min(m,n) 。
A
A
A 和
B
B
B 基于主奇异值和向量初始化,并且是可训练的,而
W
res
W^{\text{res }}
Wres 则使用残差奇异值和向量的乘积初始化,并保持冻结。根据方程 (2),在微调初期,
A
B
AB
AB (PiSSA适配器) 与残差模型的结合保留了预训练模型的原始能力:
h
=
W
x
=
(
W
r
e
s
+
W
p
r
i
)
x
=
(
W
r
e
s
+
A
B
)
x
.
h = Wx = \left( W^{res} + W^{pri} \right)x = \left( W^{res} + AB \right)x.
h=Wx=(Wres+Wpri)x=(Wres+AB)x.
与LoRA不同,PiSSA采取了一种更为优化的方法: 它保留了一个相对不重要的部分
(
W
res
)
\left( W^{\text{res }} \right)
(Wres ) ,自始至终保持冻结,而关键部分
(
W
p
r
i
)
\left( W^{pri} \right)
(Wpri) 则从一开始就进行全面可调。这种设计使得PiSSA能够更快、更好地适应训练数据。(
W
r
e
s
W^{res}
Wres : 残差部分,
W
p
r
i
W^{pri}
Wpri : 主要部分)
2 Related Works
大规模语言模型 (LLMs) 的复杂性和计算需求, 对于将其适应特定下游任务带来了显著的挑战。参数高效微调 (PEFT) [12, 13]作为一种有吸引力的解决方案, 通过最小化微调参数和内存需求, 同时实现与全量微调相当的性能。PEFT包括部分微调、软提示微调、非线性适配器微调和线性适配器微调等策略。
部分微调选择模型的特定部分进行微调, 例如偏置和层归一化 16. [17, 或在预训练权重中插入可训练的掩码 18, 19] 和de ta权重 20, 21, 22, 23]。然而, 部分微调的性能可能受限于仅调整部分层的参数。
软提示微调 ([24, 25, 26, 27, 28, 29, 30] 通过在模型的输入或隐藏层中引入可优化的向量, 以最小的结构变化适应特定任务。
非线性适配器微调 ([31, 32, 33, 34, 33, 36, 37, 38, 39] 40]) 通过(非线性)可训练模块的添加, 对模型进行适应。尽管具有适应性, 但软提示微调和非线性适配器微调增加了复杂性和推理成本。
线性适配器微调 ([14, 15, 11, 4]), 特别是LoRA(11)及其衍生方法, 涉及在自注意力和前馈层中添加可训练参数, 然后与原始权重线性结合。微调后, 这些适应性可以重新参数化到标准模型结构中, 因此由于能够保持模型原始架构并实现高效微调, 而广受欢迎。
LoRA 1 假设模型适应过程中的权重调整具有低 “固有秩”。它通过低秩分解学习权重更新, 保持原始结构不变, 证明在参数高效的微调中有效。
LoRA之后, 低秩调整 (42,41,43) 学习模型中每个层所需的LoRA秩大小。LoRA引导的预训练权重更新 (19.05) 使用适配器层的参数更新模型的原始权重, 增强LoRA的表征能力。量化适应 ([10,46,47]) 将量化应用到基础模型上, 进一步减少训练消耗。
与LoRA学习权重更新的低秩近似不同, 我们的PSSA方法创新性地利用预训练权重的低固有维度。它使用模型权重的主奇异值和向量初始化可更新的适配器层, 保持核心能力的同时实现有效微调。尽管在理念上与LoRA不同, 但这种方法在结构上与LoRA相似, 并且可以与低秩调整等方法结合, 以提高微调效率。
3 Method
本节介绍我们的主成分奇异值和向量自适应方法 (PiSSA), 如图 所示。基于内在SAID的洞察(14, 15, 预训练模型具有低的内在维度, PiSSA计算自注意力和多层感知器 (MLP) 层中矩阵W的奇异值分解 (SVD)。一个
m
×
n
m {\times} n
m×n 矩阵
W
W
W 的经济大小
S
V
D
\mathrm{SVD}
SVD 可以表示为
W
=
U
diag
(
S
)
V
T
W = U\operatorname{diag}(S)V^{T}
W=Udiag(S)VT ,其中
U
∈
R
m
×
min
(
m
,
n
)
,
V
∈
R
n
×
min
(
m
,
n
)
U {\in} {\mathbb{R}}^{m {\times} \min(m,n)},V {\in} {\mathbb{R}}^{n {\times} \min(m,n)}
U∈Rm×min(m,n),V∈Rn×min(m,n) 是具有正交列的奇异向量,
S
∈
R
>
0
min
(
m
,
n
)
S {\in} {\mathbb{R}}_{> 0}^{\min(m,n)}
S∈R>0min(m,n) 包含按降序排列的奇异值。操作
diag
(
S
)
\operatorname{diag}(S)
diag(S) 将
S
S
S 转换为对角矩阵,
V
T
V^{T}
VT 是
V
V
V 的转置。当前
r
r
r 个奇异值
S
[
:
r
]
S_{\lbrack : r\rbrack}
S[:r] 远大于剩余的奇异值
S
[
r
:
:
]
S_{\lbrack r : : \rbrack}
S[r::] 时,我们称
W
W
W 的内在秩为
r
r
r 。因此,
S
、
U
S{、}U
S、U 和
V
V
V 可以分为两组: 主成分奇异值和向量
{
U
[
x
]
,
S
[
x
r
]
,
V
[
x
]
}
\left\{U_{\lbrack x\rbrack},S_{\lbrack xr\rbrack},V_{\lbrack x\rbrack} \right\}
{U[x],S[xr],V[x]} ,以及残余奇异值和向量
{
U
[
r
]
,
S
[
r
:
:
]
,
V
[
r
:
]
}
\left\{U_{\lbrack r\rbrack},S_{\lbrack r : : \rbrack},V_{\lbrack r : \rbrack} \right\}
{U[r],S[r::],V[r:]} ,其中
X
[
r
:
]
X_{\lbrack r : \rbrack}
X[r:] 表示矩阵
X
X
X 的前
r
r
r 列。主成分奇异值和向量用于初始化注入的适配器,它由
A
∈
R
m
×
r
A {\in} {\mathbb{R}}^{m {\times} r}
A∈Rm×r 和
B
∈
R
r
×
n
B {\in} {\mathbb{R}}^{r {\times} n}
B∈Rr×n 组成。
A
=
U
[
:
r
]
diag
(
S
[
:
r
]
1
/
2
)
∈
R
m
×
r
,
A = U_{\lbrack : r\rbrack}\operatorname{diag}\left( S_{\lbrack : r\rbrack}^{1/2} \right) {\in} {\mathbb{R}}^{m {\times} r},
A=U[:r]diag(S[:r]1/2)∈Rm×r,
B
=
diag
(
S
[
:
r
]
1
/
2
)
V
[
:
r
]
T
∈
R
r
×
n
.
B = \operatorname{diag}\left( S_{\lbrack : r\rbrack}^{1/2} \right)V_{\lbrack : r\rbrack}^{T} {\in} {\mathbb{R}}^{r {\times} n}.
B=diag(S[:r]1/2)V[:r]T∈Rr×n.
残余奇异值和向量被用来构建残差矩阵: (residual singular values and vectors)
W
r
e
s
=
U
[
r
:
]
diag
(
S
[
r
:
]
)
V
[
r
:
]
T
∈
R
m
×
n
.
W^{res} = U_{\lbrack r : \rbrack}\operatorname{diag}\left( S_{\lbrack r : \rbrack} \right)V_{\lbrack r : \rbrack}^{T} {\in} {\mathbb{R}}^{m {\times} n}.
Wres=U[r:]diag(S[r:])V[r:]T∈Rm×n.
给定
W
=
W
r
e
s
+
A
B
W = W^{res} + AB
W=Wres+AB ,在训练初期引入PiSSA 并不会削弱模型的能力。由于
S
[
r
:
:
]
≈
0
S_{\lbrack r : : \rbrack} {\approx} 0
S[r::]≈0 ,这使得
W
r
e
s
≈
0
W^{res} {\approx} 0
Wres≈0 且
W
≈
A
B
W {\approx} AB
W≈AB ,所以
adapter
A
B
\operatorname{adapter}AB
adapterAB 包含了预训练模型的主要功能。然后,对
A
B
AB
AB 的微调模拟了整个模型的微调过程,尽管使用了更少的参数。相比之下, LoRA 使用高斯噪声和零初始化adapter,导致在微调初期,
W
W
W 的主要部分不可更新, 可能造成大量梯度下降步骤的浪费。此外, 较差的初始化可能导致找到次优的局部最小值, 从而影响泛化性能。
PiSSA 与LoRA 具有相同的架构, 因此继承了LoRA 的大部分优点, 包括使用较少可训练参数进行模型微调的能力、通过量化残差模型减少训练时的内存消耗以及易于部署。adapter 的简单线性结构使得在部署时可以轻松地将可训练矩阵与预训练权重结合, 保持了完全微调模型的原始推理速度。为了存储效率, 可以选择不存储密集参数矩阵
Δ
W
\Delta W
ΔW ,而是存储低秩矩阵
{
A
,
B
}
\{A,B\}
{A,B} 。
当我们需要使用微调的PiSSA时, 类似初始化的过程, 首先对基础模型进行奇异值分解 (这在我们的实验中非常快速),然后将
{
A
,
B
}
\{A,B\}
{A,B} 分配给adapter。最后,一个预训练模型可以适应多个
{
A
,
B
}
\{A,B\}
{A,B} ,这些是通过不同的PiSSA 微调过程得到的, 这使得预训练模型能够快速适应不同的下游应用。
4 Experiments
我们在LLaMA 2-7B (48)、Mistral-7B-v0.1 (49) 和Gemma-7B [50] 上进行了PiSSA、LoRA和全参数微调的对比实验。这些比较涵盖了广泛的任务, 包括数学 (2.5152)、编程 (4.53.54.55) 和指令调优 (5.7.6)。结果表明, 以主奇异值和向量初始化的微调器 (PiSSA) 优于使用中间或次要参数初始化的。这证明了直接针对模型的主要成分进行微调可以带来更好的结果 (第4.1节)。 PiSSA在下游任务中表现出色 (第4.3节)。接着, 我们在不同秩上进行实验, 发现PiSSA的收敛速度更快, 与训练数据的契合度更高, 即使在相同的可训练参数配置下也显示出稳健的优势 (第 12 节)。最后, 我们通过后续实验验证, Fast SVD [56]技术有助于我们的PiSSA在初始化速度和性能之间取得平衡 (第4.4节)。
在实验中, 我们采用了 Alpaca [57]的实现策略, 使用AdamW优化器, 批量大小为 128, 学习率为 2e-5, 采用余弦退火调度, warmup比例为 0.03 , 不使用权重衰减。我们采用bf16计算类型, 始终保持lora_alpha等于lora_r, 设置 lora_dropout为 0 , 并将适配器整合到基模型的所有线性层中。我们仅在数据集的前100,000次转换上训练一个epoch, 仅使用转换的响应计算损失。本节实验在NVIDIA A800-SXM4(80G) GPU上进行。
4.1 Verifying the importance of principal singular values and vectors
为了研究不同规模的奇异值和向量对微调性能的影响, 我们使用主奇异值和向量 (principal singular values and vectors)、中等奇异值和向量 (medium singular values and vectors) 以及小规模奇异值和向量 (minor singu-lar values and vectors) 初始化注入到LLaMA 2-7B、Mistral-7B-v0.1和Gemma-7B的适配器。然后, 这些模型在MetaMathQA数据集 [2]上进行微调, 并在GSMSK [5] 和MATH数据集 [52]上进行评估, 结果如图2所示。结果表明, 使用主奇异值和向量初始化适应器始终能够降低训练损失并提高GSM8K和MATH验证集上的准确性。这强调了我们的策略在根据主奇异值调整模型参数方面的有效性。
4.2 Evaluating PiSSA and LoRA Performance Across Diverse Ranks
本节探讨了逐步增加PISSA和LoRA的秩 (rank) 从 1到128对性能的影响, 目标是确定实现与全参数训练相当性能所需的最优可训练参数数量。实验使用MetaMathQA数据集进行训练, 验证则在GSM8K和MATH数据集上进行。实验结果如图 3所示, 更多结果在附录的图4中提供。
从图 3 中可以看出, 训练初期, PISSA迅速开始收玫, 而LoRA经历了一个损失不仅没有下降, 甚至略有增加的阶段。而且, 整个训练过程中, PiSSA的损失始终低于LoRA。
图 35 展示了使用不同秩 (1到128) 训练的模型在训练集上的最终损失。数据显示, 与LoRA相比, PiSSA在使用更少可训练参数的情况下, 达到了与全参数微调相当的训练集拟合水平。
在图 3 (8) 和 , 我们比较了不同秩下微调模型在GSM8K和MATH验证集上的性能, 发现PSSA在相同可训练参数数量下优于
L
o
R
A
n
{\mathrm{LoRA}}_{n}
LoRAn 随着秩的增加,PISSA迅速达到并超越全参数微调的性能。值得注意的是,当LLaMA 2-7B的秩为 128, 其训练损失等于全参数微调时, PISSA在下游任务的泛化能力上已经超过了全参数微调。这验证了我们使用主奇异值和向量替换全参数模型微调, 忽略低秩成分的方法, 从而得到了更具有鲁棒性的模型。
4.3 Comparative Analysis of PiSSA, LoRA, and Full Fine-Tuning Across Various Tasks
表 对比展示了使用PiSSA、LoRA和全参数微调策略的模型性能。在这些实验中, 我们针对MetaMathQA数据集上的2-7B参数的LLaMA、Mistral-7B-v0.1和Gemma-7B进行了微调, 以评估它们在GSM8K [5] 和MATH[2]验证集上的数学问题解决能力。同时, 模型也在CodeFeedback数据集[53]上进行微调, 并通过HumanEval 54]和MBPP[55]数据集来评估它们的编程能力。此外, 模型在WizardLM-Evol-Instruct数据集 7 上进行训练, 然后在MT-Bench数据集[6] 上测试它们的对话能力。
如表 所示, 对于所有模型和任务, 使用 PISSA 进行微调的效果优于使用 LoRA 的微调, 以及大多数的完全微调。未来, 我们计划将比较范围扩展到更多的模型和任务上。
4.4 Fast Singular Value Decomposition
为了加速预训练矩阵
W
W
W 的分解,我们采用了
H
a
l
k
o
\mathrm{Halko}
Halko 等人提出的算法 [56] (称为快速
S
V
D
\mathrm{SVD}
SVD ),该算法引入随机性实现近似矩阵分解。我们在表 2 中比较了 SVD和Fast SVD的初始化时间、误差和训练损失。
初始化时间指的是分解预训练参数矩阵
W
W
W 所需的计算时间,以秒为单位。初始化误差表示Fast SVD与SVD分解矩阵后引入的差异的大小。具体来说, 误差是原始SVD和Fast SVD分解的矩阵之间绝对差值的和。表中报告了自注意力模块的误差。
损失指的是训练结束时的损失值。在Fast SVD中, 参数niter表示进行子空间迭代的次数, 更大的niter会导致分解时间增加,但误差更小。符号
∞
{\infty}
∞ 代表使用SVD方法的实验结果。
可以观察到, SVD的计算时间是Fast SVD的数十倍。此外, 随着秩的增加, SVD的计算时间保持较高且变化不大, 而Fast SVD的计算时间随着秩的提高略有增加, 但始终远低于SVD。随着秩的增加, 初始化误差最初逐渐上升, 当秩达到 128 时, 误差略有下降。在同一秩下, 增加Fast SVD的niter会导致误差逐渐减小。
对于训练损失, 我们发现随着秩的增加, 训练损失逐渐减小。在相同的秩下, 随着niter的增加, 基于Fast SVD初始化的模型的训练损失接近于基于SVD初始化的模型。
5 Conclusion
本论文介绍了一种参数效率高的微调技术 (PEFT), 其中使用奇异值分解应用于预训练模型的权重矩阵, 以提取主成分。这些主成分随后被用于初始化一个名为PiSSA的适配器。对PiSSA进行微调在初期可以近乎
复制完整模型微调的效果, 同时保持良好的参数效率。通过大量实验, 我们发现PISSA的微调性能显著优于LoRA。
PISSA为PEFT研究提供了一个新颖的方向, 它识别并微调模型内的主成分, 类似于切割并重新烘焙比萨饼中最丰富的部分。
由于PiSSA与LoRA共享相同的架构, 它易于使用, 并为提供了一个高效替代的初始化方法。
未来仍需验证以下几点: 1) PisSA能否在更广泛的任务和更大规模的模型上实现显著改进? 2) 当LoRA的迭代步长足够长 (充分适应数据) 时, 它能否达到PiSSA的性能? 3) 将LoRA的后续版本与PiSSA结合是否能带来进一步提升? 4) 如何从理论上解释PiSSA优于LoRA的优势? 我们正在积极研究这些问题。尽管如此, 我们对PiSSA在现有实验中展现出的巨大潜力感到兴奋, 期待社区的更多测试和建议。