LoRA 低秩适配

LoRA 把权重更新表示成两个小矩阵的乘积,在保留基座权重的同时,用较少可训练参数完成适配。

返回概念图谱 →

理解与应用

LoRA 是一种参数高效微调方法。对一个原有权重矩阵 W,它通常冻结 W,把需要学习的增量写成两个较小矩阵的乘积 BA,再按缩放系数加入原计算。这里的“低秩”是说增量受到较低维度的约束,而不是把原模型的所有权重直接删减成一个小模型。

例如把通用模型适配为报销说明整理器时,可以保留基座,在指定层加入 LoRA 参数,用审校示例训练这些新增参数。对于 m×n 的权重,秩为 r 的两个矩阵合计有 r(m+n) 个参数;当 r 远小于 m、n 时,它们比直接训练 mn 个参数少得多。这减少了可训练参数以及相关梯度、优化器状态的开销。

但整个训练仍需加载基座并处理激活,中间计算也需要空间,所以参数减少多少并不等于总显存就下降多少。选择秩、目标层和训练数据仍是效果的一部分:秩过小可能限制适配能力,增加秩也不保证每项任务都会变好。推理时能否把增量合并进基座,还取决于实现与量化等配置。

LoRA 属于 PEFT 这一方法家族,PEFT 也常指实现多种适配方法的软件库。它可以配合 SFT,也可以用于某些强化学习训练。保存适配器时,基座版本、分词器和目标模块同样属于必要信息;一个能加载成功的适配器,接到不匹配的基座上仍可能产生错误行为。

关系速览
LoRA 低秩适配应用于 →监督微调

LoRA 可以在监督微调中降低可训练参数数量,也能用于其他适配流程。

动手试一试:比较低秩更新与完整矩阵的参数量

算例只比较一个 4096×4096 权重矩阵与两个低秩因子的参数数目。没有计入基座、激活、其他层或优化器配置,也没有训练模型,因此不能把这些百分比直接当作整机显存节省比例或效果结论。

将代码保存为 example.py,使用 Python 3.10+ 运行 python3 example.py。仅使用标准库,无需密钥,不会调用外部模型。

Python 代码

rows, columns = 4096, 4096
for rank in [8, 16]:
    full = rows * columns
    adapter = rank * (rows + columns)
    print(f"秩 {rank}:{adapter:,} 个适配参数,占完整矩阵 {adapter / full:.2%}")
print(f"完整矩阵:{full:,} 个参数")

运行结果

秩 8:65,536 个适配参数,占完整矩阵 0.39%
秩 16:131,072 个适配参数,占完整矩阵 0.78%
完整矩阵:16,777,216 个参数

常见误区

  • 低秩更新不是压缩掉基座,训练和推理通常仍需访问原模型。
  • 秩越大表示可训练空间变大,但收益还取决于数据和任务。
  • 适配器的基座、分词器和目标模块需要匹配,文件能读取不代表适配关系正确。

前置与延伸

建议先读

相关概念

参考与版本

Apollo 原创讲解与教学示例。参考资料用于核对技术定义;核验日不代表资料的发布日期。