
1. LoRA (Low-Rank Adaptation)
核心思想: 不修改原始权重,旁路添加低秩矩阵
┌─────────────────────────────────┐
│ 原始Linear层 (W: 4096×4096) │
│ ❄️ 冻结不训练 │
│ ↓ x │
│ W·x (输出) │
└─────────────────────────────────┘
- (相加)
┌─────────────────────────────────┐
│ LoRA旁路 │
│ x → A(8×4096) → B(4096×8) │
│ 🔥 只训练这两个矩阵 │
│ ↓ │
│ B·A·x (输出) │
└─────────────────────────────────┘
2. Prompt Tuning
核心思想: 在输入序列前添加可学习的"软提示词"
原始输入:
The, movie, is, great → Encoder → 输出
Prompt Tuning:
P1, P2, P3, ..., Pk, The, movie, is, great → Encoder → 输出
↑____________↑
可学习的soft prompts
(只训练这些)
具体做法:
- 模型权重 全部冻结
- 只在输入前添加 k 个可学习的embedding向量 (比如20个)
- 只训练这20个向量
- 参数量: 极少 (20 × 768维 ≈ 15K参数)
输入层:
┌──────────────────────────────────────┐
│ 🔥P₁ 🔥P₂ 🔥P₃ ... 🔥Pₖ │ ← 可训练的prompt embeddings
│ ❄️The ❄️movie ❄️is ❄️great │ ← 真实输入(正常处理)
└──────────────────────────────────────┘
↓
❄️ Transformer层 (冻结)
↓
输出
3. Adapter
核心思想: 在Transformer层之间插入小型瓶颈网络
原始Transformer块:
Input → Self-Attention → Add&Norm → FFN → Add&Norm → Output
加入Adapter后:
Input → Self-Attention → Add&Norm → [🔥Adapter] → FFN → Add&Norm → [🔥Adapter] → Output
↑ ↑
新插入的模块 新插入的模块
具体做法:
- Transformer层 冻结
- 在每层后插入Adapter模块
- 只训练Adapter参数
- 参数量: 1-3% (取决于bottleneck大小)
4. IA3 (Infused Adapter by Inhibiting and Amplifying Inner Activations)【基本不用】
核心思想: 用可学习的缩放向量调整激活值
原始:
h = W·x
IA3:
h = (W · diag(l)) · x = W · (l ⊙ x)
↑ ↑
可学习的缩放向量 逐元素相乘
具体做法:
- 权重矩阵
W冻结 - 只学习一个缩放向量
l(长度等于输入维度) - 将输入
x逐元素乘以l,然后再乘以W - 参数量: 极少 (每层只有一个向量, 比如768个参数)
可视化:
对于 K、V、FFN 的投影:
输入 x (768维)
↓
x ⊙ l_k (逐元素相乘) ← 🔥 l_k是768维可训练向量
↓
❄️ W_k · (缩放后的x) ← W_k冻结
↓
输出
5. Full FT (Full Fine-Tuning / 全量微调)
核心思想: 所有参数都训练
预训练模型的所有参数 → 🔥全部解冻 → 在下游任务上训练
具体做法:
- 加载预训练权重
- 所有层的所有参数都设为可训练
- 在目标数据集上重新训练
- 参数量: 100%
6. 固定Encoder (Feature Extraction)
核心思想: 把预训练模型当特征提取器,只训练新加的分类头
输入 → ❄️Encoder(冻结) → 特征 → 🔥分类头(新建+训练) → 输出
具体做法:
- Encoder所有层 冻结
- 去掉原来的输出层,加一个新的(比如线性层)
- 只训练这个新的分类头
- 参数量: <1% (只有分类头)