LoRA大模型微调技术
本文参考【【LoRA微调】从原理到调参,7 个问题彻底理解LoRA,不懂线性代数也没问题_大模型微调_低秩适配】www.bilibili.com/video/BV1wa…
什么是LoRA?
LoRA:低秩矩阵分解算法 全参微调:所有的参数都要更新。W->W',将W'拆解成W+ΔW,即W+ΔW=W',更进一步,可以将ΔW分解为A*B,如同下面的例子。
A有10个参数,B有8个参数,要更新的参数数就从原来的20个减小到了18个。实际应用场景下,LoRA能使参数减少0.01%-3%左右
为什么需要LoRA
LORA想解决的问题:资源消耗太大,训练效率低下
为什么可以对低秩权重增量分解
不可以对原始矩阵进行低秩分解,原因:原始矩阵一般接近满秩,奇异值分步比较平滑
LoRA如何更新参数
初始化-计算损失-反向传播-迭代优化
LoRA可以用在transformer的那些层
注意力层:
LoRA有哪些版本
LoRA训练的时候要调整哪些超参数
| 参数名 | 类型 | 含义 | 建议值 |
|---|---|---|---|
| finetuning_type | Literal["full","freeze","lora"] | 指定微调类型为 LoRA | 选择 lora,用于高效微调 |
| lora_alpha | Optional[int] | 缩放系数 α,一般情况下为 lora_rank*2 | 设为 r 的 1–2 倍,如 r=16, α=32 |
| lora_dropout | float (0.0–1.0) | LoRA 的 Dropout 概率 | 大数据集:0.0;小数据集:0.05–0.1 |
| lora_rank | int | LoRA 的秩 r | 简单任务:8–16;中等:32;复杂:64+ |
| lora_target | str(逗号分隔) | 应用 LoRA 方法的模块名称(主要是q和v) | 默认:q_proj,v_proj;复杂任务加 k_proj,o_proj 或 all/FFN |
| additional_target | str(逗号分隔) | 额外的 LoRA 目标模块 | 通常留空,除非有特殊模块 |
| loraplus_lr_ratio | Optional[float] | LoRA+ 学习率比例 (λ = η_B / η_A),η_A、η_B 分别为 adapter 矩阵 A 与 B 的学习率 | 启用时设 4–16(如 8) |
| use_rslora | bool | 是否启用秩稳定 LoRA(rsLoRA) | 小 r (4–16): false;大 r (32+): true |
| use_dora | bool | 是否启用权重分解 DoRA | 默认 false,复杂任务开启 |
| pissa_init | bool | 是否用 PiSSA 初始化 LoRA(禁用量化模型) | 默认 false,需高性能时设 true |