前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解读LoRA

解读LoRA

作者头像
半吊子全栈工匠
发布2023-12-20 18:10:20
3490
发布2023-12-20 18:10:20
举报
文章被收录于专栏:喔家ArchiSelf喔家ArchiSelf

大模型调优(finetuning)不仅仅是参数的优化,同样会受到非功能性约束的挑战,例如:

  • 计算效率约束:训练过程应该快速而廉价。
  • 内存计算高效:不应该需要大量的GPU来微调LLM。
  • 易于部署:不应该为每个要解决的任务部署LLM的多个副本。

在一定程度上,LoRA(Low-Rank Adaptation)可以较好地面对这些挑战。使用LoRA,可以降低微调专用LLM的门槛,同时实现与端到端微调相当的性能,能够在模型的特定版本之间轻松切换,并且不会增加推理延迟。鉴于其实用性,LoRA的研究也导致了大量的变体和扩展。

1. 什么是LoRA

当微调语言模型时,我们会修改模型的基本参数。为了使这一想法更加具体,微调得出的参数可以有如下的形式化表达:

LoRA的核心思想是通过低秩分解对模型参数的更新进行建模,在实践中实现为一对线性投影。LoRA使LLM的预训练层保持固定,并将可训练秩分解矩阵注入模型的每一层,如下图所示:

1.1 秩分解矩阵

简单而言,秩分解矩阵只是两个线性投影,它们减少并恢复输入的维度。这两个线性投影的输出被添加到从模型的预训练权重导出的输出中。通过添加这两个平行变换形成的更新层,LoRA被添加到直接学习底层权重并实现更新。

矩阵乘积AB具有与完全微调更新相同的维度。将更新分解为两个较小矩阵的乘积可以确保更新是低秩的,并显著减少必须训练的参数数量。LoRA不是直接微调预训练LLM层中的参数,而是仅优化秩分解矩阵,产生近似于从完全微调中导出的更新结果。用随机的小值初始化A,而B初始化为零,可以确保用模型的原始预训练权重开始微调过程。

也就是说,通过将LoRA的秩r设置为预先训练的权重矩阵的秩,大致恢复了完全微调(fully finetuning)的表现力。增加r可以提高LoRA对完整微调更新的近似值,但在实践中,r的值非常小就足够了,这样能够在对性能影响最小的情况下显著降低计算和内存成本。例如,仅使用总参数的0.01%的LoRA来微调GPT-3,并且仍然可以实现与完全微调相当的性能。

1.2 比例因子

一旦推导出权重矩阵的低秩更新,可以将其按因子α进行缩放,然后将其添加到模型的预训练权重中。比例因子的默认值为1,这意味着在计算模型的前向通过时,预训练的权重和低秩权重更新的权重相等。然而,可以更改α的值,以平衡预训练模型的重要性和新的特定任务自适应。对于具有更高秩的LoRA(即,更大的r->laα),需要更大的α值。

1.3 LoRA与LLM适配层的区别

乍一看,LoRA使用的方法可能类似于适配器层。然而,有两个显著的区别:

  1. 两个线性投影之间不存在非线性。
  2. 秩分解矩阵被注入到模型的现有层中,而不是被顺序添加为额外的层。

这些变化的最大影响是,与原始预训练模型相比,LoRA没有增加推理延迟。当将微调的LoRA模型部署到生产中时,可以直接计算并存储从LoRA导出的更新权重矩阵。因此,模型的结构与预训练的模型相同,只是权重不同。

通过存储模型的预训练权重和从几个不同任务的微调中获得的LoRA模块,可以通过以下方式“切换”LoRA模块:

  • 从模型的权重中减去一个任务的LoRA更新。
  • 将另一个任务的LoRA更新添加到模型的权重中。

相比之下,在不同任务上进行端到端微调的模型之间切换需要将所有模型参数加载到内存中或从内存中加载出来,从而造成严重的I/O瓶颈。通过对来自微调的权重更新的有效参数化,LoRA使任务之间的切换既高效又容易。

2. LoRA 的工作原理

