训完了,loss 也确实降了,但一评测就是没效果。遇到这种情况,多数人的第一反应是怀疑数据:重新洗一遍数据、换更高质量的样本再训,还是不行,就开始怀疑基座模型,甚至怀疑垂域微调这条路本身走不通。
但真正的原因可能朴素得多:学习率给小了,小了一个数量级。
这周知乎上就有个问题直接问:在对大语言模型进行LoRA微调时,如何设置恰当的学习率?知乎小红书 8 月 25 日的一篇经验帖说得更直白:很多同学会照着全参的经验用5e-5,跑完就说没效果。小红书这个学习率放在 LoRA 上,就是压根没学动。
被反复绊倒的同一个坑
这不是个别感受。知乎用户 Aura 的团队做垂域知识模型时,完整记录了这段弯路:一上来,我先用 LoRA 训练,一点都没效果。我判断是数据多样性不够,于是混了各种数据,benchmark 分数还是波动不大,甚至基本保持不变。我以为是数据质量不够,然后我又洗了很多数据,继续训练,还是没什么明显效果。知乎数据洗了一轮又一轮,唯独没怀疑训练超参,直到他们回头去验证训练轮数这类设置,才走上正路。
最优学习率:全参微调的 10 倍
去年 9 月,Thinking Machines 与 John Schulman 等人发布的实验报告《LoRA Without Regret》做了一件很彻底的事:他们对 14 个不同的 Llama 和 Qwen 模型,系统扫描了全参微调与 LoRA 各自的学习率,覆盖 Tulu3、OpenThoughts3 指令微调数据集和数学推理强化学习任务。Thinking Machines
结论很明确:LoRA 的最优学习率在同一任务里始终是全参微调的 10 倍左右,监督微调和强化学习都成立。Thinking Machines机器之心的报道也用中文印证了同一点:LoRA 的最佳学习率约是 FullFT 的 10 倍,这意味着在相同条件下 LoRA 可以接受更高的学习率。机器之心
这个倍数关系适用的范围宽得惊人:实验里缩放因子 α 固定为 32,从 rank=4 到 rank=512,最优学习率的变化不超过 2 倍。Thinking Machines
如果是 100 步以内的短训练,倍数还要更高,约 15 倍,训练拉长后才收敛回 10 倍。Thinking Machines
为什么 LoRA 反而需要更大的学习率?LoRA 不动被冻结的原始权重,而是在旁边加一条并行的低秩分支,分支输出是缩放系数 α/r 乘以两个小矩阵 B 和 A 的乘积。其中 B 初始化为零,训练早期无论 A 怎么更新,分支输出都是零,直到 B 慢慢长大,这条分支的影响才逐渐上升。也就是说,LoRA 是慢热的:同样的名义学习率下,它早期的有效更新比全参微调更小,初始值就必须给得更高。这也解释了短训练的 15 倍关系:训练时间越短,B 越没长起来,越需要更高的学习率来补偿。
报告里的扫描曲线直接展示了这种差别:全参微调与各 rank LoRA 的最优学习率区间,整整错开了一个量级。

第二个坑:LoRA 只挂在注意力层
学习率设对之后,第二个坑更隐蔽:LoRA 挂在哪几层。LoRA 原始论文建议只挂在注意力矩阵上,很多教程和框架默认配置也照此办理。Thinking Machines 的实验直接推翻了这个做法:只挂注意力层的 LoRA 明显不如只挂 MLP 层,而且在已经挂了 MLP 层的基础上,再给注意力层加 LoRA 也没有任何提升。Thinking Machines
而且这个差距没法用参数量解释:在 Llama-3.1-8B 的实验里,注意力层独占 rank=256 与 MLP 独占 rank=128 的可训练参数量几乎相同(0.25B 对 0.24B),前者的效果却明显更差。Thinking Machines
所以结论很简单:LoRA 挂到所有层,至少覆盖 MLP 和 MoE 层。机器之心的报道也是这么总结的:即便在小数据场景,将 LoRA 应用于所有权重矩阵,尤其是 MLP 与 MoE 层,均能获得更优表现。机器之心
报告里的注意力层独占与 MLP 独占对比曲线如下。

