AIGC时代 | 揭秘大型语言模型微调:11种高效方法助力模型升级


导读:大型预训练模型是一种在大规模语料库上预先训练的深度学习模型,它们可以通过在大量无标注数据上进行训练来学习通用语言表示,并在各种下游任务中进行微调和迁移。随着模型参数规模的扩大,微调和推理阶段的资源消耗也在增加。针对这一挑战,可以通过优化模型结构和训练策略来降低资源消耗。

一般来说,研究者的优化方向从两个方面共同推进:

  • 一方面,针对训练参数过多导致资源消耗巨大的情况,可以考虑通过固定基础大型语言模型的参数,引入部分特定参数进行模型训练,大大减少了算力资源的消耗,也加速了模型的训练速度。比较常用的方法包括前缀调优、提示调优等。

  • 另一方面,还可以通过固定基础大型语言模型的架构,通过增加一个“新的旁路”来针对特定任务或特定数据进行微调,当前非常热门的LoRA就是通过增加一个旁路来提升模型在多任务中的表现。

接下来,我们将详细介绍11种高效的大型语言模型参数调优的方法。

文章目录

  • 1 前缀调优
  • 2 提示调优
  • 3 P-Tuning v2
  • 4 LoRA
  • 5 DyLoRA
  • 6 AdaLoRA
  • 7 QLoRA
  • 8 QA-LoRA
  • 9 LongLoRA
  • 10 VeRA
  • 11 S-LoRA
  • 12 总结
  • 13 直播预告


1 前缀调优

前缀调优(Prefix Tuning)是一种轻量级的微调替代方法,专门用于自然语言生成任务。前缀调优的灵感来自于语言模型提示,前缀就好像是“虚拟标记”一样,这种方法可在特定任务的上下文中引导模型生成文本。

前缀调优的独特之处在于它不改变语言模型的参数,而是通过冻结LM参数,仅优化一系列连续的任务特定向量(即前缀)来实现优化任务。前缀调优的架构如图1所示。

图片

图 1 前缀调优的架构 图1 前缀调优的架构 1前缀调优的架构

由于在训练中只需要为每个任务存储前缀,前缀调优的轻量级设计避免了存储和计算资源的浪费,同时保持了模型的性能,具有模块化和高效利用空间的特点,有望在NLP任务中提供高效的解决方案。

2 提示调优

提示调优(Prompt Tuning)方法是由Brian Lester在论文“The Power of Scale for Parameter-Efficient Prompt Tuning”中提出的。

提示调优采用“软提示”(Soft Prompt)的方式,通过冻结整个预训练模型,只允许每个下游任务在输入文本前面添加k个可调的标记(Token)来优化模型参数,赋予语言模型能够执行特定的下游任务的能力。提示调优的架构如图2所示。

在这里插入图片描述

图 2 提示调优的架构 图2 提示调优的架构 2提示调优的架构

在论文的实验对比中,对于T5-XXL模型,每个经过调整的模型副本需要110亿个参数,相较于为每个下游任务制作特定的预训练模型副本,提示调优需要的参数规模仅为20480个参数。该方法在少样本提示方面表现出色。

3 P-Tuning v2

尽管提示调优在相应任务上取得了一定的效果,但当底座模型规模较小,特别是小于1000亿个参数时,效果表现不佳。为了解决这个问题,清华大学的团队提出了针对深度提示调优的优化和适应性实现——P-Tuning v2方法。

该方法最显著的改进是对预训练模型的每一层应用连续提示,而不仅仅是输入层。这实际上是一种针对大型语言模型的软提示方法,主要是将大型语言模型的词嵌入层和每个Transformer网络层前都加上新的参数。深度提示调优增加了连续提示的功能,并缩小了在各种设置之间进行微调的差距,特别是对于小型模型和困难的任务。

实验表明,P-Tuning v2在30亿到100亿个参数的不同模型规模下,以及在提取性问题回答和命名实体识别等NLP任务上,都能与传统微调的性能相匹敌,且训练成本大大降低。

4 LoRA

