LoRA:大模型的低秩自适应

前言

如今,预训练模型的参数规模变得越来越大,而在实际应用的过程中需要对模型进行相应的微调。而模型参数越大,想要进行微调的成本也就越高,而在下面这篇论文中提出的LoRA方法在对模型进行微调过程中可以有效的减少模型的参数量,从而可以极大的减少模型训练的成本。
论文链接: LORA: Low-Rank adaptation of large language models

摘要

自然语言处理的一个重要范例是在一般领域数据上进行大规模预训练,然后适应特定任务或领域。而随着预训练模型越来越大,重新训练所有模型参数的全面微调就变得不可行了。作者提出了低秩自适应技术,可以冻结预训练模型的权重,并将可训练的秩分解矩阵注入Transformer的每一层,从而大大减少下游任务的可训练参数量。与使用Adam进行微调的GPT-3 175B相比,LoRA可将可训练参数量降低10,000倍,GPU内存需求减少3倍。LoRA在RoBERTaDeBERTaGPT-2GPT-3上的模型质量表现与微调相当或更好,尽管可训练参数更少、训练吞吐量更高,而且与适配器不同,没有额外的推理延迟。还对语言模型适应中的等级缺陷进行了实证调查,揭示了LoRA的有效性。

引言

自然语言处理的很多应用都依赖于将一个大模型、预先训练好的语言模型适用于多个下游应用。这种调整通常是通过微调来完成的,微调会更新预训练模型中的所有参数。微调的主要缺点是新模型包含的参数与原模型一样多。随着更大的模型每隔几个月就要训练一次,这对于GPT-2或RoBERTa等模型而言仅仅是“不便”,对于拥有1750亿参数的GPT-3而言在部署时则成了非常严峻的挑战。

许多人视图通过只调整某些参数或为新任务学习外部模块来缓解这种情况。这样,除了为每个任务添加预先训练好的模型外,只需要存储和加载少量特定任务的参数,从而可以大大提高模型部署时的运行效率。而现有的技术通常是通过扩展模型深度或减少模型的可用序列长度,经常会引入推理延迟。更重要的是这些方法通常无法与微调基线相匹配,这就需要在效率和模型质量之间进行权衡。

有研究表明,学习到的过度参数化模型往往存在于一个较低的内在维度上。因此作者假设模型适应过程中权重的变化也具有较低的“内在秩”,因此作者就提出了低秩适应(LoRA)的方法。LoRA允许通过优化适应过程中密集层变化的秩分解矩阵来间接训练神经网络中的一些密集层,同时保持预训练的权重不变。即使在GPT-3 175B这个模型上,发现即使全秩高达12,288,也只需要很低的秩(下图中的r,可以是1或者2)就足够了,这就使得LoRA即节省存储空间,又节省计算时间。
在这里插入图片描述
LoRA有以下几个关键的优势:

  • 预训练模型可以共享,并用于为不同任务构建许多小型LoRA模块。可以通过冻结共享模块,并替换上图中的矩阵A和矩阵B来进行相关任务的切换,从而大幅降低存储需求和任务切换开销。
  • 在使用自适应优化器时,LoRA使训练更加高效,并将硬件门槛降低了3倍。因为不需要计算梯度或维护大多数参数的优化器状态。相反,只需要优化注入的、更小的低秩矩阵即可。
  • 简单的线性设计运行在部署时将可训练矩阵与冻结权值合并,与全微调的模型相比,不会带来推理延迟。
  • LoRA与许多之前的方法是正交的,并可与许多方法(如prefix-tuning)相结合。

术语与惯例:通常通过引用Transformer结构,并使用传统术语的维度。将Transformer输入和输出维度大小称为 d m o d e l d_{model} dmodel,使用 W q W_q Wq W k W_k Wk W v W_v Wv W o W_o Wo来表示自注意力模块中查询/键/值/输出投影矩阵。 W W W W o W_o Wo表示预训练的权重矩阵, Δ W \Delta W ΔW表示在适应过程中累积的梯度更新。论文中使用 r r r表示LoRA模块的秩,同样使用Adam来对模型进行优化,并将Transformer MLP的前馈维度设置为 d f f n = 4 × d m o d e l d_{ffn} = 4 \times d_{model} dffn=4×dmodel

问题描述

通常将语言模型作为对应的激励用例。下面简要介绍语言建模问题,特别是在特定任务提示下条件概率最大化的问题。

