Lora微调理论基础与超参数解释

绫波波 发布于 2025-11-27 83 次阅读


简介

LoRA(Low-Rank Adaptation)微调是微软研究院在2021年推出的一种高效参数微调(Parameter-efficient Fine-tuning PEFT)方法,已经在大语言模型微调、扩散模型和其他类型的AI模型中得到广泛应用。

LoRA与全参微调有两个基本区别:

  • LoRA微调追踪权重的变化,而不是直接更新权重
  • LoRA微调通过矩阵分解的方式,将包含权重变化的大矩阵分解为包含可训练参数的两个较小矩阵。

全尺寸矩阵越大,则分解矩阵中处理的值所占的比例越来越小,使用分解矩阵可以显著减少更新涉及到的参数量,即更少的内存占用。

在LoRA上下文忠,将原始矩阵分解出的两个较小的分解矩阵称为"更改矩阵",用它们来跟踪期望对模型权重进行的更改。在训练开始时,变化矩阵是全0的空板矩阵。然后,当我们计算一个批的损失时,他们更新以反映权重的变化。
将变化矩阵相乘并添加到模型的原始矩阵中,即可以获得微调模型。根据LoRA论文,LoRA方法能够节省3倍的内存使用。在RoBERTa、DeBERTa、GPT-2和GPT-3上,LoRA在模型质量方面的表现和调优相当或者更好。

用秩提高LoRA的精度

如果希望LoRA方法训练结果更加准确,可以通过增加变化矩阵的秩实现。通过增加矩阵的秩,仍然可以得到和模型中训练层大小相同的输出矩阵。此时每个变化矩阵中编码了更多信息,从而获得精度更高的乘法运算。

QLoRA

QLoRA团队通过创建一个特殊的数据类型NormalFloat,将权重的正态分布从16位浮点数压缩到4位浮点数,最后以做小的精度损失恢复到正态分布。例如,如果原模型使用16位浮点数,将其存储为4位浮点数可以将内存占用减少4倍。
QLoRA同样取得了与全参数微调结果相当的结果。在训练并转换为16位浮点数后,4位NormalFloats的精度被保留,而质量没有任何有意义的损失。

LoRA训练超参数

使用LLaMA-Factory进行lora微调,需要关心的“超参数”主要分为通用训练超参数和LoRA结构超参数。
其中,LoRA结构超参数包括:

fineturning_type:lora # 定义微调方式为lora微调
lora_rank:8-32 # 定义分解矩阵的秩,7/8B的模型微调一般选择8-16,32B及以上考虑32或64
lora_alpha:2-4*rank # 缩放系数,常用32(rank=16)或64(rank=32)
lora_dropout:0.05-0.1 # 仅针对投影矩阵,小数据可以提到0.1防止过拟合
lora_target:all|specific module # all——把attention+ffn里所有的线性层全部插入LoRA;列表[q_proj,v_proj]:仅插在Q/V投影,参数量约等于1/3,显存紧张时选择;也可以把k_proj、o_proj、gate_proj等按需加入

通用训练超参数包括:

per_device_train_batch_size:2 # 单卡batch,显存不够就=1
gradient_accumulation_steps: 4/8 # 用4或8把batch拓展到8-16
learning_rate:5e-6 # 学习率
num_train_epochs # 训练epoch
lr_scheduler_type # 学习率计划
warmup_rate/warmup_steps # 先缓升再下降,防止前期训崩
weight_decay # 正则项
max_grad_norm # 梯度裁剪阈值
bf16/fp16 # A100用bf16,40系显卡用fp16
cutoff_len # 样本最大长度,OOM先砍他
save_steps # 每N步存一次ckpt
logging_steps # 日志频率
plot_loss # 训练完成后自动绘制损失曲线