考察点
LoRA 是微调方向的必考题。面试官想确认你理解三件事:为什么低秩矩阵能逼近全量微调的效果、参数量省在哪、推理时怎么处理 adapter。追问常考 r 的选择、QLoRA 的量化细节、LoRA 学不了什么。
参考答案
核心思想:冻结主干,只训一个低秩旁路
全量微调要更新模型的全部参数。一个 7B 模型,光参数存成 FP16 就是 14GB,训练时还要存梯度和 Adam 优化器的两个动量状态,显存需求轻松翻好几倍,单卡根本扛不住。
LoRA 的观察是:微调对权重矩阵的修改量 ΔW,虽然是个 d×d 的大矩阵,但它包含的有效信息其实不多,可以用两个小矩阵的乘积来逼近——ΔW ≈ B·A,其中 A 是 r×d、B 是 d×r,r 远小于 d(典型取 8 到 64)。原权重 W 完全冻结不训,前向时输出变成 W·x + B·A·x,反向传播只更新 A 和 B。
算笔账:d=4096 的权重矩阵,全量要训 1680 万个参数;r=16 的 LoRA 只训 4096×16×2 ≈ 13 万个,不到百分之一。整个模型注入 LoRA 后,可训练参数通常只有总参数的 0.1%~1%,7B 模型的 adapter 文件只有几十到几百 MB,消费级显卡就能训。
为什么低秩够用
直觉解释:预训练模型已经把通用语言能力学全了,下游任务的微调只是在这个高维空间里做一点「方向修正」,修正本身是个低维结构——这就是内在维度假说,下游任务的适配不需要动整个参数空间。实证上,r=8 和 r=256 在很多任务上效果差距很小,说明微调更新的有效秩确实不高。
工程含义反过来也成立:LoRA 擅长「调整行为」——输出格式、语气风格、任务遵循、领域术语用法;不擅长「灌输知识」。你想让模型记住一本它没见过的内部手册,LoRA 大概率记成一盘散沙,这种需求该走 RAG。
工程落地的几个关键决策
注入位置:最常见的做法是注入注意力层的 Q、V 投影(原论文方案),后来的实践发现把 K、O 和 FFN 层也纳入效果更好,多数框架默认注入所有线性层。代价是参数略增,收益通常值得。
秩 r 与 alpha:LoRA 有个缩放系数 alpha/r 控制旁路输出的权重。经验起点是 r=8 或 16、alpha 取 r 的 1~2 倍。任务和预训练差异大(比如强领域适配)再往上加 r;r 加太大不仅过拟合风险上升,训练成本也上去了,边际收益递减很快。
推理时合不合并:A、B 训完后可以直接乘回原权重 W' = W + B·A,推理时完全没有额外计算和延迟——这是 LoRA 相对其他 PEFT 方法最漂亮的性质。不合并也有场景:一个基座挂多个 adapter,按租户或任务热切换,多 LoRA 服务架构就是这么做的。
QLoRA 再省一档:把冻结的基座权重量化到 4bit(NF4 格式,针对正态分布权重设计的量化方案),只保留 LoRA 旁路用 FP16 训练,反向传播时梯度穿过量化层。单张 24GB 消费卡就能微调 7B 模型,QLoRA 是把微调门槛打到个人开发者能玩的关键一步,代价是基座量化带来少量精度损失,对多数下游任务可接受。
训练实践提醒
LoRA 训练照样会翻车,常见三个坑:学习率要比全量微调高一个量级(因为可训练参数少,2e-4 上下是常见起点);数据质量比数据量重要,几百条干净样本好过一万条脏样本;训练 loss 降了不代表行为对了,必须留评测集看实际输出。
可能的追问
- LoRA 能加在 LayerNorm 后面吗?LoRA 是设计给线性层的旁路,LayerNorm 没有大权重矩阵可分解;想调 Norm 参数可以直接放开训练,参数量小,但和 LoRA 是两码事。
- r 怎么选,有没有量化标准?没有银弹,从 8~16 起步看评测集表现,复杂任务逐步加到 64;超过 128 通常不如直接考虑全量微调的性价比。
- 合并权重会掉点吗?FP16 下 B·A 加回 W 数学上精确,几乎不掉;基座本身是量化格式(如 INT8)时合并会有舍入损失,线上量化部署建议实测。