图 1:本文封面,三档秩的效果、成本与风险对比。
先说明属性:这是一篇经典题解析,题目出自本地历史面试资料整理,与任何公司的当前招聘无关。「LoRA 的 rank 设多少合适」没有标准数字答案,面试官真正想听的是你能不能把秩 r 背后的三方权衡讲清楚:它如何决定参数量与成本、如何影响效果上限、又如何与过拟合风险挂钩。
先把结构摆清楚:r 是瓶颈的宽度。
LoRA 冻结原权重 W,在旁边并联一个低秩增量 ΔW = B·A:A 把 d 维输入压到 r 维,B 再从 r 维升回 d 维。r 就是这条旁路中间瓶颈的宽度——它同时是信息通道的容量上限,也是参数量的计价单位。每层 LoRA 的可训练参数是 r × (d_in + d_out),对 r 严格线性。用一段脚本把这个账算出来(Node.js 22.15.0,node lora-rank.js),取 Transformer 常见的维度 d = 4096:
function loraParams(d, r) { return r * (d + d); }
const d = 4096;
for (const r of [4, 8, 16, 64]) {
console.log(`r=${r}: ${loraParams(d, r).toLocaleString('en-US')} 参数/层`);
}
console.log(`全量 ΔW(d×d): ${(d * d).toLocaleString('en-US')} 参数/层`);
实测输出:
r=4: 32,768 参数/层
r=8: 65,536 参数/层
r=16: 131,072 参数/层
r=64: 524,288 参数/层
全量 ΔW(d×d): 16,777,216 参数/层
r = 8 时每层只需约 6.6 万参数,不到全量增量的 0.4%;r 每翻一倍,参数量、训练显存里的优化器状态都跟着翻一倍。这条线性账本是讨论一切权衡的地基。
效果一侧:收益会饱和,不是越大越好。
2021 年发表的 LoRA 原论文(arXiv:2106.09685)做过系统的秩消融实验:在若干下游任务上对比 r 从 1 到 64 的效果,发现很低的秩(4 到 8 区间)已经能拿到接近全量微调的效果,继续增大 r 收益迅速进入平台期。论文给出的解释是,微调所需的权重更新本身具有很低的「内在秩」——ΔW 里真正重要的方向只有少数几个,小瓶颈已经装得下。要注意这个结论的适用边界:原论文的实验面向下游单一监督任务,而指令微调面对的是分布更广的指令集合,所需容量更大,所以工程实践里常见的起点比论文的甜点值更高,8 到 16 是多数任务的稳妥起步档,Hugging Face PEFT 库的 LoraConfig 默认 r 就是 8。
风险一侧:秩越大,越像全量微调,包括它的毛病。
r 增大意味着更多可训练参数,数据量撑不住时过拟合风险同步上升。几千条指令数据配 r = 64,模型很容易把训练集背下来而不是学会任务。反过来,数据充足、任务复杂(多任务混合、风格迁移幅度大)时,r 太小又可能欠拟合——瓶颈太窄,任务需要的更新方向装不进去。于是取舍规则就清晰了:数据量小(千条级)优先防过拟合,r 取 4 到 8;通用起步取 16;复杂任务或数据充足再上到 32 到 64,并且每一步都盯验证集效果说话,而不是凭感觉加码。顺带一提超参联动:PEFT 里 LoRA 增量的实际缩放是 alpha/r,调 r 而不动 alpha 会同时改变等效学习强度,很多实践直接把 alpha 设为 r 或固定值,把变量数减到最少。还有一个和秩同样重要的维度是「加在哪」:把预算摊到 Q、K、V、O 等多种矩阵上,通常好过把更大的秩集中砸在单一矩阵上——覆盖面往往比单点深度更值钱。
图 2:瓶颈结构、效果饱和曲线与三档选取建议。
面试现场的答题结构。
先给结论「没有固定最优值,经验起点 4 到 16」,然后摆出三方权衡:参数量随 r 线性增长(顺手报出 d = 4096 时 r = 8 约 6.6 万参数这层账);效果随 r 增长但很快饱和,引原论文消融——很低秩已接近全量微调效果,同时点明其适用边界在单一监督任务,指令微调通常要从 8 以上测起;过拟合风险随 r 和数据量的比值变化。最后落到实操流程收尾:从小秩起步,按验证集效果逐步上调,同时留意 alpha/r 的缩放联动。答到「r 是容量上限也是计价单位,选秩本质是给任务复杂度配预算」这一层,就把这道题从背数字升到了讲权衡。你实际微调时把 rank 设过多少?上调之后验证集真的变好了吗?欢迎聊聊你的实测经历。