[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解

news2024/10/5 0:00:11

[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解

前言:

古人云: 得卧龙者,得天下

然在当今大语言模型流行的时代,同样有一句普世之言: 会微调技术者,得私域大模型部署之道!

在众多微调技术中,LoRA (LOW-RANK ADAPTATION, lora)低秩适应是最常用的一种技术手段,尤其是当你面临多私域数据应用大模型部署,并且计算资源及内存资源又非常有限之时。
在这里插入图片描述在这里插入图片描述

1. 背景简介

随着GPT等大语言模型的陆续出现,人们逐步发现和接受了这样一个现实规律: 增加数据量和模型参数往往是提升深度网络模型性能最简单粗暴的方法。 目前主流的大模型参数量,通常都是千亿级别起步,并且还在不断持续地扩大。

大型语言模型(LLM)的微调是为了使模型更好地适应特定的任务或领域。微调通常在模型的预训练阶段之后进行,预训练阶段模型在大量无标签数据上学习通用的语言特征,而微调阶段则使用特定任务的数据对模型进行进一步训练,以提高其在该任务上的表现。

微调技术主要包括以下几种:

  1. 全参数微调:在这种方法中,模型的所有参数都会根据特定任务的数据进行更新。这种方法能够充分利用预训练模型的通用特征,但可能需要更多的计算资源。

  2. 参数高效微调(PEFT):这是一种旨在减少微调参数数量和计算复杂度的方法,以减轻大型预训练模型的训练负担。PEFT包括多种技术,如:

    • LoRA(Low-Rank Adaptation):通过在模型的关键层次中引入小型、低秩的矩阵来实现模型行为的微调,而无需对整个模型结构进行大幅度修改。这种方法在不显著增加额外计算负担的前提下,能够有效地微调模型,同时保留模型原有的性能水准 。
    • QLoRA(Quantized Low-Rank Adaptation):结合了LoRA方法与深度量化技术,通过量化预训练模型为4位,大幅减少了模型存储需求,同时保持了模型精度的最小损失 。
    • 适配器调整(Adapter Tuning):在模型的每个层或选定层之间插入小型神经网络模块,称为“适配器”。这些适配器是可训练的,而原始模型的参数则保持不变 。
    • 前缀调整(Prefix Tuning):通过在输入数据前增加前缀来给模型提供一些先验知识,以提升微调效果。
    • 提示调整(Prompt Tuning):通过设计特定的提示(prompt)来引导模型更好地完成特定任务。
    • P-Tuning及P-Tuning v2:这些方法通过调整模型的注意力机制来提高微调效率。

微调的效果取决于多种因素,包括微调策略的选择、数据集的质量、模型的规模等。例如,LoRA方法已经在多个业务场景中证明了其有效性,能够在保持模型性能的同时显著减少训练参数量和显存占用 。而QLoRA则通过量化技术进一步降低了显存占用,使得在资源有限的环境下部署和训练大型模型成为可能 。通过选择合适的微调技术,可以在有限的资源下实现高效的模型定制。

2. LoRA算法

在这里插入图片描述
在这里插入图片描述
在2021年,一篇由微软公司研究者撰写的论文《LoRA: Low-Rank Adaptation of Large Language Models 》首次提出LoRA算法,论文作者包括 Edward Hu, Yelong Shen, Phillip Wallis, Zeyuan Allen-Zhu, Yuanzhi Li, Shean Wang, Weizhu Chen。这篇论文旨在解决大型语言模型在特定任务或领域适应时面临的模型微调挑战。简要而言,LoRA(Low-Rank Adaptation)算法是一种用于大型语言模型微调的技术,它通过在模型的每个Transformer层中引入可训练的低秩矩阵来适应特定任务,而不是微调所有预训练的权重。这种方法显著减少了可训练参数的数量,从而降低了存储和计算成本,同时避免了在微调过程中可能发生的灾难性遗忘。
在这里插入图片描述
如上图所示,假设预训练的模型参数为 W 0 ∈ R m × n W_{0} \in \mathcal{R}^{m \times n} W0Rm×n, 我们通常的LLM微调则是希望利用新的领域训练数据对模型进行更新,学习一个 Δ W ∈ R m × n \Delta W \in \mathcal{R}^{m \times n} ΔWRm×n, 从而使得模型参数更新为 W ′ W^{'} W, 即:
W ′ = W 0 + Δ W . W^{'} = W_{0} + \Delta W. W=W0+ΔW.

由于 Δ W ∈ R m × n \Delta W \in \mathcal{R}^{m \times n} ΔWRm×n是一个维度与原始模型参数同纬度的巨大矩阵,在模型参数微调时会消耗大量的计算资源和内存资源。为了解决这个问题,微软的研究者提出,可以使用低秩自适应(Low-Rank Adaptation, LoRA)技术。具体而言,则是:
Δ W = A B \Delta W = AB ΔW=AB
其中,矩阵 A ∈ R m × r A \in \mathcal{R}^{m \times r} ARm×r, B ∈ R r × n B \in \mathcal{R}^{r \times n} BRr×n, 这里的关键点是 r < < { m , n } r << \{m, n\} r<<{m,n}.

对于LoRA技术与普通的微调FT技术的区别,大致可以参考下面这个图:
在这里插入图片描述

在不同规模的语言模型中,LoRA算法的表现通常是有效的。例如,在GPT-3 175B模型上,LoRA能够减少可训练参数的数量高达10000倍,并且减少GPU内存需求约3倍。实验结果表明,即使训练参数大幅减少,LoRA在模型质量上也能与全参数微调相媲美或更好。这表明LoRA在保持模型性能的同时,显著提高了训练和部署的效率。

具体性能对比数据可以参考以下实验结果:

  • 在RoBERTa模型上,使用LoRA微调的参数数量为0.3M,与其他方法相比,在GLUE基准测试中取得了与全参数微调相当的性能。
  • 在DeBERTa XXL模型上,LoRA微调的参数数量为4.7M,在GLUE基准测试中也表现出色。
  • 在GPT-2模型上,LoRA在E2E NLG Challenge任务中的表现超过了一些具有相似或更少可训练参数的基线方法。
    这些结果表明,LoRA算法在不同规模的语言模型中都能有效工作,并且在减少资源消耗的同时保持或提高了模型的性能。这些发现对于需要在资源有限的环境中部署大型语言模型的应用场景尤其有价值。

实际在微调大型模型时,以下是一些技巧和考虑因素:

  • 选择合适的微调策略:全参数微调虽然可以获得最佳效果,但资源消耗大。LoRA作为一种参数高效的微调方法,可以在保持资源效率的同时,通过避免灾难性遗忘来提高微调质量。

  • 确定微调的层:可以选择只微调模型的特定层,例如注意力机制层,或者选择微调所有线性层,这可能会提高微调质量。

  • 配置LoRA适配器:在LoRA配置中,可以定义低秩适配器的参数,如秩(r)、目标模块(target_modules)、LoRA比例因子(lora_alpha)、dropout率等。这些参数的选择会对微调结果产生显著影响。

  • 数据准备:为了进行有监督的微调,需要将数据转换为适合的格式,即提示-响应对。

  • 训练参数:定义训练参数,如训练周期、批量大小和其他训练超参数。

  • 模型部署:在部署时,需要考虑是否合并适配器权重到预训练模型中,这可能会影响推理延迟。

3. QLoRA

在这里插入图片描述
论文: https://arxiv.org/pdf/2305.14314
在这里插入图片描述
QLoRA(Quantized Low-Rank Adaptation)是2024年提出的一种用于大型语言模型(LLMs)微调的技术,它通过量化和低秩矩阵分解来减少模型在微调过程中的内存占用和计算成本。在论文中,作者提出QLORA,一种高效的微调方法,能够在保持16位全精度微调任务性能的同时,显著降低内存使用量。通过在冻结的4位量化预训练语言模型中反向传播梯度到低秩适配器(LoRA),QLORA能够在单个48GB GPU上微调65B参数模型。最佳模型系列名为Guanaco,其在Vicuna基准测试上的表现超越了所有以前公开发布的模型,达到了ChatGPT性能的99.3%,同时仅需在单个GPU上微调24小时。QLORA引入了多项创新以节省内存:(a) 4位NormalFloat(NF4),一种新的数据类型,对于正态分布的权重在信息理论上是最优的;(b) 双重量化,通过量化量化常数来减少平均内存占用;© 页面优化器,使用NVIDIA统一内存来管理内存峰值。
在这里插入图片描述

算法原理

  1. 量化(Quantization):QLoRA通过量化技术将模型参数从浮点数转换为低精度的表示,如4-bit量化。这种方法减少了模型参数的内存占用,同时通过特定的量化策略(如NormalFloat量化)来保持模型性能。

  2. 低秩矩阵分解(Low-Rank Adaptation):QLoRA利用低秩矩阵分解的思想,将原始的高维权重矩阵分解为两个低秩矩阵的乘积,从而减少需要更新的参数数量。

  3. 分页优化器(Paged Optimizers):QLoRA使用分页优化器来管理内存使用,通过NVIDIA统一内存特性在CPU和GPU之间自动页面传输,以避免内存不足错误。

在这里插入图片描述

应用效果

  • QLoRA能够在单个GPU上进行大型模型的微调,显著降低了对硬件资源的需求。
  • 它能够在保持模型性能的同时,减少内存占用和计算成本,使得在资源有限的环境中也能进行大型模型的微调。
  • 实验表明,QLoRA优化后的模型在多个自然语言处理任务上取得了与全精度模型相媲美的性能。

使用技巧

  1. 选择合适的量化策略:QLoRA使用NormalFloat量化来确保量化过程在信息理论上是最优的,这有助于保持模型性能。

  2. 调整低秩适配器的参数:QLoRA通过调整低秩适配器的参数(如秩r和缩放系数alpha)来控制模型的微调程度,这些参数的选择对模型性能有重要影响。

  3. 利用分页优化器管理内存:通过使用分页优化器,QLoRA可以在内存紧张的情况下继续训练,这对于在内存较小的设备上微调大型模型尤为重要。

  4. 实验和调优:QLoRA的性能可能受到多种因素的影响,包括数据集的质量、模型的大小和结构等。通过实验和调优,可以找到最佳的微调配置。

  5. 硬件选择:虽然QLoRA可以在消费级GPU上运行,但更大的内存和更强大的计算能力可以进一步提高微调的效率和模型的性能。

QLoRA作为一种高效的大型语言模型微调方法,通过量化技术和低秩矩阵分解,为自然语言处理领域的研究者和开发者提供了一种新的工具和方法,有助于推动LLMs在实际应用中的更广泛应用和发展。

参考资料
[1] https://www.thepaper.cn/newsDetail_forward_25531528
[2] Hu, Edward J., et al. “Lora: Low-rank adaptation of large language models.” arXiv preprint arXiv:2106.09685 (2021).
[3] Dettmers, Tim, et al. “Qlora: Efficient finetuning of quantized llms.” Advances in Neural Information Processing Systems 36 (2024).


后记

如果您对我的博客内容感兴趣,欢迎三连击(点赞,关注和评论),我将持续为您带来计算机人工智能前沿技术(尤其是AI相关的大语言模型,深度学习,计算机视觉相关方向)最新学术论文及工程实践方面的内容分享,助力您更快更准更系统地了解 AI前沿技术

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

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

相关文章

单细胞scDist细胞扰动差异分析学习

scDist通过分析不同状态下细胞的距离来找到差异最大的细胞亚群(见下图的A)&#xff0c;然后再分析每一个细胞亚群的PCA通过线性的混合模型并结合最终的系数去预估不同干预方式下细胞群之间的距离。 Augur是通过对每一个细胞进行AUC评分并排序最终找到扰动最佳的细胞群&#xf…

等额本金和等额本息是什么意思?

等额本金和等额本息是两种常见的贷款还款方式&#xff0c;它们各自有着不同的特点和适用场景。下面我将用通俗易懂的语言来解释这两种还款方式&#xff1a; 等额本金 定义&#xff1a;等额本金指的是在贷款期限内&#xff0c;每月偿还相同数额的本金&#xff0c;而利息则随着剩…

FPGA远程烧录bit流

FPGA远程烧录bit流 Vivado支持远程编译并下载bit流到本地xilinx开发板。具体操作就是在连接JTAG的远程电脑上安装hw_server.exe。比如硬件板在实验室或者是其他地方&#xff0c;开发代码与工程在本地计算机&#xff0c;如何将bit流烧录到实验室或者远程开发板&#xff1f; vi…

Socket套接字(客户端,服务端)和IO多路复用

Socket套接字&#xff08;客户端&#xff0c;服务端&#xff09; 目录 socket是什么一、在客户端1. 创建套接字2. 设置服务器地址3. 连接到服务器4. 发送数据5. 接收数据6. 关闭连接 二、内核态与用户态切换三、系统调用与上下文切换的关系四、在服务端1. 创建 Socket (用户态…

【Linux】进程地址空间(初步了解)

文章目录 1. 奇怪的现象2. 虚拟地址空间3. 关于页表4. 为什么要有虚拟地址 1. 奇怪的现象 我们先看一个现象&#xff1a; 为什么父子进程从“同一块地址中”读取到的值不一样呢&#xff1f; 因为这个地址不是物理内存的地址 &#xff0c;如果是物理内存的地址是绝对不可能出…

C++【类和对象】(友元、内部类与匿名对象)

文章目录 1.友元2.内部类3.匿名对象结语 1.友元 友元提供了⼀种突破类访问限定符封装的方式&#xff0c;友元分为&#xff1a;友元函数和友元类&#xff0c;在函数声明或者类声明的前面加friend&#xff0c;并且把友元声明放到⼀个类的里面。外部友元函数可访问类的私有和保护…

【安全科普】从“微信文件助手隐私泄漏”看社交平台网络安全

随着互联网技术的飞速发展&#xff0c;社交平台已经成为了人们日常生活中不可或缺的一部分。人们通过社交平台与亲朋好友保持联系&#xff0c;分享生活点滴&#xff0c;获取资讯信息。然而&#xff0c;与此同时&#xff0c;社交平台上的网络安全风险也日益凸显。近期&#xff0…

简单的a+b-C语言

1.问题&#xff1a; 输入两个整数a和b&#xff0c;计算ab的和。 2.解答&#xff1a; scanf()函数是通用终端格式化输入函数&#xff0c;它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。 scanf()函数返回值分为3种&…

分布式学习02-CAP理论

文章目录 CAP三指标一致性可用性分区容错性 CAP不可能三角P存在的必要性CP理论AP理论 CAP理论对分布式系统的特性做了高度抽象&#xff0c;将其抽象为一致性、可用性、分区容错性。 并对特征间的冲突做了总结&#xff1a;CAP不可能三角。 CAP三指标 一致性&#xff08;Consis…

【NIO基础】基于 NIO 中的组件实现对文件的操作(文件编程),FileChannel 详解

目录 1、FileChannel (1&#xff09;获取 FileChannel (2&#xff09;读取文件 (3&#xff09;写入文件 (4&#xff09;关闭通道 (5&#xff09;当前位置与文件大小 (6&#xff09;强制写入磁盘 2、两个 FileChannel 之间的数据传输 (1&#xff09;使用 transferTo()…

HTML的修饰(CSS) -- 第三课

文章目录 前言一、CSS是什么&#xff1f;二、使用方式1. 基本语法2. 引入方式1.行内式2.内嵌式3. 链入式 3. 选择器1. 标签选择器2.类选择器3. id选择器4. 通配符选择器 4. css属性1. 文本样式属性2. 文本外观属性 5. 元素类型及其转换1. 元素的类型2. 元素的转换 6.css高级特性…

isinstance()学习

aa {} if isinstance(aa,dict):print("是")aa 2 if isinstance(aa,dict):print("是")aa 2 if isinstance(aa,int):print("是")aa [] if isinstance(aa,list):print("list")aa [1,2,3] if isinstance(aa,list):print("list"…

模拟算法(4)_外观数列

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 模拟算法(4)_外观数列 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. 题目链…

选择排序:直接选择排序、堆排序

目录 直接选择排序 1.选择排序的基本思想 2.直接选择排序的基本思想 3.直接插入排序的代码思路步骤 4.直接选择排序代码 5.直接选择排序的特性总结 堆排序 一、排升序&#xff0c;建大堆 1.利用向上调整函数建大堆 1.1.建立大堆的思路 1.2.以下是具体步骤&#xff1a…

Android Framework AMS(01)AMS启动及相关初始化1-4

该系列文章总纲链接&#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节主要涉及systemserver启动AMS及初始化AMS相关操作。同时由于该部分内容分析过多&#xff0c;因此拆成2个章节&#xff0c;本章节是第一章节&…

Solidity 存储和内存管理:深入理解与高效优化

在 Solidity 中&#xff0c;存储和内存管理是编写高效智能合约的关键组成部分。合约执行的每一步操作都可能涉及到数据的存储和读取&#xff0c;而这些操作对 gas 的消耗有很大影响。因此&#xff0c;理解 Solidity 的存储模型以及如何优化数据的管理对于合约的安全性、性能和成…

pytorch之梯度累加

1.什么是梯度&#xff1f; 梯度可以理解为一个多变量函数的变化率&#xff0c;它告诉我们在某一点上&#xff0c;函数的输出如何随输入的变化而变化。更直观地说&#xff0c;梯度指示了最优化方向。 在机器学习中的作用&#xff1a;在训练模型时&#xff0c;我们的目标是最小…

day2网络编程项目的框架

基于终端的 UDP云聊天系统 开发环境 Linux 系统GCCUDPmakefilesqlite3 功能描述 通过 UDP 网络使服务器与客户端进行通信吗&#xff0c;从而实现云聊天。 Sqlite数据库 用户在加入聊天室前&#xff0c;需要先进行用户登录或注册操作&#xff0c;并将注册的用户信息&#xf…

P4、P4D、HelixSwarm 各种技术问题咨询

多年大型项目P4仓库运维经验&#xff0c;为你解决各种部署以及标准工业化流程问题。 Perforce 官网SDPHelixCore GuideHelixSwarm GuideHelixSwarm Download

SpringBoot基础(三):Logback日志

SpringBoot基础系列文章 SpringBoot基础(一)&#xff1a;快速入门 SpringBoot基础(二)&#xff1a;配置文件详解 SpringBoot基础(三)&#xff1a;Logback日志 目录 一、日志依赖二、日志格式1、记录日志2、默认输出格式3、springboot默认日志配置 三、日志级别1、基础设置2、…