大模型微调技术之 LoRA:开启高效微调新时代

news2024/12/24 8:10:58

一、LoRA 简介

LoRA,即低秩适应(Low-Rank Adaptation),是一种用于微调大型语言模型的技术,旨在以较小的计算资源和数据量实现模型的快速适应特定任务或领域。

LoRA 方法通过引入低秩近似的思想,对大型预训练语言模型的部分权重进行高效且轻量级的调整。在大型语言模型中,权重矩阵通常是高维且密集的,包含大量参数。LoRA 引入低秩矩阵,这些矩阵更小、更简单,但仍然能够捕获新任务所需的基本变化。例如,假设模型有一个 100 行 100 列的矩阵,需要存储 10000 个数字,而 LoRA 将矩阵分解成一个 1000x2 矩阵和一个 2x100 矩阵,只有 400 个数字需要存储,大大减少了参数量。

LoRA 主要对 Stable Diffusion 模型中最关键的交叉注意力层进行小的修改。研究人员发现,微调这部分模型就足以实现良好的训练。通过在交叉注意力层的权重矩阵中引入低秩矩阵,LoRA 可以在不显著影响模型性能的前提下,降低模型的存储需求和计算成本。

LoRA 的优势在于其高效性和灵活性。通过使用更少的参数,LoRA 显著降低了模型训练过程中的计算复杂性和显存使用量,使得在消费级 GPU 上训练大模型成为可能。同时,LoRA 可以提升模型的泛化性,防止在训练数据有限场景下的过拟合现象。此外,LoRA 可以无缝地集成到现有的神经网络架构中,以最小的额外训练成本对预训练模型进行微调和调整,非常适合迁移学习应用。

二、工作原理与关键技术要点

(一)低秩矩阵注入

在大型语言模型中,通常会在 Transformer 的注意力层等特定层引入一对低秩矩阵。以一个大型语言模型为例,假设其权重矩阵原本具有极高的维度,比如一个   的矩阵,直接微调整个模型所需的参数量巨大。而 LoRA 引入的低秩矩阵,矩阵   为  ,矩阵   为  ,其中秩   远小于基本矩阵维度   和  。这样一来,构建的参数量就大大减少了。比如,当原权重   的参数量为  时,若选择 LoRA 的秩   为 4,那么   和   的参数量均为  ,二者之和为  ,仅需训练   的参数就可以更新参数矩阵。

(二)微调过程

在微调阶段,LoRA 只训练低秩矩阵的参数,原模型的其他部分权重保持不变。通过在特定任务的数据集上对这些少量额外参数进行训练,可以引导模型有针对性地学习任务相关的语言模式和知识。比如在绘画应用 stable diffusion 中,LoRA 以插件的形式嵌入模型中,使得用户可以下载相对于原模型(GB 量级)更小的 LoRA 模型(MB 量级),从而达到调整生成图像风格的效果。在语言大模型 ChatGPT - 3 中,LoRA 可以优化它在特定领域的表现,如代码调试、法律咨询等领域。

(三)内存效率与计算效率

由于只需要训练一小部分参数,LoRA 在微调过程中显著降低了内存需求和计算成本。以 GPT - 3 175B 模型为例,原先需要 1.2TB 的显存才可以训练,使用 LoRA 后只需要 350GB 即可。当   设置为 4,且只调整 query 和 value 矩阵时,需要的显存进一步从 350GB 降至 35MB。在推理阶段,这些低秩矩阵可以在运行时动态地与原模型权重相加或相乘,无需改变模型结构或重新存储整个模型,进一步节省了资源。

三、应用与扩展

(一)NLP 任务应用

在自然语言处理任务中,LoRA 表现出了强大的适应性和高效性。例如,在文本分类任务中,使用 LoRA 微调的模型能够快速适应不同的分类需求,同时在减少大量参数的情况下,性能仅下降了极小的幅度。研究表明,在某些大规模文本分类数据集上,LoRA 微调后的模型在减少 90% 参数的情况下,性能仅下降了不到 1%。

在问答任务中,LoRA 可以通过微调预训练模型,使其更好地理解特定领域的问题,并给出更准确的答案。比如在医疗领域的问答系统中,通过对预训练语言模型进行 LoRA 微调,可以让模型更好地理解医学术语和病症描述,从而提高回答的准确性和专业性。

