大模型LoRA微调过程

news2024/11/24 6:51:08

LoRA (Low-Rank Adaptation of Large Language Models) 是一种用于微调大型预训练模型的方法,尤其适合在计算资源有限的情况下进行微调。通过限制参数更新的范围,并巧妙利用矩阵分解,LoRA 大幅减少了微调过程中的参数量,从而提高了效率并降低了显存占用。

1. LoRA为什么会出现?

LoRA 的出现是为了解决大型语言模型(如 GPT、BERT 等)在微调时面临的计算和内存瓶颈。随着模型参数规模的急剧增大,传统的全参数微调(fine-tuning)需要大量的计算资源和存储空间,限制了模型在资源有限环境中的应用。

LoRA 的核心思想是:在不改变原始模型权重的情况下,通过引入低秩矩阵的增量来进行微调。也就是说,LoRA 不直接更新原模型的参数,而是为其特定的层添加额外的可训练参数,从而实现对模型的适应调整。一方面知识对部分层进行微调,另一方面还对需要更新的矩阵层ΔW进行了分解,进一步减少了参数量和计算量。

2. 基本原理

LoRA 假设神经网络的权重更新矩阵 ΔW是低秩的。利用这一假设,它通过低秩矩阵分解,将矩阵更新分解为两个小矩阵的乘积,从而减少了参数的数量。
LoRA基本原理

具体来说,在标准的神经网络层中,例如一个线性层,其计算可以表示为:
y = W x y=Wx y=Wx
其中 W 是权重矩阵,x是输入,y 是输出。在传统微调中,我们需要直接更新 W 这个大矩阵。而 LoRA 的做法是保持 W 不变,增加一个可训练的增量 ΔW,使得微调后的输出为:
y = ( W + Δ W ) x y=(W+ΔW)x y=(W+ΔW)x
为了降低 ΔW的参数量,LoRA 通过将 ΔW 分解为两个低秩矩阵 AB,即:
Δ W = A B ΔW=AB ΔW=AB
其中 AB 的维度远小于 W,从而大大减少了微调时需要更新的参数。

3. 微调过程

LoRA 微调的具体步骤如下:

3.1 预训练模型加载

首先加载一个大型预训练模型,例如 GPT 或 Qwen。此时,模型的所有参数 W 都是固定的(微调过程中冻结模型参数),不会在 LoRA 微调过程中直接更新。

3.2 插入 LoRA 层

在模型的某些层(例如 Transformer 的注意力层)中插入 LoRA 层。具体地,在这些层的线性变换(Linear Layers)上引入低秩分解。通常,LoRA 会选择在特定的层(如自注意力层的 Query 和 Key 投影矩阵)应用低秩矩阵分解。

3.3 定义低秩矩阵

在插入的 LoRA 层中,定义两个小矩阵 AB,其中 A 的尺寸是 r×drB的尺寸是 d×kd ,这里 d 是输入维度,k 是输出维度,r 是分解的秩,通常远小于 dk

3.4 训练过程
  • 在训练过程中,只有 LoRA 引入的 AB 矩阵是可训练的,原始模型的权重 W 不会被更新。
  • 模型的前向传播仍然会计算完整的 Wx,同时也会计算增量 ΔWx=(AB)x,然后将它们相加。
  • 通过这种方式,LoRA 微调可以适应新的任务数据,但所需更新的参数量大大减少。
3.5 损失函数与优化器

LoRA 微调的损失函数和标准的微调一样,通常是交叉熵损失或者其他适合任务的损失函数。优化器也可以是常用的如 Adam、SGD 等。唯一的区别是,只有 AB 参与梯度更新,而模型的其他部分保持冻结状态。

在 LoRA 微调过程中,损失函数的计算方式与传统的全参数微调相似,核心思想是在保持原模型权重不变的前提下,通过引入的低秩矩阵来调整模型的输出。具体来说,LoRA 引入了两个小矩阵 AB 来生成增量矩阵 ΔW,并将其加到模型的某些层上进行训练。

前向传播中的输出:

在微调过程中,模型的输出是基于原始权重和加入的低秩矩阵共同生成的:

  • 原始模型的输出:模型加载了预训练好的权重矩阵 W,例如线性层权重矩阵。在前向传播中,原模型的输出为:
    y pre-trained = W x y_{\text{pre-trained}} = W x ypre-trained=Wx
    这里 W 是原始的权重矩阵,x 是输入。

  • 加入 LoRA 的输出:LoRA 方法通过低秩矩阵 AB 来调整权重矩阵,形成一个增量矩阵 ΔW,其计算如下:
    Δ W = A B ΔW=AB ΔW=AB
    因此,经过微调后的线性层输出为:
    y LoRA = ( W + Δ W ) x = W x + ( A B ) x y_{\text{LoRA}} = (W + \Delta W) x = W x + (A B) x yLoRA=(W+ΔW)x=Wx+(AB)x
    这里 ΔW 反映了 LoRA 层的贡献,它在前向传播中加入了微调产生的变化。、

