LoRA (Low-Rank Adaptation)
背景:全微调(Full Fine-Tuning)
在 LoRA 出现前,一般进行大模型微调都会执行全微调,即将原模型的所有参数都在下游任务上进行调整。
网络层的数学表示:这里以线性层(全连接层)为例,假设输入向量为 $x \in \mathbb{R}^k$,输出向量为 $h \in \mathbb{R}^d$,该层的计算可以表示为:
$$ h = W x, $$
其中 $W \in \mathbb{R}^{d \times k}$ 是该层权重矩阵。
全量微调:假设预训练好的权重矩阵为 $W_0 \in \mathbb{R}^{d \times k}$,Full Fine-Tuning 在新的数据集上更新完整的权重矩阵
$$ W = W_0 + \Delta W, $$
其中 $\Delta W \in \mathbb{R}^{d \times k}$ 是微调过程中的权重更新量。
LoRA 的思想假设
低秩假设:LoRA (Low-Rank Adaptation) 的基本思想是微调过程中,权重更新矩阵 $\Delta W$ 有很低的 intrinsic rank,即 $\Delta W$ 尺寸虽然很大,但是其包含的信息可以用远小于其维数的秩 $r$ 来有效表示。
低秩分解 Low-Rank Decomposition:LoRA 不学习巨大的 $\Delta W$ 矩阵本身,而是通过 Low-Rank Decomposition 来近似它,即
$$ \Delta W = BA, $$
其中 $B \in \mathbb{R}^{d \times r}$, $A \in \mathbb{R}^{r \times k}$,$0 < r \ll \min\{d, k\}$ 为 LoRA 近似矩阵的秩。通常 $A$ 使用高斯分布初始化,$B$ 使用零初始化,这样 $\Delta W$ 就被初始化为 $\mathcal{O}$。
LoRA 的更新步骤:在实际程序中,我们一般会见到 lora_r
和 lora_alpha
两个超参数,因为实际更新的方式为
$$ W = W_0 + \frac{\alpha}{r}(BA), $$
其中 $r$ 是 LoRA rank,$\alpha$ 为 scaling factor。一般来说,我们会将 lora_alpha
设置得比 lora_r
大一点,例如 $\alpha = 2r$。
LoRA 训练与推理:在训练过程中,我们冻结 $W_0$,只更新 $A, B$。而在推理部署时,将 $A,B$ 合并回权重矩阵 $W$,这样我们在推理过程中也不需要额外的内存/显存开销。