高效微调大型预训练模型的方法 - LoRA 微调 ChatGLM3-6B 原理
flyfish
LoRA(Low-Rank Adaptation)微调背后的原理是通过引入低秩分解来减少模型微调过程中的参数数量,从而显著降低计算成本和存储需求,同时保持模型性能。
LoRA 微调的核心原理
- 低秩近似
深度学习模型中的权重矩阵通常是高维的。为了在不损失太多信息的前提下减少这些权重矩阵的参数量,LoRA 假设这些矩阵可以用低秩矩阵来近似。这种近似的数学基础在于矩阵的低秩分解。
具体来说,假设某个权重矩阵 W W W 可以表示为两个低秩矩阵 A A A 和 B B B 的乘积: W ≈ W + Δ W = W + A × B W \approx W + \Delta W = W + A \times B W≈W+ΔW=W+A×B
其中:
A A A 的维度是 d in × r d_{\text{in}} \times r din×r, B B B 的维度是 r × d out r \times d_{\text{out}} r×dout, r r r 是低秩矩阵的秩,通常远小于 d in d_{\text{in}} din 和 d out d_{\text{out}} dout。
Δ
W
\Delta W
ΔW 是权重矩阵的低秩近似,用于更新原始的权重矩阵
W
W
W。
通过使用低秩矩阵
A
A
A 和
B
B
B,可以在较少的参数下实现对权重矩阵的有效更新。
-
冻结原始权重 在传统的微调方法中,模型的所有权重都会参与训练,这需要大量的计算资源。LoRA 的一个关键优化点在于冻结模型的原始权重,只微调通过低秩分解得到的矩阵 A A A 和 B B B 。
因此,LoRA 微调只需要更新少量的参数,而不是整个模型,这大大降低了训练过程中的计算和存储开销。 -
缩放因子 为了控制低秩更新矩阵 Δ W \Delta W ΔW 对原始权重的影响,LoRA 引入了一个缩放因子 α \alpha α: W new = W + α × ( A × B ) W_{\text{new}} = W + \alpha \times (A \times B) Wnew=W+α×(A×B)
这个缩放因子 α \alpha α 用来调整低秩矩阵对整体权重更新的贡献,确保模型在微调过程中保持数值稳定性和有效性。
对应到配置文件
LoRA (Low-Rank Adaptation) 微调中的秩 r r r 和缩放因子 α \alpha α 的数学原理是基于矩阵的低秩分解和缩放机制,以减少参数量并保持模型的表现。让我们详细探讨这两个概念背后的数学原理。
1 低秩矩阵的秩
- 低秩矩阵的秩 r r r在深度学习模型中,权重矩阵通常是高维的。例如,对于一个全连接层或自注意力机制中的线性变换,权重矩阵 W W W 的维度可能是 d in × d out d_{\text{in}} \times d_{\text{out}} din×dout。当这个矩阵非常大时,训练和推理的计算成本都很高。低秩分解 (重要的事重复一遍) 是一种将高维矩阵近似为两个低维矩阵乘积的方法。具体来说,LoRA 假设原始的权重矩阵 W W W 可以被分解为两个低秩矩阵 A A A 和 B B B 的乘积: Δ W = A × B \Delta W = A \times B ΔW=A×B
其中:
A
A
A 的维度是
d
in
×
r
d_{\text{in}} \times r
din×r。
B
B
B 的维度是
r
×
d
out
r \times d_{\text{out}}
r×dout。
这里的秩 r r r 决定了这两个低秩矩阵的大小。通过选择一个较小的 r r r,可以显著减少参数的数量。例如,如果 r r r 远小于 d in d_{\text{in}} din 和 d out d_{\text{out}} dout,则矩阵 A A A 和 B B B 的参数总数为 r × ( d in + d out ) r \times (d_{\text{in}} + d_{\text{out}}) r×(din+dout),远小于原始矩阵 W W W 的参数总数 d in × d out d_{\text{in}} \times d_{\text{out}} din×dout。这种低秩分解的数学基础是线性代数中的矩阵分解理论。秩 r r r 代表矩阵的有效维度数,或者说是其线性独立的向量的最大数量。通过使用低秩分解,LoRA 能够在保持大部分信息的前提下显著降低参数量。
2 LoRA 的缩放因子
- LoRA 的缩放因子 α \alpha αLoRA 引入了一个缩放因子 α \alpha α 来调节低秩更新矩阵 Δ W \Delta W ΔW 对原始权重矩阵 W W W 的影响。完整的权重更新表达式为: W new = W + α ⋅ Δ W W_{\text{new}} = W + \alpha \cdot \Delta W Wnew=W+α⋅ΔW
其中:
Δ
W
=
A
×
B
\Delta W = A \times B
ΔW=A×B
α
\alpha
α 是一个标量,用于调整更新矩阵
Δ
W
\Delta W
ΔW 的幅度。
数学原理 :
数值稳定性 :在训练过程中,
α
\alpha
α 可以防止低秩矩阵更新过大,导致数值不稳定或过拟合。它通过缩放因子
α
\alpha
α 控制更新的步幅,使得模型的学习过程更加平稳。
学习速率调节 :
α
\alpha
α 还可以被视为一个超参数,用来调整模型学习的速度。在许多情况下,低秩矩阵可能需要与原始权重矩阵有不同的学习速率。通过调节
α
\alpha
α,可以有效控制低秩矩阵的贡献。
通过这种缩放机制,LoRA 既能够在低秩矩阵上捕捉到有效的模型调整,同时避免了由于低秩矩阵过度影响原始权重而引发的数值问题。
一句话
秩 r r r :决定了低秩矩阵的大小,通过降低 r r r 来减少参数数量和计算成本。缩放因子 α \alpha α :控制低秩矩阵对原始权重的影响,确保模型的稳定性和有效性。
一个简单的数值示例来说明 SVD(奇异值分解)和 LU 分解的过程和结果。
两句话
SVD 分解 用于将矩阵分解为多个矩阵的乘积,广泛应用于数据降维、噪声消除等领域。
LU 分解 是用于方阵的一种分解方式,通常用于求解线性方程组和计算矩阵行列式。
1. SVD(奇异值分解)
SVD 将一个矩阵
A
A
A 分解为三个矩阵的乘积:
A
=
U
Σ
V
T
A = U \Sigma V^T
A=UΣVT,其中:
U
U
U 是一个列正交矩阵(左奇异矩阵),包含了
A
A
A 的左奇异向量。
Σ
\Sigma
Σ 是一个对角矩阵,包含了
A
A
A 的奇异值。
V
T
V^T
VT 是一个行正交矩阵(右奇异矩阵),包含了
A
A
A 的右奇异向量的转置。
示例:
设矩阵 A A A 为: A = ( 3 2 2 3 ) A = \begin{pmatrix} 3 & 2 \\ 2 & 3 \end{pmatrix} A=(3223)
进行 SVD 分解后,我们得到:
A
=
U
Σ
V
T
A = U \Sigma V^T
A=UΣVT
其中:
U
U
U 为:
U
=
(
1
2
1
2
1
2
−
1
2
)
U = \begin{pmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} \end{pmatrix}
U=(212121−21)
Σ
\Sigma
Σ 为:
Σ
=
(
5
0
0
1
)
\Sigma = \begin{pmatrix} 5 & 0 \\ 0 & 1 \end{pmatrix}
Σ=(5001)
V
T
V^T
VT 为:
V
T
=
(
1
2
1
2
1
2
−
1
2
)
V^T = \begin{pmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} \end{pmatrix}
VT=(212121−21)
所以,
A
A
A 可以表示为
U
Σ
V
T
U \Sigma V^T
UΣVT 的乘积。
2. LU 分解
LU 分解将一个方阵
A
A
A 分解为两个矩阵
L
L
L 和
U
U
U 的乘积:
A
=
L
U
A = LU
A=LU,其中:
L
L
L 是一个下三角矩阵(Lower triangular matrix),对角线上元素为 1。
U
U
U 是一个上三角矩阵(Upper triangular matrix)。
示例:
设矩阵 A A A 为: A = ( 4 3 6 3 ) A = \begin{pmatrix} 4 & 3 \\ 6 & 3 \end{pmatrix} A=(4633)
我们进行 LU 分解,得到:
A
=
L
U
A = LU
A=LU
其中:
L
L
L 为:
L
=
(
1
0
1.5
1
)
L = \begin{pmatrix} 1 & 0 \\ 1.5 & 1 \end{pmatrix}
L=(11.501)
U
U
U 为:
U
=
(
4
3
0
−
1.5
)
U = \begin{pmatrix} 4 & 3 \\ 0 & -1.5 \end{pmatrix}
U=(403−1.5)
因此,矩阵
A
A
A 可以分解为
L
L
L 和
U
U
U 的乘积:
A
=
(
1
0
1.5
1
)
(
4
3
0
−
1.5
)
=
(
4
3
6
3
)
A = \begin{pmatrix} 1 & 0 \\ 1.5 & 1 \end{pmatrix} \begin{pmatrix} 4 & 3 \\ 0 & -1.5 \end{pmatrix} = \begin{pmatrix} 4 & 3 \\ 6 & 3 \end{pmatrix}
A=(11.501)(403−1.5)=(4633)