扩展:微调方法调研
在线 Notebook
对应的交互式版本可在 Google Colab 打开,统一使用方式见 第0章说明。
概览
5.4 节介绍了 LoRA 的基本原理。本节调研更广泛的参数高效微调(PEFT)方法,帮助在实际项目中做出选择。
LoRA 变体
QLoRA(Quantized LoRA)
核心思想: LoRA + 4-bit 量化,让消费级 GPU 也能微调大模型。
标准 LoRA:
基础模型用 16-bit 存储 → 需要 ~14GB 显存(7B 模型)
QLoRA:
基础模型用 4-bit NF4 量化存储 → 只需 ~5GB 显存(7B 模型)
LoRA 适配器仍用 16-bit 训练
反向传播时动态反量化NF4(Normal Float 4): 专为正态分布权重设计的 4-bit 数据类型,比普通 INT4 精度损失更小。
实际效果: 65B 模型可以在单张 48GB A100 上微调,7B 模型可以在消费级 RTX 3090(24GB)上微调。
代价: 训练速度比标准 LoRA 慢约 30%(量化/反量化开销)。
AdaLoRA(Adaptive LoRA)
问题: 标准 LoRA 对所有层使用相同的秩 r,但不同层的重要性不同。
核心思想: 根据每个权重矩阵的重要性,自适应分配秩预算。
重要的层(如注意力的 Q/V 矩阵)→ 分配更高的秩
不重要的层 → 分配更低的秩甚至为 0
总参数量不变,但分配更合理实现: 用 SVD 分解代替 A×B 分解,通过奇异值的大小判断重要性,训练过程中动态剪枝小奇异值。
效果: 在相同参数量下,AdaLoRA 通常比标准 LoRA 提升 1-3%。
DoRA(Weight-Decomposed LoRA)
核心思想: 将权重分解为幅度(magnitude)和方向(direction)两部分,分别更新。
W = m × (W₀ + ΔW) / ||W₀ + LoRA||
m:可学习的幅度向量(每列一个标量)
方向:用 LoRA 更新为什么有效: 全量微调时,幅度和方向的变化模式不同。DoRA 让 LoRA 更接近全量微调的行为。
效果: 在多个任务上超越标准 LoRA,接近全量微调。
其他 PEFT 方法
Prefix Tuning
核心思想: 在每个 Transformer 层的输入前,加入可学习的"前缀向量"。
标准输入:[token₁, token₂, ..., tokenₙ]
Prefix Tuning:[prefix₁, prefix₂, ..., prefixₖ, token₁, ..., tokenₙ]
前缀向量是可学习的,基础模型参数冻结特点:
- 不修改模型参数,只学习前缀
- 每个任务对应一组前缀向量(存储成本低)
- 对生成任务效果好,对分类任务效果一般
Prompt Tuning
核心思想: 只在输入层加入可学习的 soft prompt,比 Prefix Tuning 更轻量。
Prefix Tuning:每层都加前缀(参数量 = 层数 × 前缀长度 × 维度)
Prompt Tuning:只在输入层加前缀(参数量 = 前缀长度 × 维度)特点: 参数量极少(通常 < 0.01%),但效果在小模型上较差,大模型(>10B)上接近全量微调。
Adapter
核心思想: 在 Transformer 层之间插入小型适配模块(两层 FFN + 残差连接)。
原始层:Attention → FFN
Adapter:Attention → Adapter → FFN → Adapter
Adapter 结构:
输入(d维)→ 降维(r维)→ 非线性激活 → 升维(d维)→ 残差加法特点: 比 LoRA 早提出,效果相近但推理时有额外开销(LoRA 可以合并权重,Adapter 不行)。
方法对比
| 方法 | 可训练参数 | 显存需求 | 推理开销 | 效果 | 适用场景 |
|---|---|---|---|---|---|
| 全量微调 | 100% | 极高 | 无 | 最好 | 资源充足 |
| LoRA | 0.1-5% | 低 | 无(合并后) | 好 | 通用首选 |
| QLoRA | 0.1-5% | 极低 | 无(合并后) | 好 | 消费级 GPU |
| AdaLoRA | 0.1-5% | 低 | 无(合并后) | 较好 | 追求精度 |
| DoRA | 0.1-5% | 低 | 无(合并后) | 较好 | 接近全量 |
| Prefix Tuning | <1% | 极低 | 有(前缀占 context) | 一般 | 生成任务 |
| Prompt Tuning | <0.1% | 极低 | 有(前缀占 context) | 一般 | 大模型 |
| Adapter | 1-5% | 低 | 有(额外层) | 好 | 多任务切换 |
选择指南
显存 < 16GB(消费级 GPU)?
→ QLoRA(4-bit 量化)
需要多任务快速切换?
→ Adapter 或 Prefix Tuning(不合并权重,切换成本低)
追求最好效果,资源充足?
→ DoRA 或 AdaLoRA
通用场景,简单可靠?
→ LoRA(r=8 或 r=16)
模型 > 30B,资源有限?
→ QLoRA(r=8)实用工具
- Hugging Face PEFT 库:统一接口支持 LoRA、QLoRA、AdaLoRA、Prefix Tuning 等
- LLaMA-Factory:一站式微调框架,支持主流开源模型
- Axolotl:灵活的微调配置框架,社区活跃
- Unsloth:优化的 LoRA/QLoRA 实现,速度提升 2-5 倍
返回: 第5章:LLM基础
