7、Lora微调论文笔记(低秩适应)
Lora微调论文笔记(低秩适应)
论文:LoRA: Low-Rank Adaptation of Large Language Models(LORA:大规模语言模型的低秩适应)
链接:https://arxiv.org/abs/2106.09685
Official Code:https://github.com/microsoft/LoRA
1、研究背景
- 引言
- 自然语言处理中常需将大规模预训练语言模型适配到多个下游应用,通常采用微调方法,但对于如 GPT - 3 等大型模型,微调会产生与原模型相同数量的参数,导致存储和部署成本过高。
- 现有一些方法如添加适配器层或优化输入层激活来提高效率,但存在引入推理延迟、降低模型可用序列长度或无法达到微调基线性能等问题。
- 问题陈述:以语言建模为例,在全量微调时,每个下游任务需学习一组与预训练模型参数维度相同的参数,这在模型规模大时面临挑战。本文采用更参数高效的方法,用小得多的参数集 Θ 编码任务特定的参数增量 ΔΦ,后续提出用低秩表示来编码 ΔΦ,以提高计算和存储效率。
- 现有解决方案的不足
- 适配器层引入推理延迟:适配器层虽可减少参数,但在在线推理场景(如小批量、短序列长度)下,会显著增加推理延迟,且在模型分片时问题更严重,因为其额外深度需要更多同步 GPU 操作。
- 直接优化提示存在困难:以前缀调整为例,其难以优化,性能在可训练参数变化时非单调,且为适应保留部分序列长度会减少处理下游任务的可用序列长度,从而影响性能。
2、Lora微调
2.1 Lora原理
图 1:我们的重新参数化。我们只训练 A 和 B。
神经网络包含许多执行矩阵乘法的密集层。这些层中的权重矩阵通常具有满秩。在适应特定任务时,Aghajanyan 等人(2020 年)表明,预训练语言模型具有较低的“内在维度”,并且尽管随机投影到较小的子空间中,仍然可以高效学习。受此启发,我们假设在适应过程中,权重的更新也具有较低的“内在秩”。对于预训练权重矩阵
W
0
∈
R
d
×
k
ˉ
W_{0}∈R^{d×\bar{k}}
W0∈Rd×kˉ,我们通过用低秩分解
W
0
+
Δ
W
=
W
0
+
B
A
W_{0}+\Delta W = W_{0}+BA
W0+ΔW=W0+BA 来约束其更新,其中
B
∈
R
d
×
r
B∈R^{d×r}
B∈Rd×r,
A
∈
R
r
×
k
A∈R^{r×k}
A∈Rr×k,并且秩
r
≪
m
i
n
(
d
,
k
)
r\ll min(d,k)
r≪min(d,k)。在训练期间,
W
0
W_{0}
W0 被冻结且不接收梯度更新,而 A 和 B 包含可训练参数。请注意,
W
0
W_{0}
W0 和
Δ
W
=
B
A
\Delta W = BA
ΔW=BA 都与相同的输入相乘,并且它们各自的输出向量按坐标求和。对于
h
=
W
0
x
h = W_{0}x
h=W0x,我们修改后的前向传播产生:
h
=
W
0
x
+
Δ
W
x
=
W
0
x
+
B
A
x
h = W_{0}x+\Delta Wx = W_{0}x + BAx
h=W0x+ΔWx=W0x+BAx。
我们在图 1 中说明了我们的重新参数化。我们对 A 使用随机高斯初始化,对 B 初始化为零,所以在训练开始时
Δ
W
=
B
A
\Delta W = BA
ΔW=BA 为零。然后,我们将
Δ
W
x
\Delta Wx
ΔWx 按
α
r
\frac{\alpha}{r}
rα 进行缩放,其中
α
\alpha
α 是 r 中的一个常数。当使用 Adam 进行优化时,如果我们适当地缩放初始化,调整
α
\alpha
α 大致与调整学习率相同。因此,我们只需将
α
\alpha
α 设置为我们尝试的第一个 r,并且不进行调整。这种缩放有助于在我们改变 r 时减少重新调整超参数的需要(Yang & Hu,2021)。
α \alpha α 和 r:
-
在这段内容中, r r r 是 LoRA 模块的秩。在对预训练权重矩阵 W 0 W_{0} W0 进行更新时,通过低秩分解 W 0 + Δ W = W 0 + B A W_{0}+\Delta W = W_{0}+BA W0+ΔW=W0+BA 来表示,其中 B ∈ R d × r B\in\mathbb{R}^{d×r} B∈Rd×r, A ∈ R r × k A\in\mathbb{R}^{r×k} A∈Rr×k,这里的 r r r 决定了低秩矩阵的秩,并且在实验中会通过改变 r r r 来研究其对模型的影响。
-
α \alpha α 是一个与 r r r 相关的常数。在训练过程中,会将 Δ W x \Delta Wx ΔWx 乘以 α r \frac{\alpha}{r} rα 进行缩放。当使用 Adam 优化器时,如果对初始化进行适当缩放,调整 α \alpha α 的效果大致等同于调整学习率。因此在实际操作中,作者简单地将 α \alpha α 设置为首次尝试的 r r r 值,并且不再对其进行调整,这样做的好处是当改变 r r r 时,可以减少重新调整超参数的需要。
2.2 Lora和微调(全参)对比
用矩阵AB低秩矩阵来替代梯度更新的损失 Δ Φ \Delta\Phi ΔΦ:
- 语言建模及下游任务适配问题:以预训练的自回归语言模型 P Φ ( y ∣ x ) P_{\Phi}(y|x) PΦ(y∣x) 为例,介绍了将其应用于下游条件文本生成任务(如总结、机器阅读理解、自然语言到 SQL 转换等)的情况。每个下游任务由包含上下文 - 目标对的训练数据集 Z = { ( x i , y i ) } i = 1 , ⋯ , N Z = \{(x_{i}, y_{i})\}_{i = 1,\cdots,N} Z={(xi,yi)}i=1,⋯,N 表示,在全量微调过程中,模型从预训练权重 Φ \Phi Φ 开始,通过重复梯度更新为 Φ 0 + Δ Φ \Phi_{0}+\Delta\Phi Φ0+ΔΦ 以最大化条件语言建模目标,但这样会导致每个下游任务都学习到一组与预训练模型参数数量相同的新参数 Δ Φ \Delta\Phi ΔΦ,对于像 G P T − 3 GPT - 3 GPT−3 这样的大型预训练模型,存储和部署多个独立的微调模型实例变得极为困难。
- 本文的参数高效方法:提出采用一种更具参数效率的方法,将特定任务的参数增量 Δ Φ = Δ Φ ( Θ ) \Delta\Phi=\Delta\Phi(\Theta) ΔΦ=ΔΦ(Θ) 用一组规模远小于 Φ 0 \Phi_{0} Φ0 的参数 Θ \Theta Θ 进行编码,将寻找 Δ Φ \Delta\Phi ΔΦ 的任务转化为对 Θ \Theta Θ 的优化,并计划在后续章节中使用低秩表示来编码 Δ Φ \Delta\Phi ΔΦ,以实现计算和内存的高效利用,如在 G P T − 3175 B GPT - 3 175B GPT−3175B 模型上可使可训练参数 Θ \Theta Θ 的数量小到 ∣ Φ 0 ∣ |\Phi_{0}| ∣Φ0∣ 的 0.01 % 0.01\% 0.01%。
2.3Lora和适配器调整(Adapter tuning)对比
传统的微调方法是对预训练模型的所有参数进行更新,但有一种更广义的微调形式,它允许仅训练预训练参数的一个子集。而 LoRA 在此基础上又有进一步的创新,在模型适应新任务的过程中,它不要求权重矩阵的累积梯度更新必须是满秩的。
具体来说,当在所有的权重矩阵上应用 LoRA 并且训练所有的偏差(这里的偏差相对于权重来说数量通常是可忽略的)时,如果我们把 LoRA 的秩 r 设置为预训练权重矩阵的秩,那么就能够大致恢复全量微调的表达能力。也就是说,当我们增加可训练参数的数量时,LoRA 的训练结果会逐渐接近对原始模型的训练结果。
相比之下,基于适配器的方法在增加可训练参数时会收敛到一个多层感知机(MLP),这种收敛结果使得它在表达能力上有一定局限;而基于前缀的方法则会收敛到一个无法处理长输入序列的模型,这在处理一些复杂任务时会受到很大限制。(基于前缀的方法则会收敛到一个无法处理长输入序列的模型,在面对长序列数据时会表现不佳。)
总的来说,LoRA 在模型适应过程中展现出独特的优势,能够在保持高效性的同时,随着参数的调整更好地逼近原始模型的性能,而其他方法则存在明显的不足。
2.4低秩更新的理解
- 选择应用 LoRA 的权重矩阵:在 GPT - 3 175B 上的实验表明,在有限参数预算下,同时适配 W q W_{q} Wq 和 W v W_{v} Wv 能获得最佳性能,即使较低的秩(如 r = 4 r = 4 r=4)也能捕捉到足够信息。
- LoRA 的最优秩 r r r:通过实验发现,对于一些数据集,较小的秩(如 r = 1 r = 1 r=1)在适配 W q W_{q} Wq 和 W v W_{v} Wv 时就能使 LoRA 表现出竞争力,且增加秩并不会覆盖更有意义的子空间,说明低秩适应矩阵足够有效。通过子空间相似性分析进一步验证了这一结论。
- 适应矩阵 Δ W \Delta W ΔW 与 W W W 的关系: Δ W \Delta W ΔW 与 W W W 的相关性比随机矩阵强,它放大了 W W W 中未被强调的特征方向,且放大因子较大,表明低秩适应矩阵可能会放大特定下游任务的重要特征。
内在秩:
度量方法:通过基于格拉斯曼距离(Grassmann distance)的归一化子空间相似性(normalized subspace similarity)来度量这个量。通过对它们进行奇异值分解(singular value decomposition,SVD),可以得到右奇异酉矩阵(right - singular unitary matrices)
U
A
r
=
8
U_{A_{r=8}}
UAr=8 和
U
A
r
=
64
U_{A_{r = 64}}
UAr=64。
ϕ
(
⋅
)
\phi(\cdot)
ϕ(⋅) 的值域在
[
0
,
1
]
[0,1]
[0,1] 之间,其中
1
1
1 表示子空间完全重叠,
0
0
0 表示子空间完全分离。请参阅附录 G)
表 6 显示,令人惊讶的是,LoRA 已经在非常小的 r 下表现得具有竞争力(对于
W
q
,
W
v
{W_{q}, W_{v}}
Wq,Wv 来说,不仅仅是
W
q
W_{q}
Wq 来说更是如此)。这表明更新矩阵
Δ
W
\Delta W
ΔW 可能具有非常小的“内在秩”6。为了进一步支持这一发现,我们检查了通过不同 r 选择和不同随机种子学习的子空间的重叠。我们认为,增加 r 并不能覆盖更有意义的子空间,这表明低秩适应矩阵就足够了。
由于
A
r
=
8
A_{r=8}
Ar=8 和
A
r
=
64
A_{r=64}
Ar=64 都是使用相同的预训练模型学习的,因此图 3 表明
A
r
=
8
A_{r=8}
Ar=8 和
A
r
=
64
A_{r=64}
Ar=64 的顶部奇异向量方向最有用,而其他方向可能包含训练过程中积累的大部分随机噪声。因此,适应矩阵确实可以具有非常低的秩。
图 3:
Δ
W
q
\Delta W_{q}
ΔWq 和
Δ
W
v
\Delta W_{v}
ΔWv 的
A
r
=
8
A_{r=8}
Ar=8 和
A
r
=
64
A_{r=64}
Ar=64 的列向量之间的子空间相似性第三个和第四个图放大了前两个图中的左下角三角形。
r
=
8
r=8
r=8 中的顶部方向包含在
r
=
64
r=64
r=64 中,反之亦然。
这张图片展示了四个热力图(heatmap),用于表示不同条件下权重矩阵的变化情况。颜色从深红色到浅红色再到白色渐变。深红色表示较大的值,浅红色表示较小的值,白色表示接近零的值。
Δ
W
\Delta W
ΔW 与
W
W
W 的关系:
为了回答这些问题,我们通过计算
U
⊤
W
V
⊤
U^{\top} W V^{\top}
U⊤WV⊤ 将 W 投影到
Δ
W
\Delta W
ΔW 的 r 维子空间上,其中
U
/
V
U / V
U/V 是
Δ
W
\Delta W
ΔW 的左/右奇异向量矩阵。然后,我们比较了
∥
U
⊤
W
V
⊤
∥
F
\left\|U^{\top} W V^{\top}\right\|_{F}
U⊤WV⊤
F 和
∥
W
∥
F
\|W\|_{F}
∥W∥F 之间的 Frobenius 范数。作为比较,我们还通过将 U 、V 替换为 W 的顶部 r 奇异向量或随机矩阵来计算
∥
U
⊤
W
V
⊤
∥
F
\left\|U^{\top} W V^{\top}\right\|_{F}
U⊤WV⊤
F。
3、数学(低秩分解)
参考:链接
低秩分解和奇异值分解区别:
- 定义
- 低秩分解:
- 低秩分解是将一个矩阵分解为两个(或多个)矩阵的乘积,使得分解后的矩阵乘积的秩相对较低。通常,如果一个矩阵 A A A 的秩为 r r r,我们希望找到矩阵 U U U 和 V V V,使得 A = U V A = UV A=UV(在简单的低秩分解形式下),并且 U U U 和 V V V 的秩的性质满足一定的要求,这个要求往往是使得 r a n k ( U V ) < r a n k ( A ) rank(UV)<rank(A) rank(UV)<rank(A) 或者 r a n k ( U V ) rank(UV) rank(UV) 是一个相对较小的值。例如,对于一个满秩的方阵,通过低秩分解可以将其表示为秩较低的矩阵的乘积,在数据压缩等应用场景中非常有用。
- 奇异值分解(SVD):
- 对于任意一个 m × n m\times n m×n 的矩阵 A A A,奇异值分解将其分解为 A = U Σ V T A = U\Sigma V^T A=UΣVT。其中 U U U 是一个 m × m m\times m m×m 的正交矩阵, V V V 是一个 n × n n\times n n×n 的正交矩阵, Σ \Sigma Σ 是一个 m × n m\times n m×n 的对角矩阵,对角线上的元素称为奇异值。奇异值是按照从大到小的顺序排列的,并且非零奇异值的个数等于矩阵 A A A 的秩。例如,对于一个 3 × 2 3\times2 3×2 的矩阵进行奇异值分解后,得到的 U U U 是 3 × 3 3\times3 3×3 正交矩阵, Σ \Sigma Σ 是 3 × 2 3\times2 3×2 对角矩阵, V V V 是 2 × 2 2\times2 2×2 正交矩阵。
- 低秩分解:
- 分解形式的不同
- 低秩分解形式相对灵活:
- 低秩分解的形式没有像奇异值分解那样固定。它可以有多种形式,比如 A = U V A = UV A=UV,也可以是 A = U D V A = UDV A=UDV(其中 D D D 是对角矩阵或者其他简单形式的矩阵)等。而且在低秩分解中,对于分解后的矩阵 U U U 和 V V V 的性质要求不像奇异值分解中 U U U、 V V V 是正交矩阵那么严格。例如在一些应用中,只要求 U U U 和 V V V 的秩满足一定条件,其列向量甚至不需要是正交的。
- 奇异值分解形式固定:
- 奇异值分解具有标准的固定形式 A = U Σ V T A = U\Sigma V^T A=UΣVT。这种固定的形式使得它在理论分析和很多应用场景中有独特的优势。因为正交矩阵 U U U 和 V V V 具有很好的性质,比如 U T U = I U^TU = I UTU=I 和 V T V = I V^TV = I VTV=I,这些性质在求解线性最小二乘问题、矩阵近似等方面非常有用。
- 低秩分解形式相对灵活:
- 分解的目的和应用场景差异
- 低秩分解主要用于降维和数据压缩:
- 当处理大规模的数据矩阵时,低秩分解可以将高维的数据表示为低秩的形式,从而减少存储数据所需的空间。例如,在图像数据处理中,如果一个图像矩阵可以用低秩分解表示,那么就可以通过存储分解后的矩阵来减少存储空间,并且在一定程度上可以对图像进行压缩表示。同时,在机器学习中的一些算法中,低秩分解可以用来对高维特征进行降维,使得模型更容易训练和理解。
- 奇异值分解用途广泛,包括但不限于信号处理和主成分分析(PCA):
- 在信号处理中,奇异值分解可以用于对信号进行去噪。例如,对于一个含有噪声的信号矩阵,通过奇异值分解后,可以根据奇异值的大小来判断哪些成分是主要信号,哪些是噪声。将较小奇异值对应的成分舍去,就可以实现信号的去噪。在主成分分析(PCA)中,奇异值分解是核心的工具。PCA 通过对数据矩阵进行奇异值分解,找到数据的主要成分(即对应较大奇异值的成分),从而实现数据的降维和特征提取。
- 低秩分解主要用于降维和数据压缩:
- 计算复杂度差异
- 低秩分解计算复杂度因算法而异:
- 低秩分解的计算复杂度取决于具体采用的算法。如果是简单的迭代算法来寻找低秩分解,计算复杂度可能相对较低,但是收敛性可能是一个问题。如果采用一些复杂的优化算法来找到最优的低秩分解,计算复杂度可能会比较高,并且可能会受到初始值等因素的影响。例如,采用梯度下降法来求解低秩分解问题,其计算复杂度和收敛速度与梯度的计算方式、步长等因素有关。
- 奇异值分解计算复杂度相对较高:
- 奇异值分解的计算复杂度通常是比较高的。对于一个 m × n m\times n m×n 的矩阵,标准的奇异值分解算法的时间复杂度通常是 O ( m n 2 + n 3 ) O(mn^2 + n^3) O(mn2+n3)(假设 m ≥ n m \geq n m≥n)。这是因为奇异值分解需要进行一系列的矩阵运算,包括正交化过程等复杂的操作。不过,在实际应用中,有一些近似的奇异值分解算法可以降低计算复杂度,例如随机奇异值分解算法,它可以在一定程度上提高计算效率,尤其是在处理大规模数据时。
- 低秩分解计算复杂度因算法而异:
4、 将 LORA 应用于 TRANSFORMER
-
权重矩阵选择
- 原则上,LoRA 可应用于神经网络中任意权重矩阵子集来减少可训练参数数量。在 Transformer 架构中,自注意力模块有四个权重矩阵( W q W_q Wq、 W k W_k Wk、 W v W_v Wv、 W o W_o Wo),多层感知机(MLP)模块有两个权重矩阵。这里将 W q W_q Wq(或 W k W_k Wk、 W v W_v Wv)视为维度为 d m o d e l × d m o d e l d_{model}\times d_{model} dmodel×dmodel 的单个矩阵(尽管输出维度通常会被分割到各个注意力头中)。
- 为了简单和参数效率,研究仅限于调整注意力权重以适应下游任务,并冻结 MLP 模块(即下游任务中不训练 MLP 模块)。在 7.1 节会进一步研究调整 Transformer 中不同类型注意力权重矩阵的效果,而对调整 MLP 层、层归一化(LayerNorm)层和偏差的实证研究留待未来工作。
-
实际效益
- 内存和存储减少
- 对于使用 Adam 训练的大型 Transformer,如果 r ≪ d m o d e l r\ll d_{model} r≪dmodel,由于不需要存储冻结参数的优化器状态,显存(VRAM)使用量最多可减少 2/3。例如在 GPT - 3 175B 上,训练时的显存消耗从 1.2TB 减少到 350GB。当 r = 4 r = 4 r=4 且仅调整查询(query)和值(value)投影矩阵时,检查点(checkpoint)大小大约减少 10000 倍(从 350GB 到 35MB)。这使得可以用更少的 GPU 进行训练,并避免 I/O 瓶颈。
- 内存和存储减少
-
局限性
-
单次前向传播中的批处理问题
- 当考虑将LoRA中的(A)和(B)合并到原始权重矩阵(W)中以消除额外的推理延迟时,在单次前向传播过程中对不同任务的输入进行批处理就变得不那么容易了。
- 这里的不同任务是指对应不同的(A)和(B)的任务。
-
具体来说,如果想要通过将 A 和 B 合并到 W 中以消除额外的推理延迟,那么在单个前向传播中对具有不同 A 和 B 的不同任务的输入进行批处理就不是一件简单直接的事情。然而,在延迟并非关键的场景下,可以选择不合并权重,而是动态地为批次中的样本选择合适的 LoRA 模块来使用,以此来应对上述问题。
MLP相当于transformer中的前馈神经网络(Feed - Forward Neural Network)部分。
- Transformer 架构中的 MLP 结构概述
- 在 Transformer 架构中,MLP(多层感知机)是一个重要的组成部分。它位于 Transformer 的每个编码器(Encoder)和解码器(Decoder)块中。以 Transformer 编码器为例,输入经过多头注意力机制(Multi - Head Attention)后,会进入一个 MLP 模块。
- 这个 MLP 模块主要由两个线性层(全连接层)和一个激活函数组成。它的作用是对经过注意力机制处理后的特征进行进一步的非线性变换,从而增强模型的表达能力。
- 具体工作过程
- 线性层操作:
- 第一个线性层会将输入的维度进行变换。假设经过多头注意力机制后的输入维度为 d m o d e l d_{model} dmodel(这是 Transformer 架构中的一个超参数,表示模型维度),第一个线性层会将这个维度映射到一个中间维度,通常表示为 d f f d_{ff} dff(feed - forward 维度)。例如,在原始 Transformer 论文中, d m o d e l = 512 d_{model} = 512 dmodel=512, d f f = 2048 d_{ff}=2048 dff=2048。这个映射是通过一个权重矩阵 W 1 W_1 W1 和偏置向量 b 1 b_1 b1 来实现的,对于输入向量 x x x,输出 y 1 = x W 1 + b 1 y_1 = xW_1 + b_1 y1=xW1+b1。
- 激活函数应用:
- 经过第一个线性层后,输出会通过一个激活函数。最常用的激活函数是 ReLU(Rectified Linear Unit),它的定义为 R e L U ( x ) = max ( 0 , x ) ReLU(x)=\max(0,x) ReLU(x)=max(0,x)。例如,如果 y 1 y_1 y1 中的某个元素为 - 2,经过 ReLU 后这个元素会变为 0;如果是 3,则保持为 3。这个激活函数的作用是引入非线性,使得模型能够学习复杂的函数关系。
- 第二个线性层操作:
- 经过激活函数后的输出会进入第二个线性层,这个线性层会将维度从 d f f d_{ff} dff 变回 d m o d e l d_{model} dmodel,通过权重矩阵 W 2 W_2 W2 和偏置向量 b 2 b_2 b2 实现,即输出 y 2 = y 1 W 2 + b 2 y_2 = y_1W_2 + b_2 y2=y1W2+b2。这样就完成了 MLP 模块对输入的一次完整的非线性变换。
- 线性层操作:
- 在 Transformer 中的作用
- 特征提取与转换:
- MLP 帮助 Transformer 更好地提取和转换输入序列中的特征。通过非线性变换,它可以将经过注意力机制处理后的特征映射到一个更有利于后续任务(如机器翻译、文本生成等)的特征空间。例如,在机器翻译任务中,输入句子的特征经过 MLP 后,能够更好地表示语义信息,使得模型能够更准确地生成目标语言的句子。
- 特征提取与转换:
5、Lora和其他微调对比实验
5.1 基线方法详细解析
基线方法 | 原理详细解析 | 参数计算解析 |
---|---|---|
微调(FT) | 模型以预训练的权重和偏差进行初始化,在训练过程中,所有模型参数都会根据梯度更新来调整,目的是让模型适应特定的下游任务。但这种方式对于大型模型,如 GPT-3,会产生大量与原模型相同规模的新参数,带来高昂的存储和部署成本。 | 由于是对所有模型参数进行更新,所以可训练参数数量等于模型原本的全部参数数量。不同模型的参数数量不同,例如 RoBERTa base 模型的可训练参数为 125.0M,RoBERTa large 模型为 355.0M,DeBERTa XXL 模型为 1500.0M 等,具体取决于模型的架构和规模。 |
Bias - only 或 BitFit | 此方法仅对模型中的偏差向量进行训练,而将其他所有的权重参数保持冻结状态。其假设是通过调整偏差向量,在一定程度上使模型能够适应下游任务,同时避免了对大量权重参数的更新,从而显著减少计算量和存储需求。 | 通常情况下,偏差向量在模型参数中所占的比例较小。以 RoBERTa base 模型为例,在采用 BitFit 方法时,可训练参数仅为 0.1M,这与全量微调的参数数量相比有极大的降低。 |
Prefix - embedding tuning(PreEmbed) | 该方法通过在输入的词序列中插入特殊的令牌(tokens),这些特殊令牌具有可训练的词嵌入(word embeddings),并且不在模型的原始词汇表中。在训练过程中,模型通过调整这些特殊令牌的嵌入表示来学习针对特定任务的特征,进而实现对下游任务的适应。特殊令牌的放置位置(如前缀“prefixing”或中缀“infixing”)会对模型性能产生影响。 | 可训练参数数量由公式 Θ = d m o d e l × ( l p + l i ) \Theta = d_{model}×(l_{p}+l_{i}) Θ=dmodel×(lp+li) 确定。其中 d m o d e l d_{model} dmodel 是模型的维度, l p l_{p} lp 是前缀令牌的数量, l i l_{i} li 是中缀令牌的数量。例如,若 d m o d e l d_{model} dmodel 为某一固定值,当设置 l p = 8 l_{p}=8 lp=8 和 l i = 8 l_{i}=8 li=8 时,可根据公式计算出相应的可训练参数数量。 |
Prefix - layer tuning(PreLayer) | 作为 Prefix - embedding tuning 的扩展,它不仅学习特殊令牌的词嵌入(或等价地,嵌入层之后的激活),还会学习每个 Transformer 层之后的激活。在计算过程中,将前一层计算得到的激活直接替换为可训练的激活,从而使模型能够更深入地适应下游任务的需求。 | 可训练参数数量由公式 Θ = L × d m o d e l × ( l p + l i ) \Theta= L×d_{model}×(l_{p}+l_{i}) Θ=L×dmodel×(lp+li) 确定,其中 L L L 是 Transformer 层的数量。这意味着随着模型层数的增加以及 l p l_{p} lp、 l i l_{i} li 的调整,可训练参数数量会相应地发生变化。例如在某些实验设置中,根据具体的模型架构和设置的 l p l_{p} lp、 l i l_{i} li 值,按照公式可以计算出可训练参数数量为 0.35M 或 0.77M 等。 |
Adapter tuning | 按照 Houlsby 等人(2019)提出的方法,在自注意力模块(和 MLP 模块)与后续的残差连接之间插入适配器层。每个适配器层包含两个带有偏差的全连接层,并在中间使用非线性函数。通过这些适配器层对输入进行转换和调整,使模型适应下游任务。不同的变体如 AdapterH、AdapterL、AdapterP 等在具体设计上有所不同,但基本原理相似。 | 可训练参数数量由公式 Θ = L ^ A d p t × ( 2 × d m o d e l × r + r + d m o d e l ) + 2 × L ^ L N × d m o d e l \Theta=\hat{L}_{Adpt}×(2×d_{model}×r + r + d_{model}) + 2×\hat{L}_{LN}×d_{model} Θ=L^Adpt×(2×dmodel×r+r+dmodel)+2×L^LN×dmodel 确定。其中 L ^ A d p t \hat{L}_{Adpt} L^Adpt 是适配器层的数量, L ^ L N \hat{L}_{LN} L^LN 是可训练的 LayerNorm 数量, r r r 是与适配器层相关的一个参数(通常与维度或秩有关)。例如在不同的实验设置和模型中,根据这些参数的具体取值,可以计算出可训练参数数量,如在某些情况下得到 Adapter 方法的可训练参数为 0.3M、0.9M 等不同的值。 |
-
权重和偏差
-
在机器学习和神经网络等领域,权重是模型中非常重要的参数。简单来说,权重是用来衡量输入特征对于输出结果的相对重要性的数值。例如,在一个简单的线性回归模型 y = w 1 x 1 + w 2 x 2 + b y = w_1x_1+w_2x_2 + b y=w1x1+w2x2+b(这里 y y y 是输出, x 1 x_1 x1 和 x 2 x_2 x2 是输入特征, w 1 w_1 w1 和 w 2 w_2 w2 是权重, b b b 是偏差)中,权重 w 1 w_1 w1 和 w 2 w_2 w2 决定了 x 1 x_1 x1 和 x 2 x_2 x2 对 y y y 的贡献程度。
-
偏差向量(Bias Vector)是偏差概念在向量空间中的扩展。在具有多个神经元(比如神经网络的某一层)的情况下,每个神经元都可能有一个偏差项。将这些偏差项组合在一起就形成了偏差向量。
-
例如,在一个全连接神经网络的某一层有 n n n 个神经元,那么偏差向量 b \mathbf{b} b 就是一个维度为 n n n 的向量, b = ( b 1 , b 2 , ⋯ , b n ) \mathbf{b}=(b_1,b_2,\cdots,b_n) b=(b1,b2,⋯,bn),其中 b i b_i bi 是第 i i i 个神经元的偏差。
-
作用
- 它可以对一组神经元的输出进行统一的位置调整。在神经网络的每一层,神经元的输出通常是通过对输入数据与权重矩阵相乘后,再加上偏差向量得到的。这有助于神经网络学习到更复杂的函数关系。
- 以图像识别为例,在卷积神经网络(CNN)的隐藏层中,偏差向量可以帮助调整该层中所有特征图(Feature Map)对应的神经元的输出,使得网络能够更好地捕捉图像中的不同特征,如边缘、纹理等。如果没有偏差向量,网络可能难以准确地学习到这些特征的位置和强度。
-
计算和更新方式
- 计算方面,在神经网络的前向传播过程中,假设输入向量为 x \mathbf{x} x,权重矩阵为 W \mathbf{W} W,对于某一层的输出 y \mathbf{y} y,计算方式为 y = W x + b \mathbf{y}=\mathbf{Wx}+\mathbf{b} y=Wx+b,这里 b \mathbf{b} b 就是偏差向量。
- 在更新过程中,同样是基于反向传播算法。计算损失函数关于偏差向量中每个元素的梯度,然后按照梯度下降或其他优化算法来更新偏差向量中的每个元素。例如,在梯度下降算法中,对于偏差向量中的第 i i i 个元素 b i b_i bi,更新公式为 b i ( n e w ) = b i ( o l d ) − α ∂ L ∂ b i b_{i(new)} = b_{i(old)}-\alpha\frac{\partial L}{\partial b_i} bi(new)=bi(old)−α∂bi∂L,其中 α \alpha α 是学习率, ∂ L ∂ b i \frac{\partial L}{\partial b_i} ∂bi∂L 是损失函数关于 b i b_i bi 的梯度。通过这种方式,整个偏差向量在训练过程中逐步得到优化,以使得模型的性能得到提升。
-
-
Adapter tuning的基本原理与变体:
- Houlsby 等人在 2019 年提出的 Adapter tuning 方法,是在自注意力模块(以及 MLP 模块)和后续的残差连接之间插入适配器层。每个适配器层包含两个带有偏差的全连接层,并且在这两个全连接层中间有非线性函数。这种原始设计被称为 AdapterH。
- 后来 Lin 等人在 2020 年提出了一种更高效的设计,将适配器层仅应用在 MLP 模块之后且在 LayerNorm 之后,这种设计被称为 AdapterL。它与 Pfeiffer 等人在 2021 年提出的一种设计(称为 AdapterP)非常相似。
- 还有一种基线方法叫做 AdapterDrop(由 R¨uckl´e 等人在 2020 年提出),它通过去掉一些适配器层来提高效率,记为 AdapterD。
在适配器层中有两个全连接层,它们具有偏置(例如relu没包含权重),中间有非线性。
结合Adapter tuning 原理解释参数计算: |Θ| = ˆLAdpt × (2 × dmodel × r + r + dmodel) + 2 × ˆLLN × dmodel
- 参数符号含义解释
- 在这里, ∣ Θ ∣ |\Theta| ∣Θ∣ 表示总的参数数量。 L ^ A d p t \hat{L}_{Adpt} L^Adpt 是适配器(Adapter)模块的数量,因为可能在模型的多个层间插入适配器,所以需要考虑其数量。 d m o d e l d_{model} dmodel 通常代表模型的特征维度(例如在 Transformer 架构中,它是隐藏层的维度), r r r 是适配器模块中的中间维度(用于下投影和上投影的中间转换维度), L ^ L N \hat{L}_{LN} L^LN 是 LayerNorm 的数量。
- 基于 Adapter Tuning 原理的参数计算解释
- 适配器(Adapter)模块参数计算部分
- 在 Adapter tuning 中,一个典型的适配器模块包含下投影层、非线性激活函数(如 ReLU,无额外参数)和上投影层。
- 对于下投影层,设输入维度为 d m o d e l d_{model} dmodel,中间维度为 r r r,其权重矩阵参数数量为 d m o d e l × r d_{model}\times r dmodel×r,再加上偏置的 r r r 个参数,下投影层总参数数量为 d m o d e l × r + r d_{model}\times r + r dmodel×r+r。
- 对于上投影层,中间维度为 r r r,恢复到原始输入维度 d m o d e l d_{model} dmodel,其权重矩阵参数数量为 r × d m o d e l r\times d_{model} r×dmodel,加上偏置的 d m o d e l d_{model} dmodel 个参数,上投影层总参数数量为 r × d m o d e l + d m o d e l r\times d_{model}+d_{model} r×dmodel+dmodel。
- 所以一个适配器模块的总参数数量为 ( d m o d e l × r + r ) + ( r × d m o d e l + d m o d e l ) = 2 × d m o d e l × r + r + d m o d e l (d_{model}\times r + r)+(r\times d_{model}+d_{model}) = 2\times d_{model}\times r + r + d_{model} (dmodel×r+r)+(r×dmodel+dmodel)=2×dmodel×r+r+dmodel。
- 由于有 L ^ A d p t \hat{L}_{Adpt} L^Adpt 个这样的适配器模块,所以适配器模块的总参数数量为 L ^ A d p t × ( 2 × d m o d e l × r + r + d m o d e l ) \hat{L}_{Adpt}\times(2\times d_{model}\times r + r + d_{model}) L^Adpt×(2×dmodel×r+r+dmodel)。
- LayerNorm 参数计算部分
- LayerNorm 主要有两个可学习参数 γ \gamma γ 和 β \beta β,其维度与输入数据维度相同。假设输入维度为 d m o d e l d_{model} dmodel,一个 LayerNorm 的参数数量为 2 × d m o d e l 2\times d_{model} 2×dmodel。
- 如果有 L ^ L N \hat{L}_{LN} L^LN 个 LayerNorm,那么 LayerNorm 的总参数数量为 2 × L ^ L N × d m o d e l 2\times\hat{L}_{LN}\times d_{model} 2×L^LN×dmodel。
- 总的参数数量计算
- 将适配器模块的总参数数量和 LayerNorm 的总参数数量相加,就得到了总的参数数量 ∣ Θ ∣ = L ^ A d p t × ( 2 × d m o d e l × r + r + d m o d e l ) + 2 × L ^ L N × d m o d e l |\Theta|=\hat{L}_{Adpt}\times(2\times d_{model}\times r + r + d_{model})+2\times\hat{L}_{LN}\times d_{model} ∣Θ∣=L^Adpt×(2×dmodel×r+r+dmodel)+2×L^LN×dmodel。这表明了在结合 Adapter tuning 和 LayerNorm 的情况下,如何根据模型架构中的关键维度(如 d m o d e l d_{model} dmodel 和 r r r)以及模块数量( L ^ A d p t \hat{L}_{Adpt} L^Adpt 和 L ^ L N \hat{L}_{LN} L^LN)来计算总的可训练参数数量。这种计算方式有助于评估模型在微调过程中的参数规模和效率。
- 适配器(Adapter)模块参数计算部分
5.2 实证实验
实证实验
- 基线设置:包括微调(FT)、仅训练偏差向量的 Bias - only 或 BitFit、前缀嵌入调整(PreEmbed)、前缀层调整(PreLayer)、适配器调整(Adapter)等多种方法,并详细说明了各方法的可训练参数数量计算方式。
- 不同模型和任务上的结果
- 在 RoBERTa base/large 和 DeBERTa XXL 的 GLUE 基准测试中,LoRA 与其他高效适应方法相比表现具有竞争力,在某些情况下达到或超过微调基线性能。
- 在 GPT - 2 medium/large 的 E2E NLG 挑战等任务中,LoRA 也优于一些基线方法,在可训练参数数量相当或更少的情况下取得更好的性能。
- 在 GPT - 3 175B 上,LoRA 在 WikiSQL、MNLI - m 和 SAMSum 等数据集上的性能匹配或超过微调基线,且具有更好的扩展性。同时发现一些方法如前缀嵌入调整和前缀层调整在可训练参数过多时性能会下降。
6、附录说明
附录A: 大型语言模型仍需要参数更新
附录B: 适配器层引入的推理延迟
附录C: 数据集详细信息,第5节用于实验评估的相关数据集,5节
附录D:实验中使用的 D 超参数,5节
附录E: 将 LORA 与前缀调整相结合,5节
附录F: 额外的实证实验,5节
附录G: 测量子空间之间的相似性,7.2中关于内在秩的计算公式,7.2节
附录H: 低秩矩阵的附加实验,7节中的相关公式与对比图,7节
7、总结
“LORA: LOW - RANK ADAPTATION OF LARGE LANGUAGE MODELS” 由 Edward Hu、Yelong Shen 等人撰写。随着语言模型规模增大,全量微调变得困难,本文提出低秩适应(LoRA)方法,冻结预训练模型权重,在 Transformer 架构每层注入可训练的低秩分解矩阵,减少下游任务的可训练参数数量,降低 GPU 内存需求,在多个模型和任务上表现与微调相当或更好,还对语言模型适应中的秩亏缺进行了实证研究。
研究背景
- 自然语言处理中常需将大规模预训练语言模型适配到多个下游应用,通常采用微调方法,但对于如 GPT - 3 等大型模型,微调会产生与原模型相同数量的参数,导致存储和部署成本过高。
- 现有一些方法如添加适配器层或优化输入层激活来提高效率,但存在引入推理延迟、降低模型可用序列长度或无法达到微调基线性能等问题。
LoRA 方法
- 低秩参数化更新矩阵
- 假设预训练权重矩阵 W 0 W_{0} W0 的更新 Δ W \Delta W ΔW 具有低“内在秩”,将其表示为低秩分解 W 0 + Δ W = W 0 + B A W_{0}+\Delta W = W_{0}+BA W0+ΔW=W0+BA,其中 B ∈ R d × r B\in\mathbb{R}^{d×r} B∈Rd×r, A ∈ R r × k A\in\mathbb{R}^{r×k} A∈Rr×k,训练时冻结 W 0 W_{0} W0,仅训练 A A A 和 B B B。通过这种方式,LoRA 可在不增加推理延迟的情况下实现高效训练和部署。
- LoRA 是全量微调的一种推广,当增加可训练参数数量时,训练 LoRA 大致收敛到训练原始模型,而基于适配器的方法收敛到 MLP,基于前缀的方法收敛到不能处理长输入序列的模型。
- 应用于 Transformer
- 在 Transformer 架构中,主要关注自注意力模块中的权重矩阵,通常将 W q W_{q} Wq(或 W k W_{k} Wk、 W v W_{v} Wv)视为维度为 d m o d e l × d m o d e l d_{model}×d_{model} dmodel×dmodel 的单个矩阵进行研究。为简单和参数效率考虑,在下游任务中仅适配注意力权重并冻结 MLP 模块。
- LoRA 的主要优势包括减少内存和存储使用(如在 GPT - 3 175B 上可大幅降低 VRAM 消耗和检查点大小)、降低训练硬件门槛、实现快速任务切换以及不引入额外推理延迟;局限性在于在单个前向传播中对不同任务的输入进行批处理时不太直接。
实证实验
- 基线设置:包括微调(FT)、仅训练偏差向量的 Bias - only 或 BitFit、前缀嵌入调整(PreEmbed)、前缀层调整(PreLayer)、适配器调整(Adapter)等多种方法,并详细说明了各方法的可训练参数数量计算方式。
- 不同模型和任务上的结果
- 在 RoBERTa base/large 和 DeBERTa XXL 的 GLUE 基准测试中,LoRA 与其他高效适应方法相比表现具有竞争力,在某些情况下达到或超过微调基线性能。
- 在 GPT - 2 medium/large 的 E2E NLG 挑战等任务中,LoRA 也优于一些基线方法,在可训练参数数量相当或更少的情况下取得更好的性能。
- 在 GPT - 3 175B 上,LoRA 在 WikiSQL、MNLI - m 和 SAMSum 等数据集上的性能匹配或超过微调基线,且具有更好的扩展性。同时发现一些方法如前缀嵌入调整和前缀层调整在可训练参数过多时性能会下降。
低秩更新的理解
- 选择应用 LoRA 的权重矩阵:在 GPT - 3 175B 上的实验表明,在有限参数预算下,同时适配 W q W_{q} Wq 和 W v W_{v} Wv 能获得最佳性能,即使较低的秩(如 r = 4 r = 4 r=4)也能捕捉到足够信息。
- LoRA 的最优秩 r r r:通过实验发现,对于一些数据集,较小的秩(如 r = 1 r = 1 r=1)在适配 W q W_{q} Wq 和 W v W_{v} Wv 时就能使 LoRA 表现出竞争力,且增加秩并不会覆盖更有意义的子空间,说明低秩适应矩阵足够有效。通过子空间相似性分析进一步验证了这一结论。
- 适应矩阵 Δ W \Delta W ΔW 与 W W W 的关系: Δ W \Delta W ΔW 与 W W W 的相关性比随机矩阵强,它放大了 W W W 中未被强调的特征方向,且放大因子较大,表明低秩适应矩阵可能会放大特定下游任务的重要特征。
研究结论与未来工作
- LoRA 是一种高效的适应策略,在保留高模型质量的同时,不引入推理延迟和减少输入序列长度,便于在部署服务时快速切换任务,其原理可应用于一般的神经网络。
- 未来工作包括将 LoRA 与其他高效适应方法结合、研究微调或 LoRA 背后的机制、探索更合理的选择应用 LoRA 的权重矩阵的方法以及深入研究权重矩阵的秩亏缺问题。
原文地址:https://blog.csdn.net/weixin_44986037/article/details/144753283
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!