LoRA使用了包含很少可训练参数的低秩分解,来构建从微调中导出的权重更新。尽管用于微调的参数很少,但为什么模型能够表现良好呢?难道不会从更多可训练的参数中受益吗?

究其根源,大语言模型往往具有较低的内在维度。尽管这听起来很复杂,但它只是意味着大模型的权重矩阵往往是低秩的。换句话说,并非所有这些参数都是必需的!我们可以通过将这些权重矩阵分解为具有更少可训练参数的表示来实现可比较的性能。

因此,可以合理地推断,经过微调的模型也是如此,从微调中得出的权重更新也应该具有较低内在维度。因此,像LoRA这样用低秩分解近似微调更新的技术应该能够高效地学习,尽管几乎没有可训练的参数,但可以产生具有较好性能的模型。

与微调的GPT-3 175B相比,LoRA可以将可训练参数的数量减少10000倍,GPU内存需求减少3倍。尽管可训练参数较少,训练吞吐量较高,而且与适配层不同,没有额外的推理延迟,但LoRA在RoBERTa、DeBERTa、GPT-2和GPT-3上的模型质量与微调不相上下或更好。

LoRA提出的一般思想可以应用于神经网络中任何类型的密集层,而不仅仅是transformer。然而,当将LoRA应用于LLM时,可以仅使用LoRA来调整注意力层权重,前馈模块和预训练权重保持固定,这样只更新插入到每个注意力层中的秩分解矩阵即可。特别地,使用LoRA来更新注意力层的查询和值矩阵,这在实验中被发现可以产生最佳结果。

然而,将LoRA应用于transformer中的所有权重矩阵可以获得更好的结果。尽管这些结果可能取决于应用,但使用LoRA调整所有权重矩阵往往会产生有竞争力的性能。

3. LoRA 的优点

LoRA可以较好地解决了本文开始的那些挑战,最明显的优点包括以下几个方面:

  1. 一个单独的预训练模型可以由几个(小得多)LoRA模块共享,这些模块对其进行调整以解决不同的任务,从而简化了部署和托管过程。
  2. LoRA模块可以“烘焙”到预训练模型的权重中,以避免额外的推理延迟,可以在不同的LoRA模块之间快速切换,以解决不同的任务。
  3. 当使用LoRA微调LLM时,只需要为极少数参数维护优化器状态,这显著减少了存储器开销并且允许用更小/更少GPU来执行微调。

当使用生成式LLM进行实验时,LoRA能够很好地处理工作负载,即使使用更大的模型也是有效的,而且,LoRA在每个测试的数据集上都匹配或超过了端到端微调的性能。此外,就所使用的可训练参数的数量而言,LoRA的性能非常稳定。

使用LoRA的微调明显快于端到端微调(即,在GPT-3的情况下,大约快25%),显著降低了微调LLM的门槛。训练很快,每个任务只有少量特定于任务的参数与之相关,而且有各种在线资源已经开始使用LoRA了。

4. LoRA 实践

LoRA对人工智能从业者来说是一个非常有用的工具。有了LoRA,可以不需要大量的大规模GPU,而且微调过程是高效的,这使得几乎任何人都可以在自己的数据上训练专门的LLM。此外,LoRA已经有了许多高效实现,并拥有了大量有用的功能;例如,减少内存使用的梯度积累、加速微调的混合精度训练以及与加速器(GPU/TPU)的轻松集成。使用LoRA微调LLM的两个常见库如下:

  • PEFT:https://huggingface.co/docs/peft
  • lit-gpt:https://github.com/Lightning-AI/lit-gpt

这里,简要概述如何使用Lit-GPT通过LoRA来微调LLM,希望能为在实践中使用LoRA提供一些有用的提示。

4.1 使用LoRA进行微调

LitGPT库包含各种有用的脚本,可用于使用LoRA微调开源LLM。在克隆Lit GPT代码仓库并安装依赖项后,第一步是下载一个预训练的模型以使用LoRA进行微调。要下载LLaMA-2可以通过HuggingFace授权访问LLaMA-2,只需从HuggingFace下载模型,将其转换为Lit GPT所需的格式,可以通过下面的脚本来完成此操作。