微软公司在2021年提出了一种名为Low-Rank Adaptation(LoRA,低秩适配器)的方法。

LoRA的核心思想是通过冻结预训练模型的权重,并将可训练的秩分解矩阵注入Transformer架构的每一层,从而显著减少下游任务中可训练参数的数量。在训练过程中,只需要固定原始模型的参数,然后训练降维矩阵A和升维矩阵B。LoRA的架构如图3所示。

图片

图 3 L o R A 的架构 图3 LoRA的架构 3LoRA的架构

具体来看,假设预训练的矩阵为图片,它的更新可表示为图片,其中:图片

与使用Adam微调的GPT-3 175B相比,LoRA可以将可训练参数的数量减少10000倍,并将GPU内存需求减少3倍。尽管LoRA的可训练参数较少,训练吞吐量较高,但与RoBERTa、DeBERTa、GPT-2和GPT-3等模型相比,LoRA在模型质量性能方面与微调相当,甚至更好。

5 DyLoRA

但随着研究的深入,LoRA块存在两大核心问题:

  • 一旦训练完成后,LoRA块的大小便无法更改,若要调整LoRA块的秩,则需重新训练整个模型,这无疑增加了大量时间和计算成本;

  • LoRA块的大小是在训练前设计的固定超参,优化秩的过程需要精细的搜索与调优操作,仅设计单一的超参可能无法有效提升模型效果。

为解决上述问题,研究者引入了一种全新的方法—DyLoRA(动态低秩适应)。

研究者参考LoRA的基本架构,针对每个LoRA块设计了上投影(Wup)和下投影(Wdw)矩阵及当前LoRA块的规模范围R。为确保增加或减少秩不会明显阻碍模型的表现,在训练过程中通过对LoRA块对不同秩的信息内容进行排序,再结合预定义的随机分布中进行抽样,来对LoRA块镜像上投影矩阵和下投影矩阵截断,最终确认单个LoRA块的大小。DyLoRA的架构如图4所示。

图片

图 4 D y L o R A 的架构 图4 DyLoRA的架构 4DyLoRA的架构

研究结果表明,与LoRA相比,使用DyLoRA训练出的模型速度可提升4~7倍,且性能几乎没有下降。此外,与LoRA相比,该模型在更广泛的秩范围内展现出了卓越的性能。

6 AdaLoRA

正如DyLoRA优化方法一样,提出AdaLoRA的研究者也发现,当前LoRA存在的改进方向:

  • 由于权重矩阵在不同LoRA块和模型层中的重要性存在差异,因此不能提前制定一个统一规模的秩来约束相关权重信息,需要设计可以支持动态更新的参数矩阵;

  • 需要设计有效的方法来评估当前参数矩阵的重要性,并根据重要性程度,为重要性高的矩阵分配更多参数量,以提升模型效果,对重要性低的矩阵进行裁剪,进一步降低计算量。

根据上述思想,研究者提出了AdaLoRA方法,可以根据权重矩阵的重要性得分,在权重矩阵之间自适应地分配参数规模。在实际操作中,AdaLoRA采用奇异值分解(SVD)的方法来进行参数训练,根据重要性指标剪裁掉不重要的奇异值来提高计算效率,从而进一步提升模型在微调阶段的效果。

7 QLoRA

Tim Dettmers等研究者在论文“QLoRA: Efficient Finetuning of Quantized LLMs”中提出了一种高效的模型微调方法——QLoRA。

QLoRA的架构如图5所示。

图片

图 5 Q L o R A 的架构 图5 QLoRA的架构 5QLoRA的架构

QLoRA的创新内容主要如下:

  • 4bit NormalFloat(NF4)。NF4是一种新型数据类型,它对正态分布的权重来说是信息理论上的最优选择。

  • 双重量化技术。双重量化技术减少了平均内存的使用,它通过对已量化的常量进行再量化来实现。

  • 分页优化器。分页优化器有助于管理内存峰值,防止梯度检查点时出现内存不足的错误。

