LoRA的alpha与rank:缩放怎么选
LoRA中的rank决定低秩分支的宽度,alpha则参与输出缩放。只增大rank、保持alpha不变,在标准α/r规则下会同时减小缩放系数;因此一次“提高rank没效果”的实验,可能混合了容量变化与更新尺度变化。rsLoRA将分母改为√r,比较时也必须把这项规则记录下来。
文章目录
下面不猜最佳超参数,而是从一个可复现的首步更新推导出哪些量一起变了,以及怎样做有意义的对照。Read in English。
先写出真正参与前向的系数
对线性层,采用列向量约定,适配后输出为y=Wx+sBAx,其中A把输入映射到r维,B映射回输出维。标准LoRA取s=α/r,rsLoRA取s=α/√r。alpha本身不是学习率,真正乘到分支输出上的量是s。
PEFT 0.21.0配置参考明确列出use_rslora对应的两种规则。若已有逐层rank或alpha配置,应核对每一层最终使用的值,而不是只看一个全局默认参数。站内LoRA参数量文章讨论矩阵大小,这篇进一步追踪缩放如何进入更新。
同样的alpha,两种规则并不在同一尺度
取α=8。r=16时,标准系数为0.5,rsLoRA为2;若固定同一份A、B和输入,后者分支输出是前者的4倍。一般地,在相同r和alpha下,两种系数之比是√r。
这个比较只固定矩阵以后讨论一次前向,不代表两次训练最终学到的矩阵也相同。开启use_rslora后直接沿用所有超参数,可能连初始更新尺度都改变。应把它视为新的实验条件,而不是一个保证提分的免费开关。
为什么初始输出为零,训练仍能开始
常见初始化把B设为零,A随机初始化。此时BAx=0,模型初始前向与原线性层一致。PEFT文档也说明了这种默认的无操作初始化;其他初始化策略可能不同,应检查实际配置。
在这个普通线性分支里,损失对A的梯度含B,所以B=0时A的首步梯度为零;对B的梯度却含A,只要输入、A和上游梯度合适,就可以非零。不能从“初始适配器输出为零”推断“两个矩阵都没有梯度”。
初始化 B=0
适配器输出为0
反向传播
B梯度可非零,A梯度为0
一次SGD
B开始变化
更新后的输出
同时受缩放与秩影响
把首步SGD完整算一遍
为了把尺度看清,构造标量输入x=1、基础权重W=0、目标1、损失L=½(y−1)²。让r个A分量交替取±1,B分量初始全零,使用普通SGD学习率η。此时误差为−1,第i项B梯度是−s aᵢ。
更新以后bᵢ=ηs aᵢ,适配器输出变为sΣbᵢaᵢ=ηs²Σaᵢ²=ηs²r。标准规则得到ηα²/r;rsLoRA规则得到ηα²。这里的r依赖来自明确的构造,不能直接当作真实模型任意训练阶段的定律。
# Scalar linear teaching model. No PEFT, neural model, or GPU is run.
import math
def scale(alpha, rank, rs=False):
if not isinstance(rank,int) or isinstance(rank,bool) or rank<=0:
raise ValueError("rank must be a positive integer")
return alpha/(math.sqrt(rank) if rs else rank)
def one_step(rank, alpha=8., eta=0.01, rs=False):
a = [1. if i%2==0 else -1. for i in range(rank)]
b = [0.]*rank
x, base_w, target = 1., 0., 1.
s = scale(alpha,rank,rs)
pred = base_w*x+s*sum(ai*bi for ai,bi in zip(a,b))*x
error = pred-target # loss = 0.5 * error**2
grad_b = [error*s*ai*x for ai in a]
grad_a = [error*s*bi*x for bi in b]
assert all(g==0 for g in grad_a)
assert any(g!=0 for g in grad_b)
b = [bi-eta*g for bi,g in zip(b,grad_b)]
output = base_w*x+s*sum(ai*bi for ai,bi in zip(a,b))*x
merged_w = base_w+s*sum(ai*bi for ai,bi in zip(a,b))
assert math.isclose(output,merged_w*x,abs_tol=1e-12)
return output
for r in [4,16,64]:
standard = one_step(r)
stabilized = one_step(r,rs=True)
assert math.isclose(standard,0.64/r,abs_tol=1e-12)
assert math.isclose(stabilized,0.64,abs_tol=1e-12)
assert math.isclose(scale(8,r,True)/scale(8,r),math.sqrt(r))
print(r,round(standard,4),round(stabilized,4))
assert one_step(16,eta=0.)==0.
try:
scale(8,0)
except ValueError:
pass
else:
raise AssertionError("invalid rank accepted")
代码已本地执行。α=8、η=0.01时,r为4、16、64的标准首步输出依次是0.16、0.04、0.01,rsLoRA均为0.64。还验证了A与B的初始梯度区别、合并前向相等、零学习率和非法rank;没有运行PEFT或任何模型微调。
0.16
0.64
0.04
0.64
0.01
0.64
这个小例子能证明什么,不能证明什么
它证明了一个具体更新中缩放会出现两次:一次进入梯度,一次进入更新后的前向输出。因此只说“系数大四倍”,还不足以描述一次SGD之后输出改变了多少。本例在相同r下两种首步输出之比为r。
rsLoRA原文A Rank Stabilization Scaling Factor for Fine-Tuning with LoRA于2023年11月28日以arXiv预印本公开。论文研究的是有特定初始化、矩与渐近条件的秩稳定性;本文只用它确认方法来源与讨论范围,不把这个标量例子冒充论文定理的完整证明。
我们的A是为算清Σaᵢ²而固定的±1序列,不是大模型权重的真实分布。实际训练中,数据、非线性层、优化器、精度和两个矩阵的后续变化都会影响结果,所以不能由图中0.64推断某个任务的loss或准确率。
把学习率调小,能否替代缩放
对于这个首步、普通SGD、其余量固定的例子,ηs²控制输出变化,因此可以构造不同η与s得到相同首步输出。但这只是一个受限等价关系;它没有证明整条训练轨迹等价。
后续A与B同时更新,动量或自适应优化器引入历史状态,其他可训练模块还可能使用不同学习率。把rsLoRA改动一句话归结为“换个学习率就完全一样”,会把这些条件省略掉。反过来,也不能说改变缩放以后完全不必重新考虑优化器设置。
保持系数不变,也不等于保持首步不变
有人随rank增大alpha,让标准规则始终满足α/r=c;rsLoRA也可以令α=c√r,使s保持为c。这两种写法确实能固定前向乘数,但在本文Σaᵢ²=r的构造里,首步输出仍为ηc²r,会随r变化。
因此“固定alpha”“固定s”“固定一次更新后的输出”是三种不同的对照。要报告实验控制了哪一种,不能只说“保持缩放一致”。这个判断也解释了为什么比较超参数表时,必须同时看初始化与优化步骤;单个比值并没有描述所有变化。
怎样做一次能解释结果的rank对照
先固定数据划分、目标模块、训练token预算、批量与优化器,再明确实验是在比较容量,还是比较某套完整训练配方。若只是改r而保留alpha,标准规则下s也变了,应在记录中把两项变化一起写出来。
可以逐组记录r、alpha、实际s、可训练参数量、初始化、学习率和训练预算。选择指标前先决定任务需求:验证损失、任务正确率或其他有标签指标不能互相替代。不要因为训练损失更低,就推断泛化或输出质量必然更好。
资源约束也应真实记录。更高rank通常增加适配器参数与训练开销;模型合并后的推理路径与保留适配器分支的路径不同,不应把某一路径的成本结论直接套到另一路径。本文不提供未测量的显存或吞吐表。
保存权重时,也要保存缩放约定
同一份A和B若按不同s加载,得到的ΔW=sBA就不同。只留下矩阵文件,却丢掉rank、alpha、use_rslora和基础模型版本,会让结果难以复现。对逐层配置还要保存它们实际匹配到哪些模块。
在合并或导出前,用一小组非敏感输入比较未合并与合并路径。保持精度与推理模式一致,并为数值误差设定符合实际条件的容差。本文代码在标量模型里验证了这条等式,但没有替你验证某个量化检查点或部署框架。
选alpha时,先确认你正在比较什么
没有脱离模型、任务与训练预算的统一最佳alpha。先核对生效系数与初始化,再用小规模受控实验观察更新和验证指标,才值得把资源投入更高rank。这样得到的是有条件的证据,而不是从一张超参数表复制来的确定答案。
如果首步推导与记录方法帮你发现一次混在rank实验里的尺度变化,欢迎通过文末自愿支持。
来源与补发说明
PEFT 0.21.0 LoRA配置参考;rsLoRA预印本原文。两图、标量示例与数值为原创教学推导,无模型训练成绩。本文于10月16日补发,文章日期保留当天09:00。
支持
如果文中的解释或示例帮你解决了问题、节省了时间,欢迎自愿打赏支持本站。
二维码可点击放大。更多支持方式见支持页面。