在下载了预训练的模型之后,需要一个数据集来进行微调。通常用于LLM微调的指令微调数据集包括:

  • Alpaca :https://github.com/tatsu-lab/stanford_alpaca
  • Dolly :https://huggingface.co/datasets/databricks/databricks-dolly-15k
  • LongForm:https://huggingface.co/datasets/akoksal/LongForm
  • LIMA:https://huggingface.co/datasets/GAIR/lima
  • RedPajama :https://huggingface.co/datasets/togethercomputer/RedPajama-Data-V2

可以简单地使用Lit-GPT中的辅助脚本来下载这些数据集,当然,也支持创建自定义的微调数据集。剩下的就是运行微调脚本,合并模型的权重,然后评估结果模型,在一组指定的任务上或者通过与模型聊天来评估质量。

在Lit-GPT中的微调脚本中,有几个是用于LoRA默认配置的。在执行微调之前,可以在finetuning/loa.py文件中编辑这些选项。例如,更改所使用的r值,或者将LoRA应用于transformer内的所有层等等。

4.1 使用LoRA的注意事项

当然,这只是使用LoRA 微调大模型的简单入门,但是可以作为一个良好的起点。从对LoRA的广泛实证分析中收集到的一些有价值的结论包括:

  • 1.为LoRA选择优化器(即SGD或AdamW)不会在性能或内存开销方面产生巨大差异(假设r很小)。
  • 2.在微调数据集上执行多个时期的训练通常是无益的,反而降低了性能。
  • 3.在transformer中的所有权重矩阵上应用LoRA比仅将LoRA应用于查询和值矩阵要好。
  • 4.将α设置为r值的2倍会产生有竞争力的结果。r的值越大,α的值就越大,而r是一个必须调整的超参数。

需要注意的是, LoRA是一种通用技术,可以用于任何类型的密集神经网络层微调。例如,使用LoRA来微调图像分类模型()。

此外,LoRA与大多数现有的PEFT微调技术正交,这意味着可以同时使用这两种技术。原因在于,LoRA不直接修改预训练模型的权重矩阵,而是学习对这些矩阵的低秩更新,这些矩阵可以可选地与预训练的权重融合,以避免推理延迟。这是一种内联自适应技术,不向模型添加额外的层。因此,除了LoRA之外,我们还可以执行端到端的微调,并在LoRA之上应用其他微调技术。

5. LoRA的各种变体

LoRA的提出促进了整个大模型微调领域的发展,进而涌现出了很多变体。

5.1 QLoRA

QLoRA可以说是最流行的LoRA变体。QLoRA在微调期间使用模型量化来减少内存使用,同时保持(大致)相等的性能水平。更具体地说,QLoRA对预训练的模型权重使用4位量化,并在此基础上训练LoRA模块。此外,还有多种新的量化技术,以进一步减少内存使用:

  • 4位NormalFloat(NF4)格式:一种新的(量化的)数据类型,适用于遵循正态分布的权重。
  • 双重量化:通过量化模型权重及其相应的量化常数来减少内存占用。
  • Paged Optimizers:防止在处理长序列或训练大型模型时,由于梯度检查点导致内存不足错误而导致的内存峰值。

在实践中,QLoRA以略微降低训练速度为代价来节省内存。例如,用QLoRA代替LoRA来微调LLaMA-2-7B可以减少33%的内存使用,但增加了39%的训练时间。

5.2 QA-LoRA

