2.3 PEFT家族对比与选型 本节摘要:参数高效微调(PEFT)是一大家子方法,LoRA 只是其中最受追捧的一个。本节把 LoRA、Prefix Tuning、Prompt Tuning、Adapter 这四个代表放在一起横向对比——它们各自把可训练参数塞在哪、推理开销多大、效果天花板多高、适合什么任务。读完你能跳出"只知道 LoRA"的局限,在遇到 LoRA 不合适的场景时知道换什么。
本节摘要:参数高效微调(PEFT)是一大家子方法,LoRA 只是其中最受追捧的一个。本节把 LoRA、Prefix Tuning、Prompt Tuning、Adapter 这四个代表放在一起横向对比——它们各自把可训练参数塞在哪、推理开销多大、效果天花板多高、适合什么任务。读完你能跳出"只知道 LoRA"的局限,在遇到 LoRA 不合适的场景时知道换什么。
阅读完本节,你应当能够:
前面两节我们只讲了 LoRA,好像它是微调的唯一答案。其实参数高效微调(PEFT,Parameter-Efficient Fine-Tuning)是一个大家族,LoRA 只是 2021 年后才流行起来的"后起之秀"。在它之前,Prefix Tuning、Prompt Tuning、Adapter 这些方法已经各自火过一轮。
为什么要了解这一大家子?因为 LoRA 不是万能的。有些场景下 Prefix Tuning 反而更合适(比如你要的是极轻量的软提示、完全不动模型结构),有些场景下传统 Adapter 在多任务融合(AdapterFusion)上有独到优势。只知道 LoRA 一种锤子,会把所有问题都当成钉子。
这一节我们就把这四个代表摊在一起比,重点不是背概念,而是搞清楚它们各自把"可训练的少量参数"塞在模型的哪个位置——这个位置决定了它们各自的特性。理解了这一点,选型就有依据了。
所有 PEFT 方法的共同思路是:冻结基座模型的绝大部分参数不动,只额外引入一小部分可训练参数来适配下游任务。这"一小部分"通常是全量参数的 0.1% 到 5%,却能逼近甚至持平全量微调的效果。
为什么这能work?因为大量研究(包括上一节提到的"权重更新低秩"观察)表明:大模型在适配下游任务时,真正需要变化的部分是高度压缩的,没必要让所有参数都动。PEFT 就是把这个观察工程化——只学那个"压缩的变化",省下巨量计算和显存。
各家方法的分歧在于:这"一小部分可训练参数"放在哪。放的位置不同,特性就不同。整个 PEFT 家族的分类树长这样:
下面这张图把四种 PEFT 方法的参数插入位置画在同一张 Transformer 层结构上,一眼就能看出它们的差异所在。

