大语言模型 LoRA 技术综述:原理、应用与训练指南
引言
低秩适应(Low-Rank Adaptation,LoRA)通过可插拔的低秩矩阵更新密集神经网络层,是当前参数高效微调范式中表现最佳的方法之一。它在跨任务泛化和隐私保护方面具有显著优势。随着预训练语言模型参数规模的迅速增加,全量微调的计算开销变得极其巨大。为了减少计算成本,LoRA 等参数高效微调(PEFT)方法应运而生。
背景与挑战
近年来,预训练语言模型的参数规模增加了数千倍。然而,由于知识边界限制,它们在某些下游任务中的能力仍然有限。对 LLM 进行全参数微调计算开销极大,例如对 LLaMA2-7B 模型进行全量微调需要大约 60GB 的内存,超出了普通消费级 GPU 的容量。PEFT 方法通过只微调少量额外的模型参数来使 LLMs 适应下游任务。从是否涉及额外参数的角度来看,PEFT 方法可以分为两类:额外参数方法和内部参数方法。在无法修改模型架构的情况下,内部参数方法是理想的。
LoRA 核心原理
低维固有维度假说提出,过度参数化模型存在于低固有维度上。基于这一假说,LoRA 提出用低秩矩阵更新模型中的密集层。它可以同时实现参数和计算效率。
具体而言,对于预训练权重矩阵 $W_0 \in \mathbb{R}^{d \times k}$,LoRA 冻结 $W_0$,并约束权重的更新为低秩分解形式 $\Delta W = BA$,其中 $B \in \mathbb{R}^{d \times r}$,$A \in \mathbb{R}^{r \times k}$,且秩 $r \ll \min(d, k)$。前向传播时,输出为 $h = W_0x + \Delta W x = W_0x + BAx$。
在实践中,对于基于 Transformer 的大语言模型,密集层通常由两种类型的权重矩阵组成:注意力模块中的投影矩阵和前馈神经(FFN)模块。原始研究中,LoRA 应用于注意力层的权重矩阵。后续工作表明,在 FFN 层中使用它可以进一步提高模型性能。
如何训练 LoRA 模型
使用 LoRA 进行微调通常不需要修改底层模型架构,只需加载预训练模型并添加 LoRA 适配器即可。以下是一个基于 Hugging Face transformers 和 peft 库的训练流程示例:
from peft import LoraConfig, get_peft_model
from transformers import AutoModelForCausalLM, AutoTokenizer
# 1. 加载预训练模型和分词器
model_name = "meta-llama/Llama-2-7b-hf"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# 2. 配置 LoRA 参数
lora_config = LoraConfig(
r=8, # 低秩秩数
lora_alpha=32, # 缩放系数
target_modules=["q_proj", "v_proj"], # 目标模块
lora_dropout=0.1, # Dropout 率
bias="none", # 偏置项处理
task_type="CAUSAL_LM" # 任务类型
)
# 3. 应用 LoRA 适配器
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()


