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