实验表明,QLoRA技术使得研究者能够在单个48GB GPU上微调650亿个参数规模的模型,同时维持16bit精度任务的完整性能。例如,在训练Guanaco模型时,仅需在单个GPU上微调24h,即可达到与ChatGPT相当的99.3%性能水平。通过QLoRA微调技术,可以有效降低模型微调时的显存消耗。

8 QA-LoRA

大型语言模型取得了迅猛发展,尽管在许多语言理解任务中表现强大,但由于巨大的计算负担,尤其是在需要将它们部署到边缘设备时,应用受到了限制。具体而言,预训练权重矩阵的每一列只伴随一个缩放和零参数对,但有很多LoRA参数。这种不平衡不仅导致了大量的量化误差(对LLM的准确性造成损害),而且使得将辅助权重整合到主模型中变得困难。

在论文“QA-LoRA: Quantization-aware Low-rank Adaptation of large language models”中,研究者提出了一种量化感知的低秩适应(QA-LoRA)算法。该方法来源于量化和适应的自由度不平衡的思想。

研究者提出采用分组运算符的方式,旨在增加量化自由度的同时减少适应自由度。

QA-LoRA的实现简便,仅需几行代码,同时赋予原始的LoRA两倍的能力:

  • 在微调过程中,LLM的权重被量化(如INT4),以降低时间和内存的使用;

  • 微调后,LLM和辅助权重能够自然地集成到一个量化模型中,而不损失准确性。

通过在LLaMA和LLaMA2模型系列的实验中证明,QA-LoRA在不同的微调数据集和下游场景中验证了其有效性。

如图6所示,与之前的适应方法LoRA和QLoRA相比,QA-LoRA在微调和推理阶段都具有更高的计算效率。更重要的是,由于不需要进行训练后量化,因此它不会导致准确性损失。在图6中展示了INT4的量化,但QA-LoRA可以推广到INT3和INT2。

图片

图 6 L o R A 、 Q L o R A 、 Q A − L o R A 的架构对比 图6 LoRA、QLoRA、QA-LoRA的架构对比 6LoRAQLoRAQALoRA的架构对比

9 LongLoRA

通常情况下,用较长的上下文长度训练大型语言模型的计算成本较高,需要大量的训练时间和GPU资源。

为了在有限的计算成本下扩展预训练大型语言模型的上下文大小,研究者在论文“LongLoRA: Efficient Fine-tuning of Long-Context Large Language Models”中提出了LongLoRA的方法,整体架构如图7所示。

图片

图 7 L o n g L o R A 的整体架构 图7 LongLoRA的整体架构 7LongLoRA的整体架构

LongLoRA在两个方面进行了改进:

  • 虽然在推理过程中需要密集的全局注意力,但通过采用稀疏的局部注意力,可以有效地进行模型微调。在LongLoRA中,引入的转移短暂的注意力机制能够有效地实现上下文扩展,从而在性能上与使用香草注意力(Vanilla Attention)进行微调的效果相似;

  • 通过重新审视上下文扩展的参数高效微调机制,研究者发现在可训练嵌入和规范化的前提下,用于上下文扩展的LoRA表现良好。

LongLoRA在从70亿、130亿到700亿个参数的LLaMA2模型的各种任务上都取得了良好的结果。具体而言,LongLoRA采用LLaMA2-7B模型,将上下文长度从4000个Token扩展到10万个Token,展现了其在增加上下文长度的同时保持了高效计算的能力。这为大型语言模型的进一步优化和应用提供了有益的思路。

10 VeRA

LoRA是一种常用的大型语言模型微调方法,它在微调大型语言模型时能够减少可训练参数的数量。然而,随着模型规模的进一步扩大或者需要部署大量适应于每个用户或任务的模型时,存储问题仍然是一个挑战。

研究者提出了一种基于向量的随机矩阵适应(Vector-based Random matrix Adaptation,VeRA)的方法,VeRA的实现方法是通过使用一对低秩矩阵在所有层之间共享,并学习小的缩放向量来实现这一目标。

