LoRA(Low-Rank Adaptation)通过低秩分解将权重矩阵拆分为两个小矩阵相乘,训练时只更新低秩矩阵,显著降低大模型微调的计算和存储成本。
核心原理
将权重矩阵近似为两个低秩矩阵的乘积:
其中,,为秩。
实现流程
- 冻结原始权重矩阵
- 初始化低秩矩阵(随机高斯)和(零初始化)
- 前向传播:
- 训练时只更新和
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 | 仅优化软提示词 |