LoRA
1.摘要
随着模型越来越大,全量微调变得越来越不可行了。所以作者提出了低秩适应(Low-Rank Adaptation, LoRA,他冻结了预训练模型权重,并在 Transformer 架构的每一层注入可训练的秩分解矩阵,极大地减少了下游任务的可训练参数量。
与 Adam 微调 GPT-3 175B 相比,LoRA 可以将训练参数量减少 10000 倍,GPU 内存需求减少 3 倍。
虽然可训练参数少,但是吞吐量高,且与 adapter 不同,他没有额外的推理延迟。
Note:
LoRA 基本思想:在模型适应阶段,不直接修改预训练模型原有的稠密权重矩阵,而是引入额外的低秩矩阵来表示权重变化的部分。具体的,
- 秩分解:对于原本的高维矩阵 W ,将他的变化量 ΔW 近似为两个低秩矩阵的乘积 ΔW≈U∗VTΔ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=(xi,yi),i=1,…,NZ={(x_i,y_i)},i=1,…,NZ=(xi,yi),i=1,…,N 表示,其中 xix_ixi 和 yiy_iyi 都是由 token 组成的序列。举例来说,在 NL2SQL 任务中, xix_ixi 是一个自然语言查询,而 yiy_iyi 则是对应的SQL命令;在摘要生成任务中, xix_ixi 是文章的内容, yiy_iyi 是其摘要。
在完全微调过程中,模型初始化为预训练权重 Φ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 等人表明,预训练的语言模型具有低“内在维度”,并且尽管随机投影到较小的子空间,仍然可以高效学习。
受此启发,我们假设在适应过程中权重的更新也具有低“内在秩”。对于预训练的权重矩阵 W0∈Rd×kW_0 ∈ R^{d×k}W0∈Rd×k,我们通过表示后者为低秩分解 W0+∆W=W0+BAW_0 + ∆W = W_0 + BAW0+∆W=W0+BA 来约束其更新,其中 B∈Rd×rB ∈ R^{d×r}