LoRA个关键超参数:`LoRA_rank`(通常简称为 `rank` 或 `r`)和 `LoRA_alpha`(通常简称为 `alpha`)

发布于:2025-04-18 ⋅ 阅读:(44) ⋅ 点赞:(0)

LoRA (Low-Rank Adaptation) 中的两个关键超参数:LoRA_rank(通常简称为 rankr)和 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) rmin(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
    • 有时也会设置 alpharank 的两倍 (alpha = 2 * rank) 或其他固定值(如 32)。
    • 一些实现可能不遵循 α / r \alpha/r α/r 的缩放,而是直接使用 α \alpha α 作为缩放因子 s = α s = \alpha s=α。这时 alpha 的作用更直接,需要根据实验效果调整。检查你使用的具体库或代码是如何实现缩放的非常重要。
    • 通常,如果 alpha 设置得太高,可能会导致训练不稳定或过拟合;如果太低,LoRA 的效果可能不明显。

  • rank (r) 决定了 LoRA 适配器的 容量参数数量。它控制了模型能学习多复杂的调整。
  • alpha ( α \alpha α) 决定了 LoRA 适配器 影响的强度缩放比例。它控制了学习到的调整在多大程度上应用于原始模型。
  • 两者通常一起调整。常见的策略是先选择一个 rank,然后将 alpha 设置为等于 rankrank 的两倍,并根据实验结果进一步微调。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)。

网站公告

今日签到

点亮在社区的每一天
去签到