参数高效微调:LoRA、QLoRA 与 Adapter 家族
讲清为什么不必每次都更新全部参数,重点拆解 LoRA 的低秩分解原理与它为何用极小训练成本逼近全参效果,比较 QLoRA、Adapter、Prefix/Prompt Tuning 的适用场景与取舍
- 理解「冻结基座、只训练少量额外参数」的核心思想
- 看懂 LoRA 的低秩分解 W′=W+BA 与秩 r 的含义
- 说清 LoRA 省显存、可插拔切换的工程优势
- 区分 LoRA/QLoRA/Adapter/Prefix Tuning 的适用场景
能不能不动庞大的基座
全参微调要为每个参数保存梯度和优化器状态,成本随模型规模水涨船高,而且每适配一个任务就存一整套模型副本,极不划算。参数高效微调(PEFT)的共同思想是:冻结预训练权重,只引入并训练极少量额外参数,让这些「小补丁」承载任务差异。
LoRA:给权重加一条低秩「旁路」
LoRA(低秩适应)假设:模型适配新任务所需的权重变化是低秩的——也就是说,巨大的权重矩阵 W 只需要在一个低维方向上调整。它不直接改 W,而是并行加一条小旁路:先用一个「降维」矩阵 A 把特征压到秩 r,再用「升维」矩阵 B 还原回去,输出为 W′x = Wx + BAx。训练时 W 冻结,只训很小的 A 和 B。
输入 x
冻结的原权重 W(不训练)
保留基座全部能力
低秩旁路 B·A
A 降到秩 r、B 升回;只训练 A、B,参数量极小
两路相加得到适配后输出
秩 r 远小于原矩阵维度,因此 A、B 参数量只是 W 的零头,训练显存和时间大幅下降,且多个任务可以共用同一个基座、各自挂不同的小 LoRA 权重,随时热插拔切换。推理时还可以把 BA 合并回 W,不增加额外计算。
为什么「适配新任务所需的权重变化是低秩的」这个假设站得住?直觉是:基座模型已经把通用语言学得很好了,适配某个具体领域(比如客服、法律、某种语气),并不需要改动整个权重矩阵的每个角落,通常只需要在少数几个方向上做调整。巨大的 W 是千百万个数排成的矩阵,但任务带来的变化往往集中在一个低维子空间里——用两个小矩阵 A、B 的乘积去表示这个变化,参数量从 d×d 骤降到 d×r + r×d,而 r 常常只有几到几十。这就是 LoRA 省得惊人却效果不差的根:它没有假装任务不需要学习,而是抓住了「任务变化是低维的」这个结构。工程上,同一个基座挂几十上百个不同 LoRA,想切风格就换一个小文件,这已经成了社区分发模型能力的标准方式。
r 是给「任务调整」预留的维度容量。r 太小,能学的调整有限;r 太大,参数变多、也更易过拟合。实践中从较小的秩开始试,按效果调整,是典型的容量—成本权衡。
LoRA 为什么能做到「推理不变慢」?关键在于它训练时是旁路,推理时可以合并:训完之后把 B·A 这个增量直接加回原权重 W,得到一个新的权重矩阵,之后前向传播就和普通模型一模一样,没有额外计算分支。这意味着你用极小的成本训出了任务适配,部署时却不必为它付出推理代价。它的可插拔性同样来自这个结构:基座 W 冻结不动,每个任务只是几 MB 到几百 MB 的小 A、B 文件,需要哪个任务就挂上哪个,想换风格几秒钟搞定。QLoRA 则再往前一步——把基座权重量化到 4bit 存着,省掉一大半显存,只对那点 LoRA 参数用高精度训练,于是在单张消费级显卡上微调一个很大的模型成为现实。它牺牲一点基座的数值精度,换来的是普通人也能做领域微调。
PEFT 家族对比
LoRA
旁路低秩矩阵,效果稳、最通用,可合并回主干,当前事实主流
QLoRA
把基座量化到 4bit 冻结,再训 LoRA,进一步压显存,单卡可微调较大模型
Adapter
在层间插入小型瓶颈模块,思路更早,会增加一点推理路径
Prefix/Prompt Tuning
只训练一小段可学习前缀向量,参数最省,适合风格/分类类轻任务
更新全部参数,效果上限高
显存/存储成本高,每任务一份全量
适合有充足算力、追求极致
冻结基座、只训少量参数
省显存、多任务可插拔、可合并
适合绝大多数领域/任务适配与个人实验
LoRA 在「效果接近全参」和「成本极低」之间取得了最佳平衡,再叠加可插拔特性,使得「一个基座 + 一堆任务小补丁」成为标准工作流:社区分享的也往往是几十到几百 MB 的 LoRA 权重,而非整套模型。理解低秩假设,就抓住了这一整类方法的本质。
什么时候还得回到全参微调?当任务需要从根本上改变模型能力、而不只是「换个风格/领域」时,低秩旁路的容量就可能不够——比如要给模型加入全新的语种、或大幅改变它深层的知识结构,光靠几维的旁路调整不动。此外,如果显存充裕、追求极致效果、且只部署一个任务,全参微调的上限仍然更高。现实中的取舍很务实:绝大多数领域适配、个人实验、多任务并存的场景,LoRA/QLoRA 的性价比压倒性地好;只有在少数「要榨干模型上限」的场合,才值得付出全参微调的成本。记住这个判断:LoRA 不是万能,但它把「微调」这件从前只有大团队玩得起的事,下放到了普通开发者手里。
LoRA 能大幅降低微调成本的根本原因是?
资深工程师加餐
底层原理 · 大厂视角 · 工程经验,点卡片展开
先查数据:标签是否正确、有没有特征和标签泄漏、是否做了归一化;再查损失与学习率:学习率太大震荡、太小几乎不动;接着看批量大小和优化器,最后才怀疑模型结构。一个极好用的冒烟测试是:用极少量样本训练,看损失能不能被压到接近零——能,说明整条代码链路是通的;不能,问题一定在实现里,先别谈调参。