Parameter efficient fine-tuning
高效参数微调可以粗略的分为三大类:
- Additive 增加额外参数,主要包括
- Adapter-like 类适配器
- Soft prompts 软提示
- Selective 选取一部分参数更新
- Reparameterization 重参数化,LoRA属于这种
1. Prompt-based methods [Soft prompts]
| 特性 | Prompt Tuning (v1) | P-tuning (v1) | Prefix Tuning | P-tuning (v2) |
|---|---|---|---|---|
| 注入位置 | 仅输入层 (Layer 0) | 仅输入层 (Layer 0) | 所有层 (Layer 0 ~ N) | 所有层 (Layer 0 ~ N) |
| 主要架构 | Decoder-only (GPT) | 侧重 Decoder-only (GPT) | Decoder-only (GPT) | 通用 (BERT, GPT, T5 均可) |
| 优势任务 | NLG (生成), 大模型 | 通常需转为生成任务 (Generation) | NLG (生成) | 支持标准 NLU (Classification, Tagging) |
| 参数量 | 最少 | 极少 (m×d) | 中等 | 中等 (比 v1 多,比全量少) |
| 重参数化 | 可选 | 必须 (LSTM/MLP) | 必须 (MLP) | 可选 (LSTM/MLP) |
| 性能表现 | 小模型 NLU 效果差 | 小模型效果较差 (不如全量微调) | 生成任务效果好 | 小模型 NLU 媲美全量微调 |
1.1 Prompt tuning
Prompt tuning was developed for text classification tasks on T5 models, and all downstream tasks are cast as a text generation task.
仅在模型的输入层(Embedding 层)添加可训练的连续向量P,Input=[P;Embedding(Text)],而保持模型所有层(包括 Embedding 层之后的所有 Transformer 层)的参数完全冻结。
1.2 Prefix Tuning
Prefix tuning was designed for natural language generation (NLG) tasks on GPT models.
不同于 Prompt Tuning 只在输入层加 token,Prefix Tuning 在每一层 Transformer Layer 的 Self-Attention 中,将可训练的 Prefix 向量(长度为m)拼接到 K(L×d) 和 V(L×d) 的前面。
- 计算出的 Attention Score 矩阵维度为 L×(m+L)。这意味着真实输入的每个 token 都可以 attend 到 Prefix 向量,但 Prefix 向量之间也可以互相 attend(取决于具体实现,通常是 Prefix 之间也能互相注意,但 Prefix 不 attend 真实输入,或者简单处理为只修改 K,V)。
- 输出维度仍为 L×d,因为 Q 的长度决定了输出序列长度(Prefix 部分在输出时被丢弃,不传给下一层作为输入 token,只作为上下文信息)。
- 重参数化 (Reparameterization): 不直接优化 P,而是通过一个小型的 MLP(多层感知机)来生成 Prefix 向量P
1.3 P-tuning (v1)
论文: GPT Understands, Too (Liu et al., 2021)
核心动机:早期的 Hard Prompt(人工写文本如 “It was [MASK]”)很难调优,且不稳定。Prompt Tuning (Lester et al.) 提出了连续向量(Soft Prompt),但在小模型或 NLU 任务上效果不佳。 P-tuning v1 的初衷是:让 Soft Prompt 更容易训练。
实现机制
- 位置:仅在输入层 (Input Embedding) 添加可训练向量。这一点与 Prompt Tuning 完全一致。 Input=[P1,P2,…,Pm,Embed(x1),…,Embed(xn)]Input=[P1,P2,…,P**m,Embed(x1),…,Embed(x**n)]
- 重参数化 (Reparameterization,关键创新):
- Prompt Tuning 直接优化 P 矩阵,容易陷入局部最优。
- P-tuning v1 引入一个 Prompt Encoder (通常是 LSTM 或 MLP)。不直接训练 P,而是训练 Encoder 的参数。输入是位置索引或随机噪声,输出才是 P。
- 作用:利用 LSTM/MLP 的平滑性,让生成的 Prompt 向量之间具有关联性,收敛更快,效果更好。
- 适用性:主要针对 Decoder-only (GPT) 模型,试图让 GPT 也能做好分类任务(通过把分类任务转化成生成任务,如生成 “Yes”/“No”)。
1.4 P-tuning (v2)
P-tuning is designed for natural language understanding (NLU) tasks and all language models.
论文: P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks (Liu et al., 2022)
核心动机:作者发现 P-tuning v1 和 Prompt Tuning 在 NLU 任务(如序列标注、句子对匹配)和 中小规模模型 上表现不佳。 原因分析:仅靠输入层的提示,信息传递到深层时会被稀释,无法有效调整深层的语义空间。 解决方案:借鉴 Prefix Tuning 的思想,将 Prompt 注入到 每一层。
不再使用离散的单词作为 Prompt,而是使用一组可学习的连续向量(Embedding vectors)。这些向量没有具体的语义含义(不是真实的词),而是通过梯度下降直接优化出来的“最优激活模式”。同时可以在输入序列任意位置插入这组可训练的连续向量。
- 重参数化 : 使用一个 Prompt Encoder(LSTM/MLP),为每一层生成对应的 P
- 任务形式:
- 不再强制将任务转化为生成任务。
- 可以直接在 [CLS] token 上加分类头进行标准分类,或者做序列标注。这使得它在 BERT 等 Encoder 模型上非常自然且高效。
- 通用性:同时适用于 Encoder-only (BERT), Decoder-only (GPT), 和 Encoder-Decoder (T5)。
2. Adapter Tuning
核心思想:插入式模块。在 Transformer 层之间(通常在 FFN 之后或 Attention 之后)插入小型的全连接神经网络(Bottleneck Adapter)。
- 结构:DownProjection → ReLU/GELU → UpProjection (r≪d)
- 特点:
- 串行计算:由于是串行插入,会轻微增加推理延迟(无法像 LoRA/IA³ 那样完全合并消除结构变化,除非特殊优化)。
- 历史地位:PEFT 的早期经典方法,现逐渐被 LoRA 取代,但在多任务学习(Multi-task Learning)中仍有应用(不同任务加载不同 Adapter 层)。
3. LoRA methods (Low-Rank Adaptation)
核心思想:加法更新。通过在原始模型权重矩阵附近添加一个低秩矩阵来近似模型参数的更新。这种方法通过优化这个低秩矩阵来实现微调,而不需要修改原始模型参数。
- 零推理延迟:推理时可将 BA** 合并回 W,模型结构不变。
- 通用性强:适用于 Encoder, Decoder, Encoder-Decoder 所有架构。
- 主流地位:目前工业界最流行的 PEFT 方法。
4. IA3 (Infused Adapter by Inhibiting and Amplifying Inner Activations)
核心思想:乘法调制。不添加任何新的向量或矩阵到输入中,也不改变模型结构,而是学习三个极小的缩放向量(Scaling Vectors),直接对模型内部的激活值(Activations)进行“乘法”调制。
Transformer注入位置:
Key (k) 投影之后:调节注意力机制中“键”的强度。(self-attention+encoder-decoder-attention)
Value (v) 投影之后:调节注意力机制中“值”的强度。(self-attention+encoder-decoder-attention)
- 中间激活 (ffn) 之后:调节前馈神经网络(Feed-Forward Network)的输出强度。
注意力层 (Attention):
其中 ⊙表示逐元素相乘(Broadcasting)。
- ℓk 控制哪些 Key 特征被重视。
- ℓv控制哪些 Value 信息被传递。
前馈网络层 (FFN):
- ℓffn 控制 FFN 输出的哪些通道被激活或抑制。
关键点:
- 这些 ℓ 向量的维度与隐藏层维度 d相同(例如 d=768),参数量极小。
- 它们不增加推理时的序列长度(不像 Prefix/Prompt)。
- 它们不改变权重矩阵的秩(不像 LoRA),只是对激活值进行掩码或缩放。
参考:
