低秩适应(LoRA)与量化LoRA(QLoRA)技术解析
LoRA:从线性代数到模型微调
从矩阵分解理解Lora
假设我们有一个大模型中的权重矩阵,形状为1024×512(包含约52万个参数)。传统微调方法会直接更新这52万个参数,这不仅计算量大,而且存在过拟合风险。
LoRA的做法是:
- 保持原始权重矩阵不变
- 引入两个小矩阵:比如1024×32和32×512
- 这两个小矩阵相乘得到的结果与原始矩阵形状相同
- 将乘积结果与原始矩阵相加,作为最终使用的权重
这种方法的优势立刻显现:
- 32是一个超参数r(rank),通常远小于原始维度
- 两个小矩阵总共只有约4.9万个参数,仅为原始矩阵的约9.3%
- 如果r取更小值(如8或4),参数量可进一步减少
总结一下:LoRA的核心思想源自线性代数中的"低秩矩阵分解"技术。这个名字可以拆解为Low-Rank Adaptation,字面意思是"低秩适应"。通过这种技术,我们可以巧妙地绕过直接修改原始模型的庞大参数,而是添加训练一组规模小得多的参数矩阵。
为什么这么做会有效
LoRA的数学表达
让我们用数学公式来表达这个过程。对于原始权重矩阵 W∈R^(d×k),LoRA微调后的权重表示为:
W_LoRA = W + ΔW = W + BA
其中:
- B∈R^(d×r) 和 A∈R^(r×k) 是两个低秩矩阵
- r << min(d,k),确保参数量大幅减少
- 初始化时,B可以随机初始化,而A通常初始化为全零矩阵
在实际应用中,还会引入一个缩放因子α,修改公式为:
W_LoRA = W + (α/r)BA
这样做可以更好地控制微调的程度,α与r的比值影响着学习率的选择。
实际应用与注意事项
矩阵的秩,通常选择4~32之间的值
在使用Hugging Face Transformers库的PEFT(Parameter-Efficient Fine-Tuning)模块实现LoRA时,主要参数包括:
r
: 矩阵的秩,通常选择4~32之间的值alpha
: 缩放因子,缩放因子的默认值为 1,这意味着在计算模型的前向传播时,预训练权重和低秩权重更新的权重相等。但是,可以更改 α 的值,以平衡预训练模型和新的特定任务自适应的重要性。最近的实证分析表明,对于秩较高的 LoRA,需要更大的 α 值(即,rα 越大,则越小)。target_modules
: 指定应用LoRA的层,可以是全部层或特定层
from peft import LoraConfig, get_peft_modelconfig = LoraConfig(r=8,alpha=16,target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],lora_dropout=0.05,
)model = get_peft_model(base_model, config)
值得注意的是,LoRA通常不应用于偏置项(bias)和层归一化(layer normalization)参数,这些参数量相对较小,可以直接训练。
QLoRA:量化与低秩适应的结合
QLoRA(Quantized LoRA)是LoRA的进阶版本,它将量化技术与低秩适应相结合。通过将原模型量化到较低精度(如4位整数),同时使用LoRA进行微调,可以实现更高效的内存使用。
这种组合方法特别适合于单GPU环境,使开发者能够在普通消费级GPU(如RTX 4090或A10)上微调大型模型(如Llama 7B甚至更大)。