Skip to content

LoRA 是如何工作的?

How does LoRA work?

现在,你可能会想……

但如果两个矩阵维度不同,我们又怎么能把它们相加呢?

确实,我们没法直接这么做。

更具体地说,在微调过程中,权重矩阵 W 是被冻结的,因此不会接收任何梯度更新,所有梯度更新都被转而导向 ΔW 矩阵。但为了确保 ΔW 和 W 能够相加、共同生成微调后模型的最终表示,ΔW 矩阵被拆分成两个低秩矩阵 A 和 B 的乘积,可训练参数就存放在这两个矩阵中。

fine tuning p80 1

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

fine tuning p80 2

因此,ΔW 的维度也必须是 d×k。但这并不意味着矩阵 A 和 B 中可训练参数的总量,也必须与 ΔW 的维度保持一致。

恰恰相反,A 和 B 完全可以是非常小的矩阵,我们唯一需要确保的是:它们的乘积结果是一个维度为 d×k 的矩阵。

因此:矩阵 A 的维度被设为 d×r。

矩阵 B 的维度被设为 r×k。

如果检验一下它们的乘积,确实就是 d×k。

在训练过程中,只有矩阵 A 和 B 会被训练,整个网络的其余权重都保持固定不变。

这就是 LoRA 的工作原理。

更正式地说,LoRA 通过提出两个问题,对全模型微调这一做法本身提出了质疑:

  • 我们真的有必要微调原始模型中的全部参数吗?
  • 原始模型参数(或者说矩阵的秩)的表达能力究竟有多强?

这可以画成一张二维网格图,如下所示:

fine tuning p81 1

在上图中,每一个点都代表一种可能的 LoRA 配置,右上角对应的则是全参数微调。

实验观察表明,理想的配置往往位于上图网格的左下角,这意味着我们并不需要训练模型的全部参数。既然我们已经理解了 LoRA 的工作原理,接下来就让我们动手实现 LoRA。

本站内容仅供学习交流,版权归原作者所有。