与LoRA相比,VeRA成功将可训练参数的数量减少了10倍,同时保持了相同的性能水平。VeRA与LoRA的架构对比如图8所示,LoRA通过训练低秩矩阵和来更新权重矩阵,中间秩为。在VeRA中,这些矩阵被冻结,在所有层之间共享,并通过可训练向量和进行适应,从而显著减少可训练参数的数量。在这种情况下,低秩矩阵和向量可以合并到原始权重矩阵中,不引入额外的延迟。这种新颖的结构设计使得VeRA在减少存储开销的同时,还能够保持和LoRA相媲美的性能,为大型语言模型的优化和应用提供了更加灵活的解决方案。

图片

图 8 V e R A 与 L o R A 的架构对比 图8 VeRA与LoRA的架构对比 8VeRALoRA的架构对比

实验证明,VeRA在GLUE和E2E基准测试中展现了其有效性,并在使用LLaMA2 7B模型时仅使用140万个参数的指令就取得了一定的效果。这一方法为在大型语言模型微调中降低存储开销提供了一种新的思路,有望在实际应用中取得更为显著的效益。

11 S-LoRA

LoRA作为一种参数高效的大型语言模型微调方法,通常用于将基础模型适应到多种任务中,从而形成了大量派生自基础模型的LoRA模型。由于多个采用LoRA形式训练的模型的底座模型都为同一个,因此可以参考批处理模式进行推理。

