张芷铭的个人博客

LoRA(Low-Rank Adaptation)通过低秩分解将权重矩阵拆分为两个小矩阵相乘,训练时只更新低秩矩阵,显著降低大模型微调的计算和存储成本。

核心原理

将权重矩阵$W \in \mathbb{R}^{m \times n}$近似为两个低秩矩阵的乘积: $$W \approx A \times B$$

其中$A \in \mathbb{R}^{m \times r}$,$B \in \mathbb{R}^{r \times n}$,$r \ll \min(m, n)$为秩。

实现流程

  1. 冻结原始权重矩阵$W$
  2. 初始化低秩矩阵$A$(随机高斯)和$B$(零初始化)
  3. 前向传播:$W’ = W + AB$
  4. 训练时只更新$A$和$B$

PyTorch实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import torch.nn as nn

class LoRALayer(nn.Module):
    def __init__(self, in_features, out_features, rank=8):
        super().__init__()
        self.W = nn.Linear(in_features, out_features, bias=False)
        self.W.weight.requires_grad = False  # 冻结原始权重

        # 低秩矩阵
        self.A = nn.Parameter(torch.randn(in_features, rank))
        self.B = nn.Parameter(torch.zeros(rank, out_features))
        self.scaling = 1.0 / rank

    def forward(self, x):
        return self.W(x) + (x @ self.A @ self.B) * self.scaling

参数量对比

方法参数量说明
全参数微调$m \times n$更新所有参数
LoRA$r \times (m + n)$仅更新低秩矩阵

示例:$m=n=4096$,$r=8$时,参数量从16M降至65K,减少99.6%。

核心论文

相关工作

方法说明
Adapters在每层插入小模块,仅更新模块
Prefix Tuning在输入前添加可学习前缀
Prompt Tuning仅优化软提示词

Comments