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

核心原理

将权重矩阵近似为两个低秩矩阵的乘积:

其中为秩。

实现流程

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

PyTorch实现

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

参数量对比

方法参数量说明
全参数微调更新所有参数
LoRA仅更新低秩矩阵

示例:时,参数量从16M降至65K,减少99.6%。

核心论文

相关工作

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