【大模型微调】Lora、Dola和Pissa的实践与优化
Lora、Dola和Pissa模型对比分析
大模型微调
在大规模预训练模型的微调过程中,通常需要更新模型的所有参数。由于大模型的参数数量庞大,这种全参数微调方法带来了以下几个关键挑战:
全参数微调(Full Parameter Fine-Tuning)中,需要对初始权重矩阵 W W W反向传播计算梯度,进行梯度下降(Gradient descent),大规模数据矩阵的梯度计算量极大。因此,处理权重矩阵的方法可以有效提高微调的计算效率。
- 计算资源消耗巨大:全参数微调会对计算能力提出极高要求,尤其是对于GPU和显存资源的需求。
- 存储压力过大:大规模模型微调需要存储大量的梯度和中间计算结果,特别是当模型应用于多任务场景时。
- 效率低下:由于需要更新整个模型的参数,全参数微调在训练速度和部署时的效率较低,尤其是在小数据集或特定任务上微调时,可能存在浪费资源的现象。
为了解决这些挑战,研究者们提出了一些参数高效微调的创新方法,比如Lora、Dola和Pissa,它们能够有效减少需要更新的参数量,在保持模型性能的同时,大幅降低计算和存储开销。
Lora
LoRA (Low-Rank Adaptation of Large Language Models) 是微软研究院提出的一种PEFT(arameter-Efficient Fine-Tuning)方法,专门针对LLM的微调问题。LoRA 的设计目标是在保持模型性能的同时,最大限度地减少微调所需的计算资源和存储空间。
模型原理
LoRA的核心原理是利用低秩矩阵来近似表示预训练模型的权重矩阵增量。具体来说,LoRA将预训练模型的原始权重矩阵冻结,利用两个低秩矩阵的乘积来更新。由于低秩矩阵的秩远小于原始矩阵的秩,因此LoRA 可以显著减少微调参数的数量。 
低秩近似原理
对于预训练权重矩阵 W 0 ∈ R d × d W_0 \in \mathbb{R}^{d \times d} W0∈Rd×d,可以用一个低秩分解来表示参数更新 Δ W \Delta W ΔW,即:
W 0 + Δ W = W 0 + B A W_0 + \Delta W = W_0 + BA W0+ΔW=W0+BA
其中 B ∈ R d × r B \in \mathbb{R}^{d \times r} B∈Rd×r, A ∈ R r × d A \in \mathbb{R}^{r \times d} A∈Rr×d,且 r ≪ d r \ll d r≪d 。
原本一个 d × d d\times d d×d的矩阵降维到了 d × r d\times r d×r,低秩代表着保留了奇异值较大的部分,保留了原有矩阵的主要信息,我们只需对低秩部分反向传播进行梯度下降。此外,矩阵 A A A是服从正态分布的随机矩阵。目标秩取得越大,即保留的信息越多,从而计算量越大。在目标秩大于某个值时,计算量会接近全参数微调。
训练过程中冻结参数 W 0 W_0 W0,仅训练 A A A 和 B B B中的参数。如上图所示,对于 h = W 0 x h = W_0 x h=W0x,前向传播过程变为:
h = W 0 x + Δ W x = W 0 x + B A x h = W_0 x + \Delta W x = W_0 x + BA x h=W0x+ΔWx=W0x+BAx
伪代码
这里给出了部分伪代码,具体可以参考原链接。
# 加载预训练模型
pretrained_model = load_pretrained_model()
# 将 LoRA 应用于模型的线性层
for module in pretrained_model.modules():
if isinstance(module, nn.Linear):
lora_layer = LoRALayer(module.weight.shape, rank=lora_rank)
module.weight = lora_layer
# 定义优化器,只更新 LoRA 层的参数
optimizer = optim.Adam(lora_layer.parameters(), lr=learning_rate)
# 训练模型
# ...
参考链接:https://github.com/microsoft/LoRA
Lora的实际表现
LORA为何有效?
通过大量的对比实验,作者证明了Lora的有效性。作者希望进一步解释这种从下游任务中学到的低秩适应(low-rank adaptation)的特性。为此,作者在原文中提出了三个问题:
Q1:LORA应该作用于Transformer的哪个参数矩阵?
从下图可以看到,将所有微调参数都放到Attention的某一个参数矩阵的效果并不好,将可微调参数平均分配到
W
q
W_q
Wq和
W
k
W_k
Wk的效果最好。即使是秩
r
=
4
r=4
r=4的时候,也可以从
Δ
W
\Delta W
ΔW中获得足够的信息。因此,在实际操作中应当将可微调参数分配到多种类型权重矩阵中,而不应该用更大的秩单独微调某种类型的权重矩阵。

Q2:LORA最优秩为多少?
从文献中的实验结论可以看到,在秩
r
=
1
r=1
r=1或
r
=
2
r=2
r=2的时候,Lora的仍有不错的效果。因此,作者认为更新参数矩阵
Δ
W
\Delta W
ΔW 可能拥有极小的“内在秩”,即极低的目标秩也可以提取到主要的信息。

为了进一步验证内在秩,我们需要计算不同秩
r
r
r对应的子空间之间的重要程度。以
r
=
8
r = 8
r=8和
r
=
64
r = 64
r=64两个秩为例。首先,进行奇异值分解(SVD),分别得到两个左奇异矩阵
U
A
r
=
8
U_{A_{r=8}}
UAr=8和
U
A
r
=
64
U_{A_{r=64}}
UAr=64。进一步,我们希望了解
U
A
r
=
8
U_{A_{r=8}}
UAr=8的 Top-j 奇异向量有多少被包含在
U
A
r
=
64
U_{A_{r=64}}
UAr=64 的 Top-j 个向量中。并且可用格拉姆矩阵来表示这两子空间之间的相似关系:
ϕ
(
A
r
=
8
,
A
r
=
64
,
i
,
j
)
=
∣
∣
U
A
r
=
8
T
V
A
r
=
64
j
∣
∣
2
min
(
i
,
j
)
=
∑
k
min
(
i
,
j
)
Λ
k
2
min
(
i
,
j
)
,
\phi (A_{r=8}, A_{r=64}, i, j) = \frac{|| U^T_{A_{r=8}} V^j_{A_{r=64}} ||^2}{\min(i, j)} = \frac{\sum^{\min(i,j)}_k \Lambda^2_k}{\min(i,j)},
ϕ(Ar=8,Ar=64,i,j)=min(i,j)∣∣UAr=8TVAr=64j∣∣2=min(i,j)∑kmin(i,j)Λk2,
从下图可以看出
r
=
8
r = 8
r=8和
r
=
64
r = 64
r=64中的Top奇异向量重叠得最多(颜色越小表示相似程度越高),这意味着Top奇异向量的作用最大,其他的奇异值可能会引入更多的噪声。这证明了更新参数矩阵
Δ
W
\Delta W
ΔW存在极小的‘内在秩’。

SVD分解中,奇异值矩阵中对角线元素按照奇异值递减排列。Top奇异向量表示了参数矩阵的主要信息部分。内在秩体现了前面部分的top奇异向量可能表示了参数矩阵的80%甚至更多的信息,剩余部分为冗余。
Q3:参数增量
Δ
W
\Delta W
ΔW和
W
W
W的关系?
文中为揭示微调过程的内在原理,作者进行了如下实验:

从上图的对比结果,作者发现三个现象:
- 相比于随机矩阵(Random), Δ W \Delta W ΔW和 W W W有强关联。从表中的 0.32 > > >> >> 0.02 可以看出,
- Δ W \Delta W ΔW仅放大了 W W W中任务相关的特征,并未放大头部特征。由于 F F F-范数的平方等于奇异值和的平方。因此,从表中的 0.32 $<<$21.67 可以看出 Δ W \Delta W ΔW和 W W W的头部奇异向量并无关联。
- 当 r = 4 r=4 r=4时, Δ W \Delta W ΔW 的放大系数已经足够大。计算 6.91 / 0.32 ≈ 21.5 可知 Δ W \Delta W ΔW能将 W W W 中相关的特征向量放大 21.5 倍。
因此,我们可以得到结论。在训练过程中,低秩的适应矩阵 Δ W \Delta W ΔW 仅仅放大了对下游任务有用的特征,而不是预训练模型中的主要特征。
实验结果:
在保持模型性能的前提下, LoRA显著减少了微调所需的参数数量。LoRA在计算效率和存储效率方面表现优异, 使其成为资源受限环境中的理想选择。



LoRA 优势与应用场景
优势:
- 高效性: LoRA 在参数效率方面表现出色,可以显著减少微调参数的数量。
- 易用性: LoRA 易于实现和使用,现有的深度学习框架已经提供了相应的工具和库。
- 可扩展性: LoRA 可以应用于各种规模的预训练模型,包括大型语言模型。
应用场景:
- 大型语言模型微调: LoRA 非常适合对大型语言模型进行微调,例如 GPT-3 和 BERT。
- 多任务学习: LoRA 可以用于多任务学习,每个任务只需要微调少量的参数。
- 模型轻量化: LoRA 可以看作是一种模型轻量化技术,可以减小模型的存储空间和推理时间
Dora
DoRA(Weight-Decomposed Low-Rank Adaptation)的主要思想是将预训练权重分解为幅度(magnitude)和方向(direction),并利用LoRA来微调方向矩阵
W
′
=
m
V
+
Δ
V
∥
V
+
Δ
V
∥
c
=
m
W
0
+
B
A
∥
W
0
+
B
A
∥
c
.
W' = m \frac{V + \Delta V}{\| V + \Delta V \|_c} = m \frac{W_0 + BA}{\| W_0 + BA \|_c}.
W′=m∥V+ΔV∥cV+ΔV=m∥W0+BA∥cW0+BA.

如下图所示,LoRA通常会等比例增减幅度和方向,DoRA通过将预训练权重矩阵分解为幅度和方向,能够更接近全量微调的效果。

使用比LoRA更少的参数,表现效果反而更好。

使用较小的
r
r
r,准确率要高出Lora很多,这意味着其内在秩所包含的信息更多。