据此,研究者提出了一种S-LoRA(Serving thousands of con current 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在实现对许多任务特定微调模型的可伸缩服务方面取得了显著进展,并为大规模定制微调服务提供了潜在的可能性。

12 总结

本文从背景、来源、技术路线及性能等方面综述了11种在模型参数调优阶段进行的方法,其中前缀调优、提示调优和P-Tuning v2属于引入特定参数来减少算力消耗、提升训练速度;基于LoRA的各种方法的基本思想是添加新的旁路,对特定任务或特定数据进行微调。

开源社区Hugging Face将这11种方法归纳为高效参数调优方法(Parameter-Efficient Fine-Tuning,PEFT)。PEFT方法能够在不微调所有模型参数的情况下,有效地让预训练语言模型适应各种下游应用。PEFT方法只微调了少量额外的模型参数,从而大幅降低了大模型训练和微调的计算与存储成本。通过合理使用PEFT方法,不但能提高模型的训练效率,还能在特定任务上达到大型语言模型的效果。有关基于PEFT的微调实战案例,推荐您阅读刘聪、沈盛宇、李特丽和杜振东的新书《大型语言模型实战指南:应用实践与场景落地》。

文章来源:IT阅读排行榜


本文摘编自《大型语言模型实战指南:应用实践与场景落地》,刘聪 沈盛宇 李特丽 杜振东 著,机械工业出版社出版,经出版方授权发布,转载请标明文章来源。

▼ ▼

延伸阅读 延伸阅读 延伸阅读

图片

《大型语言模型实战指南:应用实践与场景落地》 《大型语言模型实战指南:应用实践与场景落地》 《大型语言模型实战指南:应用实践与场景落地》

刘聪沈盛宇李特丽杜振东著 刘聪 沈盛宇 李特丽 杜振东 著 刘聪沈盛宇李特丽杜振东著

资深大模型技术专家撰写 资深大模型技术专家撰写 资深大模型技术专家撰写

零一万物、通义千问、面壁智能等 零一万物、通义千问、面壁智能等 零一万物、通义千问、面壁智能等

多个主流大模型的负责人力荐 多个主流大模型的负责人力荐 多个主流大模型的负责人力荐

获取方式:https://item.jd.com/14255849.html

内容简介:

这是一本系统梳理并深入解析大模型的基础理论、算法实现、数据构造流程、模型微调方法、偏好对齐方法的著作,也是一本能手把手教你构建角色扮演、信息抽取、知识问答、AI Agent等各种强大的应用程序的著作。本书得到了零一万物、面壁智能、通义千问、百姓AI、澜舟科技等国内主流大模型团队的负责人的高度评价和鼎力推荐。

13 直播预告

10月18日周五晚19:30 南京云问科技首席算法架构师刘聪、资深算法工程师沈盛宇、资深NLP技术专家和AI技术专家汪鹏、某头部大厂算法工程师谷清水四位嘉宾与您分享“如何让大模型应用真正落地:场景+解决方案+案例”

点击预约观看!直播间好礼不停

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/448564.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【H2O2|全栈】JS入门知识(二)

目录 JS 前言 准备工作 运算符 算数运算符 比较运算符 自增、自减运算符 逻辑运算符 运算符的优先级 分支语句 if-else语句 switch语句 三元表达式 结束语 JS 前言 本系列博客主要分享JavaScript的基础语法知识,本期为第二期,包含一些简…

c++应用网络编程之十一Linux下的epoll模式基础

一、epoll模式 在前面分析了select和poll两种IO多路复用的模式,但总体给人的感觉有一种力不从心的感觉。尤其是刚刚接触底层网络开发的程序员,被很多双十一千万并发,游戏百万并发等等已经给唬的一楞一楞的。一听说只支持一两千个并发&#x…

阿里Dataworks使用循环节点和赋值节点完成对mongodb分表数据同步

背景 需求将MongoDB数据入仓MaxCompute 环境说明 MongoDB 100个Collections:orders_1、orders_2、…、orders_100 前期准备 1、MongoDB数据源配置 需要先保证DW和MongoDB网络是能够联通的,需要现在集成任务中配置MongoDB的数据源信息。 具体可以查…

Python OpenCV精讲系列 - 三维重建深入理解(十七)

💖💖⚡️⚡️专栏:Python OpenCV精讲⚡️⚡️💖💖 本专栏聚焦于Python结合OpenCV库进行计算机视觉开发的专业教程。通过系统化的课程设计,从基础概念入手,逐步深入到图像处理、特征检测、物体识…

AD9361 在低至 1MHz 的频率下运行

AD9361 在低至 1MHz 的频率下运行 AD -FREQCVT1-EBZ是包含AD9361的FMCOMMS3/4/5板的附加板。虽然完整的芯片级设计包可在此 RF 收发器的ADI产品页面上找到,但有关此卡的信息及其使用方法、围绕它的设计包以及可使其工作的软件可在此处找到。 AD-FREQCVT1-EBZ 模块…

无人机之放电速率篇

无人机的放电速率是指电池在一定时间内放出其储存电能的能力,这一参数对无人机的飞行时间、性能以及安全性都有重要影响。 一、放电速率的表示方法 放电速率通常用C数来表示。C数越大,表示放电速率越快。例如,一个2C的电池可以在1/2小时内放…

储能电源自动化测试系统中不同硬件电路设计对测试结果有哪些影响?-纳米软件

随着能源领域的不断发展,储能电源在各个领域的应用越来越广泛。为了确保储能电源的性能和可靠性,自动化测试系统的重要性日益凸显。其中,硬件电路设计是自动化测试系统的关键组成部分,不同的硬件电路设计会对测试结果产生不同的影…

程序报错:ModuleNotFoundError: No module named ‘code.utils‘; ‘code‘ is not a package

程序报错内容&#xff1a; Traceback (most recent call last): File "code/nli_inference/veracity_prediction.py", line 10, in <module> from code.utils.data_loader import read_json ModuleNotFoundError: No module named code.utils; code is …

Linux运维_Apache更改默认网站目录

1.首先创建目录 并且在目录下新建测试文件 index.html mkdir -p /home/test/ap_web 直接wget 百度官网 wget www.baidu.com 2.编辑配置文件 /etc/apache2/sites-available/000-default.conf(找到 DocumentRoot)更改为刚刚创建的目录 接着在添加 最终文件: 3.给文件 添加属…

面试题:Redis(五)

1. 面试题 面试问 记录对集合中的数据进行统计 在移动应用中&#xff0c;需要统计每天的新增用户数和第2天的留存用户数&#xff1b; 在电商网站的商品评论中&#xff0c;需要统计评论列表中的最新评论&#xff1b; 在签到打卡中&#xff0c;需要统计一个月内连续打卡的用户数&…

【AI大模型】羊驼大模型详解_零基础入门到精通,看完这篇就足够了~

LLaMa系列模型 羊驼模型&#xff08;鼻祖是LLaMa模型&#xff0c;Facebook公司开源模型&#xff09;&#xff1a;即将成为大模型的安卓&#xff0c;国内95%的大模型都是羊驼套壳。GPT系列&#xff08;OpenAI公司&#xff09;&#xff1a;相当于大模型的iOS&#xff08;不开源&…

鸿蒙OS启动流程

启动流程(基于openharmony4.1) 系统上电加载内核后&#xff0c;按照以下流程完成系统各个服务和应用的启动&#xff1a; 内核加载init进程&#xff0c;一般在bootloader启动内核时通过设置内核的cmdline来指定init的位置。init进程启动后&#xff0c;会挂载tmpfs&#xff0c;…

JavaSE——泛型

目录 一、泛型的引入 二、泛型的好处 三、泛型介绍 四、泛型的语法 (一)泛型的声明 (二)泛型的实例化 五、泛型使用的注意事项和细节 六、泛型练习题1 七、自定义泛型 (一)自定义泛型类 (二)自定义泛型接口 (三)自定义泛型方法 八、泛型练习题2 九、泛型的继承和…

moe2024新生赛--pwn篇

moe2024新生赛–pwn篇 也算是复健吧。。 文章目录 moe2024新生赛--pwn篇**1 二进制漏洞审计入门指北**2 NotEnoughTime3 no_more_gets4 leak_sth5 ez_shellcode6 这是什么&#xff1f;libc7 这是什么&#xff1f;shellcode8 这是什么&#xff1f;random9 flag_helper10 这是什么…

PCB缺陷检测数据集 xml 可转yolo格式 ,共10688张图片

PCB缺陷检测数据集&#xff08;yolov5,v7,v8&#xff09; 数据集总共有两个文件夹&#xff0c;一个是pcb整体标注&#xff0c;一个是pcb部分截图。 整体标注有6个分类&#xff0c;开路&#xff0c;短路等都已经标注&#xff0c;标注格式为xml&#xff0c;每个文件夹下有100多张…

bp intruder 四种攻击类型 记录

1. Sniper 攻击&#xff08;狙击手模式&#xff09; 特点&#xff1a; Sniper 攻击是最基础的一种攻击类型&#xff0c;适用于单参数的简单测试。它会逐一替换每一个 payload 插入点&#xff0c;其他位置保持不变&#xff0c;从而测试单个参数对应用的影响。 工作流程&#…

Java-IO流使用场景

Java IO 流是Java编程中非常重要的组成部分,用于处理文件读写、网络通信等数据传输任务。 1. 字节流 1.1 读取文件 import java.io.FileInputStream; import java.io.IOException;public class ReadFileExample {public static void main(String[] args) {try (FileInputSt…

不用搭建服务?MemFire Cloud让开发更简单

不用搭建服务&#xff1f;MemFire Cloud让开发更简单 在当今的开发世界里&#xff0c;想要开发一个功能齐全的应用&#xff0c;往往意味着需要搭建复杂的后端、开发API接口、处理认证授权、管理数据库……这些琐碎的工作让很多开发者头疼不已&#xff0c;尤其是独立开发者或者…

成都睿明智科技有限公司电商服务可靠不?

在这个短视频风起云涌的时代&#xff0c;抖音不仅成为了人们娱乐消遣的首选平台&#xff0c;更是众多商家竞相追逐的电商新蓝海。成都睿明智科技有限公司&#xff0c;作为抖音电商服务领域的佼佼者&#xff0c;正以其独到的洞察力和专业的服务&#xff0c;助力无数品牌在这片沃…

【进阶OpenCV】 (16)-- 人脸识别 -- FisherFaces算法

文章目录 FisherFaces算法一、算法原理二、算法优势与局限三、算法实现1. 图像预处理2. 创建FisherFace人脸特征识别器3. 训练模型4. 测试图像 总结 FisherFaces算法 PCA方法是EigenFaces人脸识别的核心&#xff0c;但是其具有明显的缺点&#xff0c;在操作过程中会损失许多人…