损失函数的计算:

与常规的全参数微调类似,LoRA 微调的损失函数通常是基于特定任务的目标来定义的,比如交叉熵损失(分类任务)或均方误差(回归任务)。LoRA 的关键在于损失函数的输入是微调后的模型输出 yLoRA,而不是只使用原始权重的输出。

假设模型在给定输入 xxx 后的目标输出为 ytrue,那么典型的损失函数可以是交叉熵损失:
L = CrossEntropy ( y LoRA , y true ) \mathcal{L} = \text{CrossEntropy}(y_{\text{LoRA}}, y_{\text{true}}) L=CrossEntropy(yLoRA,ytrue)
或者是均方误差损失(MSE):
L = MSE ( y LoRA , y true ) \mathcal{L} = \text{MSE}(y_{\text{LoRA}}, y_{\text{true}}) L=MSE(yLoRA,ytrue)
其中
y LoRA = ( W + Δ W ) x y_{\text{LoRA}} = (W + \Delta W) x yLoRA=(W+ΔW)x
注意,这里的损失函数仅仅是基于模型的输出计算的,和传统微调的方式没有区别。LoRA 的创新之处在于它通过调整参数的方式减少了可训练参数的数量,但损失计算还是基于模型的输出和目标输出的差异。

参数更新:

在损失函数计算完毕后,优化器(如 Adam 或 SGD)会基于损失函数的梯度来更新参数。在 LoRA 微调中,模型的大部分权重(原始的 W)是冻结的,不会更新。只有新增的低秩矩阵 AB 参与参数更新。

具体来说,基于损失函数的反向传播过程会计算:

  • 对低秩矩阵 A 的梯度
    ∂ L ∂ A \frac{\partial \mathcal{L}}{\partial A} AL

  • 对低秩矩阵 B 的梯度
    ∂ L ∂ B \frac{\partial \mathcal{L}}{\partial B} BL

而原始权重矩阵 W 的梯度则为零,因为它是冻结的。

因此,优化器仅更新低秩矩阵 AB 的参数,模型的其他部分保持不变。这种方式使得 LoRA 在显著减少训练参数的同时,仍能有效调整模型的输出,从而适应新的任务。

最后,将微调完的 AB 矩阵相乘得到 ΔW ,然后与原模型参数 W 相加即可得到微调后的模型参数。

4. 优势与特点

LoRA 相比传统的微调方法有以下几个显著优势:

  • 参数效率:只需更新非常少量的参数,大大降低了显存的占用。
  • 加速训练:由于参与训练的参数量减少,训练速度可以显著提高。
  • 节省存储:微调后,只需存储两个低秩矩阵 AB ,而不需要存储整个大型模型的参数。
  • 性能保留:在很多任务中,LoRA 的微调效果可以接近甚至达到全参数微调的效果。

5. 应用场景

LoRA 尤其适用于以下场景:

  • 资源受限环境:如边缘设备或低计算资源的服务器,LoRA 可以使得在有限资源下进行大模型的微调成为可能。
  • 多任务微调:由于 LoRA 只引入了极少量的参数,可以对同一模型进行多任务微调,而不需要每次保存完整的模型权重。

6. 实践中的应用

在实际应用中,LoRA 已被广泛应用于各类语言模型的微调,特别是在自然语言处理(NLP)任务中。例如,LoRA 可以用于将 GPT-3 微调到特定的下游任务(如文本生成、问答等)上,而无需更新整个 GPT-3 模型。

此外,LoRA 也逐渐应用于其他领域,如计算机视觉中的图像分类和目标检测任务中,作为一种通用的低秩适应方法。

总结

LoRA 微调通过将大型模型的权重更新限制在低秩矩阵上,实现了高效的参数更新和资源节约。它在保持预训练模型参数不变的情况下,仅通过少量的参数调整适应新的任务,从而极大降低了微调的成本,适用于需要频繁微调或者资源有限的应用场景。

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

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

相关文章

探索实缴注册资金的魅力:知识产权实缴的关键所在

在企业的运营和发展中,实缴注册资金具有一系列显著的优势,特别是当知识产权能够资本化时,更是为企业带来了多重机遇和价值。以下将分重点进行解析。 一、实缴注册资金的优势 增强企业信用和信誉 实缴注册资金向外界展示了企业的资金实力和承…

仓库管理是什么?有哪些核心要点?

一个运转良好的仓库就像是一台精密的机器,而仓库管理者就是那个让这台机器高效运作的关键人物。仓库可不只是堆货的地方,它关系着企业的供应链能否顺畅运转,成本能否得到有效控制。一个优秀的仓库管理者,能让仓库井井有条&#xf…

echarts多折线按组分类控制显示隐藏

需求:目前有俩个组数组分别为sss和aaa,sss和aaa有4个属性,分别为温度、湿度、气压和ppm,根据不同的属性每组画出4条折现,结果应该为8条折现,每条折现颜色不一致,名称也不一致,时间也…

