大模型微调技术 --> LoRA 系列之 LoRA(现今最火热的模型微调方法,甚至没有之一,下面有常用的 lora 参数)
LoRA
1.摘要
随着模型越来越大,全量微调变得越来越不可行了。所以作者提出了低秩适应(Low-Rank Adaptation, LoRA,他冻结了预训练模型权重,并在 Transformer 架构的每一层注入可训练的秩分解矩阵,极大地减少了下游任务的可训练参数量。
与 Adam 微调 GPT-3 175B 相比,LoRA 可以将训练参数量减少 10000 倍,GPU 内存需求减少 3 倍。
虽然可训练参数少,但是吞吐量高,且与 adapter 不同,他没有额外的推理延迟。
Note:
LoRA 基本思想:在模型适应阶段,不直接修改预训练模型原有的稠密权重矩阵,而是引入额外的低秩矩阵来表示权重变化的部分。具体的,
- 秩分解:对于原本的高维矩阵 W ,将他的变化量 ΔW 近似为两个低秩矩阵的乘积 Δ W ≈ U ∗ V T ΔW ≈ U * V^T ΔW≈U∗VT
- 注入低秩矩阵:在 Transformer 的某些层在推理或微调过程中通过相加或相乘操作,结合这两个低秩矩阵 U, V 来间接影响输出结果
- 保持预训练权重不变:他允许我们不改变预训练模型参数的前提下进行模型的个性化调整或快速适应新任务,从而保留了预训练模型捕获的通用语言特征,并且由于使用了低秩矩阵,大大减少了存储和计算需求。
注释:
2.引言
NLP 很多应用需要通过 微调 来完成到下游任务的迁移。
fine-tune 需要更新所有参数,很费资源。
后来试图通过只适应部分参数或为新任务学习外部模块来减轻这个问题。但是这些技术通常拓展了模型深度引入了推理延迟,或通过减少模型可用序列长度来实现。这些方法通常不能达到微调基线。
作者从之前的工作获得了灵感,学习到的过度参数化模型实际上存在一个低内在维度上。作者假设模型适应过程中权重的变化也具有低“内在秩”,所以提出了低秩适应的方法。
过度参数化模型:模型的参数量远大于训练数据量所能提供的有效信息量。DL 中,如 CNN,Transformer 都属于过度参数化模型。这样的模型一般具有表现力强、泛化能力好和良好的微调潜力的特性。
LoRA 允许通过优化适应过程中 密集层变化的 秩分解 矩阵 间接训练神经网络的一些密集层,同时保持预训练权重冻结。
如 GPT-3 175B ,在全秩高达 12,288 时,非常低的秩(r=1 or 2)也足够了。又节省时间有加速计算。
秩分解:将一个大矩阵分解为几个小矩阵的乘积
图一:重参数化,只训练 A 和 B
LoRA 的关键优势:
- 一个预训练模型可以共享并用于构建许多针对不同任务的小 LoRA 模块。可以冻结共享模型,并通过替换图中的 A 和 B 来高速的切换任务,显著减少存储需求和任务切换开销
- LoRA 通过水用自适应优化器,使训练更加高效,并将硬件的入门门槛降低了三倍,因为现在不需要为大多数参数计算梯度或维护优化器状态,只优化注入的、小的多的低秩矩阵
- 简单的线性设计允许在部署的时候将可训练矩阵与冻结权重合并,与完全微调模型相比,从构造上不引入推理延迟
- LoRA 与许多先前的方法正交,并可以与他们中的很多进行结合,如前缀微调
3.问题陈述
假定我们有一个预训练的自回归语言模型 P Φ ( y ∣ x ) P_Φ(y∣x) PΦ(y∣x),该模型由参数 Φ Φ Φ 定。例如, P Φ ( y ∣ x ) P_Φ(y∣x) PΦ(y∣x) 可能是一个基于 Transformer 架构的通用多任务学习器,如 GPT。
现在考虑将这个预训练模型应用于下游条件文本生成任务,如摘要生成、机器阅读理解(MRC)、以及自然语言到SQL转换(NL2SQL)。
每个下游任务都通过一组上下文-目标对的训练数据集 Z = ( x i , y i ) , i = 1 , … , N Z={(x_i,y_i)},i=1,…,N Z=(xi,yi),i=1,…,N 表示,其中 x i x_i xi 和 y i y_i yi 都是由 token 组成的序列。举例来说,在 NL2SQL 任务中, x i x_i xi 是一个自然语言查询,而 y i y_i yi 则是对应的SQL命令;在摘要生成任务中, x i x_i xi 是文章的内容, y i y_i yi 是其摘要。
在完全微调过程中,模型初始化为预训练权重 Φ 0 Φ_0 Φ0,并通过反复沿着梯度方向更新,以最大化条件语言建模目标函数
其中一个主要问题是,对于每个下游任务,我们都需要学习一组不同的参数增量 ∆ Φ ∆Φ ∆Φ,其维度 ∣ ∆ Φ ∣ |∆Φ| ∣∆Φ∣ 等于 ∣ Φ 0 ∣ |Φ_0| ∣Φ0∣。因此,如果预训练模型非常大(比如 GPT-3,其中 ( ∣ Φ 0 ∣ |Φ_0| ∣Φ0∣ ≈1750亿),存储和部署许多独立的微调模型实例将面临挑战,甚至可能变得不可行
本文中,采用了一种更节省参数的方法,其中任务特定的参数增量 ∆ Φ = ∆ Φ ( Θ ) ∆Φ = ∆Φ(Θ) ∆Φ=∆Φ(Θ)由一组规模小得多的参数 Θ Θ Θ 来进一步编码,满足 ∣ Θ ∣ ≪ ∣ Φ 0 ∣ ∣Θ∣≪∣Φ_0∣ ∣Θ∣≪∣Φ0∣。因此,寻找 ∆ Φ ∆Φ ∆Φ的任务转化为针对 Θ Θ Θ 进行优化的问题:
4.现有解决方案是否足够好?
以语言建模为例,涉及到高效适应时,有两种突出的策略:添加 adapter 层 或 优化输入层激活的某种形式。但是她们都有一些局限性
1.adapter 层引入推理延迟
adapter 有很多变体。这里关注原始的设计,即每个 Transformer 块有两个 adapter 层的设计 以及 一个较新的设计,每块只有一个 adapter 但增加了额外的 LN(层归一化)。
虽然可以通过修剪层或利用多任务设置来减少总体延迟,但没有直接方法绕过适配器层中的额外计算。这似乎不是一个大问题,因为 adapter 层被设计为具有很少的参数(有时是原始模型的<1%),通过具有小 bottleneck 维度,这限制了它们可以添加的浮点运算次数(FLOPs)。
然而,大型神经网络依赖于硬件并行性来保持延迟低, adapter 层必须按顺序处理。这在 在线推理 设置中有所不同,批量大小通常只有一。在没有模型并行性的通用场景中,例如在单个 GPU上 运行 GPT-2(Radford等人,b)的中等大小,我们发现使用适配器时延迟明显增加,即使瓶颈维度非常小(表1)
在NVIDIA Quadro RTX8000上测量的GPT-2中等模型单次前向传播推理延迟(以毫秒为单位),数据基于100次试验的平均值。"|Θ|"表示适配器层中的可训练参数数量。AdapterL和AdapterH是两种适配器调优的变体,我们将在5.1节中详细介绍。在在线、短序列长度场景下,由适配器层引入的推理延迟可能会相当显著。详细研究请参阅附录B。
2.直接优化提示很困难
前缀微调的方法来改进模型,让它更好地完成特定的任务。
但是,这个方法很难调整到最佳状态,有时候改了参数后,模型的表现反而变差了。而且,因为我们在输入的文本前面加了一些东西,所以留给处理实际任务的空间就变小了。我们担心这可能会让模型的表现不如其他方法。我们会在报告的后面部分更详细地看看这个问题。
5.我们的方法
1.低秩参数化更新矩阵
神经网络包含许多执行矩阵乘法的密集层。这些层中的权重矩阵通常具有满秩。
在适应特定任务时,Aghajanyan 等人表明,预训练的语言模型具有低“内在维度”,并且尽管随机投影到较小的子空间,仍然可以高效学习。
受此启发,我们假设在适应过程中权重的更新也具有低“内在秩”。对于预训练的权重矩阵 W 0 ∈ R d × k W_0 ∈ R^{d×k} W0∈Rd×k,我们通过表示后者为低秩分解 W 0 + ∆ W = W 0 + B A W_0 + ∆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 ≤ min(d, k) r≤min(d,k)。
在训练期间, W 0 W_0 W0 被冻结,不接受梯度更新,而 A A A 和 B B B 包含可训练参数。注意 W 0 W_0 W0 和 ∆ W = B A ∆W = BA ∆W=BA 都与相同的输入相乘,它们的输出向量按坐标相加。对于 h = W 0 x h = W_0x h=W0x,我们修改的前向传递产生:
h = W 0 x + ∆ W x = W 0 x + B A x h = W_0x + ∆W x = W_0x + BAx h=W0x+∆Wx=W0x+BAx
我们在 图1 中说明了我们的重参数化。
我们使用随机高斯初始化 A , B A,B A,B 为零,因此 ∆ W = B A ∆W = BA ∆W=BA 在训练开始时为零。
然后我们按 α / r α/r α/r 缩放 ∆ W x ∆W x ∆Wx ,其中 α α α 是 r r r 中的常数。当使用 Adam 优化时,调整 α α α 大致相当于调整学习率,如果我们适当地缩放初始化。因此,我们简单地将 α α α 设置为我们尝试的第一个 r r r,并且不调整它。这种缩放有助于减少 在变化 r r r 时重新调整超参数的需求。
- 在适应特定任务的时候,研究发现,预训练语言模型具有较低的**内在维度。**这个内在维度指模型在表示数据时所需的参数数量。即使在将模型的参数随机投影到一个更小的子空间情况下,这些预训练语言模型仍然能有效学习。
2.这个 α \alpha α 常数用来控制 A 和 B 的学习速度,就像学习率,为了简化过程,一般将 α \alpha α 设置为尝试的第一个 r r r 值,并在后续的训练中不再调整。好处是,当改变 r r r 的时候,不需要重新调整超参数(学习率 )
3.减少超参数调整:这种缩放策略有助于在改变 r r r 的时候,减少对其他超参数的需求(论文的结论)。
-
全微调的泛化形式
更普遍的微调方式允许训练预训练参数的一个子集。
LoRA 则更进一步,它在适应过程中并不要求累积到权重矩阵上的梯度更新具有满秩。
这意味着当我们将LoRA应用到所有权重矩阵并对所有偏置进行训练时,通过将 LoRA 的秩 r r r 设置为预训练权重矩阵的秩,我们大致能够恢复全微调的表达能力。
换句话说,随着可训练参数数量的增加,在训练 LoRA 时,其表现大约会收敛于训练原始模型;
而基于适配器的方法会收敛至一个 MLP,基于前缀的方法则会收敛至一个无法处理长输入序列的模型。
-
没有额外的推理延迟
在生产中部署时,我们可以明确计算并存储 W = W 0 + B A W = W_0 + BA W=W0+BA,并像往常一样进行推理。
注意 W 0 W_0 W0 和 B A BA BA 都在 R d × k R^{d×k} Rd×k 中。当我们需要切换到另一个下游任务时,我们可以通过减去 B A BA BA ,然后添加不同的 B ′ A ′ B'A' B′A′ 来恢复 W 0 W_0 W0,这是一个快速操作,几乎没有内存开销。
关键的是,这保证了我们在推理过程中不会引入任何额外的延迟,与通过构造的微调模型相比。
2.把 LoRA 应用到 Transformer
原则上,我们可以将 LoRA 应用于神经网络中的任何权重矩阵子集,以减少可训练参数的数量。
在 Transformer 架构中,自注意力模块有四个权重矩阵 ( W q , W k , W v , W o ) (W_q, W_k, W_v, W_o) (Wq,Wk,Wv,Wo),MLP模块有两个。
即使输出维度通常被分割成注意力头,我们将 W q W_q Wq(或 W k , W v W_k, W_v Wk,Wv )视为一个维度为dmodel × dmodel的单个矩阵。我们限制我们的研究只适应下游任务的注意力权重,并冻结 MLP 模块(因此在下游任务中不训练),既为了简单性,也为了参数效率。
- 实际好处和局限性。
最显著的好处来自于内存和存储使用的减少。
对于使用 Adam 训练的大型 Transformer,如果 r ≤ d m o d e l r ≤ dmodel r≤dmodel,我们可以将 VRAM 使用量减少至 2/3 ,因为我们不需要为冻结的参数存储优化器状态。
在 GPT-3 175B 上,我们将训练期间的 VRAM 消耗从 1.2TB 降低到 350GB 。
当 r = 4 r = 4 r=4,并且只有查询和值投影矩阵被适应时,检查点大小减少了大约 10,000倍(从350GB降至35MB)。这使我们能够使用显著更少的GPU进行训练,并避免I/O瓶颈。
另一个好处是,我们可以通过仅交换 LoRA 权重而不是所有参数,在部署时以更低的成本在任务之间切换。这允许创建许多定制模型,可以在存储预训练权重的 VRAM 机器上快速交换。我们还观察到,在 GPT-3 175B 上训练时,与完全微调相比,速度提高了25%,因为我们不需要计算绝大多数参数的梯度。
- LoRA也有其局限性。
例如,如果选择将 A 和 B 吸收到 W 中以消除额外的推理延迟,那么在单个前向传递中批量输入不同任务的输入并不直观,这些任务具有不同的 A 和 B 。尽管在延迟不是关键的情况下,不合并权重并动态选择用于批量中样本的 LoRA 模块是可能的。
但是,LoRA 也有一些限制。比如,如果我们想要在机器运行时快速切换不同的任务,那么我们需要确保这些任务的小齿轮(A 和 B)不会互相冲突。虽然我们可以在不太在意延迟的情况下,动态地选择适合当前任务的小齿轮,但如果我们想要完全消除这种延迟,那么就需要更复杂的设置。
6.实验
微调(FT)是适应的常用方法
仅偏置或BitFit是一个基线,我们只训练偏置向量,同时冻结其他所有内容。
**前缀嵌入调整(PreEmbed)**在输入标记之间插入特殊标记。
**前缀层调整(PreLayer)**是前缀嵌入调整的扩展
适配器调整,如 Houlsby 等人(2019年)所提出的,在自注意力模块(和MLP模块)与随后的残差连接之间插入适配器层
LoRA在现有权重矩阵旁边并行添加了可训练的秩分解矩阵对
表2:在GLUE基准测试上,使用不同适应方法的RoBERTa基础版、RoBERTa large版和DeBERTa XXL。我们报告了MNLI的整体(匹配和不匹配)准确率、CoLA的Matthew相关系数、STS-B的皮尔逊相关系数,以及其他任务的准确率。所有指标中,数值越高越好。*表示先前作品中发布的数字。†表示为了公平比较,配置了与Houlsby等人(2019年)相似的设置的运行。
表3:在E2E NLG挑战赛中,针对GPT-2中型(M)和大型(L)模型应用了不同的适应方法。对于所有评估指标,数值越高表示性能越好。LoRA方法在具有可比或更少训练参数的情况下超越了几种基准方法。表格中展示了我们进行实验时计算出的置信区间。带有星号(*)的数字表示之前研究工作中已经发表的结果。
表4:不同适应方法在GPT-3 175B模型上的性能表现。我们报告了WikiSQL上逻辑形式验证准确率、MultiNLI-matched上的验证准确率以及SAMSum上的Rouge-1/2/L指标。结果显示,LoRA相比于先前的方法(包括完全微调)表现出更好的性能。在WikiSQL数据集上的结果波动约在±0.5%左右,MNLI-matched数据集上的波动约为±0.1%,而SAMSum数据集上三个指标的波动分别约为±0.2、±0.2和±0.1。
图2展示了GPT-3 1750亿参数模型在WikiSQL和MNLI-matched数据集上的验证准确率与几种适应方法的可训练参数数量之间的关系。结果显示,LoRA方法具有更好的扩展性和任务性能表现。有关图表中所绘数据点的更多详情,请参阅F.2节
7.理解低秩更新
作者进行了一系列实验,回答以下问题:
1)在给定参数预算约束的情况下,我们应该适应预训练 Transformer 中的哪些权重矩阵,以最大化下游性能?
2)“最优”适应矩阵 ∆ W ∆W ∆W 真的是秩不足的吗?如果是,实践中应该使用什么秩?
3) ∆ W ∆W ∆W 和 W W W 之间有什么联系? ∆ W ∆W ∆W 与 W W W 高度相关吗? ∆ W ∆W ∆W 与 W W W 相比有多大?
1.我们应该对 Transformer 中的哪些 权重矩阵 应用 LoRA?
在有限参数预算下,我们应该适应那些类型的权重,以在下游任务中获得最佳性能?
如上面所述,只考虑自注意力模块中的权重矩阵。在 GPT-3 175B 上设置了 18M 的参数预算,这对应于如果我们适应一种类型的注意力权重,则 r = 8 r=8 r=8,如果我们适应两种类型,则 r = 4 r=4 r=4,摄影与所有 96 层。如下表
表5:在给定相同数量可训练参数的情况下,将LoRA应用于GPT-3的不同类型的注意力权重后,在WikiSQL和MultiNLI数据集上的验证准确率。同时调整Wq和Wv可以获得最佳的整体性能表现。我们发现对于给定的数据集,随机种子之间的标准偏差保持一致,该数值我们在第一列中报告。
请注意,将所有参数放在 ∆ W q ∆W_q ∆Wq 或 ∆ W k ∆W_k ∆Wk 中会导致性能显著降低,而适应 W q W_q Wq 和 W v W_v Wv 则产生最佳结果。这表明,即使是 r = 4 r=4 r=4 也能在 ∆W 中捕获足够的信息,因此适应更多的权重矩阵比适应单一类型的权重且秩更大是更可取的。
为了在下游任务中获得最佳性能,我们不应该只更新查询或键的权重,而是应该同时更新查询、键和值的权重。这可能是因为在自注意力机制中,查询、键和值之间存在复杂的相互作用,只更新其中一部分可能无法充分利用模型的潜力,而同时更新它们可以更好地捕捉和利用这些相互作用
2.LoRA的最优秩 r r r 是多少?
作者将注意力转向秩 r r r 对模型性能的影响。我们适应 { W q , W v W_q, W_v Wq,Wv},{ W q , W k , W v , W o W_q, W_k, W_v, W_o Wq,Wk,Wv,Wo},以及 仅 W q W_q Wq 进行比较。
表6:在WikiSQL和MultiNLI上使用不同秩r的验证准确率。令我们惊讶的是,即使秩仅为1,也足以适应这些数据集上的Wq和Wv,而单独训练Wq则需要更大的r。我们在第H.2节对GPT-2进行了类似的实验
表6显示,令人惊讶的是,LoRA 即使在非常小的 r r r 下(尤其是对于{ W q , W v W_q, W_v Wq,Wv}而不是仅 W q W_q Wq)就已经具有竞争力。
这表明**更新矩阵 ∆ W ∆W ∆W 可能具有非常小的“内在秩”。**为了进一步支持这一发现,我们检查了不同 r r r 选择和不同随机种子学习到的子空间的重叠。我们认为,增加 r r r 并不会覆盖更有意义的子空间,这表明低秩适应矩阵就足够了。
-
不同 r r r 之间的子空间相似性
给定 A r = 8 A_r=8 Ar=8 和 A r = 64 A_r=64 Ar=64,它们是使用相同预训练模型学习的秩为 8 和 64 的适应矩阵,我们执行奇异值分解,并得到右奇异酉矩阵 U A r = 8 U_{A_r}=8 UAr=8 和 U A r = 64 U_{A_r}=64 UAr=64。
我们希望回答: U A r = 8 U_{A_r}=8 UAr=8 中由前 i 个奇异向量张成的子空间(对于1 ≤ i ≤ 8)包含在 U A r = 64 U_{A_r}=64 UAr=64 的前 j 个奇异向量张成的子空间中的多少?
我们基于 Grassmann 距离(见附录G以进行更正式的讨论)测量这个量。
φ ( ⋅ ) φ(·) φ(⋅) 的范围是 [0, 1] ,其中 1 代表子空间的完全重叠,0 代表完全分离。见图3,了解 φ φ φ 如何随着 i 和 j 的变化而变化。由于空间限制,我们只看第48层(共96层),但结论也适用于其他层,如第H.1节所示。
图3: A r = 8 A_r=8 Ar=8 和 A r = 64 A_r=64 Ar=64 的 ∆Wq 和 ∆Wv 的列向量之间的子空间相似性。
第三和第四张图放大了前两张图中左下角的三角形区域。
在r = 8中的顶级方向被包含在 r = 64中,反之亦然。图中的 横轴(j) 和 纵轴(i) 代表了奇异值分解中的 奇异向量的位置。奇异值分解是一种将矩阵分解为奇异向量和奇异值的方法,它可以揭示矩阵中最重要的方向(即奇异向量)和这些方向的重要性(即奇异值)。
图中的每个点(例如, ( A r = 64 , A r = 8 , i , j ) (A_r = 64, A_r = 8, i, j) (Ar=64,Ar=8,i,j))表示在秩为 64 的适应矩阵( A r = 64 A_r=64 Ar=64)的第 i 个奇异向量和秩为 8 的适应矩阵( A r = 8 A_r=8 Ar=8)的第 j 个奇异向量之间的子空间相似性。相似性用一个介于 0 到 1 之间的值表示,其中1表示完全相似(即两个子空间完全重叠),0表示完全不相似(即两个子空间没有重叠)
图中的第三和第四个图放大了前两个图中左下角的三角形区域。这表明在较低秩(r = 8)的适应矩阵中最重要的方向(即前奇异向量)被包含在较高秩(r = 64)的适应矩阵中,反之亦然。
这意味着即使在较低秩的情况下,适应矩阵也能够捕获到与较高秩相似的重要特征方向。这可能表明在实际应用中,使用低秩适应矩阵可能是足够的,因为它们能够以较少的参数捕获到与高秩适应矩阵相似的重要信息。我们从图3中得出一个重要观察。
与 A r = 8 A_{r=8} Ar=8 和 A r = 64 A_{r=64} Ar=64 对应的前奇异向量方向之间有显著的重叠,而其他方向则没有。
具体来说, A r = 8 A_{r=8} Ar=8 的 ∆Wv(以及∆Wq) 和 A r = 64 A_{r=64} Ar=64 的 ∆Wv(以及∆Wq) 共享一个维度为 1 的子空间,标准化相似度> 0.5,这解释了为什么在我们的下游任务中,GPT-3 的 r = 1 r = 1 r=1 表现相当好。由于 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 的前奇异向量方向最有用,而其他方向可能主要包含在训练过程中累积的随机噪声。因此,适应矩阵确实可以具有非常低的秩。
-
不同随机种子之间的子空间相似性
坐着通过绘制 r = 64 的两个随机种子运行之间的标准化子空间相似性来进一步确认这一点,如图4所示
∆ W q ∆W_q ∆Wq 似乎具有比 ∆ W v ∆W_v ∆Wv 更高的“内在秩”,因为两个运行都学习了更多的共同奇异值方向,这与我们在表 6 中的实证观察一致。
作为比较,作者还绘制了两个随机高斯矩阵,它们之间没有任何共同的奇异值方向
3.适应矩阵 ∆W 与 W 比较如何
作者又进一步研究了 ∆ W ∆W ∆W 和 W W W 的关系。特别是, ∆ W ∆W ∆W 与 W W W 高度相关么?(或者数学上说, ∆ W ∆W ∆W 是否主要包含在 W W W 的最高奇异方向中?)
此外,与 W W W 中的相应方向相比, ∆ W ∆W ∆W 有多“大”?这可以揭示适应预训练语言模型的潜在机制
图4:左图和中图:在第48层,两个随机种子的 A r = 64 A_r=64 Ar=64的列向量之间的标准化子空间相似性,分别对应于∆Wq和∆Wv。
右图:两个随机高斯矩阵的列向量之间的相同热图。有关其他层的信息,请参见第H.1节
这张图展示了在第 48 层中,两个不同随机种子生成的秩为 64 的适应矩阵( A r = 64 A_r=64 Ar=64)的列向量之间的标准化子空间相似性。这里的适应矩阵可能指的是 ∆ W q ∆W_q ∆Wq(查询权重更新)和 ∆ W v ∆W_v ∆Wv(值权重更新),它们是 Transformer 模型中自注意力机制的权重矩阵。
为了解答这些问题,作者通过计算 U T W V T U^TWV^T UTWVT 投影矩阵 W W W 到 ∆ W ∆W ∆W 的 r 维子空间上,其中 U / V U/V U/V 分别是 ∆ W ∆W ∆W 的左/右奇异向量矩阵。接着,我们比较 ∣ ∣ U T W V T ∣ ∣ F ||U^TWV^T||_F ∣∣UTWVT∣∣F 和 ∣ ∣ W ∣ ∣ F ||W||_F ∣∣W∣∣F 之间的 弗罗贝尼乌斯范数。作为对比,我们也计算了用 W W W 的前 r 个奇异向量或一个随机矩阵代替 U U U 和 V V V 时得到的 ∣ ∣ U T W V T ∣ ∣ F ||U^TWV^T||_F ∣∣UTWVT∣∣F。
1.投影 W 到 ∆W 的 r 维子空间
首先,我们有一个原始的权重矩阵 W,我们想要将其投影到适应矩阵 ∆W 的 r 维子空间中。这里的 r 是一个较小的秩,表示我们只关注 ∆W 中最重要的 r 个奇异向量。
为了实现这个投影,我们需要计算 ∆W 的奇异值分解,得到左奇异向量矩阵 U 和右奇异向量矩阵 V 。奇异值分解可以将矩阵分解为 U、奇异值矩阵 Σ 和 V 的转置( V T V^T VT)的乘积
2.计算 Frobenius 范数
Frobenius范数是一种度量矩阵大小的方法,它是矩阵元素的平方和的平方根。这个比较可以帮助我们理解W在∆W的子空间中的重要性。
3.作为比较,使用W的奇异向量或随机矩阵
为了进一步比较,我们用 W 的最高 r 个奇异向量或一个随机矩阵来替换 U 和 V,然后再次计算 Frobenius 范数。这可以帮助我们理解在不同的基(basis)下,W 的投影是如何变化的
表7:弗罗贝尼乌斯范数 U T W V T U^TWV^T UTWVT,其中 U 和 V 分别为以下三种情况的左/右前r个奇异向量方向:(1)∆Wq,(2)Wq,(3) 随机矩阵。权重矩阵取自GPT-3模型的第48层。
我们从 表7 中得出几个结论。
首先,与随机矩阵相比,∆W 与 W 的相关性更强,表明 ∆W 放大了 W 中已经存在的某些特征。
其次,∆W 并没有重复 W 的最高奇异方向,而是只放大了在 W 中没有被强调的方向。
第三,放大因子相当大:对于 r = 4,21.5 ≈ 6.91/0.32。见第H.4节了解为什么 r = 64 的放大因子较小。我们还在第H.3节提供了一个可视化,展示了随着我们包含更多Wq的最高奇异方向,相关性如何变化。这表明,低秩适应矩阵可能放大了在通用预训练模型中学到但未被强调的特定下游任务的重要特征。
8.超参数
1.RoBERTa 的超参数
2.DeBERTa XXL 的超参数
3.GPT-2 的超参数
4.GPT-3 的超参数
5.GPT-2 用不同的适应方法在 DART 上
6.GPT-2 用不同的适应方法在 WebNLG 上
7.不同适应方法在 WikiSQL 和 MNLI 的超参数分析
LoRA 更好一些
8.不同方法在 GPT-3 的准确率
8.超参数微调(来自 Claude)
1.超参数
-
rank(秩)
- 这是 LoRA 最核心的超参数,决定了低秩矩阵的维度
- 建议:
- 常用取值范围是 4-64
- 较大的模型(如 14B 以上)可以使用 4-8 的较小 rank
- 中小模型建议从 8-16 开始尝试
- rank 越大,可训练参数越多,效果可能更好但是训练更慢
-
alpha(缩放因子)
- 调节 LoRA 的更新幅度
- 建议:
- 通常设置为与 rank 项目的值(如 rank=8 → alpha=8)
- 也可以独立调节,范围在 1-32 之间
- alpha 越大,每次更新的影响越大
-
target modules(目标层)
-
选择那些层应用 LoRA
-
建议
- 常见的选择是 query 和 value 矩阵(q_proj, v_proj)
- 也可以包含 key 矩阵(k_proj)
- 某些场景可以考虑添加到输出层(out_proj) 和 FFN 层
- 通常不建议全部层都使用 LoRA
-
完整配置
target_modules=["q_proj", "k_proj", "v_proj", "o_proj","gate_proj", "up_proj", "down_proj" ]
-
-
dropout
- LoRA 的 dropout 率
- 建议
- 默认 0.1
- 如果过拟合适当增加
- 数据量大的时候,可以考虑移除
2.具体调参建议
- rank 的选择策略
- 从较小的 rank 开始(如 8 )
- 如果效果不好,可以逐步翻倍
- 注意观察性能提升和计算开销的平衡
- 经验表明, rank=16 是一个很好的起点
- target modules 的选择
- 基础配置:只用于 query 和 value 矩阵
- 进阶配置:添加到 key 矩阵
- 完整配置:包含所有 attention 相关矩阵 和 FFN
- 建议从基础配置开始,根据需要逐步拓展
- 不同规模的参数建议
- 7B以下模型:
- rank: 16-32
- alpha: 16-32
- target: q,k,v,o
- 7B-70B模型:
- rank: 8-16
- alpha: 8-16
- target: q,v(起步)
- 70B以上模型:
- rank: 4-8
- alpha: 4-8
- target: q,v
- 7B以下模型:
3.最佳实践总结
-
初始配置建议:
lora_config = {"r": 8,# 起始rank"alpha": 8,# 与rank相同"dropout": 0.1,# 默认dropout"target_modules": ["q_proj", "v_proj"]# 基础配置 }
-
调优策略:
- Step 1: 先固定其他参数,调整 rank 和 alpha
- Step 2: 确定最优 rank 后,可以尝试增加 target modules
- Step 3: 如果还不够好,可以调整 dropout 或 学习率
-
常见陷阱避免:
- rank 设置过大可能导致显存不足
- target modules 太多会降低训练效率
- alpha 太大可能造成训练不稳定