此外,LoRA 还可以与其他 NLP 技术结合,进一步提升模型性能。例如,与知识图谱结合,利用知识图谱中的实体和关系信息,引导 LoRA 微调过程,使模型在回答问题时能够更好地利用外部知识。

(二)插件式微调策略

LoRA 的插件式微调策略为用户提供了极大的便利。用户可以根据不同的任务需求,选择合适的预训练模型,并通过 LoRA 快速进行定制化调整。

这种插件式的设计使得模型的定制化过程更加灵活和高效。例如,当用户需要针对特定的文学作品进行分析时,可以选择一个通用的语言模型,然后使用 LoRA 对其进行微调,使其更好地理解该作品的风格和主题。

同时,LoRA 的插件式策略也使得模型的更新和维护更加容易。当新的任务出现或者数据发生变化时,用户可以只对 LoRA 部分进行调整,而无需重新训练整个模型。

总之,LoRA 的插件式微调策略为大型语言模型的应用提供了一种高效、灵活的解决方案,使得更多的用户能够在有限的资源下利用大型语言模型的强大能力。

四、微调实践

(一)环境配置

StarCoder 的微调实践需要特定的环境配置。例如,采用 A800 显卡,搭配 python3.8、torch2.0 和 CUDA11.6。在 python 环境中,transforemrs 和 peft 这两个包建议使用 "Development Mode" 安装。环境中主要包的版本也有明确要求,如 tqdm==4.65.0、transformers=4.31.0.dev0、peft=0.4.0.dev0、datasets==2.11.0、huggingface-hub==0.13.4、accelerate==0.18.0。这样的环境配置为后续的模型加载和微调提供了稳定的基础。

(二)模型加载

模型加载过程整合了 alpaca-lora 项目和 StarCoder 的 finetune 项目。首先,使用 AutoModelForCausalLM.from_pretrained 加载预训练模型,设置参数如 use_auth_token=True、use_cache=True、load_in_8bit=True 等,并通过 device_map 指定显卡索引。接着,使用 prepare_model_for_int8_training 对模型进行处理,然后设置 LoraConfig,指定参数如 r=16、lora_alpha=32、lora_dropout=0.05 等,并通过 get_peft_model 将原模型作为 base 模型,在各个 self-attention 层加入 LoRA 层,同时改写模型 forward 的计算方式。在模型加载时,load_in_8bit=True 的 8bit 量化优化了静态显存,是 bitsandbytes 库赋予的能力,会把加载模型转化成混合 8bit 的量化模型。模型量化本质是对浮点参数进行压缩的同时,降低压缩带来的误差,将原始 fp32(4 字节)压缩到 int8(1 字节),也就是实现了 1/4 的显存占用。

(三)参数选取

  1. Rank 的选取:作者对比了 1 - 64 的取值,在一般效果上,Rank 在 4 - 8 之间最好,再高并没有效果提升。不过论文的实验是面向下游单一监督任务的,因此在指令微调上,根据指令分布的广度,Rank 选择还是需要在 8 以上的取值进行测试。
  2. alpha 参数选取:alpha 其实是个缩放参数,训练后权重 merge 时的比例为 alpha/r。
  3. 初始化:矩阵 A 是 Uniform 初始化,B 是零初始化,这样最初的 lora 权重为 0,所以 lora 参数是从头学起,并没有那么容易收敛。对于哪些参数进行微调,基于 Transformer 结构,LoRA 只对每层的 Self-Attention 的部分进行微调,有四个映射层参数可以进行微调。像 StarCoder 模型 Multi - query 结构的 attention 层对应的参数名称是 attn.c_attn、attn.c_proj。

五、在大模型微调中的作用

(一)高效微调

大语言模型通常拥有海量的参数,全参数微调不仅计算成本高昂,而且耗时漫长。LoRA 以其独特的低秩矩阵注入方式,为大语言模型的微调带来了高效的解决方案。

以 GPT-3 175B 模型为例,全参数微调需要 1.2TB 的显存,而使用 LoRA 后,显存需求大幅降低。例如,当   设置为 4,且只调整 query 和 value 矩阵时,显存需求可从 1.2TB 降至 35MB,这为资源受限的环境提供了可行性。

