11. Adapter Tuning、Prefix Tuning、Prompt Tuning 与 LoRA 有什么异同?
整理 Adapter、Prefix、Prompt Tuning 与 LoRA 的差异与取舍。
简单回答
这四种都是参数高效微调(PEFT)方法,核心思路都是冻结大部分原始参数、只训练少量新增参数。区别在于"加在哪里、怎么加"。Adapter Tuning 在 Transformer 层之间插入小型 MLP 模块;Prefix Tuning 在每层 attention 的 KV 前面拼接可学习的虚拟 token;Prompt Tuning 只在输入 embedding 层前面加可学习的 soft prompt;LoRA 在权重矩阵旁边加低秩分解。LoRA 是目前最主流的方案,因为推理时可以合并、没有额外开销。
详细解释
Adapter Tuning
最早由 Houlsby et al. (2019) 提出。做法是在 Transformer 每层的 FFN 之后(或 attention 和 FFN 之后各一个)插入一个小的 bottleneck MLP:先用一个下投影矩阵把维度从 d 降到 r,过一个非线性激活,再用上投影矩阵升回 d,加上残差连接。可训练参数量由 r 控制。
优点是概念简单、实现直观。缺点是推理时这些 adapter 模块是串联在模型中的,每一层都多一次前向计算,推理延迟会增加。而且不能像 LoRA 那样合并进原始权重。
Prefix Tuning
由 Li & Liang (2021) 提出。核心是在每一层 attention 计算时,在 K 和 V 的前面拼接一组可学习的"虚拟 token"(prefix),长度通常 10~100。这些 prefix 的表示在每一层都是独立可学习的(不是从 embedding 过 Transformer 得来的,而是直接优化的)。
直觉上可以理解为:在每一层给模型加了一段"隐形提示",引导 attention 的行为。实际上 Prefix Tuning 一般通过一个小的 MLP 来生成 prefix 参数,然后冻结这个 MLP,只保留生成的参数,避免直接优化高维参数带来的不稳定。
缺点是占用了一部分 context window(prefix 也算 token),序列越长这个问题越明显。而且不同层的 prefix 参数独立,参数量随层数线性增长。
Prompt Tuning
由 Lester et al. (2021) 提出,可以看作 Prefix Tuning 的简化版。只在输入层的 embedding 前面拼接一组可学习的 soft prompt 向量(通常 20~100 个 token),其余所有参数冻结。
Prompt Tuning 的参数量是这四种方法中最少的,但效果通常也最弱——尤其在模型规模不够大的时候。论文中的结论是当模型超过 10B 规模时,Prompt Tuning 的效果可以接近全量微调,但在小模型上差距明显。
另外 Prompt Tuning 和 hard prompt(人写的自然语言 prompt)的区别要搞清楚:Prompt Tuning 学的是连续的向量,不对应任何自然语言词,是不可解释的。
LoRA
前面第 4 题已经详细讲过。LoRA 在权重矩阵旁边加一个低秩分解,只训练 A 和 B:
推理时还可以把 LoRA 参数合并进原始权重:
合并后和原始模型的推理速度完全一样,没有任何额外延迟。
横向对比
从参数效率看:Prompt Tuning < LoRA ≈ Adapter < Prefix Tuning(Prefix 每层都有独立参数)。从推理效率看:LoRA 最好(合并后零额外开销)> Prompt Tuning(只多了几个 embedding) > Prefix Tuning(每层多几个 KV token)> Adapter(每层多一次前向计算)。从效果看:LoRA ≈ Adapter > Prefix Tuning > Prompt Tuning(通常情况)。从实现成熟度和工具链支持看:LoRA 远远领先,HuggingFace PEFT 库对 LoRA 的支持最完善,推理框架(vLLM 等)也原生支持多 LoRA 服务。
这也是为什么 LoRA 成了 PEFT 的事实标准——它在效率、效果和工程便利性上的综合优势最强。
面试时可以这样答
这四种都是 PEFT 方法,核心都是冻结原始参数、训练少量新增参数。区别在于新增参数加在什么位置。
Adapter Tuning 在每层 Transformer 中间插一个小 MLP,bottleneck 结构,效果不错但推理时有额外延迟。Prefix Tuning 在每层 attention 的 KV 前面拼可学习的虚拟 token,相当于给每层加了一段"隐形提示",但会占用 context window。Prompt Tuning 是最轻量的,只在输入层前面加 soft prompt,参数最少但效果也最弱,大模型上才能接近微调效果。
LoRA 走了完全不同的路——在权重矩阵旁边加低秩分解,训练完可以直接合并进原始权重,推理时零额外开销。这是 LoRA 最大的优势,也是它成为 PEFT 事实标准的核心原因。加上工具链支持最完善,vLLM 等推理框架原生支持多 LoRA,在工程上的生态优势是其他方法没法比的。
常见追问
- Adapter Tuning 为什么不能像 LoRA 一样合并进原始权重?
- Prefix Tuning 的 prefix 长度对效果影响大吗?一般怎么设?
- 有没有把 LoRA 和 Adapter 结合的方法?效果怎么样?