LLM 高效微调方法详解:Adapter、LoRA、Prompt 等六大主流方案对比
由于大语言模型(LLM)参数量通常在亿级以上,少则数十亿,多则数千亿。当我们想在特定领域数据上微调模型时,如果选择 Full-Tuning(全量微调所有参数),不仅对硬件设备(GPU)要求极高,训练时间也往往难以接受。因此,我们可以选择一条捷径:不需要微调 LLM 的全量参数,而只需要新增少量的参数,通过固定原始模型参数,仅微调新增的少量参数,从而达到接近使用全参数 Full-Tuning 的效果。
本章主要讲述在 LLM 时代,当下主流的六种高效微调(Efficient Tuning)方法及其思路与优缺点对比。
1. Adapter Tuning (2019)
(1) 论文信息
来自 2019 年,论文《Parameter-Efficient Transfer Learning for NLP》。
摘要内容:微调大型预训练模型在自然语言处理中是一种有效的迁移学习机制。然而,在存在许多下游任务的情况下,微调显得参数效率低下:因为每个任务都需要一个全新的模型。作为替代方案,我们提出了带有适配器模块的迁移学习方法。适配器模块能够生成一个紧凑且可扩展的模型;它们仅为每个任务增加少量可训练参数,并且可以在不重新访问先前任务的情况下添加新任务。原始网络的参数保持不变,从而实现了高度的参数共享。
为了展示适配器的有效性,我们将最近提出的 BERT Transformer 模型迁移到了 26 个不同的文本分类任务中,包括 GLUE 基准测试。适配器在仅为每个任务增加少量参数的情况下,达到了接近最先进性能的水平。在 GLUE 基准测试中,我们在仅为每个任务增加 3.6% 参数的情况下,实现了与完整微调性能相差不到 0.4% 的结果。相比之下,微调则需要对每个任务的 100% 参数进行训练。
(2) 思路
- 固定 Transformer 的全部参数。
- 在 Transformer 的每一个 Block 里嵌入一些新初始化的 Adapter Network。
- 其中 Adapter 由两层 MLP 组成,分别负责将 Transformer 的表征降维和升维。
(此处原图展示了 Adapter 在 Transformer 层中的插入位置)
(3) 优势
- 只需要添加不到 5% 的可训练参数,即可以几乎达到全参数训练的效果。
- 在训练过程中大大节省了训练时间,做到时间有效性。
- 基本不降低模型在下游任务中的表现。
2. Prefix Tuning (2021)
(1) 论文信息
摘要内容:微调是实际上利用大型预训练语言模型执行下游任务的首选方法。然而,这种方法会修改所有语言模型的参数,因此必须为每个任务存储完整的副本。在本文中,我们提出了前缀微调(Prefix-tuning),这是一种针对自然语言生成任务的轻量级微调替代方案。该方法保持语言模型参数不变,但优化了一个小的、连续的任务特定向量(称为前缀)。前缀微调受到提示机制的启发,允许后续标记关注这个前缀,就像它们是'虚拟标记'一样。
我们将前缀微调应用于 GPT-2 进行表格到文本的生成,以及应用于 BART 进行文本摘要。我们发现,通过仅学习 0.1% 的参数,前缀微调在全数据设置下取得了与微调相当的性能,在低数据设置下超越了微调,并且更好地推广到了训练过程中未见过的主题示例。
(2) 思路
固定预训练参数,为每一个任务额外添加一个或多个 embedding,且利用多层感知编码 prefix。不再像 Prompt Tuning 继续输入 LLM。
(此处原图展示了 Prefix 在序列前的插入结构)
(3) 结构
在 seq 前面加 idx 个虚拟 token,以此构造一个连续的 token,作为微调参数(结构一样是 transformer)。
固定 LLM 的参数。
由于发现直接加 prefix 层,模型不稳定,故在其后加了 MLP 层,用于 reparametrization 参数 $P_\theta$。
$$ P_\theta[i:] = \text{MLP}\theta(P'\theta[i,:]) $$
原始 $P_\theta$ 维度为 $|P_{idx}| \times \text{dim}(h_i)$,$P'\theta$ 维度为 $|P{idx}| \times k$,经过 MLP 复原原始维度。
针对不同任务,有不同最优的 k 值,经过实验,作者建议:
- Table-to-table 任务,k=512
- Summarization 任务,k=800
(4) 优势
- 在 Table2Text 任务上,只有 0.1% 参数量级的效果要优于微调。
(5) 缺点
3. Prompt Tuning (2021)
(1) 论文信息
摘要:在这项工作中,我们探索了'提示微调'(prompt tuning),这是一种简单而有效的机制,用于学习'软提示'来条件化冻结的语言模型以执行特定的下游任务。与 GPT-3 使用的离散文本提示不同,软提示是通过反向传播学习的,并且可以根据任意数量的标记示例进行调整。我们的端到端学习方法在性能上大幅超越了 GPT-3 的少量样本学习。
更值得一提的是,通过使用 T5 模型进行模型大小的消融实验,我们展示了提示微调随着规模的增加变得更加具有竞争力:当模型参数超过数十亿时,我们的方法'缩小了差距'并达到了模型微调(即调整所有模型权重)的强大性能。这一发现尤为重要,因为大型模型的共享和部署成本高昂,而能够重用一个冻结的模型来执行多个下游任务可以减轻这一负担。
(2) 思路
固定预训练 LLM 的参数,为每一个任务额外添加一个或多个 embedding。之后拼接 query 正常输入 LLM,并只训练这些 embedding。
(此处原图展示了 Prompt Embedding 拼接输入的结构)
(3) 优势
- 效果优于 GPT-3 的 few-shot learning。
- 当模型参数量达 100 亿时,接近于全模型微调效果。
4. P-tuning (2021)
V2 版本:2023 更新
(1) 论文信息
摘要:使用自然语言模式对预训练语言模型进行提示已被证明在自然语言理解(NLU)任务中有效。然而,我们的初步研究表明,手动设计的离散提示往往导致性能不稳定——例如,仅改变提示中的一个单词就可能导致性能大幅下降。为此,我们提出了一种新颖的方法 P-Tuning,该方法在离散提示的基础上结合了可训练的连续提示嵌入。实验表明,P-Tuning 不仅通过最小化不同离散提示之间的差距来稳定训练过程,而且在一系列 NLU 任务(包括 LAMA 和 SuperGLUE)上显著提高了性能。P-Tuning 在完全监督和少量样本设置下,对冻结和微调的语言模型均普遍有效。
(2) 思路
固定 LLM 参数,用多层感知机和 LSTM 对 prompt 进行编码,编码后与其他向量进行拼接,正常输入 LLM。
注意,训练之后只保留 prompt 编码之后的向量,无需保留编码器。
(此处原图展示了 P-tuning 的编码结构)
(3) 结构
对于 prompt 模板,使用 MLP+LSTM 进行编码,替代原始的 input embedding。
对于原始的输入 input 和 target,则使用原始的 input embedding。
(4) 使用方式
离散和连续 template token 混合时,显示地插入一下 anchor(离散的 token)有助于 template 的优化。
(5) 优势
- 能缓解离散 prompt 方法,导致的模型输出结果到达局部最优。
(6) 缺点
- 查找的最优提示,可能是次优的。
- 在小参数量模型中表现差(小参数模型如 Bert,330M),上了 10B 的模型效果才开始可以持平。
- 序列标注等对推理和理解要求高的任务,prompt-tuning 效果会变差。
5. P-tuning v2 (2022)
(1) 论文信息
摘要:提示微调(Prompt Tuning),该方法仅对冻结的语言模型中的连续提示进行微调,极大地减少了训练时每个任务的存储和内存使用。然而,在 NLU(自然语言理解)的背景下,先前的工作表明,对于正常大小的预训练模型,提示微调的性能并不理想。我们还发现现有的提示微调方法无法处理复杂的序列标注任务,这表明其缺乏普适性。
我们提出了一个新颖的实验发现:经过适当优化的提示微调可以在广泛的模型规模和 NLU 任务中普遍有效。它在性能上与微调相当,但仅需要调整 0.1%-3% 的参数。我们的方法 P-Tuning v2 是 Deep Prompt Tuning(Li 和 Liang, 2021; Qin 和 Eisner, 2021)的一种实现,针对 NLU 进行了优化和适配。鉴于 P-Tuning v2 的普适性和简单性,我们相信它可以作为微调的替代方案,并为未来的研究提供一个强大的基线。
(2) 思路
- 固定 LLM 参数。
- 类似 Prefix-tuning。
- 在 Deep FT 层:在 seq 前面加 n 个虚拟 token,以此构造一个连续的 token,作为微调参数(结构一样是 transformer)。
- 在多种任务上下进行微调。
- 完全变为生成模型,无需 verbalizer。
(此处原图展示了 P-tuning v2 的深层结构)
(3) 优势
- 在小、大模型上,效果均优于 P-tuning。
- 当参数量达 10B,效果相当于 FT。
6. LoRA (2021)
(1) 论文信息
摘要:自然语言处理的一个重要范式包括在通用领域数据上进行大规模预训练,并适应特定任务或领域。随着我们预训练更大的模型,全面微调(即重新训练所有模型参数)变得不太可行。以 GPT-3 175B 为例,部署独立的微调模型实例,每个实例都有 175B 参数,成本是极其昂贵的。我们提出了低秩适应(Low-Rank Adaptation,简称 LoRA),该方法冻结预训练模型的权重,并在 Transformer 架构的每一层中注入可训练的低秩分解矩阵,从而大大减少了下游任务的可训练参数数量。与使用 Adam 对 GPT-3 175B 进行微调相比,LoRA 可以将可训练参数数量减少 10,000 倍,GPU 内存需求减少 3 倍。尽管 LoRA 的可训练参数较少,训练吞吐量更高,并且与适配器不同,没有额外的推理延迟,但它在 RoBERTa、DeBERTa、GPT-2 和 GPT-3 上的模型质量上仍然与微调相当或更好。我们还对语言模型适应中的秩不足问题进行了实证调查,这揭示了 LoRA 的有效性。
(2) 思路
固定 LLM 参数,在每一个 self-attention 层中,加入一个 low-rank 的矩阵,即 $B \times A$。在微调时,只更新 $B \times A$ 的参数。
(此处原图展示了 LoRA 在 Attention 层的并行结构)
(3) 结构
在每一层 self-attention 中,添加新的参数 $\Delta W$。
$$ h = W_0x + \Delta W x = W_0x + BAx $$
其中,预训练模型的原始参数为 $W_0 \in R^{d \times k}$。
LoRA 的新增参数为 $B \in R^{d \times r}$,$A \in R^{r \times k}$。
B 初始化为一个全 0 矩阵,A 是一个高斯随机初始化的矩阵。B 初始化为全 0 矩阵的目的是,在开始训练时,让 $B \times A$ 等于 0 矩阵,即参数从 0 开始。
其中 LoRA 的中间维度 $r$,远小于原始模型维度,即 $r \ll \min(d,k)$。
(4) 学习目标
原始的 LLM,一般也是 CLM (Causal Language Model/Conditional Language Model),学习目标为预测下一个 token。
加入 LoRA 后,学习目标保持一致,但在计算过程中加入了低秩矩阵的增量。
(5) 配置
- 在多个部位 (Q/K/V/Output) 同时添加 $\Delta W$,会比只在单一部分上添加权重 $\Delta W$,效果要好。
- 在 wikiSQL/MultiNLI 数据集上测试得出结论:小的 $\gamma$ 值,能达到较好的效果(一般为 4-8)。
(6) 优势
- 用于低资源的场景。也就是硬件设备资源有限的情况下。
- 更新参数量少。对于 175B 的 GPT 模型,使用该方法只需要额外更新 0.01% 的参数量。
- 是全参数微调(FT)的一种替代方案。
(7) 缺点
总结与选型建议
上述六种方法各有侧重,实际应用中需根据具体场景进行选择:
- 资源受限场景:若显存极度紧张,LoRA 和 Adapter 是首选,因为它们引入了极少的可训练参数且推理无延迟。
- 生成任务:Prefix Tuning 和 P-tuning v2 在文本生成和摘要任务上表现优异,适合需要长上下文生成的场景。
- 理解任务:P-tuning v2 在 NLU 任务上表现稳定,尤其是配合较大的模型规模时。
- 快速迭代:Prompt Tuning 实现最简单,适合快速验证想法,但在小模型上效果有限。
- 性能优先:若资源允许,Full-Tuning 仍是上限最高的方案,但 LoRA 已能逼近其 99% 以上的性能。
在实际工程中,LoRA 因其生态支持好(如 HuggingFace PEFT)、部署方便且效果显著,目前已成为工业界微调大模型的主流选择。