在微调过程中,LoRA 只训练低秩矩阵的参数,原模型的其他部分权重保持不变。这种方式使得训练过程更加高效,能够在较短的时间内达到较好的效果。同时,由于参数量的大幅减少,训练过程中的计算复杂性也大大降低,避免了过拟合的风险,保持了模型的稳定性和可靠性。

(二)应用场景广泛

1. 智能客服领域

在智能客服领域,LoRA 微调后的大语言模型能够更加准确地理解客户的问题,并给出更加恰当的回答。一家企业使用经过 LoRA 微调的大语言模型来回答客户的问题,通过对大量客户咨询数据的学习和微调,模型能够快速适应不同类型的问题和客户需求。据统计,使用 LoRA 微调后的模型,客户满意度提高了 [X]%,同时大大降低了人工客服的成本。

2. 文本生成领域

对于文本生成任务,LoRA 微调也发挥了重要作用。一位作家利用经过 LoRA 微调的语言模型来辅助创作。这个模型可以根据作家提供的主题和关键词,生成富有创意和感染力的文本内容。作家可以在此基础上进行进一步的修改和完善,从而提高创作效率和质量。例如,在某些文学创作项目中,使用 LoRA 微调后的模型,创作效率提高了 [X]%。

3. 机器翻译领域

在机器翻译领域,LoRA 微调同样有着出色的表现。一个翻译团队使用经过 LoRA 微调的大语言模型来进行多语种翻译。通过对特定领域的翻译数据进行微调,这个模型能够更加准确地翻译专业术语和特定语境下的语句,提高了翻译的准确性和流畅性。实验表明,在特定领域的翻译任务中,LoRA 微调后的模型翻译准确率提高了 [X]%。

六、技术优势

(一)低秩矩阵近似高效

大语言模型往往拥有庞大的参数数量,这使得全参数微调面临着巨大的计算资源压力和时间成本。LoRA 巧妙地运用低秩矩阵近似的方法,对高维参数矩阵进行分解。例如,在一个拥有数十亿参数的大语言模型中,全参数微调可能需要数 TB 的显存空间以及漫长的训练时间。而 LoRA 可以将参数矩阵分解为低秩矩阵,假设原模型参数矩阵为  ,LoRA 可能将其分解为   和   的两个低秩矩阵,极大地减少了参数量。实验数据表明,这种低秩矩阵近似的方法可以将训练显存开销降低至全参数微调的约 1/3。在实际应用中,对于资源有限的环境,如消费级 GPU,LoRA 使得大模型的微调成为可能,大大提高了模型训练的效率和可行性。

(二)灵活插件式应用

LoRA 的插件式应用为不同任务的微调提供了极大的灵活性。在不同的应用场景中,可以针对特定任务训练出独立的 LoRA 参数,然后与预训练参数快速结合。以 Stable Diffusion(SD)与 LoRA 的结合为例,在图像生成领域,用户可以根据不同的风格需求下载相对较小的 LoRA 模型(通常为几十到几百 MB),与原有的 SD 模型(可能为几个 GB)结合使用。比如,当用户想要生成特定风格的图像时,只需要加载对应的 LoRA 模型,即可轻松实现风格的调整。这种插件式的设计方便快捷,使得用户可以在不改变原模型结构的情况下,快速适应不同的任务需求。同时,插件式应用也使得模型的更新和扩展更加容易,当新的任务或风格出现时,只需训练新的 LoRA 参数,而无需重新训练整个模型。

(三)不改变原模型

LoRA 微调的一个重要优势是不改变原有的预训练参数。在微调过程中,新的 LoRA 参数与原参数配合使用,不会增加推理时间。这意味着在实际应用中,可以在不影响模型性能的前提下,实现高效的任务微调。例如,在智能客服系统中,使用 LoRA 微调后的大语言模型可以在不改变原有的响应时间的情况下,更加准确地回答客户的问题。对于一些对实时性要求较高的应用场景,这一优势尤为重要。同时,不改变原模型也使得模型的稳定性得到了保障,避免了因大规模参数调整而可能导致的模型性能不稳定问题。在不同的任务中,LoRA 可以根据具体需求进行灵活的微调,而不会对原模型的整体性能产生负面影响。

结语

