一、LoRA模型的概念
- LoRA的全称:Low-Rank Adaptation of Large Language Models,是一种微调模型,可以理解为stable diffusion模型的一种插件,用于满足一种特定的风格,或指定的人物特征属性;
- 我们可以使用SD模型+LoRA微调训练的方式,只训练参数量很小的LoRA模型,就能在下游细分任务中取得不错的效果;
- LoRA大幅降低了SD模型训练时的显存占用,因为并不优化主模型(SD模型),所以主模型对应的优化器参数不需要存储。但计算量没有明显变化,因为LoRA是在主模型的全参梯度基础上增加了“残差”梯度,同时节省了主模型优化器更新权重的过程。
二、LoRA模型的核心原理
(一)LoRA模型的训练逻辑
- 步骤一: 冻结训练好的SD模型的权重;
- 步骤二: 在SD模型的U-Net结构中注入LoRA模块,并将其与CrossAttention模块结合,并只对这部分参数进行微调训练;
- 步骤三: 训练好新的参数后,利用重参的方式,将新参数和老的模型参数合并。
(二)LoRA的参数合并方式
对于SD模型权重
W
0
∈
R
n
×
m
W_0 \in \mathbb{R}^{n\times m}
W0∈Rn×m,我们不再对其进行全参微调训练,而是对权重加入残差的形式,通过训练
Δ
W
\Delta W
ΔW来完成优化过程:
W
′
=
W
0
+
Δ
W
W^{'} =W_0+\Delta W
W′=W0+ΔW
其中
Δ
W
=
A
B
T
\Delta W=AB^T
ΔW=ABT,
A
∈
R
n
×
d
A\in \mathbb{R}^{n\times d}
A∈Rn×d,
B
∈
R
d
×
m
B\in \mathbb{R}^{d\times m}
B∈Rd×m,
d
d
d就是
Δ
W
\Delta W
ΔW这个参数矩阵的秩,其通过低秩分解由两个低秩矩阵的乘积组成。由于下游细分任务的域非常小,所以d可以取得很小,很多时候可以取1。因此,在训练完成后,可以获得一个参数远小于SD模型的LoRA模型。
假设原来的是100x1024的参数矩阵,那么参数量为102400,LoRA模型将矩阵拆成了两个矩阵相乘,如果设置Rank=8,那么就是100x8的B矩阵与8x1024的A矩阵做矩阵乘法,参数量为800+8192=8992,整体参数量下降了约11.39倍。
矩阵乘积
A
B
T
AB^T
ABT 与SD模型的参数有相同的维度,同时分解出来的两个较小矩阵可以确保参数更新是在低秩情况下的,这样就显著减少训练的参数数量了。
- 对于矩阵A:使用随机高斯分布初始化
- 对于矩阵B:使用全0初始化
- 初始状态下这两个矩阵相乘的结果为0,从而保证初始阶段时只有SD模型(主模型)生效
参考:
深入浅出完整解析LoRA(Low-Rank Adaptation)模型核心基础知识
什么是LoRA模型,如何使用和训练LoRA模型?你想要的都在这!
图像生成:SD LoRA模型详解