Overfrp内网穿透用例:使用域名部署穿透服务器以访问内网http/https服务

项目地址:https://github.com/sometiny/overfrp 使用overfrp部署穿透服务器,绑定域名后,可使用域名访问内网的http/https服务。 用例中穿透服务器和内网机器之间的访问全链路加密,具有ssh2相当的安全级别。!&#xf…

软件测试的常用的面试题【带答案】

1. 请自我介绍一下(需简单清楚的表述自已的基本情况,在这过程中要展现出自信,对工作有激情,上进,好学) 面试官您好,我叫XXX,今年24岁,来自XX,就读专业是电子商务,毕业后就…

Spring18——Spring事务角色(事务管理员、事务协调员)

39-Spring事务角色 这部分我们重点要理解两个概念,分别是事务管理员和事务协调员。 当未开启Spring事务时 AccountDao的outMoney因为是修改操作,会开启一个事务T1 AccountDao的inMoney因为是修改操作,会开启一个事务T2AccountService的tr…

爬虫(反调试)

其实就是一种给页面反爬机制,一般页面用不到。 万能解决反调试方法:

康师傅涨价背后:是自救还是失策?

涨价策略虽缓解成本压力,却可能导致消费者忠诚度下降,促使消费者转向竞品,加剧康师傅市场份额的流失。 转载:原创新熵 作者丨璐萱 编辑丨蕨影 康师傅方便面又双叒叕涨价了! 今年5月份以来,在人们感叹买不…

C++与Rust那些事之跳过析构函数

C与Rust那些事之跳过析构函数 在Rust中mem::forget用于防止对象的析构,跳过清理工作,从而让资源的释放交给其他机制管理。 例如: let file File::open("foo.txt").unwrap(); mem::forget(file); 那么在C中如何防止析构&#xff1f…

滚柱导轨适配技巧与注意事项!

滚柱导轨是一种重要的传动元件,它由滚柱作为滚动体。用于连接机床的运动部件和床身基座,其设计旨在提供高承载能力和高刚度,适用于重型机床和精密仪器,而滚柱导轨的适配方法对于确保机械设备的高精度运行至关重要。 滚柱导轨的适配…

conda 创建虚拟环境 Anconda虚拟环境

1、创建虚拟python环境: 通过构建虚拟环境,可避免与其他人的软件版本冲突。 conda create -n name python2.x 例如创建名字为xgli的虚拟环境,python的版本为2.7.3,则命令为: conda create -n ia2024 python2.7&…

web基础-攻防世界

get-post 一、WP (题目本质:get与post传参方法) 用 GET 给后端传参的方法是:在?后跟变量名字,不同的变量之间用&隔开。例如,在 url 后添加/?a1 即可发送 get 请求。 利用 hackbar 进行…

DBMS-4 数据库存储

存储结构 一.表空间 1.概念:一张数据表在数据库空间中以一个表空间的形式存储。表空间由数据段、索引段、回滚段组成,分别记录一张表的不同信息。 2.层次信息 (1)一个表空间(TableSpace)由多个段(Segment)构成; &…

四、Spring Boot集成Spring Security之认证流程

Spring Boot集成Spring Security之认证流程 一、概要说明二、基于内存的用户名密码1、默认用户名密码2、自定义用户名密码3、为方便测试添加测试接口TestController 三、登录登出重要概念介绍四、登录业务逻辑1、登录业务相关过滤器2、访问业务请求处理流程①、访问业务请求地址…

AI核身-金融场景凭证篡改检测Baseline实践

金融领域交互式自证业务中涵盖信用成长、用户开户、商家入驻、职业认证、商户解限等多种应用场景,通常都需要用户提交一定的材料(即凭证)用于证明资产收入信息、身份信息、所有权信息、交易信息、资质信息等,而凭证的真实性一直是…

力扣19.删除链表的倒数第N个节点

题目链接:19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2输出:[1,2,3,…

【Linux调试工具】gdb/cgdb

文章目录 gdb 简介gdb 的主要功能 gdb的用法如何进入gdb显示代码如何运行程序如何打断点和取消断点逐语句调试逐行逐行执行代码(s)调试工具 总结 gdb 简介 GDB(GNU Debugger)是GNU项目中的一款强大的调试工具,广泛应用…

数字隔离器的技术竞争

长期以来,光耦合器一直被人们信赖,因为它能够在电路的不同部分之间提供电气隔离,确保信号的安全传输,同时保护元件免受高压影响。然而,近年来,数字隔离器已成为一种强大的替代品,在速度、寿命和…

Map的实现类:TreeMap

1.存储结构:红黑树 2.实现了SortedMap接口(是Map的子接口),可以对key自动排序。 3.实例代码:Student类和Demo03 如果出现类转换异常 参考【TreeSet(红黑树)】 package com.map;import java…

苍穹外卖P19--异常处理

以上传数据库数据重复为例,进行异常处理。 接口文档报错: 重新启动: