大模型微调之LoRA
1 大模型微调的动机
对于在开源大模型的基础上进行修改,创建可自用的大模型用于自定义的对话/翻译/推理/做题等业务,微调都是一个绕不开的研究方向。此外,由于个人的经济能力限制,可具备的计算资源也是有限的,且普通机箱的显卡槽位为1个,通常为单张RTX 4090 (24 GB显存)。而4卡槽/6卡槽工作站的显存可达到96 GB - 288GB (采用单张 24 GB 或 单张 48 GB 的显卡,型号包括90系,或A5000/A6000)。上述配置想开发自己的大模型的周期过长,且取得的效果也是有限的,此外目前开源社区 (huggingface 、魔搭社区 和 GitHub) 中也存在大量的不同规格的开源大模型,如 (LLaMA 系列、通义千问 系列 等) 。以通义千问为例,各尺寸模型的微调所需计算资源如下:
微调方法名称 | 方法类别 | 精度 | 7B | 13B | 30B | 72B | 110B |
---|---|---|---|---|---|---|---|
FULL | 全参数微调 | AMP | 120 GB | 240 GB | 600 GB | 1200 GB | 2000 GB |
FULL | 全参数微调 | 16 bit | 60 GB | 120 GB | 300 GB | 600 GB | 900 GB |
Freeze | 部分参数微调 | 16 bit | 20 GB | 40 GB | 80 GB | 200 GB | 360 GB |
LoRA/GaLore/BAdam | 部分参数微调 | 16 bit | 16 GB | 32 GB | 64 GB | 160 GB | 240 GB |
QLoRA | 部分参数微调 | 8 bit | 16 GB | 32 GB | 64 GB | 160 GB | 240 GB |
QLoRA | 部分参数微调 | 4 bit | 10 GB | 20 GB | 40 GB | 80 GB | 140 GB |
QLoRA | 部分参数微调 | 2 bit | 4 GB | 8 GB | 16 GB | 24 GB | 48 GB |
如上表所示,全参数微调所需的计算资源仍然较大,但低精度微调的准确度又较低,因此选取较中间的部分参数微调方式,如LoRA (16 bit),可一定程度上达到精度与计算资源的平衡。本文就将结合原文介绍部分参数微调领域的经典方法: LoRA。
2 微调方法背景介绍
该论文的原文为:
LoRA: Low-Rank Adaptation of Large Language Models
如论文[1]题目所示,LoRA是 Low-Rank Adaptation 的简写,意为低秩自适应。动机为下列假设:
过参数化模型实际上存在于较低的内生性纬度中,在模型参数微调时,若假设其过参数化模型也存在于较低纬度中,则可通过仅对这些纬度进行微调,已达到可在降低计算量的并通知获取与全参数微调相同甚至更好的效果。
根据论文中的结论,使用LoRA可相对于传统方法提高3倍的训练效率。
3 论文主要内容
3.1 问题叙述
论文提出的方法是一般性的,但为了方便叙述,选定了大模型最常见的语言建模任务作为背景:
给定预训练自回归语言模型 (如 GPT,Qwen 等) P Φ ( y ∣ x ) P_\Phi(y|x) PΦ(y∣x) ,带有可训练参数 Φ \Phi Φ 。该模型中的每个下游任务 (downstream task) 由 Z = { ( x i , y i ) } i = 1 , . . . , N \mathcal{Z}=\{(x_{i},y_{i})\}_{i=1,...,N} Z={(xi,yi)}i=1,...,N 构成的数据集来表征(这里是因为大模型的数据驱动性比较强,基本是通过数据集来驱动新的模型业务),其中 x i x_{i} xi 为输入词元(input token), y i y_{i} yi 为输出词元(output token)。
在全参数微调时,上述模型可被初始化为预训练权重
Φ
0
\Phi_0
Φ0 ,并可通过最大化下列条件性语言模型并被更新为
Φ
0
+
Δ
Φ
\Phi_0+\Delta\Phi
Φ0+ΔΦ
max
Φ
∑
(
x
,
y
)
∈
Z
∑
t
=
1
∣
y
∣
log
(
P
Φ
(
y
t
∣
x
,
y
<
t
)
)
\max_\Phi\sum_{(x,y)\in\mathcal{Z}}\sum_{t=1}^{|y|}\log\left(P_\Phi(y_t|x,y_{<t})\right)
Φmax(x,y)∈Z∑t=1∑∣y∣log(PΦ(yt∣x,y<t))
在上述过程中,全参数微调的缺点就在于,每次在进行微调时,均有更新后的参数量与初始化参数量相同,即
∣
Δ
Φ
∣
=
∣
Φ
0
∣
|\Delta\Phi| = |\Phi_0|
∣ΔΦ∣=∣Φ0∣ ,相当于重新训练了一个参数,这对于一些比较大的模型,如Qwen1.5-110B, 就需要更新其中的全部1100亿个参数。而LoRA的参数微调,则通过对参数更深层次编码,每次微调时仅需要更新
∣
Θ
∣
≪
∣
Φ
0
∣
|\Theta|\ll|\Phi_0|
∣Θ∣≪∣Φ0∣ 个参数即可完成微调,其更新过程可由下式获取
max
Θ
∑
(
x
,
y
)
∈
Z
∑
t
=
1
∣
y
∣
log
(
p
Φ
0
+
Δ
Φ
(
Θ
)
(
y
t
∣
x
,
y
<
t
)
)
\max_{\Theta}\sum_{(x,y)\in\mathcal{Z}}\sum_{t=1}^{|y|}\log\left(p_{\Phi_0+\Delta\Phi(\Theta)}(y_t|x,y_{<t})\right)
Θmax(x,y)∈Z∑t=1∑∣y∣log(pΦ0+ΔΦ(Θ)(yt∣x,y<t))
对于一些较大的模型,如GPT-3 175B,使用LoRA进行参数微调需要更新的参数,甚至仅需全参数微调所需更新参数量的 0.01% 。
综上,全参数微调与LoRA等部分参数微调方法的区别可用下图表述:
微调效果图
给定预训练后的权重矩阵
W
0
∈
R
d
×
k
W_0\in\mathbb{R}^{d\times k}
W0∈Rd×k ,及其全参数微调的结果,
W
0
+
Δ
W
W_0+\Delta W
W0+ΔW 则基于LoRA的部分参数微调方法则主要是通过将微调矩阵通过低秩分解进行简化,即
W
0
+
Δ
W
=
W
0
+
B
A
W_0+\Delta W=W_0+BA
W0+ΔW=W0+BA
其中,
B
∈
R
d
×
r
,
A
∈
R
r
×
k
B \in \mathbb{R}^{d\times r},A \in \mathbb{R}^{r\times k}
B∈Rd×r,A∈Rr×k 且
r
≪
min
(
d
,
k
)
r\ll\min(d,k)
r≪min(d,k) 。在训练过程中,
W
0
W_0
W0 也是固定不变的,且不会受到梯度更新的影响(这也是为什么通过 LLaMA Factory 进行LoRA微调后,需要有merge的这个操作的原因)。则对形如
h
=
W
0
x
h=W_0x
h=W0x 的前向传播过程,有
h
=
W
0
x
+
Δ
W
x
=
W
0
x
+
B
A
x
h=W_0x+\Delta Wx=W_0x+BAx
h=W0x+ΔWx=W0x+BAx
LoRA结构图(LoRA原文中的figure 1)
如图一所示,在进行微调初始化时,通常设置 A A A 的初始值为期望值是0的标准高斯分布, B B B 的初始值为0矩阵,并可立即得到 W 0 = B A W_0=BA W0=BA 的初始也为0。 对 W 0 x W_0x W0x 项的放缩主要通过 α / r \alpha / r α/r 来完成,并有 α \alpha α 为 r r r 中的一个常数。在进行实际运行时,通常取 α = r 0 \alpha = r_0 α=r0 (此处的 r 0 r_0 r0 指的是第一个尝试的秩阶次)以避免超参数的重复调整。
此外, 由于大模型的基底一般是transformer,LoRA论文中关于transformer的应用也有较大的研究价值。根据原文的叙述,LoRA对自注意力模块设定了4个权重矩阵 W q , W k , W v , W o W_q,W_k,W_v,W_o Wq,Wk,Wv,Wo ,分别对应查询、键、值以及输出,对多层感知机(multi-layer perception, MLP)设定了2个权重矩阵。其中,对 W q , W k , W v W_q,W_k,W_v Wq,Wk,Wv 均有尺度为 d m o d e l × d m o d e l d_{model}\times d_{model} dmodel×dmodel 。在进行LoRA微调时,对多层感知机对应的权重进行固定。
3.2 重要实验结果
实验结果中,对不同数据集的结果可参照原文,此处仅关注与LoRA训练过程中的调参相关的消融实验部分。
3.2.1 应该将LoRA应用于哪些参数矩阵?
论文首先固定了参数的数量为 18 M B 18MB 18MB ,即LoRA的秩阶次为8。当应用于单个参数矩阵时,每个参数矩阵的阶次为8;当应用于2个参数矩阵时,每个参数矩阵的阶次为4;当应用于2个参数矩阵时,每个参数矩阵的阶次为2。具体实验结果如下表
消融实验结果1
3.2.2 对LoRA来说最优的阶次是什么?
当阶次较低时,LoRA也可达到较好的实验结果。因此,需要进行低阶次,多参数微调。
消融实验结果2
3 参考文献
[1] Hu, Edward J., et al. “Lora: Low-rank adaptation of large language models.” arXiv preprint arXiv:2106.09685 (2021). [PDF]