外观
LoRA 是如何工作的?
How does LoRA work?
现在,你可能会想……
但如果两个矩阵维度不同,我们又怎么能把它们相加呢?
确实,我们没法直接这么做。
更具体地说,在微调过程中,权重矩阵 W 是被冻结的,因此不会接收任何梯度更新,所有梯度更新都被转而导向 ΔW 矩阵。但为了确保 ΔW 和 W 能够相加、共同生成微调后模型的最终表示,ΔW 矩阵被拆分成两个低秩矩阵 A 和 B 的乘积,可训练参数就存放在这两个矩阵中。

如前所述,W 的维度是 d×k:

因此,ΔW 的维度也必须是 d×k。但这并不意味着矩阵 A 和 B 中可训练参数的总量,也必须与 ΔW 的维度保持一致。
恰恰相反,A 和 B 完全可以是非常小的矩阵,我们唯一需要确保的是:它们的乘积结果是一个维度为 d×k 的矩阵。
因此:矩阵 A 的维度被设为 d×r。
矩阵 B 的维度被设为 r×k。
如果检验一下它们的乘积,确实就是 d×k。
在训练过程中,只有矩阵 A 和 B 会被训练,整个网络的其余权重都保持固定不变。
这就是 LoRA 的工作原理。
更正式地说,LoRA 通过提出两个问题,对全模型微调这一做法本身提出了质疑:
- 我们真的有必要微调原始模型中的全部参数吗?
- 原始模型参数(或者说矩阵的秩)的表达能力究竟有多强?
这可以画成一张二维网格图,如下所示:

在上图中,每一个点都代表一种可能的 LoRA 配置,右上角对应的则是全参数微调。
实验观察表明,理想的配置往往位于上图网格的左下角,这意味着我们并不需要训练模型的全部参数。既然我们已经理解了 LoRA 的工作原理,接下来就让我们动手实现 LoRA。