LoRA作为大模型微调技术中的一项创新成果,在多个方面展现出了卓越的性能和巨大的潜力。 从技术角度来看,其低秩矩阵注入的工作原理,为大模型微调在内存效率和计算效率方面提供了一种高效的解决方案。这种在特定层引入少量参数进行训练的方式,在不破坏原模型结构的基础上,实现了模型对特定任务的快速适应,这是传统微调方法难以企及的。 在应用层面,无论是自然语言处理领域的各种任务,还是扩展到其他如与图像生成模型结合的跨领域应用,LoRA都发挥着不可忽视的作用。它的插件式微调策略,使得不同领域、不同需求的用户能够方便地定制大型语言模型,满足多样化的实际需求。 随着人工智能技术的不断发展,大模型在各个行业的应用将越来越广泛。LoRA技术凭借其独特的优势,有望在未来的研究和实际应用中继续发挥重要的作用,进一步推动大模型在各个特定领域的优化和应用拓展,为实现更加精准、高效的人工智能服务奠定坚实的基础。同时,研究人员也将继续探索LoRA技术的更多可能性,例如如何进一步优化低秩矩阵的选择和训练,以及如何更好地与其他新兴技术相结合等,以适应不断变化的人工智能发展需求。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NFS共享文件系统(将文件目录挂载到别的机器上)

我们创建的磁盘是否都必须挂载到本机上?并不是。在 Linux 和其他操作系统中,有一种叫做 NFS(网络文件系统)的工具,它允许跨网络共享文件系统资源。通过使用 NFS,我们可以将多个客户端服务器的数据目录挂载到…

Java中常见的等待唤醒机制及实践

JDK自带的等待唤醒机制 在Java中,有一个JDK维度的等待唤醒机制。Object类的wait和notify,notifyAll 需要在synchronized同步代码块内并且对象必须获取到锁才能调用。否则会抛IllegalMonitorStateException异常。 当线程在尝试获取锁时失败,会被封装成节…

Mybatis-plus做了什么

Mybatis-plus做了什么 Mybatis回顾以前的方案Mybatis-plus 合集总览:Mybatis框架梳理 聊一下mybatis-plus。你是否有过疑问,Mybatis-plus中BaseMapper方法对应的SQL在哪里?它为啥会被越来越多人接受。在Mybatis已经足够灵活的情况下&…

《强烈推荐一个强大的书签管理工具》

在信息爆炸的时代,我们每天都会浏览大量的网页,收藏各种各样的书签。然而,随着书签数量的增加,管理起来也变得越来越困难。这时,一个强大的书签管理工具就显得尤为重要。今天,我要向大家推荐一款备受好评的…

EtherCAT学习笔记

文章目录 前言一、EtherCAT介绍二、EtherCA系统组成2.1 ESC(EtherCAT从站控制器)2.2 从站控制微处理器2.3 物理层器件2.4 其它应用层器件 三、EtherCAT数据帧结构3.1 寻址方式3.2 时钟3.3 通信模式 四、状态机和通信初始化五、应用层协议六、ESC概述6.1 EtherCAT从站控制芯片6.…

基于SpringBoot+Vue+MySQL的美食信息推荐系统

系统展示 用户前台界面 管理员后台界面 系统背景 在数字化时代,随着人们对美食文化的热爱与追求不断增长,美食信息推荐系统成为了连接食客与美食之间的重要桥梁。面对海量的美食信息,用户往往难以快速找到符合个人口味和需求的美食。因此&…

Java-数据结构-Lambda表达式 (✪ω✪)

文本目录: ❄️一、背景: ➷ 1、Lambda表达式的语法: ➷ 2、函数式接口: ❄️二、Lambda表达式的基本使用: ➷ 1、语法精简: ❄️三、变量捕获: ❄️四、Lambda在集合中的使用: …

Chromium 中js navigator对象c++实现分析

一、Navigator 对象 Navigator 对象包含有关浏览器的信息。 前端测试例子&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>接口测试</title> </head> <body><div id"example&q…

爱心表达公式

脚本公式 local r (math.sin(angle) * math.sqrt(math.abs(math.cos(angle)))) / (math.sin(angle) 1.4) - 2 * math.sin(angle) 2

IOT-Tree连接西门子PLC S7 200 Smart竟然如此简单

最近一个项目需要把用户现场控制柜接入到云端&#xff0c;控制柜使用西门子PLC Smart 200 SR40型号&#xff0c;已经运行多年&#xff0c;PLC通过以太网接口对接一个触摸屏。 按照我以往的经验&#xff0c;觉得触摸屏以太网接口已经被占用&#xff0c;那么只能通过剩余的RS485…

