引言
自 2018 年 BERT 发布以来,"预训练 + 微调"成为语言模型的通用范式。以 ChatGPT 为代表的大语言模型针对不同任务构造 Prompt 来训练,本质上仍然是预训练与微调的使用范式。千亿规模的参数微调需要大量算力,即使提供了预训练的基座模型,一般的研究机构也很难对其进行全量微调(即对所有参数进行微调)。为了应对这个问题,相关学者提出了 PEFT(Parameter-Efficient Fine-Tuning,高效参数微调)技术。
本文将总结并介绍几种常见的 PEFT 技术,包括 Adapter Tuning、Prefix/Prompt Tuning 以及 LoRA,分析其原理、优缺点及适用场景。
Adapter Tuning
Adapter Tuning 是一种经典的 PEFT 技术,在 2019 年由谷歌的研究人员提出,也由此拉开了 PEFT 研究的序幕。
研究人员发现在面对下游任务微调 BERT 时,如果进行全量微调,效率较低;而如果固定预训练模型的大部分参数,只对为下游任务添加的几层参数进行微调时,效果较差。因此,他们设计了 Adapter 结构,并将其集成在 Transformer 中。在微调阶段,只对 Adapter 中的参数进行调整,固定所有其他参数。
Adapter 模块包含一个 down-project 层(即将高维特征映射为低维特征)、非线性激活层和 up-project 层(即将低维特征映射回高维特征)。同时包含 skip-connection 结构,与残差连接类似,以保证梯度传播的稳定性。
Adapter 的效果显示,其能够在只增加并训练 BERT-large 的 3.6% 参数的情况下,在 GLUE 基准达到 80.0 的总分(BERT-large 全量微调的得分为 80.4)。
优点:
- 参数效率高,显存占用少。
- 模块化设计,易于部署多个任务。
缺点:
- 引入额外的计算层,推理时会增加延迟。
- 需要调整瓶颈维度 $d_{adapter}$,影响性能上限。
Prefix Tuning 与 Prompt Tuning
Prefix Tuning
2021 年,斯坦福大学的研究人员提出了 Prefix Tuning。该方法的主要做法是在输入 token 之前构造一段与任务相关的前缀 token(即 Prefix),在训练时只更新 Prefix 部分参数,固定模型中其他参数。
直接更新 Prefix 会导致训练过程不稳定,因此研究人员在 Prefix 前加上一个 MLP 结构,将一个含有较少参数的矩阵 P'转化为 Prefix,训练时更新 P'与 MLP 的参数,在训练完成后删除这些参数,只保留并存储不同任务的 Prefix,而模型其他参数由不同任务共享。
这种方法与现在常用的 Prompt 类似,但是是由模型自动对 Prompt 进行隐式编码,而不是人为构造显式的 Prompt。
Prompt Tuning
2021 年,谷歌的研究团队也提出了 Prompt Tuning 方法。与现在我们所熟知的 Prompt 不同,这个方法可以看作是另一种 Prefix Tuning,在输入层加入 prompt token 并与原输入拼接,并没有额外加入 MLP。
作者对 T5 模型进行了实验,并且发现随着预训练模型参数量增大,Prompt tuning 的效果会越来越接近全量微调。
对比:
- Prefix Tuning 引入了可学习的连续向量,通过 MLP 投影,灵活性更高。
- Prompt Tuning 更轻量,直接优化嵌入层,但受限于离散 token 空间或连续向量空间的大小。
LoRA (Low-Rank Adaptation)
Adapter Tuning 与 Prefix Tuning 各有一定优势,但也有一定的缺点。Adapter Tuning 中添加的 adapter 模块会带来额外的计算量,而 Prefix Tuning 的前缀长度会影响到下游任务可输入的序列长度,且有一定优化问题,其性能随参数规模变化情况并不一定是单调递增的。
LoRA 被发表在 ICLR 2022 上,它的核心思想是通过低秩分解来表示模型的权重更新,并且只更新分解矩阵部分的参数。
原理
为了便于理解,首先附上原论文的 LoRA 示意图。图中,左侧蓝色矩形表示预训练权重矩阵,右侧表示其参数更新过程的低秩分解,先通过矩阵 A 将特征映射到低维(r 一般为 2/4/8/16),再通过矩阵 B 映射回原维度。训练时固定预训练矩阵,只更新 A 与 B,再将预训练矩阵与 A、B 合并(BA 的维度与 W 相同)。
LoRA 假设模型的权重更新在微调过程中具有较低的'内在秩(intrinsic rank)',对预训练的权重矩阵 $W_0$,用低秩分解来表示其更新:
$$W' = W_0 + \Delta W = W_0 + BA$$


