Adapter微调
参数高效的适配器微调方法
核心思想
Adapter微调在预训练模型的Transformer层中插入小型瓶颈结构(Adapter), 训练时只更新这些Adapter参数,冻结原模型权重,实现参数高效微调。
# Adapter结构
Input → LayerNorm → Adapter → Attention → Adapter → Output
# 参数量仅增加3-4%
Adapter结构
# 瓶颈结构
d → m → d (m << d)
Adapter(x) = x + W_up(GELU(W_down(x)))
# 典型设置: m = d/64 或 d/128
降维
d → m
非线性
GELU激活
升维
m → d
插入位置
注意力后插入
在Multi-Head Attention输出后插入
Attention → Adapter → Add & Norm
FFN后插入
在Feed Forward Network输出后插入
FFN → Adapter → Add & Norm
与LoRA对比
| 特性 | Adapter | LoRA |
|---|---|---|
| 插入方式 | 新增模块 | 旁路连接 |
| 推理延迟 | 增加(额外层数) | 无(可合并) |
| 参数量 | 3-4% | 0.1-1% |
| 适用场景 | 理解任务 | 生成任务 |
代码实现
# 使用adapter-transformers
pip install adapter-transformers
from transformers import AutoModelWithHeads
model = AutoModelWithHeads.from_pretrained("bert-base-uncased")
model.add_adapter("task_adapter", config="pfeiffer")
model.train_adapter("task_adapter")
----