目录
- 4.4 低秩适配方法
- 4.4.1 LoRA
- 1)方法实现
- 2)参数效率
- 4.4.2 LoRA 变体
- 1)打破低秩瓶颈(例ReLoRA)
- 2)动态秩分配(例AdaLoRA)
- 3)训练过程优化(例DoRA)
- 4.4.3 基于 LoRA 插件的任务泛化
4.4 低秩适配方法
低维固有维度假设表明:过参数化模型的固有维度是很低的;换言之,存在可以与全参数更新媲美的低维的参数更新。低秩适配方法(Lowrank Adaptation Methods)基于此假设,通过低秩矩阵近似原始权重更新矩阵,仅微调低秩矩阵以降低参数量。
下面将介绍经典低秩适配方法LoRA的实现细节与参数效率、其变体以及基于LoRA插件化特性和任务泛化能力。
.
4.4.1 LoRA
低秩适配(Low-rank Adaptation, LoRA) :
-
提出利用低秩矩阵近似参数更新矩阵来实现低秩适配。
-
该方法将参数更新矩阵低秩分解为两个小矩阵。在微调时, 通过微调这两个小矩阵来对大语言模型进行更新,大幅节省了微调时的内存开销。
图 4.8: LoRA 示意图
.
1)方法实现
(1)核心思想
给定一个密集神经网络层,其参数矩阵为 W 0 ∈ R d × k W_0 \in \mathbb{R}^{d \times k} W0∈Rd×k,为适配下游任务,我们通常要学习参数更新矩阵 ∆ W ∈ R d × k ∆W ∈ R^{d×k} ∆W∈Rd×k,对原始参数矩阵进行更新:
W = W 0 + ∆ W W = W_0 + ∆W W=W0+∆W
对全量微调,∆W 是需对该层所有 d × k 个参数计算梯度,这常需要大量 GPU 内存,成本高昂。
为解决这一问题,如图 4.8,LoRA 将 ∆W 分解为两个低参数量的矩阵 B ∈ R d × r B ∈ R^{d×r} B∈Rd×r 和 A ∈ R r × k A ∈ R^{r×k} A∈Rr×k,使得更新过程变为:
W = W 0 + α B A W = W_0 + αBA W=W0+αBA
其中,
-
秩 r ≪ min{d, k},
-
B 和 A 分别用随机高斯分布和零进行初始化,
-
α 是缩放因子,用于控制 LoRA 权重的大小。
在训练过程中,固定预训练模型的参数,仅微 调 B 和 A 的参数。因此,在训练时,LoRA 涉及的更新参数数量为 r × (d + k),远 小于全量微调 d × k。
(2)应用场景
在基于 Transformer 的大语言模型中,密集层主要分为注意力模块的投影层和 FFN 模块的投影层。最初,LoRA 被应用于注意力层的权重矩阵。后续研究表明,将其应用于 FFN 层也能进一步提升模型性能。
(3)LoRA特性
LoRA仅微调低秩参数,参数效率高且不增加推理延迟。其低秩矩阵可扩展为低秩张量或与Kronecker分解结合以进一步提高参数效率。LoRA具有可插拔性,能封装为可共享和重复使用的插件。多个任务的LoRA插件可组合,以实现良好的跨任务泛化性能。
.
2)参数效率
(1)案例:
在 LLaMA2-7B 中微调第一个 FFN 层的权重矩阵为例。
-
全量微调:调整参数总量为
11,008 × 4,096 = 45,088,768
-
LoRA微调(r=4):参数量仅需
(11,008 × 4) + (4 × 4,096) = 60,416
-
效率对比:LoRA参数量 不到全量微调的千分之一(≈0.13%)
(2)微调的内存使用:
具体来说,模型微调的内存使用主要涉及四个部分:
-
权重内存(Weight Memory):用于存储模型权重所需的内存;
-
激活内存(Activation Memory):前向传播内存时中间激活带来的显存占用, 主要取决于 batch size 大小以及序列长度等;
-
梯度内存(Gradient Memory):在反向传播期间需要用来保存梯度的内存,这些梯度仅针对可训练参数进行计算;
-
优化器内存(Optimization Memory):用于保存优化器状态的内部存在。例如,Adam 优化器会保存可训练参数的 “一阶动量” 和 “二阶动量”。
(3)显存与速度对比
基于《Rui Pan et al. “LISA: Layerwise Importance Sampling for Memory-Efficient Large Language Model Fine-Tuning”. In: arXiv preprint arXiv.2403.17919 (2024).》文献中的实验,数据如下:
- 硬件条件:NVIDIA RTX4090(24GB显存),批量大小=1
微调方式 | 显存占用 | 优化器内存 | 梯度内存 | 速度 |
---|---|---|---|---|
全量微调 | 60GB(溢出) | - | - | 基准速度 |
LoRA微调 | 23GB | ↓25GB | ↓14GB | ↑1.9倍 |
由于LoRA 的可训练参数少,使得优化器内存和梯度内存分别减少约 25GB 和 14GB。
虽然其引入的额外“增量参数”导致激活内存和权重内存略微增加(总计约 2GB),但整体内存减少的优势更明显。
此外,LoRA 减少了参数计算,加速了反向传播,速度比全量微调提高了 1.9 倍。
.
4.4.2 LoRA 变体
LoRA在复杂下游任务上(如一些数学推理)与全量微调有性能差距,为弥补差距,LoRA变体方法从以下三方面改进:一是打破低秩瓶颈,二是动态秩分配,三是训练过程优化。
1)打破低秩瓶颈(例ReLoRA)
LoRA的低秩更新特性使其在参数效率上表现出色,但这也限制了大规模语言模型记忆新知识和适应下游任务的能力,即存在低秩瓶颈。
Biderman等人的研究表明,全量微调的秩显著高于LoRA的秩(10-100倍),增加LoRA的秩可以缩小与全量微调之间的性能差距。为解决这一问题,一些方法被提出以打破低秩瓶颈。
例如,ReLoRA:
通过周期性地将LoRA模块合并到大语言模型并重新初始化,允许模型在保持总参数量不变的情况下,通过多次低秩更新累积成高秩状态,提升性能接近全秩训练。具体步骤包括:
-
合并:按照公式 W i ← W i + α B i A i W^i \leftarrow W^i + \alpha B^i A^i Wi←Wi+αBiAi 将LoRA模块合并到原始权重矩阵。
-
重置:将 B i B^i Bi 用特定方法(如Kaiming初始化)重新初始化, A i A^i Ai 设置为零。
-
优化器状态处理:通过幅度剪枝对优化器状态进行部分重置,防止模型性能发散。
.
2)动态秩分配(例AdaLoRA)
LoRA的秩并非越高越好,过高的秩可能导致性能和效率下降。由于Transformer模型中不同层的权重重要性存在差异,因此需要为每个层分配不同的秩。
AdaLoRA:
-
通过将参数更新矩阵参数化为奇异值分解(SVD)的形式,
-
再通过奇异值剪枝动态调整不同层中LoRA模块的秩。
具体来说,AdaLoRA使用SVD重新表示∆W,即:
W = W 0 + ∆ W = W 0 + P Λ Q W=W0+∆W=W0+PΛQ W=W0+∆W=W0+PΛQ
其中P和Q是正交的,Λ是对角矩阵,其中包含 {λi}1≤i≤r 的奇异值。训练时,W0的参数固定,仅更新P、Λ和Q的参数。根据梯度权重乘积大小的移动平均值构造奇异值的重要性得分,对不重要的奇异值进行迭代剪枝。
此外,为了增强稳定训练性,AdaLoRA 引入一个额外的惩罚项确保 P 和 Q 之间的正交性:
R ( P , Q ) = ∣ ∣ P T P − I ∣ ∣ F 2 + ∣ ∣ Q Q T − I ∣ ∣ F 2 R(P, Q) = ||P^TP − I||^2_F + ||QQ^T − I||^2_F R(P,Q)=∣∣PTP−I∣∣F2+∣∣QQT−I∣∣F2
其中,I 是单位矩阵, ∣ ∣ ⋅ ∣ ∣ F || · ||_F ∣∣⋅∣∣F 代表 Frobenius 范数。
.
3)训练过程优化(例DoRA)
LoRA在实际微调中存在收敛速度慢、对超参数敏感及易过拟合的问题,影响了其效率和下游适配性能,为此,有工作尝试优化LoRA训练过程。
DoRA 方法:
DoRA 方法通过约束梯度更新,侧重于更新参数的方向变化,将预训练权重 W 0 ∈ R d × k W_0 \in \mathbb{R}^{d \times k} W0∈Rd×k 分解为方向和大小两个组件,并仅将 LoRA 应用于方向组件以增强训练稳定性。具体表示为:
W 0 = m V ∥ V ∥ c = ∥ W 0 ∥ c W 0 ∥ W 0 ∥ c W_0 = m \frac{V}{\|V\|_c} = \|W_0\|_c \frac{W_0}{\|W_0\|_c} W0=m∥V∥cV=∥W0∥c∥W0∥cW0
其中, m ∈ R 1 × k m \in \mathbb{R}^{1 \times k} m∈R1×k 是大小向量, V ∈ R d × k V \in \mathbb{R}^{d \times k} V∈Rd×k 是方向矩阵, ∥ ⋅ ∥ c \|\cdot\|_c ∥⋅∥c 是矩阵在每一列上的向量范数。
DoRA 仅对方向矩阵 V 施加 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
其中, Δ V \Delta V ΔV 是由 LoRA 学习的增量方向更新,m、 Δ V \Delta V ΔV 、BA 是可训练参数。
.
4.4.3 基于 LoRA 插件的任务泛化
LoRA 微调后,可将更新模块 B 和 A 分离并封装成即插即用、不破坏原始模型的参数插件,便于在不同任务上训练、保存、共享和使用。还能组合多任务的 LoRA 插件,迁移到新任务。
图 4.9: LoRAHub 示意图
LoRAHub 提供组合方法框架,包括组合阶段和适应阶段:
- 组合阶段:通过逐元素线性加权把已学习的 LoRA 模块组合成单一模块;
m ^ = ( w 1 A 1 + w 2 A 2 + ⋯ + w N A N ) ( w 1 B 1 + w 2 B 2 + ⋯ + w N B N ) \hat{m} = \left(w_1 A_1 + w_2 A_2 + \cdots + w_N A_N\right)\left(w_1 B_1 + w_2 B_2 + \cdots + w_N B_N\right) m^=(w1A1+w2A2+⋯+wNAN)(w1B1+w2B2+⋯+wNBN)
- 适应阶段:用无梯度方法 Shiwa 自适应学习权重组合,经 k 次迭代找到最优组合,适应新任务。
.
其他参考:【大模型基础_毛玉仁】系列文章
声明:资源可能存在第三方来源,若有侵权请联系删除!