LoRA (Low-Rank Adaptation) 中的两个关键超参数:LoRA_rank
(通常简称为 rank
或 r
)和 LoRA_alpha
(通常简称为 alpha
)。
LoRA 的核心思想是,在对大型预训练模型(如 LLM 或 Stable Diffusion)进行微调时,我们不需要更新模型的所有权重。相反,我们可以冻结原始权重 W 0 W_0 W0,并为模型的某些层(通常是 Transformer 的 Attention 层中的 W q , W k , W v , W o W_q, W_k, W_v, W_o Wq,Wk,Wv,Wo 矩阵)注入一对可训练的、低秩的“适配器”矩阵 A A A 和 B B B。
模型层的前向传播被修改为:
原始:
h
=
W
0
x
h = W_0 x
h=W0x
LoRA 修改后:
h
=
W
0
x
+
Δ
W
x
=
W
0
x
+
B
A
x
h = W_0 x + \Delta W x = W_0 x + B A x
h=W0x+ΔWx=W0x+BAx
这里:
- W 0 W_0 W0 是原始的、冻结的权重矩阵。
- x x x 是输入。
- h h h 是输出。
- Δ W = B A \Delta W = B A ΔW=BA 是学习到的权重 变化量(权重更新),由两个较小的矩阵 B B B 和 A A A 的乘积来表示。
- 如果
W
0
W_0
W0 的维度是
d
×
k
d \times k
d×k,那么
A
A
A 的维度是
r
×
k
r \times k
r×k,
B
B
B 的维度是
d
×
r
d \times r
d×r。这里的
r
r
r 就是
LoRA_rank
。
1. LoRA_rank
(r
)
- 定义:
rank
参数 r r r 定义了 LoRA 适配器矩阵 A A A 和 B B B 的内部维度(秩)。它直接决定了 Δ W = B A \Delta W = BA ΔW=BA 这个近似更新矩阵的秩。 - 作用:
- 模型容量/表达能力:
rank
控制了 LoRA 适配器能够学习和表达的信息量。更高的rank
意味着矩阵 A A A 和 B B B 更大, Δ W \Delta W ΔW 可以捕捉更复杂的模式和权重变化。理论上,更高的rank
可以让模型更好地适应新的数据或任务,可能达到更高的微调性能。 - 参数数量:LoRA 引入的可训练参数数量与
rank
成正比。对于一个 d × k d \times k d×k 的权重矩阵 W 0 W_0 W0,LoRA 引入的参数数量是 r × k + d × r = r × ( d + k ) r \times k + d \times r = r \times (d+k) r×k+d×r=r×(d+k)。相比于训练整个 d × k d \times k d×k 的矩阵,当 r ≪ min ( d , k ) r \ll \min(d, k) r≪min(d,k) 时,这个数量要小得多。因此,rank
直接影响了 LoRA 微调的效率(内存占用和计算量)。 - 权衡:选择
rank
是在 模型性能 和 效率/参数量 之间做权衡。- 较低的
rank
(如 4, 8, 16):参数少,训练快,内存占用小,但可能无法完全捕捉所需的权重调整,导致性能略有损失。 - 较高的
rank
(如 32, 64, 128, 256):参数更多,可能获得更好的性能,但训练更慢,占用内存更多,并且如果rank
过高而微调数据量不足,可能有过拟合的风险。
- 较低的
- 模型容量/表达能力:
- 类比:你可以把
rank
想象成给模型微调分配的“表达能力预算”或“复杂度预算”。预算越高,模型调整得可能越精细,但也更昂贵。 - 选择:
rank
的选择通常取决于具体的任务、数据集大小和基础模型。实践中常常从较小的值(如 8 或 16)开始尝试,根据验证集上的性能表现来调整。
2. LoRA_alpha
(
α
\alpha
α)
- 定义:
alpha
是一个缩放因子(scaling factor),用于调整 LoRA 适配器输出的幅度。 - 作用:
- 调整适应强度:
alpha
控制了 LoRA 适配器( Δ W = B A \Delta W = BA ΔW=BA)对原始模型输出 ( W 0 x W_0 x W0x) 的影响程度。修改后的前向传播通常实现为:
h = W 0 x + s ⋅ ( B A x ) h = W_0 x + s \cdot (B A x) h=W0x+s⋅(BAx)
这里的 s s s 是最终的缩放系数。在原始 LoRA 论文和许多实现中,这个缩放系数 s s s 通常设置为 α r \frac{\alpha}{r} rα。
h = W 0 x + α r ( B A x ) h = W_0 x + \frac{\alpha}{r} (B A x) h=W0x+rα(BAx)
这意味着,LoRA 部分的贡献被 α \alpha α 放大,同时被rank
( r r r) 缩小。 - 归一化和稳定性:使用
α
r
\frac{\alpha}{r}
rα 作为缩放因子的一个重要原因是,它有助于在改变
rank
( r r r) 时,保持 LoRA 更新的初始幅度相对稳定。如果没有除以 r r r,那么增加rank
会同时增加参与计算的参数数量和潜在的输出幅度,可能导致训练不稳定。通过除以 r r r,可以部分抵消这种影响。设置 α \alpha α 使得 α / r \alpha/r α/r 这个比例大致保持在一个合适的范围内(例如, α = r \alpha = r α=r 时,比例为 1; α = 2 r \alpha = 2r α=2r 时,比例为 2)。 - 控制学习范围:可以认为
alpha
像一个专门针对 LoRA部分的“学习率”乘数。它决定了学习到的 Δ W \Delta W ΔW 在多大程度上改变模型的行为。
- 调整适应强度:
- 类比:你可以把
alpha
想象成 LoRA 适应层输出的“音量旋钮”或“强度调节器”。 - 选择:
- 一个常见的做法是将
alpha
设置为rank
的某个倍数,最常见的是alpha = rank
(即 α / r = 1 \alpha/r = 1 α/r=1)。这样可以简化超参数调整,只需要调整rank
。 - 有时也会设置
alpha
为rank
的两倍 (alpha = 2 * rank
) 或其他固定值(如 32)。 - 一些实现可能不遵循
α
/
r
\alpha/r
α/r 的缩放,而是直接使用
α
\alpha
α 作为缩放因子
s
=
α
s = \alpha
s=α。这时
alpha
的作用更直接,需要根据实验效果调整。检查你使用的具体库或代码是如何实现缩放的非常重要。 - 通常,如果
alpha
设置得太高,可能会导致训练不稳定或过拟合;如果太低,LoRA 的效果可能不明显。
- 一个常见的做法是将
rank
(r
) 决定了 LoRA 适配器的 容量 和 参数数量。它控制了模型能学习多复杂的调整。alpha
( α \alpha α) 决定了 LoRA 适配器 影响的强度 或 缩放比例。它控制了学习到的调整在多大程度上应用于原始模型。- 两者通常一起调整。常见的策略是先选择一个
rank
,然后将alpha
设置为等于rank
或rank
的两倍,并根据实验结果进一步微调。alpha / rank
这个比值通常被认为是一个更稳定的衡量 LoRA 影响力的指标。
缩放因子 s s s 是越大越好还是越小越好
关于缩放因子 s s s(通常是 α r \frac{\alpha}{r} rα),并不是简单的“越大越好”或“越小越好”。它是一个需要根据具体任务、模型和数据进行调整的超参数,其最佳值取决于你想要达到的效果和需要平衡的因素。
我们来分析一下 s s s 的大小意味着什么:
回顾 LoRA 的公式: h = W 0 x + s ⋅ ( B A x ) h = W_0 x + s \cdot (B A x) h=W0x+s⋅(BAx)
-
s s s 较大时 (例如, s > 1 s > 1 s>1,对应 α > r \alpha > r α>r):
- 效果:LoRA 适配器学习到的变化 Δ W = B A \Delta W = BA ΔW=BA 对模型最终输出的影响更大。模型会更倾向于根据微调数据进行调整,其行为会更多地偏离原始预训练模型。
- 优点:如果微调任务与预训练任务差异较大,或者需要模型进行显著的行为改变,较大的 s s s 可能有助于模型更快、更充分地适应新任务,可能达到更高的任务性能。
- 缺点:
- 训练不稳定:过大的 s s s 可能导致训练过程不稳定,梯度可能会爆炸或消失。
- 过拟合:模型可能过度拟合微调数据,丢失了预训练模型学到的泛化能力(灾难性遗忘)。
- 破坏预训练知识:LoRA 的目的是在保留预训练知识的基础上进行微调,过大的 s s s 可能过度改变模型行为,破坏了基础模型的良好特性。
-
s s s 较小时 (例如, s < 1 s < 1 s<1,对应 α < r \alpha < r α<r):
- 效果:LoRA 适配器学习到的变化 Δ W = B A \Delta W = BA ΔW=BA 对模型最终输出的影响较小。模型的行为会更接近原始的预训练模型。
- 优点:
- 训练更稳定:通常训练过程更平滑。
- 更好地保留预训练知识:有助于防止灾难性遗忘,保持模型的泛化能力。
- 更精细的调整:适合只需要对模型进行微小调整的任务。
- 缺点:如果微调任务需要较大的模型调整,较小的 s s s 可能导致 LoRA 的适应能力不足(underfitting),模型无法充分学习新任务的特性,性能提升有限。
-
s = 1 s = 1 s=1 时 (通常对应 α = r \alpha = r α=r):
- 这通常被认为是一个基准或合理的起点。它提供了一个直接的平衡,即 LoRA 学习到的更新 B A x BAx BAx 在幅度上与原始权重 W 0 x W_0 x W0x 的贡献具有一定的可比性(具体取决于 B A x BAx BAx 的实际数值大小)。许多研究和实践都从 s = 1 s=1 s=1 开始尝试。
总结:
- 没有绝对的最优值:最佳的 s s s 值取决于任务需求。需要通过实验来找到最适合场景的值。
- 权衡:需要在 适应新任务的程度 和 保留预训练知识/训练稳定性 之间进行权衡。
- 起点:通常从 s = 1 s=1 s=1 (即 α = r \alpha = r α=r) 开始是一个不错的选择。
- 调整策略:如果在 s = 1 s=1 s=1 时模型适应不足,可以尝试增大 s s s(比如设置 α = 2 r \alpha = 2r α=2r 使得 s = 2 s=2 s=2);如果模型训练不稳定或有过拟合迹象,可以尝试减小 s s s(比如设置 α = 0.5 r \alpha = 0.5r α=0.5r 使得 s = 0.5 s=0.5 s=0.5)。