第三个坑:batch 开太大
如果你是照着全参微调的经验设 batch,还有一个坑在等着。系统实验发现:在一些设置下,LoRA 对大 batch 的容忍度比全参微调更低,batch 越大,性能差距越大,而且与 rank 无关。Thinking Machines机器之心的总结也强调了这一点:此外,LoRA 对大批量训练的容忍度低于 FullFT 。机器之心
实验里,batch 超过某个阈值之后,LoRA 的损失代价越来越大,而且这个代价靠提高 rank 也救不回来——它来自 LoRA 矩阵乘积参数化本身的训练动力学。实操建议:如果你照全参经验把 batch 开得很大、loss 曲线不对劲,先把 batch 降下来,再谈别的。

第四个坑:知识任务套用"一个 epoch 就够"
如果你做的是垂域知识注入,还有第四个坑:全参圈流传的"SFT 一个 epoch 就够",在 LoRA 上同样不成立。Aura 的实验一共评测了 4739 条问答:LoRA ep1 的 ROUGE-1 已经达到 0.6122,说明模型输出的表达形式、句式和参考答案已经比较接近了。但是 Exact Match 只有 2.45%。知乎格式看起来像答案了,关键事实还没进去。
LoRA 并不是没救:继续训,从 ep1 到 ep5,语义正确率从 47.52% 提到了 81.64%。
Aura 把这个现象总结为:ROUGE 提升得很快,但 Exact Match 提升得很慢。知乎模型先学会的是怎么回答——格式和语气;要记住回答什么——关键事实——需要更多轮数。所以知识类任务别拿一个 epoch 判生死,用准确率指标说话。
一份可以直接抄的起步参数
不想深究原理的话,这里有一份社区实践验证过的起步参数:
学习率:lora的lr要高一个量级,我一般从2e-4开始,垂域任务在1e-4到3e-4之间,再结合cosine衰减,warmup给总步数的 3-5%。小红书
rank 与 alpha:从16起跑,alpha就32,欠拟合了再往64加。数据量不大的时候rank开太高是在学噪声。
target modules:挂所有线性层,至少覆盖 MLP(见第二个坑)。
batch:别照全参经验盲目开大(见第三个坑)。
评估:做几个下游的真实任务指标,比如事实核查集或者判断题。
如果 loss 曲线先降后平,多半是容量顶到了天花板:而低秩 LoRA 则会在适配器容量耗尽时偏离最小损失曲线。机器之心这时候再考虑把 rank 往上加。

跑完没效果,先过一遍诊断清单
别急着重做数据,先对照症状:
loss 纹丝不动:学习率太小,乘上几倍再试,上面的 10 倍关系就是对症的。
loss 降了、评测反而降:过拟合、样本背诵。知乎上有个完整的翻车复盘:辛辛苦苦洗了数据、配好环境、跑完训练,结果 BLEU 反而降了 4.22%。知乎事后定位,根子是只有 1140 条医疗问答,模型不是在学习而是在背诵,连训练样本里的套话都被原样背进了输出。
ROUGE 高、正确率低:格式学会了、事实没学会,加轮数(见第四个坑)。
loss 先降后平:容量瓶颈,考虑提高 rank。
两个新变化,以及什么时候换全参
最后说两个值得留意的变化。FP8 量化 LoRA 已经可用:fp8 lora 在 4090 及以上精度几乎无损,显存和速度都更好。小红书QLoRA 不再是低显存的唯一选择。
什么时候必须让位给全参微调?一是知识注入速度:全参所有参数都能直接更新,前几轮就能明显提升,上面的实验里,全量训练 2 轮的效果,仍然明显超过 LoRA 训练 5 轮。知乎二是数据规模:当数据规模超出 LoRA 参数容量时,其表现将落后于 FullFT,这种差距主要体现在训练效率的下降,而非无法继续优化。机器之心
想拉高 rank 又怕训练不稳,可以试试 rsLoRA:觉得麻烦的话可以直接上 rslora,把缩放从除以 rank 改成除以根号 rank,高 rank 下梯度更稳定。小红书
LoRA 已经是目前最热门的参数高效微调方法。机器之心但多数人手里那份超参经验,是全参微调时代攒下来的。下次 LoRA 再"没效果",别急着重做数据,先把学习率乘 10 再训一轮试试。被这个坑绊住的人真不少——8 月 28 日,B 站刚有视频专门讲 rank、alpha、targetmodules 和学习率这四个超参数该怎么设。哔哩哔哩