如何微调出自己的大模型——LoRA原理解析
上一篇文章,我们已经讲了隐扩散模型——Stable Diffusion生成大模型。这种大模型,参数量及其之大。你没有足够的算力资源,就只能够使用人家已经训练好的大模型。既然没有办法训练属于自己的模型,那我们就想,是否可以在别人已经训练好的大模型的基础上,用我们自己的训练数据,对模型进行微调,从而得到我们想要的模型。github.com[如何微调出属于自己大模型?——LORA原理解析-哔哩哔哩]
1、前言
上一篇文章,我们已经讲了隐扩散模型——Stable Diffusion生成大模型。这种大模型,参数量及其之大。你没有足够的算力资源,就只能够使用人家已经训练好的大模型。既然没有办法训练属于自己的模型,那我们就想,是否可以在别人已经训练好的大模型的基础上,用我们自己的训练数据,对模型进行微调,从而得到我们想要的模型。
视频:[如何微调出属于自己大模型?——LORA原理解析-哔哩哔哩]
2、引入
如果你使用过Stable Diffusion,应该看到过LoRA这个词。他其实就是一种微调方法。
在这个微调方法之前,其实已经存在一些微调方法,比如
①Fine-Tuning,FT: 在微调过程中,模型初始化为预训练的权重和偏置项,所有的模型参数都会进行梯度更新。一个简单的变体是只更新一些层而冻结其他层。
②Bias-only or BitFit: 只训练偏置向量,而冻结其他所有部分。
③Adapter tuning: 在自注意力模块和后面的残差连接之间插入一个适配器层。该适配器层有两个全连接层,中间有非线性的偏置。后面还存在一些新的变体。
另外论文还提到了Prefix-embedding tuning和Prefix-layer tuning。这两种我之前没见过,感兴趣的可以去看一下。
上述方法都或多或少的存在一些问题。如果模型的非常大。那么上述这些微调方法的计算成本将非常大。所以论文就提出了一种新的微调方法LoRA
Ps:这篇论文一开始提出来是应用在自然语言处理的。比如GPT,BERT这些模型。
3、LoRA
论文作者受到这篇论文Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning (arxiv.org)的启发。该论文表明,预训练的语言模型在去适应某些特定的任务时(下游任务),是具有较低的内在维度的。也就是说,即使我们把它投射到较小的子空间,仍然能够高效的学习。
基于这个思想,论文假设权重微调变化的过程中也具有较低的秩(权重更新矩阵 Δ W \Delta W ΔW是低秩矩阵),从而提出Low-Rank Adaptation(LoRA)
什么叫做具有低的秩?我们从方程的角度出发
2
x
+
y
=
1
x
+
y
=
0
2x+y=1\\x+y=0
2x+y=1x+y=0
两个方程,两个未知量。我们可以求出对应的值
x
=
1
,
y
=
−
1
x=1,y=-1
x=1,y=−1
那假如我们的方程长这样呢
2
x
+
y
=
1
4
x
+
2
y
=
2
2x+y=1\\4x+2y=2
2x+y=14x+2y=2
我们绝对求不出,因为这两个方程是线性相关的。我们仔细看,第一个方程乘以2,就得到了第二个方程。因此,我们不难发现,这种存在相关性的方程之间,是无法求解的。也就是说,第二个方程实际上是无用的,因为它可以由第一个方程进行线性变化得到。
现在,我们假设有一份方程组
{
x
+
0
×
y
=
0
2
x
+
0
×
y
=
0
\begin{cases}x+0\times y=0\\2x+0\times y=0\end{cases}
{x+0×y=02x+0×y=0
我们把系数写成矩阵的形式
(
1
0
2
0
)
\begin{pmatrix}1 & 0 \\2 & 0\end{pmatrix}
(1200)
像这种方式,由于第一行和第二行线性相关,所以这个矩阵的秩就等于1。而矩阵的维度是2x2。当矩阵的秩(记为r)远远小于行,列的维度,我们称该矩阵为低秩矩阵(当燃了,我这里举的例子,也没有远远小于…大家知道概念就行)。
我们做个微调假设更新,对一个参数层,有
W
′
=
W
0
+
W
F
T
W'=W_0+W^{FT}
W′=W0+WFT
W
F
T
W^{FT}
WFT是一个微调矩阵,
W
′
W'
W′表示微调后的参数,
W
0
W_0
W0表示原始参数,假设
W
0
∈
R
d
×
k
W_0\in R^{d\times k}
W0∈Rd×k,那么
W
F
T
W^{FT}
WFT也是一样的维度。对
W
F
T
W^{FT}
WFT进行奇异值分解
W
F
T
=
U
d
×
d
Σ
d
×
k
V
k
×
k
T
W^{FT}=U_{d\times d}\Sigma_{d\times k}V_{k\times k}^T
WFT=Ud×dΣd×kVk×kT
当
W
F
T
W^{FT}
WFT的秩远远小于d和k,则我们可以获取
W
F
T
W^{FT}
WFT的近似(选择前r个奇异值来压缩矩阵,如果矩阵的秩足够小,被丢弃的奇异值将为0或者较小,所以以下近似成立,该方法被称为低秩分解)
W
F
T
≈
U
d
×
r
Σ
r
×
r
V
r
×
k
T
W^{FT}\approx U_{d\times r}\Sigma_{r\times r}V^T_{r\times k}
WFT≈Ud×rΣr×rVr×kT
为什么可以选择前r个奇异值?因为
Σ
d
×
k
\Sigma_{d\times k}
Σd×k一般是从大到小排序的。奇异值越大,代表其对应的奇异向量越重要,越小则越不重要。
我们将奇异值分解压缩成两个矩阵相乘
B
=
U
d
×
r
A
=
Σ
r
×
r
V
r
×
k
T
B=U_{d\times r}\\A=\Sigma_{r\times r}V_{r \times k}^T
B=Ud×rA=Σr×rVr×kT
再说回来,假设权重微调变化的过程中也具有较低的秩。所以,可以通过低秩分解。来缩小可训练的参数维度。
我们用
Δ
W
\Delta W
ΔW表示
W
F
T
W^{FT}
WFT低秩分解的结果。并用该低秩分解的结果去微调。于是就得到了论文里面结论
W
′
=
W
0
+
Δ
W
=
W
0
+
B
A
W'=W_0+\Delta W=W_0+BA
W′=W0+ΔW=W0+BA
那么
B
∈
R
d
×
r
,
A
∈
R
r
×
k
B \in R^{d\times r},A \in R^{r\times k}
B∈Rd×r,A∈Rr×k,B和A里面的参数是可学习的,r就是我们所选择的秩,并且
r
≪
min
(
d
,
k
)
r \ll \min(d,k)
r≪min(d,k)。而
W
0
W_0
W0参数冻结。
所以对于
W
0
W_0
W0乘以一个x得到输出,也就是
h
=
W
0
x
h=W_0x
h=W0x,就可以变成
h
=
W
′
x
=
W
0
x
+
B
A
x
h=W'x=W_0x+BAx
h=W′x=W0x+BAx
其中,A是随机高斯初始化的,而B初始化为0,因此一开始,
B
A
=
0
BA=0
BA=0。也就是相当于没有微调。
然后,论文作者使用 α r \frac{\alpha}{r} rα来缩放 B A x BAx BAx, α \alpha α是一个与r相关的常数,在使用Adam优化器时,可以把 α \alpha α调整为与学习率相当。
通过这种方式,我们可训练的参数,实际上是
∣
Φ
∣
=
(
d
+
k
)
×
r
×
L
^
L
o
R
A
|\Phi|=(d+k)\times r\times \hat L_{LoRA}
∣Φ∣=(d+k)×r×L^LoRA
其中
L
^
L
o
R
A
\hat L_{LoRA}
L^LoRA代表应用LoRA的权重矩阵的数量
4、选择哪些参数微调
在这篇论文中,是应用在自然语言处理的,比如GPT,Transformer,BERT这些模型。作者指出,我们对里面的自注意力机制的权重矩阵进行更改。也就是对 W q , W k , W v , W o W_q,W_k,W_v,W_o Wq,Wk,Wv,Wo进行微调(也可以只微调其中一部分,比如只微调 W q , W v W_q,W_v Wq,Wv)。
而对于我们的Stable Diffusion,在哪些参数进行微调呢?我可以明确的告诉你,我不知道!这篇论文的发表先于Stable Diffusion那篇论文,里面没有提到对这个模型的微调修改。我也没有看过相关的代码
不过,Stable Diffusion里面也有一个自注意力机制。所以盲猜就是对注意力的权重矩阵进行微调了。
5、结束
好了,本篇文章到此为止,如有问题,还望指出。阿里嘎多!!!
更多推荐
所有评论(0)