
在 2026 年微调一个开源大模型,LoRA(Low-Rank Adaptation,低秩适应)几乎已经是默认选项。但一个让很多人头疼的现实是:真正动手的时候,一堆超参数——rank 取多少、alpha 怎么设、dropout 要不要、只调注意力层还是所有线性层——大多数人还是靠猜,或者照抄某个教程的默认值。Lightning AI 的研究员 Sebastian Raschka,这位写了《Build a Large Language Model (From Scratch)》的 ML 教育者,用一系列可复现的实验,把这些「靠猜」的地方一个个变成了「有结论」的地方。
速览卡:这位大佬和他说了什么
| 项目 | 内容 |
|---|---|
| 大佬 | Sebastian Raschka |
| 身份 | Lightning AI 研究员、ML 教育者、《Build a Large Language Model (From Scratch)》作者 |
| 出处 | 个人博客 sebastianraschka.com、Lightning AI 实验、GitHub |
| 时间 | 2024-2026 年持续更新的系列实验与教程 |
| 核心观点 | LoRA 应覆盖所有线性层而非仅注意力层;rank 与 alpha 的取舍有明确规律;参数高效微调是 2026 年的实用主流 |
Raschka 说了什么
Raschka 在 LoRA 上最有影响力的一组结论,来自他对「LoRA 应该应用在哪些层」的系统实验。很多教程默认只把 LoRA 加在注意力机制的 Q(query)和 V(value)投影矩阵上,这是 LoRA 原论文的默认设置。但 Raschka 的实验发现了一个反直觉、却稳定的规律:
把 LoRA 应用到所有线性层,而不只是注意力的 Q 和 V 矩阵,能稳定地提升下游任务性能。
这个结论在社区里被反复验证。有教程作者直接指出:「HuggingFace PEFT 库的默认配置只覆盖注意力层,这实际上把一部分可获得的性能提升留在了桌面上。」在 Unsloth 里,对应的设置是 target_modules="all-linear"。
关于 rank(秩)这个最常被问到的参数,Raschka 的实验也给出了边界:
对大多数任务,r=16 就足够了;但 Raschka 发现,非常大的 rank(比如 r=256)在某些特定任务上确实有帮助,不过 r=16 到 64 已经覆盖了实用的范围。
换句话说,rank 不是越大越好,也不是越小越好,而是有一个「够用区间」,超过这个区间边际收益骤降,除非你在做某种需要大量知识注入的特定任务。
背景:为什么是 LoRA,以及它解决了什么
要理解这些结论的价值,先得理解 LoRA 解决的核心痛点。
全参数微调(full fine-tuning)的问题很简单也很致命:一个 70B 的模型,全参数微调意味着要更新、存储、部署一整套几百 GB 的新权重。这在显卡、存储、推理成本上都贵得离谱,而且每做一个新任务就要存一份完整的模型副本。对绝大多数个人开发者和中小团队来说,这条路根本走不通。
LoRA 的思路是一个优雅的「减法」:冻结预训练模型的原始权重,不更新它们;在每一层旁边注入一对很小的可训练矩阵(A 和 B,都是低秩的),只训练这两个小矩阵。训练完成后,这两个小矩阵(adapter)通常只有几十 MB 到几百 MB,而原始模型纹丝不动。这带来的好处是立竿见影的:可训练参数量减少多达 10000 倍,显存占用大幅下降,训练时间缩短,而且每个任务的产出只是一个「小文件」而不是一整个「大模型」。
QLoRA 则在这个基础上再进一步,把冻结的原始权重做 4 位 NormalFloat 量化,让显存占用再砍掉一半左右。这直接解锁了「在消费级显卡上微调大模型」这件事——一个 7B 模型,QLoRA 下大概只要 6-10 GB 显存,一张免费的 Colab T4(16GB)就能跑。
Raschka 是这个领域里少有的「既写教材、又跑实验、还把结论公开」的人。他的价值不在于发明了 LoRA,而在于把「怎么正确地用 LoRA」这件事,从玄学变成了工程。
核心观点展开:一套可以直接抄的超参数
把 Raschka 的实验结论和 2026 年的社区最佳实践合并,可以得到一份相当完整的「LoRA 微调默认清单」。以下是几个最关键、也最容易被问到的参数。
Rank(r):从 16 起步。rank 决定 adapter 的容量——rank 越高,可训练参数越多,表达力越强,但也越吃显存。对大多数任务,r=16 足够;简单任务(二分类、严格 JSON 格式输出)甚至可以降到 r=4 或 r=8,反而能防过拟合;需要深度知识注入的复杂任务(医疗推理、学一门新语言)才需要往 r=128 甚至更高走。一个值得记住的规律:rank 不够时,LoRA 会退化——当数据集的信息量超过 adapter 参数能存下的量时,效果会打折扣。
Alpha:设成 rank 的 2 倍。alpha 是 adapter 输出的缩放系数,alpha/r 这个比值实际上控制着 adapter 的「有效学习率乘数」。社区通行的经验法则是 alpha = 2 × r(比如 r=16 就设 alpha=32)。有些更精细的做法(如 rsLoRA)会按 alpha/√r 来缩放以稳定高 rank 训练,但对大多数人来说,2 倍关系是个稳妥的起点。
Target modules:覆盖所有线性层。这是 Raschka 最有价值的结论之一。LoRA 原论文只调注意力层,但实验表明把 MLP、前馈网络里的线性层也一并覆盖,性能更稳。别再用 PEFT 默认的「只调 q_proj、v_proj」,用 Unsloth 的 target_modules="all-linear",或手动把 k_proj、o_proj、gate_proj、up_proj、down_proj 都加进去。
Dropout:0.05。一个小的 dropout 能帮你在小数据集上防过拟合。有些实践者设 0,但在数据量小的情况下,保留 0.05 更稳。
学习率:2e-4 起步,配合余弦退火。LoRA 的学习率通常比全参数微调高一个数量级。一个重要的背景知识:LoRA 的参数化方式改变了有效步长,所以学习率要设得比全参数微调的「最优值」高约 10 倍。2e-4 是个好起点,配合余弦退火 + 线性预热(预热步数约为总步数的 5-10%)。
训练轮数:1-3 轮。小数据集上多跑几轮会快速过拟合,1-3 轮对大多数任务够用,边训练边监控验证损失。
梯度检查点:永远开启。它用约 20% 的额外计算,换回巨大的显存节省,几乎总是划算的。
行业内的讨论与不同声音
LoRA 虽然已经成为主流,但它并不是没有争议,Raschka 的「所有层都覆盖」结论也并非铁律。
一个绕不开的问题是:LoRA 到底能不能追平全参数微调?2025 年那篇《LoRA Without Regret》的研究给出了一个相当正面的答案:只要配置正确——adapter 覆盖所有层(包括 MLP)、学习率设为全参数微调最优值的约 10 倍、rank 给足数据所需的容量——LoRA 在监督微调和 RL 后训练上都能追平全参数微调。甚至有一个惊人的发现:在 GRPO 式推理后训练里,因为策略梯度更新每一步携带的信息量很少,rank=1 的 LoRA 就能追平全参数微调。这意味着对做 RL 后训练的团队来说,LoRA 已经不是「妥协」,而是「默认」。
但也有声音提醒别过度神化 LoRA。一个反复被提及的边界是:当数据集非常大(相对于 adapter 容量)时,LoRA 会退化;以及做「持续预训练」(continual pre-training)时,全参数微调往往仍有优势。换句话说,LoRA 的强大是有前提的——它最适合「在已有强基座模型上做任务适配」,而不是「从零注入大量新知识」。
此外,LoRA 的「变体生态」在这两年已经收敛。DoRA(方向性 LoRA)、rsLoRA(按 alpha/√r 缩放以稳定高 rank)、以及 PiSSA、LoftQ 这类初始化方案,都已经被整合进 HuggingFace 的 PEFT 库。实践上,2026 年的大多数微调,是 QLoRA 或 DoRA 跑在 PEFT、Axolotl、Unsloth、LLaMA-Factory 这些框架上,而不是手写训练循环。
横向扩展:训练完之后,adapter 的去留是个架构决策
Raschka 和社区反复强调的一件事,是 LoRA 的价值不止在训练,更在部署。
训练完成后,你面临一个选择:合并导出,还是保留 adapter 分开用?这两条路对应两种完全不同的推理架构。
第一条路是「合并导出」:调用 merge_and_unload() 把 adapter 的权重折叠回基座模型,得到一个标准的、零推理开销的单一模型,再导出成 GGUF 给 Ollama、LM Studio、llama.cpp 用。这条路适合「你只有一个微调任务、想要最大简洁度」的场景。
第二条路是「保留 adapter 分开服务」:基座模型只存一份,不同任务(甚至不同客户)的 adapter 各自独立,推理时按请求动态加载对应的小 adapter。这条路适合「你有一堆微调变体,不想存 N 份几百 GB 的模型」的场景。像 vLLM 和 S-LoRA(Scalable LoRA)这样的框架专门为这种「多租户动态 adapter 服务」设计——在单次前向传播里,共享的基座模型负责计算大部分重矩阵乘法,专门的 CUDA kernel 把不同请求路由到各自的轻量 LoRA 分支。这能把「给几百万用户同时提供个性化模型」的成本,降到原来的一个零头。
这个「adapter 可热插拔」的特性,是 LoRA 相对全参数微调最根本的架构优势——它把一个「模型」变成了一个「可组合的模块」,也催生了「模型合并」(model merging)这个方向:因为 LoRA adapter 本质是加性权重矩阵,你可以用线性插值、SLERP 球面插值、task arithmetic 把「代码 adapter」和「写作 adapter」合并成一个「既会写代码又会写文章」的模型。
一个更深的产业观察也值得写下来:Raschka 和很多一线实践者的共识是,「模型按任务塑形,胜过一个大模型通吃」。别试图微调一个「什么都能干」的模型,而是为每个任务训练一个独立的 adapter,推理时按需切换。这在成本和质量上都更优。
把训练数据准备好:比调参更前置的一步
Raschka 和几乎所有一线实践者反复强调的一点是:在纠结超参数之前,先把数据准备好。因为数据质量的权重,远大于任何单个超参数的权重。
先说格式。微调数据通常有两种主流格式:Alpaca 格式(单轮,instruction/input/output 三段)和 ShareGPT 格式(多轮对话,messages 列表)。选哪种取决于任务类型——单轮指令遵循用 Alpaca,多轮对话用 ShareGPT。这个选择看似简单,但搞错了会让后续训练事半功倍。
再说数据清洗,这是最容易被偷懒、也最致命的一步。社区总结出的四个标准动作是:去重(移除内容重复的样本)、去噪(修正格式错误和拼写错误)、过滤(移除质量不达标的样本)、平衡(确保各类别样本数量均衡)。这四件事里,很多人只做「去重」就以为够了,其实「过滤低质样本」才是决定模型上限的那一步。
一个更具体、也更有用的判断标准是:数据量的边际收益曲线。对于格式/风格转换任务,200-500 条高质量样本通常就够了;领域知识注入需要 1000-5000 条;复杂指令遵循需要 5000-10000 条。注意那个被反复验证的结论——数据量超过一定阈值后,边际收益急剧下降:从 5000 条加到 10000 条,效果提升通常不到 5%。所以「更多数据」不是答案,「更多有区分度的数据」才是。
还有一个被很多人忽略、但极其重要的前置动作:先建立评估基线。在花 GPU 时间之前,先用你手头的数据,测一下「提示词 + 上下文学习」的基线表现(比如 few-shot prompting)。只有当微调能「有意义地」超过这个基线时,才值得去微调。如果微调后的模型连提示词基线都打不过,那就别部署它——这是 Raschka 和社区反复强调的一条铁律。用一个简单的 checklist 来说:能不能用提示词解决?如果能,别微调;数据够不够(至少 500 条有区分度的样本)?如果不够,先补数据;基座模型选对了吗?如果没选对,微调也救不回来。
2026 年的完整微调技术栈:一条被验证过的路径
把 Raschka 的实验和社区实践合起来,2026 年微调一个开源模型,有一条相当清晰的「黄金路径」。它不复杂,但每一步都有讲究。
第一步,选基座模型。2026 年年中的共识是,Gemma 4 12B 在「同显存下性价比」上表现突出,是大多数任务的默认选择。但选基座的原则比具体型号更重要:先确认你的任务和基座模型的强项是否匹配,而不是盲目追最新最大的。
第二步,选方法。除非你有特殊理由,否则 QLoRA 是默认——它在 LoRA 的基础上把基座权重做 4 位量化,显存再省一半,几乎无损。配 Unsloth 能拿到 3-4 倍的吞吐提升(融合的交叉熵、自定义 CUDA kernel、异步梯度检查点)。
第三步,配参数。就是前面那套默认值:r=16、alpha=32、dropout=0.05、lr=2e-4 余弦退火、所有线性层、1-3 轮、开梯度检查点、max_seq_length=2048(除非你的数据真有长文档,否则别盲目加长——长序列吃显存是二次方增长的)。
第四步,评估再部署。和提示词基线对比,有意义的提升才部署。部署时再决定是「合并导出 GGUF」还是「保留 adapter 分开服务」。
这套路径的价值在于,它把「微调一个专用模型」的成本打到了一个史无前例的低位。Raschka 和社区传递的一个很有感染力的观察是:一张 1500 美元的 RTX 4090、30 分钟的训练时间,就能产出一个两年前要花几万美元算力才能做出来的专用模型。「我有个想法」到「我有个部署好的专用模型」之间的距离,从来没有这么短过。而让这件事成立的底层技术,就是 LoRA 那两个小矩阵——以及一套被 Raschka 这样的研究者用实验跑出来的、可复制的默认值。
总结与启示
Raschka 关于 LoRA 的贡献,可以浓缩成一句可操作的话:把 LoRA 覆盖到所有线性层,rank 从 16 起、alpha 设 2 倍、dropout 0.05、学习率 2e-4 配余弦退火,训练 1-3 轮,开梯度检查点。这套默认值,他在三个不同模型家族上验证过「就是能用」。
但对一个工程师来说,比「记住这串数字」更重要的,是理解背后两条判断原则。
第一条:先问「提示词能不能解决」,再决定要不要微调。一个被反复强调、却总被忽略的事实是,80% 的微调项目在开始之前就该被「提示词能不能解决」这个问题过滤掉。如果你用 5-10 个示例做上下文学习就能搞定,或者数据不足 500 条,那提示词或 RAG 几乎总是更好的起点。微调是那 20% 场景的答案——你需要跨成千上万次输出保持一致的格式,你有领域术语基座模型处理不好,或者你想通过删掉冗长的系统提示词来降低推理成本。
第二条:数据质量比超参数重要一个数量级。再漂亮的 LoRA 配置,也救不了一份脏数据。社区里流传的一个标准是:每一条训练样本,都应该是「你愿意拿它当模型输出的样子」。一条低质样本,就是在教模型「低质是可以接受的」。数据量上也有一个清晰的参考区间:格式/风格适配 200-500 条够用,领域知识注入需要 1000-5000 条,复杂指令遵循需要 5000-10000 条;超过阈值后边际收益骤降——从 5000 条加到 10000 条,提升通常不到 5%。
最后,Raschka 的实践还传递了一个更宏观的判断:2026 年,「我有个想法」到「我有个部署好的专用模型」之间的距离,已经史无前例地短。一张 1500 美元的 RTX 4090、30 分钟训练时间,就能产出一个两年前要花几万美元算力才能做出来的专用模型。工具链的成熟(Unsloth + QLoRA + PEFT),让微调这件事第一次真正「民主化」了。而让这件事成立的底层技术,就是 LoRA 那两个小矩阵。
参考来源
- Sebastian Raschka 个人博客:https://sebastianraschka.com/(LoRA/QLoRA 系列教程与实验)
- Kunal Ganglani《Fine-Tune Open-Source LLMs: LoRA, QLoRA, Gemma 4 [2026]》
- Klu Glossary《Parameter-Efficient Fine-Tuning (PEFT)》
- 《LoRA Learns Less and Forgets Less》及《LoRA Without Regret》相关研究
- Databricks Blog《Dolly: Open Instruction-Tuned LLM》(指令数据侧背景)

