为什么 LoRA 梯度是建立在全量参数 W 的梯度之上

🧠 首先搞清楚 LoRA 是怎么做微调的

我们原来要训练的参数矩阵是 W W W,但 LoRA 说:

别动 W,我在它旁边加一个低秩矩阵 Δ W = U V \Delta W = UV ΔW=UV,只训练这个部分!

也就是说,LoRA 用一个新的权重矩阵:

W ′ = W + U V W' = W + UV W′=W+UV

只训练 U U U 和 V V V, W W W 不动。


📦 所以前向传播其实用的是:

模型输入 x ⟶ W ′ x = W x + U V x ⟶ 输出 ⟶ L \text{模型输入}x \longrightarrow W'x = Wx + UVx \longrightarrow \text{输出} \longrightarrow \mathcal{L} 模型输入x⟶W′x=Wx+UVx⟶输出⟶L

在这个过程中,损失函数 L \mathcal{L} L 是基于 W + U V W + UV W+UV 来计算的。


🔁 反向传播的时候怎么求梯度?

LoRA 要训练的是 U U U 和 V V V,所以我们要算:

∂ L ∂ U 和 ∂ L ∂ V \frac{\partial \mathcal{L}}{\partial U} \quad \text{和} \quad \frac{\partial \mathcal{L}}{\partial V} ∂U∂L和∂V∂L

但问题是:损失函数 L \mathcal{L} L 不是直接依赖 U U U 和 V V V,而是依赖 U V UV UV

所以要用链式法则 ,先对 U V UV UV 求导,然后传播回 U U U、 V V V。而对UV求导等价于对 W W W求导


✅ 关键点来了

我们记:

∂ L ∂ W = G \frac{\partial \mathcal{L}}{\partial W} = G ∂W∂L=G

这个 G G G 就是"如果我们在做全量微调,该怎么更新 W W W 的梯度"。

LoRA 说:

"虽然我不更新 W W W,但我要更新的是 U V UV UV。所以我也可以用这个 G G G 来指导我怎么更新 U U U 和 V V V。"

于是我们得到:

∂ L ∂ U = G V ⊤ , ∂ L ∂ V = U ⊤ G \frac{\partial \mathcal{L}}{\partial U} = G V^\top, \quad \frac{\partial \mathcal{L}}{\partial V} = U^\top G ∂U∂L=GV⊤,∂V∂L=U⊤G


LoRA 的梯度建立在 ∂ L ∂ W \frac{\partial \mathcal{L}}{\partial W} ∂W∂L 上, 是因为它相当于"用低秩矩阵 U V UV UV 来代替全量的参数更新", 所以梯度传播也必须从 ∂ L ∂ W \frac{\partial \mathcal{L}}{\partial W} ∂W∂L 开始。

LoRA 往往只是显存不足的无奈之选,因为一般情况下全量微调的效果都会优于 LoRA,所以如果算力足够并且要追求效果最佳时,请优先选择全量微调。

使用 LoRA 的另一个场景是有大量的微型定制化需求,要存下非常多的微调结果,此时使用 LoRA 能减少储存成本。

🔍 为什么

为什么 ∂ L ∂ W \frac{\partial \mathcal{L}}{\partial W} ∂W∂L,就是对 U V UV UV 的梯度?

换句话说:LoRA 中的 W ′ = W + U V W' = W + UV W′=W+UV,那我们训练时不是更新 W W W,只更新 U V UV UV,那为什么还能用 ∂ L ∂ W \frac{\partial \mathcal{L}}{\partial W} ∂W∂L 来指导 U U U 和 V V V 的更新呢?


✅ 答案是:因为前向传播中 W + U V W + UV W+UV 是一起作为整体参与运算的

所以:

∂ L ∂ W = ∂ L ∂ ( W + U V ) = ∂ L ∂ ( U V ) \frac{\partial \mathcal{L}}{\partial W} = \frac{\partial \mathcal{L}}{\partial (W + UV)} = \frac{\partial \mathcal{L}}{\partial (UV)} ∂W∂L=∂(W+UV)∂L=∂(UV)∂L

这是因为:

  • 我们的模型使用的是 W + U V W + UV W+UV
  • 所以损失函数 L \mathcal{L} L 是以 W + U V W + UV W+UV 为输入计算出来的
  • 那么对 W W W 求导,其实是对这个整体求导
  • 而因为 W W W 是固定的(不训练,看作常数),所以梯度全部由 U V UV UV 来承接

  • 本来我们应该更新 W W W:
    W ← W − η ∂ L ∂ W W \leftarrow W - \eta \frac{\partial \mathcal{L}}{\partial W} W←W−η∂W∂L
  • 现在我们不动 W W W,让 U V UV UV 来"做这个事情":
    W + U V ← W + U V − η ⋅ ( LoRA方向上的梯度 ) W + UV \leftarrow W + UV - \eta \cdot \left(\text{LoRA方向上的梯度}\right) W+UV←W+UV−η⋅(LoRA方向上的梯度)

所以如果要算 U V UV UV 的导数,就是算 ∂ L ∂ W \frac{\partial \mathcal{L}}{\partial W} ∂W∂L

相关推荐
网安INF6 小时前
【论文阅读】-《TtBA: Two-third Bridge Approach for Decision-Based Adversarial Attack》
论文阅读·人工智能·神经网络·对抗攻击
这张生成的图像能检测吗13 小时前
(论文速读)SFAFBR:一种自监督的人工特征偏置校正框架
人工智能·深度学习·神经网络·机器学习·故障诊断·自监督学习
这张生成的图像能检测吗17 小时前
(论文速读)PatchTST:通道无关补丁时间序列变压器
人工智能·深度学习·神经网络·计算机视觉·注意力机制·vit·时序模型
老鱼说AI18 小时前
CUDA架构与高性能程序设计:多维网格与数据
c++·人工智能·深度学习·神经网络·机器学习·语言模型·cuda
不当菜鸡的程序媛2 天前
神经网络——bias 偏置项(bias term) 或者截距项(intercept term)
人工智能·神经网络·算法
老刘说AI2 天前
初识Agent
人工智能·神经网络·语言模型
强化学习与机器人控制仿真2 天前
Kimodo 入门教程(一)英伟达开源人形机器人动捕数据集训练运动学动作扩散模型
人工智能·神经网络·机器人·强化学习·扩散模型·英伟达·人形机器人
Learn Beyond Limits2 天前
循环神经网络的问题:梯度消失与梯度爆炸|Problems with RNNs: Vanishing and Exploding Gradients
人工智能·rnn·深度学习·神经网络·机器学习·自然语言处理·nlp
Alsian3 天前
Day45 神经网络调参
深度学习·神经网络·机器学习
weixin_429630263 天前
6.1 LCVAE-CNN:基于LCVAE的室内Wi‑Fi指纹CNN定位方法
人工智能·神经网络·cnn