从图里能直观看出四种方法的位置差异:
Prompt/Prefix Tuning 把可训练参数放在输入端——在输入 embedding 前面拼上一段可学习的"软提示"向量(软,指它是连续向量不是离散词)。模型本身一字不改。Prompt Tuning 只在输入层加,Prefix Tuning 在每一层的注意力前都加前缀。它们最轻,参数最少。
Adapter 把可训练参数放在每一层的输出后——在冻结的 Transformer 层后面串一个小瓶颈网络(先降维再升维)。模型结构被改了(多了层),但因为瓶颈层很窄,参数量仍很少。
LoRA 把可训练参数并接在权重矩阵旁边——不串入新层,而是在原有权重的旁边加一条低秩支路。关键优势是训练完可以合并回原权重,推理时零额外开销。
把四种方法的关键维度列成表,差异更清晰:
| 方法 | 可训练参数位置 | 可训练参数量 | 推理开销 | 效果 | 训练稳定性 |
|---|---|---|---|---|---|
| Prompt Tuning | 仅输入层加软提示 | 极少(约0.01%) | 无 | 中,模型越大越好 | 较差(小模型上不稳) |
| Prefix Tuning | 每层注意力前加前缀 | 少(约0.1%) | 略增(占用上下文长度) | 中上 | 中 |
| Adapter | 每层后串瓶颈网络 | 中(约1-5%) | 增(多了串行层) | 高 | 好 |
| LoRA | 权重旁并接低秩矩阵 | 少(约0.1-1%) | 合并后为零 | 高 | 好 |
| 全量微调 | 全部参数 | 100% | 无 | 最高 | 好 |
💡 关键直觉:LoRA 能后来居上成主流,关键在"推理合并后零开销"这一点。Adapter 效果也好,但推理时多了一堆串行层,延迟和显存都涨;Prompt Tuning 参数最少但小模型上不稳定。LoRA 恰好在效果、稳定性、推理开销三者的平衡上最讨好。
虽然 LoRA 是主流,但其他方法在特定场景仍有优势:
虽然 LoRA 是默认选择,但下面这些情况可以考虑别的:
| 场景 | 推荐方法 | 理由 |
|---|---|---|
| 模型极大(千亿级) | Prompt Tuning | 参数更少,部署更省 |
| 多任务要知识共享 | Adapter + AdapterFusion | 组合多适配器实现增益 |
| 纯生成任务、追求生成质量 | Prefix Tuning | 前缀机制对生成有利 |
| 一般领域适配、改风格格式 | LoRA(默认) | 平衡最好,生态最成熟 |
Prompt Tuning 在小模型(几亿参数)上经常不稳定——训练初期 loss 抖动大、收敛慢,有时甚至完全不收敛。原因是软提示的作用随模型规模放大而增强:小模型上,几十个可训练向量撬不动整个模型;大模型上,模型本身能力强,软提示只需轻微引导就能改变行为。
⚠️ 常见坑:别在 7B 以下的小模型上用 Prompt Tuning 期待好效果。它从约 10B 参数开始才稳定有效,千亿模型上才真正发挥优势。小模型老老实实用 LoRA。
很多人以为 PEFT 是"穷人版微调",效果注定不如全量。这其实不准确。在大量基准测试里,配置得当的 LoRA 在多数任务上能持平甚至偶尔超过全量微调。原因是 PEFT 的强正则化(只训少量参数)反而抑制了过拟合,在数据量不大的场景下泛化更好。
PEFT 真正不如全量微调的场景是:任务需要模型学会全新的、复杂的推理能力(比如一门新编程语言的深度推理),这时低秩参数的表达力不够,全量微调才更合适。回到 2.1 节那个判断:PEFT 擅长调行为,全量擅长灌深度新能力。
Adapter 的 AdapterFusion 值得单独多说两句,因为它是 LoRA 难以替代的能力。设想一个场景:你有客服问答、摘要、翻译三个任务,每个都训了一个 Adapter。普通做法是三个适配器独立工作、互不干涉。但有时你想让"摘要任务"也能借用"客服问答"学到的领域知识——比如摘要的对象恰好是客服对话,让摘要 Adapter 知道客服领域的表达习惯,摘要质量会更好。
AdapterFusion 的做法是在所有任务 Adapter 之上再加一个融合层,它学习在不同输入下给各任务 Adapter 分配不同权重,实现"按需组合多个 Adapter 的能力"。这样摘要任务在处理客服对话时,融合层会自动调高客服 Adapter 的权重,让它的领域知识流入摘要。
这种"多任务既要专精又要互相增益"的需求,用 LoRA 的多适配器做不到——LoRA 的多适配器是"一次只用一个、互不叠加",没有融合机制。所以如果你的业务明确需要跨任务知识共享,Adapter 加 AdapterFusion 是更对口的工具。代价是实现复杂度更高、训练流程更繁琐(要先训各任务 Adapter 再训融合层),所以只在确有跨任务增益需求时才上。
反过来,如果你的多个任务是相互独立的(客服归客服、翻译归翻译,不需要互相借鉴),LoRA 的多适配器更简单直接——每个任务一个适配器、按请求切换,没有融合的开销和复杂度。多数企业的多任务场景属于这一类,所以 LoRA 多适配器比 AdapterFusion 用得更广。
把选型浓缩成一个决策流程:
1. 数据量小(几千条以内)? → LoRA(正则强,防过拟合) 2. 模型极大(百亿+),追求极简? → Prompt Tuning(够大才稳) 3. 多任务要互相增益? → Adapter + AdapterFusion 4. 纯生成任务? → Prefix Tuning 或 LoRA 都可试 5. 默认 / 不确定? → LoRA(生态最成熟,踩坑最少)
💡 关键直觉:不确定就用 LoRA。它的工具链(PEFT 库、trl、各类教程)最成熟,社区踩过的坑最多,遇到问题最容易找到答案。其他方法要么有规模门槛(Prompt Tuning),要么推理有开销(Adapter),要么 niche 化(Prefix Tuning)。把 LoRA 用熟,再在遇到明确不合适的场景时换别的。
最后补充一个实践层面的建议:别在选型上纠结太久。PEFT 方法之间的差距,远小于"有没有把数据弄好"和"有没有搭评估集"带来的差距。我见过团队花两周对比 LoRA 和 Adapter 哪个好,最后发现两者的效果差距不到 2 个百分点,而同期如果花在数据清洗上能提升 10 个百分点。选型用半天做个粗略决定(默认 LoRA,有明确理由才换),把省下的时间投到数据和评估上,回报高得多。方法选型是 10% 的优化,数据和评估是 90% 的优化,别本末倒置。
入门:对比同一任务下 LoRA 和 Adapter 的可训练参数量与推理延迟,体会在"效果相当"时 LoRA 推理零开销的优势。
进阶:在一个 7B 模型上尝试 Prompt Tuning,观察它的训练稳定性(loss 抖动、收敛速度),理解为什么小模型上它不可靠。
挑战:设计一个三任务场景(如客服问答、摘要、分类),分别用 LoRA 训三个适配器多适配器部署,对比用 AdapterFusion 组合后的效果差异,思考"专精"与"共享"的取舍。
下一节我们聚焦微调的数据工程——数据怎么准备、格式怎么定、有哪些常见坑,这往往比选哪种 PEFT 方法更决定最终效果。