LoRA(Low-Rank Adaptation of Large Language Models)是一种轻量级参数高效微调(PEFT)技术,可在不重新训练大型语言模型(LLM)全部参数的情况下,高效适应特定任务或领域。相比传统全量微调(需训练数十亿至数万亿参数),LoRA 仅更新少量新增参数,大幅降低计算和存储成本。
LoRA 的核心思想是通过低秩分解(Low-Rank Decomposition)近似参数更新,而非直接更新原始权重矩阵:
- 冻结预训练模型:保持原始 LLM 参数(如 GPT、LLaMA)不变。
- 引入可训练的低秩矩阵:对于模型中的每个权重矩阵 \(W_0\)(如注意力层权重),添加两个低秩矩阵 A 和 B,使得实际权重更新为:\(W = W_0 + \Delta W = W_0 + B \cdot A \cdot \alpha\)
其中:
- A 和 B 分别是 \(d \times r\) 和 \(r \times d\) 的矩阵(\(r \ll d\),r 为秩,通常取 1-32)。
- \(\alpha\) 是缩放因子,控制微调幅度。
- 仅训练 A 和 B:预训练权重 \(W_0\) 保持不变,仅更新低秩矩阵 A 和 B,显著减少可训练参数数量(从数十亿降至数百万)。
| 对比项 | 传统全量微调 | LoRA 微调 |
| 可训练参数 |
100%(如 7B 参数) |
0.01%-0.1%(如 7B→0.5M) |
| GPU 内存需求 |
高(如训练 7B 模型需约 32GB+) |
低(仅需 4-8GB) |
| 训练时间 |
长 |
显著缩短(约快 3-10 倍) |
| 模型存储 |
完整模型副本(如 28GB for 7B 模型) |
仅存储 LoRA 权重(如 10-100MB) |
| 任务迁移 |
需重新训练整个模型 |
可共享基础模型,切换不同任务的 LoRA 权重 |
- 领域适配:将通用 LLM(如 LLaMA)适配到医疗、法律等专业领域,仅需少量领域数据。
- 多任务学习:在同一基础模型上通过不同 LoRA 权重支持多个任务(如问答、摘要、翻译)。
- 个性化微调:根据用户偏好或少量示例数据定制模型输出风格(如正式 / 口语化)。
- 资源受限场景:在消费级 GPU(如 RTX 3090)或边缘设备上微调大型模型。
以下是使用 Hugging Face Transformers 和 PEFT 库实现 LoRA 微调的简化代码:
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model
-
如何选择 LoRA 的秩 r:
- 较小的 r(如 4-8)适用于任务与预训练领域相近的场景。
- 较大的 r(如 16-32)适用于任务差异较大或需要更高精度的场景。
-
哪些层应应用 LoRA:
- 通常对注意力层(如
q_proj, k_proj, v_proj, o_proj)和 MLP 层(如gate_proj, up_proj, down_proj)应用 LoRA。
- 可通过
target_modules参数灵活配置。
-
与其他 PEFT 方法对比:
- LoRA:适用于大多数场景,平衡了效率与效果。
- Adapter Tuning:在模型中插入额外的 “适配器” 层,参数量稍多但灵活性高。
- Prefix Tuning:仅优化输入层的连续提示(prefix),参数量最少但可能需要更多训练数据。
LoRA 是当前大模型微调的主流技术之一,通过低秩分解显著降低了微调成本,使普通开发者也能在消费级硬件上定制大型语言模型。其核心优势在于 “参数高效” 和 “任务灵活切换”,已广泛应用于开源模型(如 Alpaca-LoRA、 Vicuna)和工业场景中。