LoRA微调:低秩矩阵如何省参数
微调一个大模型,不一定要更新全部权重。LoRA把某个线性层的权重更新限制为两个小矩阵的乘积:基础权重保持冻结,只学习增量。它减少的是可训练参数,而不是把原模型的全部参数变小。
两个小矩阵怎样改变输出
设原权重W₀的形状为d×k,输入x有k个分量。增量写成sBA,A为r×k,B为d×r,s通常取α/r。前向计算为 y = W₀x + sB(Ax)。r是所选的秩上界;即使r大于1,实际乘积的秩也可能更低。
下面用一个人工构造的2×3线性层说明:A=[1,2,0],B=[0.5,−1]ᵀ,x=[2,3,4],s=0.25。先得到Ax=8,再得到B(Ax)=[4,−8],缩放后与基础输出[2,3]相加,结果为[3,1]。
W₀x = [2, 3]
sB(Ax) = [1, −2]
y = [3, 1]
这个例子也说明LoRA不是简单地给输出加一个固定偏置。输入变化时,A和B产生的增量也会变化。
参数节省要按层计算
只统计一个不含偏置的线性层:完整权重有dk个参数,LoRA支路有r(k+d)个可训练参数。假设d=k=4096,r=8,分别是16,777,216与65,536,后者为前者的1/256。这个比例是尺寸算术,不是整个模型的显存节省比例。
| 对象 | 数量 | 是否仍需要 |
|---|---|---|
| 基础权重W₀ | dk | 需要保存和前向使用 |
| A与B | r(k+d) | 训练增量参数 |
| 激活与临时张量 | 依具体网络而定 | 不能由秩直接推算 |
因此,评估一次微调是否装得下,不能只看适配器文件大小。建议分别记录基础权重精度、目标层、序列长度、批大小及峰值显存,并用同一任务的数据核验效果。
合并权重可以直接验证
对这个普通线性层,提前算好W=W₀+sBA,便能用Wx得到同一结果。以下Python示例已执行,验证了双支路与合并计算的一致性;没有调用训练框架,也没有测量GPU性能。
def mv(m, x):
return [sum(a*b for a,b in zip(row,x)) for row in m]
W = [[1,0,0], [0,1,0]]
A = [[1,2,0]]
B = [[0.5], [-1]]
x = [2,3,4]
s = 0.25 # alpha / r in this toy example
base, update = mv(W,x), mv(B,mv(A,x))
y = [a+s*b for a,b in zip(base,update)]
merged = [[W[i][j]+s*B[i][0]*A[0][j]
for j in range(3)] for i in range(2)]
assert y == [3.0,1.0]
assert mv(merged,x) == y
print(y)
浮点实现一般应使用误差容限比较。这个短例子所用数值可精确表示,因而直接用相等断言。若部署涉及量化或不同精度,不能把这条实数代数恒等式当成所有实现逐位一致的保证。
选秩不能只看“小”
秩越小,可训练空间越受限制;是否足够,应由验证集任务质量判断。可以固定数据划分与目标层,比较几种秩,再记录训练成本和错误类型。不要只用训练损失挑选配置。
Microsoft官方实现说明了训练LoRA参数与保存适配器的用法,也支持在相应模式下合并权重。生产部署仍须核对所用库的实际行为,避免把已经合并的增量再次叠加。本文解释普通LoRA的代数,不覆盖所有变体。
LoRA原始工作于2021年提交arXiv,本文依据原理与原创小例子展开,不复现论文基准,也不声称低秩更新普遍优于完整微调。若问题来自知识证据缺失,还可先比较RAG检索方案:训练参数与检索资料解决的问题并不相同。
资料来源
LoRA原始预印本(2021);作者官方实现。原理与基准成绩分开看,本文不转述性能倍数。
补发说明:北京时间2026年10月10日实际补发,文章日期保留原计划时段。
支持
如果这篇文章对你有帮助,欢迎支持本站。
二维码可点击放大。更多支持方式见支持页面。