QA-LoRA(是LoRA/QLoRA的扩展,进一步减少了训练和部署LLM的计算负荷,使用两种主要技术来减少微调LLM的计算/内存开销:

  • PEFT:使用少量可训练参数对预训练的LLM进行微调,例如,LoRA是PEFT的一种形式。
  • 量化:将LLM的训练权重转换为低位表示。

QA-LoRA以一种简单而高效的方式集成了这两种思想。可以在使用LoRA微调的模型上执行训练后量化,但这种方法已被证明效果不佳。相反,QA-LoRA提出一种分组量化方案来提高训练和推理效率,该方案分别对模型中的不同权重组进行量化。这种量化是在训练期间应用的,所以不需要训练后量化。

5.3 LongLoRA

简单地说,LongLoRA只是一种有效的微调技术,可以使用它来调整预训练的LLM,以支持更长的上下文长度。也就是说,LongLoRA试图使用基于LoRA的微调方案将LLM廉价地调整为更长的上下文长度。

训练具有长上下文长度的LLM是昂贵的,因为自注意力的成本相对于输入序列的长度是二次的。然而,可以通过从预训练的LLM开始以及通过微调扩展其上下文长度来避免一些成本。LongLoRA正是这样做的,通过以下方式使通过微调来扩展预训练的LLM的上下文长度变得更便宜:

  • --使用稀疏的局部注意力而不是密集的全局注意力(在推理时是可选的),这意味着它只关注上下文窗口中的一小部分令牌,这显著降低了计算成本。
  • --使用LoRA进行上下文扩展,用可训练参数来表示局部注意力权重。这允许模型了解对于不同的任务,哪些令牌是重要的。

LongLoRA可以显著降低对长上下文大小的LLM进行微调的计算成本,在各种任务上都能实现与注意力微调类似的性能,与大多数现有的LLM微调技术兼容,如FlashAttention-2。但是,LongLoRA需要一个有监督的微调数据集,而且对于需要很长上下文大小的任务,例如长文档的摘要,LongLoRA可能没有那么有效。

尽管以上3个是值得关注的LoRA变体,但实际上也各种各样基于LoRA的扩展,例如GLoRA,Tied-LoRA,LoRA-FA,LQ-LoRA,MultiLoRA等等。

6. 小结

LoRA可以说是用于创建专门LLM的最广泛使用的实用工具,显著降低LLM微调过程的硬件需求。它让几乎任何人都有能力对自己的数据进行专门的LLM训练。因此,基于LoRA产生了各种扩展、替代方案和实用工具。例如,QLoRa将LoRA与模型量化相结合,以进一步减少LLM微调的内存开销,代价是训练速度的略微降低。

7. 画外音

如果对如上文字感到失望,那么您期望的 LoRA 可能指的是应用于 LPWAN 的一种无线通信技术。

LoRA 是一种工作在非授权频段的无线技术,在欧洲的常用频段为 433MHz 和 868MHz,在美国的常用频段为 915MHz。LoRa 基于扩频技术进行信号调制,并具有前向纠错(FEC)的功能,相较于同类技术,在相同的发射功率下,LoRa 的通信传输距离更长,可达 15km以上,在空旷区域的传输距离甚至更远。而且,LoRa 的接收灵敏度很高,它使用整个信道带宽来广播一个信号,因此可以有效对抗信道噪声以及由低成本的晶振引起的频偏。

此外,LoRA 协议还针对低功耗、电池供电的传感器进行了优化,很好地平衡了网络延迟与电池寿命的关系。采用 LoRa 无线技术构成的网络称为 LoRaWAN。该网络采用星形拓扑架构,相较于网状的网络架构,其传输延迟大大降低。更为重要的是,支持 LoRa 协议的设备节点可以直接与网络集中器进行连接,形成星形网络架构。如果设备节点的距离较远,则可以借助网关设备进行连接。

LoRaWAN 网络可以提供物联网的安全通信,满足移动化服务和本地化服务等需求。LoRaWAN 规范对智能设备间无缝的互操作性提供了约定,从而使得不需要复杂的安装,就可以让用户自行组建网络。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 喔家ArchiSelf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 什么是LoRA
    • 1.1 秩分解矩阵
      • 1.2 比例因子
        • 1.3 LoRA与LLM适配层的区别
        • 2. LoRA 的工作原理
        • 3. LoRA 的优点
        • 4. LoRA 实践
          • 4.1 使用LoRA进行微调
            • 4.1 使用LoRA的注意事项
            • 5. LoRA的各种变体
              • 5.1 QLoRA
                • 5.2 QA-LoRA
                  • 5.3 LongLoRA
                  • 6. 小结
                  • 7. 画外音
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档