对于复杂的LoRA应用,了解如何初始化可训练参数非常重要。设置低秩矩阵A和B初始值的方式会影响训练稳定性、收敛速度,并最终影响微调模型的质量。常见的初始化策略及其作用将被审视。
回顾一下,对于权重矩阵W0,LoRA更新ΔW计算为ΔW=BA,其中B∈Rd×r且A∈Rr×k,对于权重矩阵W0∈Rd×k。微调期间修改后的权重矩阵是W=W0+αrBA,尽管为了简化初始化讨论,我们通常关注核心的BA项,同时记住缩放因子α/r稍后应用。初始化的目标是适当地设置A和B的起始值。
默认初始化:B为零,A为高斯分布
最广泛采用且通常为默认的LoRA初始化策略是:
- 初始化矩阵A 使用标准随机初始化方法,通常是Kaiming均匀或高斯分布(N(0,σ2)),且方差较小。这能确保投影到低秩空间的初始表示具有一定的变动性。
- 初始化矩阵B 为全零。
这种方法的核心思想是确保在微调过程的最开始(步骤t=0),自适应项ΔW=BA精确为零。
Wt=0=W0+BA=W0+0⋅A=W0
这意味着带有LoRA层的模型初始行为与预训练基础模型完全相同。微调过程随后逐步学习B的非零值,使得自适应ΔW可以出现并根据特定任务数据调整模型的行为。
优点:
- 稳定性: 从ΔW=0开始能避免对预训练模型精心学习到的表示造成任何初始干扰。这通常会带来更稳定的训练动态,尤其是在初始阶段。
- 保留预训练知识: 确保微调过程完全从基础模型的状态开始,没有来自LoRA层的任何初始随机扰动。
缺点:
- 初始学习可能较慢: 由于B从零开始,梯度信息需要回流以将B更新为非零值,然后才能发生有意义的自适应。这可能会使收敛的初始阶段略微慢于ΔW从一开始就非零的方法。
这种策略在流行的库中默认实施,例如Hugging Face的PEFT (peft)。例如,LoraLayer通常将lora_B权重初始化为零,并使用Kaiming均匀初始化来初始化lora_A权重。
A和B的高斯初始化
另一种方法是使用随机分布初始化矩阵A和B,通常是精心选择(通常较小)方差σ2的高斯分布(N(0,σ2))。
在这种情况下,当t=0时,自适应项ΔW=BA将是一个非零矩阵,尽管如果σ较小,其项的值也可能较小。
Wt=0=W0+BA=W0(除非 BA 碰巧为零)
原理:
这里的想法是,从小的非零随机自适应开始,可能让模型更快地学习到所需的调整,从而可能加速收敛。初始的随机ΔW提供了一个即时但可能带噪声的自适应方向。
注意事项:
- 方差选择(σ2): 这是一个重要的超参数。如果σ过大,初始的随机ΔW可能会显著干扰预训练权重W0,导致训练不稳定或立即性能下降。如果σ过小,其作用可能微不足道,并类似于将B初始化为零。最佳方差通常需要调优。
- 与学习率的相互作用: 与将B零初始化策略相比,非零的初始ΔW可能需要更小的初始学习率以保持稳定性。
优点:
- 潜在的更快初始收敛: 模型不需要“打破B=0的对称性”,并且如果随机初始化提供有用信号,则可能在初始步骤中更快地自适应。
缺点:
- 不稳定性风险: 如果未适当缩放,初始随机ΔW可能会干扰预训练模型的功能。
- 对超参数的敏感性增加: 需要更仔细地调优初始化方差(σ2)以及可能的学习率。
此图说明了LoRA更新项BA的幅度可能如何演变。将B零初始化会使更新从零开始,而对A和B进行高斯初始化则会从一个小的非零更新开始。
实际考虑和建议
对于大多数实际使用场景,建议从**默认策略(B零初始化,A随机初始化)**开始。它提供了一个稳定可靠的基线,在微调开始时保留预训练模型的完整性。与随机初始化两个矩阵相比,这种方法对超参数选择的敏感性较低。
仅在以下情况下考虑对A和B进行随机初始化:
- 使用默认方法时,您观察到初始收敛特别缓慢。
- 您有足够的计算资源对初始化方差和可能的学习率进行仔细的超参数调优。
- 您正在为了研究目的试验不同变体。
记住,有效的初始更新幅度也受LoRA秩r和缩放因子α的影响。更新是W0+αrBA。即使对A和B进行高斯初始化,非常小的α或非常大的r也会减弱由BA引起的初始扰动。相反,大的α或小的r会放大它。这些因素共同作用,同时调整它们是优化LoRA性能的一部分。
尽管可以设计其他初始化方案,或许借鉴矩阵分解技术或整合关于任务的先验知识,但A采用Kaiming/高斯初始化,B采用零初始化仍然是应用LoRA普遍且有效的起始点。