大模型下游任务必备:LORA
LoRA(Low-Rank Adaptation)是一种高效的模型微调技术,全称“Low-Rank Adaptation of Large Language Models”。它由微软研究团队提出,旨在解决大规模预训练模型微调时的资源消耗问题。LoRA 通过在原始权重矩阵上添加低秩更新矩阵,仅调整少量参数,而非全部权重,从而大幅降低计算和存储需求。这种方法在保持模型性能的同时,极大提升了微调的效率,
LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS
来源:ICLR深度学习顶会
时间:2021年6月
Lora是PEFT 的优秀算法,全称是 Parameter-Efficient Fine-Tuning,即参数高效微调,lora没有引入额外层对于模型进行优化,仅仅通过低秩分解就可以完成权重更新!并且lora对于MHA(multi-head attention)进行修改权重,全连接层进行冻结,相比full finetune ,lora性能并没有明显的下降,消耗资源大幅减少!
尽管Lora有很强的性能表现,但是作为21年提出的算法,仍然有很多可以提升性能的方向,后续会不断更新,更加强大的微调算法,喜欢的话点点关注!有错误的地方欢迎指出!共同进步!
摘要
自然语言处理的一个重要范式包括对一般领域数据的大规模预训练和对特定任务或领域的适应。随着我们对较大的模型进行预训练,重新训练所有模型参数的完全微调变得不太可行。以 GPT-3 175B 为例——部署微调模型的独立实例,每个实例都有 175B 参数,成本高得令人望而却步。我们提出了 Low-Rank Adaptation 或 LoRA,它冻结了预训练的模型权重,并将可训练的秩分解矩阵注入到 Transformer 架构的每一层中,大大减少了下游任务的可训练 pa rameter 的数量。与使用 Adam 微调的 GPT-3 175B 相比,LoRA 可以将可训练参数的数量减少 10,000 倍,将 GPU 内存需求减少 3 倍。LoRA 在 RoBERTa、DeBERTa、GPT-2 和 GPT-3 上的模型质量表现与微调相当或更好,尽管可训练参数较少,训练吞吐量更高,并且与适配器不同,没有额外的推理延迟。我们还对语言模型适应中的等级缺陷进行了实证调查,这阐明了 LoRA.Werelease 的有效性,该软件包促进了 LoRA 与 PyTorch 模型的集成,并在 https://github.com/microsoft/LoRA 上为 RoBERTa、DeBERTa 和 GPT-2 提供了我们的实现和模型检查点
- 引言
一个大语言模型经常面向不同的下游任务,针对微调任务提出了lora用于平衡有效性和模型质量, Li et al. (2018a); Aghajanyan et al. (2020) 提出过度参数化会出现low intrinsic dimension,该论文模型改变权重的过程也会出现低内秩的情况,因此提出lora。
Lora的优势 - 便于迁移,lora通过改变A,B矩阵的内容可以实现对于不同任务的微调
- Lora使得训练更加有效,通过冻结一部分参数,并且不用计算梯度。
- 通过引入简单的线性设计,可以合并一些训练矩阵
- Lora正交与之前的方法
- 存在问题
当前语言模型 任务假设任务目标为 P Φ ( y ∣ x ) P_{\Phi }(y|x) PΦ(y∣x),其中的模型的训练参数为 Φ \Phi Φ,模型生成与输出的结构为 Z = ( x i , y i ) i = 1 , . . . , N Z = {(x_i,y_i)}_{i=1,...,N} Z=(xi,yi)i=1,...,N,其中x代表输入的内容,y代表输出的内容。大语言模型的目标函数为 m a x Φ ∑ ( x , y ) ∈ Z ∑ t = 1 ∣ y ∣ l o g ( P Φ 0 ( y t ∣ x , y < t ) ) max_{\Phi} \sum_{(x,y)\in Z}\sum_{t=1}^{|y|}log(P_{\Phi_0}(y_t|x,y<t)) maxΦ(x,y)∈Z∑t=1∑∣y∣log(PΦ0(yt∣x,y<t))
对于full finetuning 中的 △ Φ = ∣ Φ 0 ∣ \triangle\Phi = |\Phi_0| △Φ=∣Φ0∣, 相当于对于所有的原始数据进行可微调,GPT3的 ∣ Φ 0 ∣ ≈ 175 B |\Phi_0| \approx {175B} ∣Φ0∣≈175B
而lora关键在于寻找合适的 △ Φ \triangle\Phi △Φ使其在参数量减少的情况下实现最大化目标参数。
m a x Φ ∑ ( x , y ) ∈ Z ∑ t = 1 ∣ y ∣ l o g ( P Φ 0 + △ Φ ( θ ) ( y t ∣ x , y < t ) ) max_{\Phi} \sum_{(x,y)\in Z}\sum_{t=1}^{|y|}log(P_{\Phi_0+\bigtriangleup \Phi(\theta)}(y_t|x,y<t)) maxΦ(x,y)∈Z∑t=1∑∣y∣log(PΦ0+△Φ(θ)(yt∣x,y<t))
现有问题是
Adapter Layer导致推断延迟,并且在模型迁移的时候会需要更多的时间以及资源。
直接优化提示是困难的:另一个方向,如前缀调整所证明的,面临着不同的挑战。我们观察到前缀调整很难优化,并且其性能在可训练参数中非单调变化,证实了原始论文中的类似观察结果。根本的是,保留一部分序列长度用于适应必然会减少可用于处理下游任务的序列长度,我们怀疑与其他方法相比,这会使调优提示的性能降低。
适配器推理延迟图 - 论文中提出的方法
神经网络通常会包含大量的矩阵变换,而权重矩阵往往在这些变换当中是满秩的,但是当在一些特殊任务上时,Aghajanyan等人提出预训练模型具有低内秩的特点。因此论文假设权重在adatption的过程中出现低内秩的特定,对于该情况进行矩阵分解 W o + △ W = W o + B A , W o ∈ R d ∗ x , B ∈ R d ∗ r , A ∈ R r ∗ k , 其中 r < < m i n ( d , k ) W_o + \triangle W = W_o+BA,W_o \in{R^{d*x}},B \in R^{d*r},A\in R^{r*k},其中r<<min(d,k) Wo+△W=Wo+BA,Wo∈Rd∗x,B∈Rd∗r,A∈Rr∗k,其中r<<min(d,k),对于 W o , B A W_o,BA Wo,BA 来说输入的数据是相同的。
文章提出仅仅修改transformer中的注意力权重,在下游任务中并不修改全连接层。 W q , W k , W v , W o W_q,W_k,W_v,W_o Wq,Wk,Wv,Wo分别代表在attention中的query,key,value,output,我们在图 1 中说明了我们的重新参数化。我们对 A 使用随机高斯初始化,对 B 使用零,因此在训练开始时 W = BA = 0。然后我们将 Wx 缩放 r ,其中 是 r 中的常数。使用 Adam 进行优化时,如果我们适当地缩放初始化,则 tuning 与调整学习率大致相同。因此,我们只需设置为 first r 我们尝试,而不调整它。这种缩放有助于减少当我们改变 r 时重新调整超参数的需要)。
工作最大的优势是
- 减少了内存和存储的开支,对于tranformer使用Adam训练的,减少了2/3的显存消耗
- 便于迁移,对于不同的训练任务,可以通过加上BA恢复原始参数。
LoRA也有其局限性。例如,如果选择使用 加入A,B,W 来消除额外的推理延迟,那么使用不同的 A 和 B在一次前向传递中 对不同任务进行批量输入并不简单。不过,在延迟不重要的情况下,可以不合并权重并动态选择用于批处理样本的 LoRA 模块。 - 实验结果
实验对比baseline
Bias-only or BitFit :在训练偏差时冻结其他所有的向量
Pre-embedding (PreEmbed) 在输入标记中插入特殊标记。这些特殊标记具有可训练的单词嵌入,通常不在模型的词汇表中。放置此类令牌的位置可能会影响性能。我们专注于 “prefixing”,它将此类标记附加到提示符前面,以及 “infixing”,它附加到提示符中;两者都在Li & Liang (2021)中进行了讨论。我们使用 lp (resp. li) 表示前缀 (resp. infix) 标记的数量。可训练参数的数量是 =dmodel (lp +li)。
前缀层优化 (PreLayer) 是前缀嵌入优化的扩展。我们不是仅仅学习一些特殊标记的词 embeddings(或者等效地,嵌入层之后的 activations),而是学习每个 Transformer 层之后的 activations。从 pre vious 层计算的 activations 被 trainable 层简单地替换。可训练参数的结果数量为 =L dmodel (lp+li),其中 Lis为 Transformer 层数。Houlsby 等人 (2019) 提出的适配器调整在自注意力模块(和 MLP 模块)和随后的残余连接之间插入适配器层。在适配器层中有两个全连接层,它们具有偏置,中间有非线性。我们将此原始设计称为 AdapterH。最近,Lin 等人(2020 年)提出了一种更高效的设计,即适配器层仅在 MLP 模块和 LayerNorm 之后应用。我们称之为 AdapterL。这与 Pfeiffer 等人(2021 年)提出的另一个设计非常相似,我们称之为 AdapterP。我们还包括另一个基线调用 AdapterDrop (R ̈ uckl’ e et al., 2020),它删除了一些适配器层以提高效率 (AdapterD)。我们尽可能引用先前工作中的数字,以最大限度地增加我们比较的基线数量;它们位于第一列中带有星号 (*) 的行中。
在所有情况下,我们都有 = LAdpt (2 dmodel r+r+dmodel)+2 LLN dmodel,其中 LAdpt 是适配器层的数量,LLN 是可训练的 LayerNorm 的数量(例如,在 AdapterL 中)。
5. 理解低秩更新
鉴于 LoRA 的经验优势,我们希望进一步解释从下游任务中学到的低秩适应的特性。
请注意,低秩结构不仅降低了硬件进入门槛,允许我们并行运行多个实验,而且还可以更好地解释更新权重与预训练权重的关联性。我们将研究重点放在 GPT-3 175B 上,在那里我们实现了可训练参数的最大减少(高达 10,000 ),而不会对任务性能产生不利影响。我们进行了一系列实证研究来回答以下问题:
1) 给定一个参数预算约束,我们应该调整预训练 Transformer 中的哪个权重矩阵子集以最大限度地提高下游性能?
2) “最佳”适应矩阵 W 真的有秩缺陷吗?如果是这样,在实践中使用什么好的秩?
3) W 和 △ W \triangle W △W 之间有什么联系?W 与 △ W \triangle W △W 高度相关吗?W 与 △ W \triangle W △W 相比有多大?
我们相信,我们对问题 (2) 和 (3) 的回答阐明了使用预训练语言模型进行下游任务的基本原则,这是 NLP 中的一个关键主题。
上表表明,令人惊讶的是,LoRA 已经在非常小的 r 下表现得具有竞争力(对于 WqWv 来说,不仅仅是 Wq)。这表明更新矩阵 W 可能具有非常小的“内在秩”。为了进一步支持这一发现,我们检查了通过不同 r 选择和不同随机种子学习的子空间的重叠。我们认为,增加 r 并不能覆盖更有意义的子空间,这表明低秩适应矩阵就足够了。
更多推荐
所有评论(0)