LoRA、QLoRA 和 DoRA 解读
PEFT代表参数高效微调。其核心做两件事:
- 冻结基础模型的大部分参数。 原始权重完全不变,这节省了大量显存并防止灾难性遗忘。
- 只训练极少量的参数。 不是更新数十亿权重,而是只训练一组非常小的额外参数(如适配器层)或修改权重的表示方式(如低秩矩阵近似)。
在这篇文章中,我们将介绍三种算法。
1、LoRA(低秩适应)
LoRA引入一个小的可训练更新矩阵,将其添加到原始冻结的权重矩阵中。在微调过程中,这个更新被表示为两个低秩矩阵的乘积,从而减少可训练参数的数量。
对于原始权重矩阵 W,完整微调学习:
LoRA假设更新ΔW可以由两个低秩矩阵近似:
因此:
其中:
W是冻结的原始权重矩阵;- A ∈ ℝ^(r×d);
- B ∈ ℝ^(d′×r);
r是一个小的秩,如4、8或16;- BA ∈ ℝ^(d′×d),与
W具有相同的形状。
训练期间:W被冻结;A和B可训练。
从技术上讲,LoRA不是先计算完整的ΔW然后对其进行分解。它直接将更新参数化为 BA,并通过反向传播训练 A 和 B。
例如,如果:
完整更新参数:
4096 × 4096 ≈ 1680万
LoRA参数:
4096 × 8 + 8 × 4096 = 65,536
所以LoRA本质上是:
权重更新的低秩参数化,而不是原始LLM权重的完整矩阵分解
2、QLoRA
Q 代表 量化。
它结合了:
- 量化: 将基础模型转换为低位精度,通常是4位,以减少内存使用。
- LoRA: 冻结量化后的基础模型,只训练两个小的低秩矩阵。
更新后的权重可以写成:
其中 W_4bit 是冻结的4位模型,BA 是可训练的LoRA更新。
简单来说:
QLoRA压缩原始模型,然后在其上训练一个小的适配器。
这允许用更少的显存微调更大的LLM,同时保持接近标准LoRA的性能。
3、DoRA
3.1 LoRA的问题
任何向量都可以由两个分量表示:其大小和其方向。然而,LoRA通过单个低秩矩阵学习权重更新。因此,相同的低秩更新必须同时捕获权重大小和方向的变化。
对于简单任务,这种近似可能足够。然而,对于更复杂的任务,所需的更新可能包含几个独立的模式。由于更新被约束在维度为 r 的低秩子空间中,所有参数变化必须仅表示为 r 个基方向的组合。
如果任务需要的独立变化超过所选秩能表达的范围,则无法精确表示这些变化。模型必须在有限的低秩空间内近似它们,这可能导致不同适应需求之间的干扰或折衷。
3.2 一个简单的例子
假设所需的权重更新是:
- 增加第一个方向1;
- 减少第二个方向1;
- 保持两个方向独立。
该矩阵的秩为2:rank(ΔW) = 2。
然而,如果LoRA使用 r = 1,其更新必须具有形式:
秩-1更新可以改变多个参数,但所有变化必须遵循一个共享模式。它无法在增加一个方向的同时减少另一个方向。因此,LoRA无法精确表示目标更新,必须近似:
ΔW ≈ BA
这种近似可能迫使模型在不同需求之间妥协。例如,它可能学会正确增加第一个方向,但未能充分减少第二个方向。
3.3 DoRA在LoRA基础上增加了什么?
DoRA代表权重分解低秩适应。
DoRA将这两种类型的变化分离。它将预训练权重矩阵分解为大小分量和方向分量:
在微调期间:
- 方向使用LoRA矩阵
B和A更新; - 大小
m作为单独的可训练参数学习。
更新后的权重可以写成:
这样,DoRA不强制相同的低秩更新同时学习大小和方向。相反:
LoRA分量 BA → 学习方向变化
可训练大小 m' → 学习缩放变化
这给了模型更多灵活性,可以使其行为更接近完整微调,特别是当任务需要复杂的权重更新时。
然而,DoRA并没有完全消除低秩约束。方向更新仍然由 BA 表示,因此其有效性仍然取决于所选的秩 r。DoRA主要改进了可用适应能力的使用方式。
4、秩
矩阵是模型用于处理和转换信息的基本工具;秩表示该矩阵实际上可以表达多少独立的信息方向。矩阵的秩代表其中真正独立的信息方向数量,也代表其转换后保留的有效维度数量。
原文链接:Parameter-Efficient Fine-Tuning (PEFT): LoRA, QLoRA, and DoRA Explained
汇智网翻译整理,转载请标明出处