通过一个实际的例子,介绍 Java 的自动装箱与拆箱机制

Java 中 1000 1000 返回 false&#xff0c;但 100 100 返回 true&#xff0c;这一现象背后隐藏了 Java 对于对象和基本类型的内存管理机制。为了理解这个现象&#xff0c;我们需要从 Java 的自动装箱与拆箱机制、对象引用和数值缓存策略等角度深入探讨。让我们一步一步通过 J…

电脑怎么卸载软件?学会这6个卸载软件技巧就够了(精选)

电脑怎么卸载软件&#xff1f;在日常的办公生活中&#xff0c;我们需要下载一些工具来辅助工作&#xff0c;当不需要这些工具的时候&#xff0c;我们就需要卸载这些软件了。很多小伙伴表示卸载软件卸载不干净&#xff0c;还是回残留一些文件&#xff0c;或者是卸载不了&#xf…

Verilog开源项目——百兆以太网交换机(九)表项管理模块设计

Verilog开源项目——百兆以太网交换机&#xff08;九&#xff09;表项管理模块设计 &#x1f508;声明&#xff1a;未经作者允许&#xff0c;禁止转载 &#x1f603;博主主页&#xff1a;王_嘻嘻的CSDN主页 &#x1f511;全新原创以太网交换机项目&#xff0c;Blog内容将聚焦整…

新型僵尸网络针对 100 个国家发起 30 万次 DDoS 攻击

近日&#xff0c;网络安全研究人员发现了一个名为 Gorilla&#xff08;又名 GorillaBot&#xff09;的新僵尸网络恶意软件家族&#xff0c;它是已泄露的 Mirai 僵尸网络源代码的变种。 网络安全公司 NSFOCUS 在上个月发现了这一活动&#xff0c;并称该僵尸网络在今年 9 月 4 日…

【Java 循环控制实例详解【While do... while】】

Java 循环控制详解【While & do… while】 在 Java 中&#xff0c;循环控制是程序设计中非常重要的部分&#xff0c;主要包括 while 循环和 do...while 循环。本文将详细介绍这两种循环的基本语法、执行流程及相关示例。 1. while 循环控制 基本语法 循环变量初始化; wh…

在uniapp中实现长按聊天对话框可以弹出对话框然后可以删除该条对话,单击可以进入该条对话框的对话页面

效果展示 效果描述 长按【大于1s】某一条对话框会弹出一个对话框&#xff0c;点击确定按钮就可以将当前对话框从列表中进行删除&#xff0c;如果点击取消则不做额外操作。 如果只是点击了一下&#xff0c;时间【小于1s】的情况下会直接引入到与该用户的对话框详情页面。 代码…

ai绘画变现方式全解析,教你如何通过AI绘画赚钱

*AI绘画变现方式全解析&#xff0c;教你如何通过AI绘画赚钱* *为什么选择AI绘画&#xff1f;* 你是否曾经梦想过成为一名画家&#xff0c;但现实却让你无从下手? 或者你已经是一位艺术家&#xff0c;但苦于作品没能带来足够的收入&#xff1f;随着AI技术的飞速发展&#xff…

IDEA没有代码自动提示问题的解决

一、问题描述 如图&#xff0c;博主输入new Hash 没有提示出HashMap之类的api 原因在于&#xff1a;不小心打开了idea的省电模式&#xff0c;在这个模式下&#xff0c;idea是不会为我们提供自动提示的 二、问题解决 在File中找到 Power Save Mode选项&#xff0c;将它关闭即…

【西电电路实验】1. 仪器的使用(电子线路 III 电院)

文章目录 前言一、实验原理二、实验过程1. [高频信号源DSG3030 数据手册](https://www.rigol.com/Images/DSG3000_DataSheet_CN_tcm4-3558.pdf)2. [信号源 SDS 2320X 数据手册](https://www.siglent.com/u_file/download/24_05_29/SDS2000X%20HD_Datasheet_CN02A.pdf#:~:textSD…

MySQL多表查询:标量子查询

先看我的emp表结构 emp表 子查询基本语法 select * from t1 where column1 (select column1 from t2);例子1&#xff1a;查询"销售部" 的所有员工信息 这个可以先拆解为两个 a.查询"销售部"的部门ID select id from dept where name 销售部; b. 根…