大型语言模型的 11 种高效微调策略详解
本文综述了大型语言模型的 11 种参数高效微调方法。涵盖前缀调优、提示调优、P-Tuning v2 等引入特定参数的技术,以及基于 LoRA 及其变体(DyLoRA、AdaLoRA、QLoRA、QA-LoRA、LongLoRA、VeRA、S-LoRA)的旁路适配方案。这些方法通过冻结主模型参数或增加低秩矩阵,显著降低训练显存和计算成本,同时保持模型性能。PEFT 技术适用于资源受限场景及多任务部署,是落地大模型应用的关键路径。

本文综述了大型语言模型的 11 种参数高效微调方法。涵盖前缀调优、提示调优、P-Tuning v2 等引入特定参数的技术,以及基于 LoRA 及其变体(DyLoRA、AdaLoRA、QLoRA、QA-LoRA、LongLoRA、VeRA、S-LoRA)的旁路适配方案。这些方法通过冻结主模型参数或增加低秩矩阵,显著降低训练显存和计算成本,同时保持模型性能。PEFT 技术适用于资源受限场景及多任务部署,是落地大模型应用的关键路径。

大型预训练模型是一种在大规模语料库上预先训练的深度学习模型,它们可以通过在大量无标注数据上进行训练来学习通用语言表示,并在各种下游任务中进行微调和迁移。随着模型参数规模的扩大,微调和推理阶段的资源消耗也在增加。针对这一挑战,可以通过优化模型结构和训练策略来降低资源消耗。
一般来说,研究者的优化方向从两个方面共同推进:
一方面,针对训练参数过多导致资源消耗巨大的情况,可以考虑通过固定基础大型语言模型的参数,引入部分特定参数进行模型训练,大大减少了算力资源的消耗,也加速了模型的训练速度。比较常用的方法包括前缀调优、提示调优等。
另一方面,还可以通过固定基础大型语言模型的架构,通过增加一个'新的旁路'来针对特定任务或特定数据进行微调,当前非常热门的 LoRA 就是通过增加一个旁路来提升模型在多任务中的表现。
接下来,我们将详细介绍 11 种高效的大型语言模型参数调优的方法。
前缀调优(Prefix Tuning)是一种轻量级的微调替代方法,专门用于自然语言生成任务。前缀调优的灵感来自于语言模型提示,前缀就好像是'虚拟标记'一样,这种方法可在特定任务的上下文中引导模型生成文本。
前缀调优的独特之处在于它不改变语言模型的参数,而是通过冻结 LM 参数,仅优化一系列连续的任务特定向量(即前缀)来实现优化任务。前缀调优的架构如图 1 所示。
图 1 前缀调优的架构
由于在训练中只需要为每个任务存储前缀,前缀调优的轻量级设计避免了存储和计算资源的浪费,同时保持了模型的性能,具有模块化和高效利用空间的特点,有望在 NLP 任务中提供高效的解决方案。
提示调优(Prompt Tuning)方法是由 Brian Lester 在论文'The Power of Scale for Parameter-Efficient Prompt Tuning'中提出的。
提示调优采用'软提示'(Soft Prompt)的方式,通过冻结整个预训练模型,只允许每个下游任务在输入文本前面添加 k 个可调的标记(Token)来优化模型参数,赋予语言模型能够执行特定的下游任务的能力。提示调优的架构如图 2 所示。
图 2 提示调优的架构
在论文的实验对比中,对于 T5-XXL 模型,每个经过调整的模型副本需要 110 亿个参数,相较于为每个下游任务制作特定的预训练模型副本,提示调优需要的参数规模仅为 20480 个参数。该方法在少样本提示方面表现出色。
尽管提示调优在相应任务上取得了一定的效果,但当底座模型规模较小,特别是小于 1000 亿个参数时,效果表现不佳。为了解决这个问题,清华大学的团队提出了针对深度提示调优的优化和适应性实现——P-Tuning v2 方法。
该方法最显著的改进是对预训练模型的每一层应用连续提示,而不仅仅是输入层。这实际上是一种针对大型语言模型的软提示方法,主要是将大型语言模型的词嵌入层和每个 Transformer 网络层前都加上新的参数。深度提示调优增加了连续提示的功能,并缩小了在各种设置之间进行微调的差距,特别是对于小型模型和困难的任务。
实验表明,P-Tuning v2 在 30 亿到 100 亿个参数的不同模型规模下,以及在提取性问题回答和命名实体识别等 NLP 任务上,都能与传统微调的性能相匹敌,且训练成本大大降低。
LoRA 的核心思想是通过冻结预训练模型的权重,并将可训练的秩分解矩阵注入 Transformer 架构的每一层,从而显著减少下游任务中可训练参数的数量。在训练过程中,只需要固定原始模型的参数,然后训练降维矩阵 A 和升维矩阵 B。LoRA 的架构如图 3 所示。
图 3 LoRA 的架构
具体来看,假设预训练的矩阵为 W,它的更新可表示为:W' = W + BA,其中:A 为降维矩阵,B 为升维矩阵。
与使用 Adam 微调的 GPT-3 175B 相比,LoRA 可以将可训练参数的数量减少 10000 倍,并将 GPU 内存需求减少 3 倍。尽管 LoRA 的可训练参数较少,训练吞吐量较高,但与 RoBERTa、DeBERTa、GPT-2 和 GPT-3 等模型相比,LoRA 在模型质量性能方面与微调相当,甚至更好。
但随着研究的深入,LoRA 块存在两大核心问题:
为解决上述问题,研究者引入了一种全新的方法—DyLoRA(动态低秩适应)。
研究者参考 LoRA 的基本架构,针对每个 LoRA 块设计了上投影(Wup)和下投影(Wdw)矩阵及当前 LoRA 块的规模范围 R。为确保增加或减少秩不会明显阻碍模型的表现,在训练过程中通过对 LoRA 块对不同秩的信息内容进行排序,再结合预定义的随机分布中进行抽样,来对 LoRA 块镜像上投影矩阵和下投影矩阵截断,最终确认单个 LoRA 块的大小。DyLoRA 的架构如图 4 所示。
图 4 DyLoRA 的架构
研究结果表明,与 LoRA 相比,使用 DyLoRA 训练出的模型速度可提升 4~7 倍,且性能几乎没有下降。此外,与 LoRA 相比,该模型在更广泛的秩范围内展现出了卓越的性能。
正如 DyLoRA 优化方法一样,提出 AdaLoRA 的研究者也发现,当前 LoRA 存在的改进方向:
根据上述思想,研究者提出了 AdaLoRA 方法,可以根据权重矩阵的重要性得分,在权重矩阵之间自适应地分配参数规模。在实际操作中,AdaLoRA 采用奇异值分解(SVD)的方法来进行参数训练,根据重要性指标剪裁掉不重要的奇异值来提高计算效率,从而进一步提升模型在微调阶段的效果。
Tim Dettmers 等研究者在论文'QLoRA: Efficient Finetuning of Quantized LLMs'中提出了一种高效的模型微调方法——QLoRA。
QLoRA 的架构如图 5 所示。
图 5 QLoRA 的架构
QLoRA 的创新内容主要如下:
实验表明,QLoRA 技术使得研究者能够在单个 48GB GPU 上微调 650 亿个参数规模的模型,同时维持 16bit 精度任务的完整性能。例如,在训练 Guanaco 模型时,仅需在单个 GPU 上微调 24h,即可达到与 ChatGPT 相当的 99.3% 性能水平。通过 QLoRA 微调技术,可以有效降低模型微调时的显存消耗。
大型语言模型取得了迅猛发展,尽管在许多语言理解任务中表现强大,但由于巨大的计算负担,尤其是在需要将它们部署到边缘设备时,应用受到了限制。具体而言,预训练权重矩阵的每一列只伴随一个缩放和零参数对,但有很多 LoRA 参数。这种不平衡不仅导致了大量的量化误差(对 LLM 的准确性造成损害),而且使得将辅助权重整合到主模型中变得困难。
在论文'QA-LoRA: Quantization-aware Low-rank Adaptation of large language models'中,研究者提出了一种量化感知的低秩适应(QA-LoRA)算法。该方法来源于量化和适应的自由度不平衡的思想。
研究者提出采用分组运算符的方式,旨在增加量化自由度的同时减少适应自由度。
QA-LoRA 的实现简便,仅需几行代码,同时赋予原始的 LoRA 两倍的能力:
通过在 LLaMA 和 LLaMA2 模型系列的实验中证明,QA-LoRA 在不同的微调数据集和下游场景中验证了其有效性。
如图 6 所示,与之前的适应方法 LoRA 和 QLoRA 相比,QA-LoRA 在微调和推理阶段都具有更高的计算效率。更重要的是,由于不需要进行训练后量化,因此它不会导致准确性损失。在图 6 中展示了 INT4 的量化,但 QA-LoRA 可以推广到 INT3 和 INT2。
图 6 LoRA、QLoRA、QA-LoRA 的架构对比
通常情况下,用较长的上下文长度训练大型语言模型的计算成本较高,需要大量的训练时间和 GPU 资源。
为了在有限的计算成本下扩展预训练大型语言模型的上下文大小,研究者在论文'LongLoRA: Efficient Fine-tuning of Long-Context Large Language Models'中提出了 LongLoRA 的方法,整体架构如图 7 所示。
图 7 LongLoRA 的整体架构
LongLoRA 在两个方面进行了改进:
LongLoRA 在从 70 亿、130 亿到 700 亿个参数的 LLaMA2 模型的各种任务上都取得了良好的结果。具体而言,LongLoRA 采用 LLaMA2-7B 模型,将上下文长度从 4000 个 Token 扩展到 10 万个 Token,展现了其在增加上下文长度的同时保持了高效计算的能力。这为大型语言模型的进一步优化和应用提供了有益的思路。
LoRA 是一种常用的大型语言模型微调方法,它在微调大型语言模型时能够减少可训练参数的数量。然而,随着模型规模的进一步扩大或者需要部署大量适应于每个用户或任务的模型时,存储问题仍然是一个挑战。
研究者提出了一种基于向量的随机矩阵适应(Vector-based Random matrix Adaptation,VeRA)的方法,VeRA 的实现方法是通过使用一对低秩矩阵在所有层之间共享,并学习小的缩放向量来实现这一目标。
与 LoRA 相比,VeRA 成功将可训练参数的数量减少了 10 倍,同时保持了相同的性能水平。VeRA 与 LoRA 的架构对比如图 8 所示,LoRA 通过训练低秩矩阵和来更新权重矩阵,中间秩为 r。在 VeRA 中,这些矩阵被冻结,在所有层之间共享,并通过可训练向量和进行适应,从而显著减少可训练参数的数量。在这种情况下,低秩矩阵和向量可以合并到原始权重矩阵中,不引入额外的延迟。这种新颖的结构设计使得 VeRA 在减少存储开销的同时,还能够保持和 LoRA 相媲美的性能,为大型语言模型的优化和应用提供了更加灵活的解决方案。
图 8 VeRA 与 LoRA 的架构对比
实验证明,VeRA 在 GLUE 和 E2E 基准测试中展现了其有效性,并在使用 LLaMA2 7B 模型时仅使用 140 万个参数的指令就取得了一定的效果。这一方法为在大型语言模型微调中降低存储开销提供了一种新的思路,有望在实际应用中取得更为显著的效益。
LoRA 作为一种参数高效的大型语言模型微调方法,通常用于将基础模型适应到多种任务中,从而形成了大量派生自基础模型的 LoRA 模型。由于多个采用 LoRA 形式训练的模型的底座模型都为同一个,因此可以参考批处理模式进行推理。
据此,研究者提出了一种 S-LoRA(Serving thousands of concurrent LoRA adapters)方法,S-LoRA 是一种专为可伸缩地服务多个 LoRA 适配器而设计的方法。
S-LoRA 的设计理念是将所有适配器存储在主内存中,并在 GPU 内存中动态获取当前运行查询所需的适配器。为了高效使用 GPU 内存并减少碎片,S-LoRA 引入了统一分页。统一分页采用统一的内存池来管理具有不同秩的动态适配器权重以及具有不同序列长度的 KV 缓存张量。此外,S-LoRA 还采用了一种新颖的张量并行策略和高度优化的自定义 CUDA 核心,用于异构批处理 LoRA 计算。这些特性使得 S-LoRA 能够在单个 GPU 或跨多个 GPU 上提供数千个 LoRA 适配器,而开销相对较小。
通过实验发现,S-LoRA 的吞吐量提高了 4 倍多,并且提供的适配器数量增加了数个数量级。因此,S-LoRA 在实现对许多任务特定微调模型的可伸缩服务方面取得了显著进展,并为大规模定制微调服务提供了潜在的可能性。
本文从背景、来源、技术路线及性能等方面综述了 11 种在模型参数调优阶段进行的方法。开源社区 Hugging Face 将这 11 种方法归纳为高效参数调优方法(Parameter-Efficient Fine-Tuning,PEFT)。PEFT 方法能够在不微调所有模型参数的情况下,有效地让预训练语言模型适应各种下游应用。
引入特定参数类:
基于 LoRA 旁路适配类:
PEFT 方法只微调了少量额外的模型参数,从而大幅降低了大模型训练和微调的计算与存储成本。通过合理使用 PEFT 方法,不但能提高模型的训练效率,还能在特定任务上达到大型语言模型的效果。这些技术是解决大模型落地过程中资源受限问题的关键路径。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online