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