LoRA 为什么必须把一个矩阵初始化为0

LoRA(Low-Rank Adaptation)中必须把其中一个矩阵(通常是 B)初始化为 0 的核心原因,是为了让微调在第0步(刚加载预训练权重时)不改变原模型的任何输出,也就是实现“从预训练模型精确起步”。

这不是可有可无的trick,而是LoRA设计中最关键的工程细节之一。

为什么一定要 ΔW = 0 在初始化时刻?

LoRA 的更新形式是:

h = W₀ x + ΔW x = W₀ x + (B A) x
(通常再乘一个缩放因子 α/r)

在训练刚开始的那一刻,如果 ΔW ≠ 0,就会立刻给原模型引入一个随机偏移,这会导致:

  1. 输出突然跳变 → 损失剧烈震荡
  2. 早期梯度不稳定,容易跑偏或梯度爆炸/消失
  3. 破坏了预训练模型已经非常好的初始化(这是最昂贵的部分)

而把 B 初始化为 全零矩阵,无论 A 是什么(高斯随机、Kaiming、Xavier 随便),都有:

B A = 0(矩阵乘法性质:任何矩阵乘以零矩阵都得零矩阵)

于是 ΔW = 0 → h = W₀ x,完美保持原模型行为。

为什么不把 A 和 B 都初始化为 0?

初始化方式ΔW 初始化时是否为 0梯度是否为 0早期训练稳定性实际效果(主流实践)
A=0, B=0是(对称性问题)极差基本学不动(梯度对称坍缩)
A=随机, B=随机否(随机大偏移)正常早期震荡大,难收敛
A=随机, B=0(主流)正常很好最稳定,推荐
A=0, B=随机正常较好比主流稍差一些
  • 全零 → 所有神经元对称,梯度相同 → 学不动(经典的 zero init 灾难)
  • 都随机 → 相当于突然给预训练权重加了一个随机低秩扰动 → 相当于从一个很差的起点开始微调,浪费了预训练的优势

所以主流(包括原论文、PEFT库、绝大多数开源实现)都选 A 随机小方差初始化 + B = 0

2024–2025 年的新研究:其实不“必须”了

最近一些工作(尤其是 infinite-width 理论分析 + 大量实验)发现:

  • 如果把 A 和 B 都用很小的非零值初始化(比如缩小标准差),训练其实也能正常进行
  • 甚至在某些情况下(特别小 learning rate 时)更鲁棒
  • 微调不一定非要从精确的预训练模型开始,加一点小的随机噪声通常不影响最终性能

代表工作:

  • “Investigating the Impact of Non-Zero Initialization on LoRA Fine-Tuning Dynamics” (ICML 2025)
  • 结论:非零初始化可以提升对次优学习率的鲁棒性,且最终精度往往不差甚至略好

但目前工程界仍然强烈推荐 B 初始化为 0,原因主要是:

  • 最稳(early training 几乎不会炸)
  • 最可复现
  • 和绝大多数已有 checkpoint / 教程 / huggingface peft 代码一致

总结一句话

LoRA 把 B 初始化为 0 的根本目的是:让低秩适配器在训练第0步“什么都不做”,从而最大限度地继承预训练模型的优秀初始化和稳定性。

这是工程上“稳”压倒一切的典型案例。

如果你现在做实验:

  • 想最稳 → 继续用 B=0
  • 想探索极限 / 小学习率场景 → 可以试试双随机小方差初始化(注意要配合更小的初始学习率)

你是在 debug LoRA 训练不稳定,还是在准备面试/写论文想深入理解这个细节?可以告诉我具体场景,我再给你更针对性的建议~

文章已创建 4729

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部