在得到预训练好的自回归语言模型后,会考虑将这个预先训练好的模型应用在下游的相关任务上,如摘要、机器阅读理解(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是标记序列。在完全微调过程中,模型被初始化为预先训练的权重 Φ 0 \Phi 0 Φ0,并通过反复跟踪梯度更新为 Φ 0 + Δ Φ \Phi 0 + \Delta \Phi Φ0+ΔΦ,以最大化条件建模目标:
max ⁡ Φ ∑ ( x , y ) ∈ Z ∑ t = 1 ∣ y ∣ l o g ( P Θ ( y t ∣ x , y < t ) ) \max_{\Phi } \sum_{(x,y)\in Z} \sum _{t=1}^{|y|} log(P_\Theta (y_t|x,y_{<t})) Φmax(x,y)Zt=1ylog(PΘ(ytx,y<t))
完全微调的一个主要缺点是,对于每个下游任务,都要学习一组不同的参数 Δ Φ \Delta \Phi ΔΦ,其维度 ∣ Δ Φ ∣ |\Delta \Phi| ∣ΔΦ∣等于 Φ 0 \Phi 0 Φ0。因此如果预训练的模型很大,那么存储和部署许多独立的微调模型实例即使可行,也会很有挑战性。

这篇论文中采用了一种参数效率更高的方法,即特定于任务的参数增量 Δ Φ = Δ Φ ( Θ ) \Delta \Phi = \Delta \Phi (\Theta) ΔΦ=ΔΦ(Θ)由一组更小的参数 Θ \Theta Θ进行编码,其中 ∣ Θ ∣ ≪ ∣ Φ ∣ |\Theta| \ll |\Phi| ∣Θ∣∣Φ∣。寻找 Δ Φ \Delta \Phi ΔΦ的任务就变成了优化 Θ \Theta Θ
max ⁡ Φ ∑ ( 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 + \Delta \Phi(\Theta)} (y_t|x,y_{<t})) Φmax(x,y)Zt=1ylog(PΦ0+ΔΦ(Θ)(ytx,y<t))
在后续章节中,建议使用低秩表示法来编码既节省计算又节省内存的 Δ Φ \Delta \Phi ΔΦ

对现有方案的分析

由于解决的问题并不是一个新出现的问题,自从迁移学习诞生以来,已经有数十项研究试图提高模型适应的参数和计算效率。以语言建模为例,在高效适配方面有两种较为突出的策略:增加适配层或优化某些形式的输入层激活。然而,这两种策略都有其局限性,尤其是在大规模和对延迟敏感的生产场景中。

适配器层带来推理延迟:适配器有很多种,重点关注的是Houlsby的原始设计,每个Transformer模块有两个适配器层;Lin的最新设计,每个Transformer只有一个适配器层,但附加了一个额外的LayerNorm。这看起来不是一个问题,因为适配器层的瓶颈维度较小,可以限制器增加的FLOPs,从而使其参数变得很少(有时小于原始模型的1%)。然而,大型神经网络依赖于硬件并行性来保持低延迟,而适配器层必须按照顺序处理。这不利于在线推理设置,其中批处理大小通常小于1。在没有模型并行性的通用场景中,如在单个GPU上运行GPT-2时,通常可以发现适配器会明显增加延迟,即使瓶颈维度很小。在对模型进行分割时,这个问题就会变得更加严重,因为额外的深度需要更多的GPU同步操作,除非冗余地存储适配器参数。

直接优化提示很难:以prefix-tuning为例,另一个方向同样面临着不用的调整。prefix tuning同样很难优化,其性能在可训练参数上的变化并不是单调变化的。更重要的,保留部分序列长度用于自适应必然会减少可用于处理下游任务的序列长度。因此与其他方法相比,这使得调整提示符的性能可能低于其他的方法。

本文中的方法

这里主要介绍LoRA的简单设计及其实际效益。这里概述的原则适用于深度学习模型中的任何密集层,不过在实验中只关注Transformer语言模型中的某些权重,并将其作为激励用例。

低秩参数化更新矩阵

一个神经网络包含许多密集的层,它们可以执行矩阵乘法。这些层中的权重矩阵通常具有全秩。当适应特定任务时,预训练的语言模型具有较低的“内在维度”,尽管随机投影到较小的子空间,仍然能够高效学习。受此启发,假设权重的更新在适应过程中也具有较低的“内在等级”。对于预先训练的权重矩阵 W 0 ∈ R d × k W_0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nlp_xiaogui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值