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

LoRA (Low-Rank Adaptation) 中的两个关键超参数:LoRA_rank(通常简称为 rankr)和 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 矩阵)注入一对可训练的、低秩的“适配器”矩阵 AAABBB

模型层的前向传播被修改为:
原始: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 是学习到的权重 变化量(权重更新),由两个较小的矩阵 BBBAAA 的乘积来表示。
  • 如果 W0W_0W0 的维度是 d×kd \times kd×k,那么 AAA 的维度是 r×kr \times kr×kBBB 的维度是 d×rd \times rd×r。这里的 rrr 就是 LoRA_rank

1. LoRA_rank (r)

  • 定义rank 参数 rrr 定义了 LoRA 适配器矩阵 AAABBB 的内部维度(秩)。它直接决定了 ΔW=BA\Delta W = BAΔW=BA 这个近似更新矩阵的秩。
  • 作用
    • 模型容量/表达能力rank 控制了 LoRA 适配器能够学习和表达的信息量。更高的 rank 意味着矩阵 AAABBB 更大,Δ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)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=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
    • 有时也会设置 alpharank 的两倍 (alpha = 2 * rank) 或其他固定值(如 32)。
    • 一些实现可能不遵循 α/r\alpha/rα/r 的缩放,而是直接使用 α\alphaα 作为缩放因子 s=αs = \alphas=α。这时 alpha 的作用更直接,需要根据实验效果调整。检查你使用的具体库或代码是如何实现缩放的非常重要。
    • 通常,如果 alpha 设置得太高,可能会导致训练不稳定或过拟合;如果太低,LoRA 的效果可能不明显。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值