PISSA
随着大模型的参数量日益增长,微调整个模型的开销逐渐变得难以接受。为此,北京大学的研究团队提出了一种名为 PiSSA的参数高效微调方法,在主流数据集上都超过了目前广泛使用的 LoRA 的微调效果。
PiSSA 在模型架构上和 LoRA完全一致 ,只是初始化 Adapter 的方式不同。LoRA 使用高斯噪声初始化
A
A
A,使用 0 初始化
B
B
B;而 PiSSA 使用主奇异值和奇异向量 (Principal Singular values and Singular vectors) 来初始化 Adapter ,即矩阵
A
A
A 和
B
B
B。 
从图中可以看出,PiSSA的优势在于,初始化增量矩阵的时候对原始权重矩阵 W W W进行了截断的SVD(TSVD)。将截断后的矩阵代替原本随机初始化的矩阵 A A A和 B B B。从而在不增加计算量的情况下,获取到了原始权重矩阵的信息。
受到 Intrinsic SAID “预训练大模型参数具有低秩性”的启发,PiSSA 对预训练模型的参数矩阵
W
∈
R
m
×
n
W \in \mathbb{R}^{m \times n}
W∈Rm×n进行奇异值分解。其中前
r
r
r个奇异值和奇异向量用来初始化适配器 (adapter) 的两个矩阵
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
e
s
∈
R
m
×
n
W^{res} \in \mathbb{R}^{m \times n}
Wres∈Rm×n,获得
W
=
A
B
+
W
r
e
s
W = AB + W^{res}
W=AB+Wres
因此,适配器中的参数包含了模型的核心参数,而残差矩阵中的参数是修正参数。通过微调参数量较小的核心适配器
A
,
B
A, B
A,B,冻结参数量较大的残差矩阵
W
r
e
s
W^{res}
Wres,就达成了用很少的参数近似全参数微调的效果。Lora 认为大模型微调后的矩阵的变化
Δ
W
\Delta W
ΔW 具有很低的本征秩。因此,通过
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 相乘得到低秩矩阵来描述大模型中矩阵的变化
Δ
W
\Delta W
ΔW。初始化阶段,Lora 使用高斯噪声初始化
A
A
A,
B
B
B,因此
Δ
W
=
A
B
=
0
\Delta W = AB = 0
ΔW=AB=0
以保证模型初始的输出没有变化,并微调
A
A
A和
B
B
B实现对
W
W
W进行更新。与此相对,PiSSA 不关心
W
W
W 而是认为
W
W
W 具有很低的本征秩。因此,直接对
W
W
W进行SVD
W
=
A
B
+
W
r
e
s
W = AB + W^{res}
W=AB+Wres
其中,
W
r
e
s
W^{res}
Wres 表示残余量。假设
V
V
V的奇异值分解为
W
=
U
D
i
a
g
(
S
)
V
T
W = U Diag(S) V^T
W=UDiag(S)VT,
A
,
B
A, B
A,B使用 SVD 分解后奇异值大的
r
r
r 个奇异值,奇异向量进行初始化。
A
=
U
[
:
,
:
r
]
d
i
a
g
(
S
[
:
r
]
2
)
−
1
2
∈
R
m
×
r
,
A = U_{[:, :r]} \, diag(S_{[:r]}^2)^{-\frac{1}{2}} \in \mathbb{R}^{m \times r},
A=U[:,:r]diag(S[:r]2)−21∈Rm×r,
B
=
d
i
a
g
(
S
[
:
r
]
2
)
−
1
2
V
[
:
,
:
r
]
T
∈
R
r
×
n
,
B = diag(S_{[:r]}^2)^{-\frac{1}{2}} V_{[:, :r]}^T \in \mathbb{R}^{r \times n},
B=diag(S[:r]2)−21V[:,:r]T∈Rr×n,
残差矩阵使用其余的奇异值、奇异向量进行初始化:
W
r
e
s
=
U
[
:
,
r
:
]
d
i
a
g
(
S
[
r
:
]
)
V
[
:
,
r
:
]
T
∈
R
m
×
n
,
W^{res} = U_{[:, r:]} \, diag(S_{[r:]}) V_{[:, r:]}^T \in \mathbb{R}^{m \times n},
Wres=U[:,r:]diag(S[r:])V[:,r:]T∈Rm×n,
PiSSA 直接对
W
W
W 的低秩主成分
A
,
B
A, B
A,B 进行微调,冻结次要的修正项。相比 Lora 用高斯噪声以及 0 初始化适配器参数、冻结核心模型参数,PiSSA 收敛更快,效果更好。
参考文献
[1] Hu E J, Shen Y, Wallis P, et al. Lora: Low-rank adaptation of large language models[J]. arXiv preprint arXiv:2106.09685, 2021.
[2] Meng F, Wang Z, Zhang M. Pissa: Principal singular values and singular vectors adaptation of large language models[J]. arXiv preprint arXiv:2404.02948, 2024.
[3] Liu S Y, Wang C Y, Yin H, et al. Dora: Weight-decomposed low-rank adaptation[J]. arXiv preprint arXiv:2402.09353, 2024.
更多推荐
所有评论(0)