LoRA原理解析

news2024/10/7 17:34:54

文章目录

  • 前言
  • 现有方案存在的问题
    • Adapter Tuning
    • Prefix Tuning
  • LoRA
  • 总结


前言

随着模型规模的不断扩大,微调模型的所有参数(所谓full fine-tuning)的可行性变得越来越低。以GPT-3的175B参数为例,每增加一个新领域就需要完整微调一个新模型,代价和成本非常高!

论文:LORA: LOW-RANK ADAPTATION OF LARGE LANNGUAGE MODELS
代码:https://github.com/microsoft/LoRA

现有方案存在的问题

Adapter Tuning

简单来说,adapter就是固定原有的参数,并添加一些额外参数用于微调。上图中会在原始的transformer block中添加2个adapter,一个在多头注意力后面,另一个这是FFN后面。
在这里插入图片描述
从图中可以看出,Adapter增加了模型的层数,导致模型推理速度变慢

Prefix Tuning

在这里插入图片描述

具体来说,对于transformer中的每一层,都在句子表征前面插入可训练的virtual token embedding。对于自回归模型(GPT系列),在句子前添加连续前缀,即 Z = [PREFIX; x; y].
对于Encoder-Decoder模型(T5),则在Ecoder和Decoder前都添加连续前缀 Z = [PREFIX; x | PREFIX; y].
添加前缀的过程如上图

虽然,prefix-tuning并没有添加太多的额外参数;但是,prefix-tuning难以优化,且会减少下游任务的序列长度。

LoRA

LoRA的几个关键优势:

  • 预训练的模型可以共享,节省硬盘开销
  • 切换任务时,只需要更换LoRA权重,成本低
  • 训练时只需训练LoRA权重,内存消耗低

在这里插入图片描述
简单理解:在模型的Linear层的旁边,增加一个“旁支”,这个“旁支”的作用,就是代替原有的参数矩阵W进行训练。

结合上图,我们来直观地理解一下这个过程,输入 x x x,具有维度 d d d,举个例子,在普通的transformer模型中,这个 x x x可能是embedding的输出,也有可能是上一层transformer layer的输出,而 d d d一般就是768(大多数Bert的输出维度是768)。按照原本的路线,它应该只走左边的部分,也就是原有的模型部分。

而在LoRA的策略下,增加了右侧的“旁支”,也就是先用一个Linear层A,将数据从 d d d维降到 r r r维,这个 r r r也就是LORA的秩,是LoRA中最重要的一个超参数。一般会远远小于 d d d (见的比较多的是4、8),尤其是对于现在的大模型, d d d已经不止是768或者1024,例如LLaMA-7B,每一层transformer有32个head,这样一来 d d d就达到了4096.

接着再用第二个Linear层B,将数据从 r r r变回 d d d维。最后再将左右两部分的结果相加融合,就得到了输出的hidden_state

对于左右两个部分,右侧看起来像是左侧原有矩阵 W W W的分解,将参数量从 d ∗ d d * d dd变成了 d ∗ r + r ∗ d d * r + r * d dr+rd,也就是 2 ∗ d ∗ r 2 * d * r 2dr,在 r < < d r << d r<<d的情况下,参数量就大大地降低了。

在Albert中,作者考虑到词表的维度很大,所以将Embedding矩阵分解成两个相对较小的矩阵,用来模拟Embedding矩阵的效果,这样一来需要训练的参数量就减少了很多。(实际上也就减少了10M左右,Albert参数量较少的主要原因跨层参数共享)
在这里插入图片描述
LoRA也是类似的思想,并且它不再局限于Embedding层,而是所有出现大矩阵的地方,理论上都可以用到这样的分解。

但是与Albert不同的是,Albert直接用两个小矩阵替换了原来的大矩阵,而LoRA保留了原来的矩阵W,但是不让W参与训练,所以需要计算梯度的部分就只剩下旁支的A和B两个小矩阵。

从论文中的公式来看,全参微调时,模型训练的优化表示为(以自回归语言模型为例):
在这里插入图片描述
即最大化条件概率

其中,模型的参数用 Φ \Phi Φ表示。

全参微调的一个主要缺点是,对于每个下游任务,都需要学习一组不同的参数,如果预训练的模型很大,如GPT3(1750亿参数),存储和部署许多独立的微调模型实例可能是一项挑战。

而加入了LoRA之后,模型的优化表示为:
在这里插入图片描述
其中,模型原有的参数是 Φ 0 \Phi_0 Φ0 ,LoRA新增的参数是 Δ Φ ( Θ ) \Delta \Phi\left(\Theta\right) ΔΦ(Θ)

从第二个式子可以看到,尽管参数看起来增加了(多了 Δ Φ ( Θ ) \Delta \Phi\left(\Theta\right) ΔΦ(Θ)),但是从前面的max的目标来看,需要优化的参数只有 Θ \Theta Θ,而根据假设, Θ < < Φ Θ << \Phi Θ<<Φ,这就使得训练过程中,梯度计算量少了很多,所以就在低资源的情况下,我们可以只消耗 Θ \Theta Θ这部分的资源,这样一来就可以在单卡低显存的情况下训练大模型了。

训练完之后只保存lora部分的参数(就是可训练的参数)进行推理时可以先把这些参数加到原始模型上形成新的模型(图1中顶部的大+号部分),然后再加载进行推理,这样和原模型相比不会增加任何额外的推理时间开销。

目前的LLM都是由上亿级别的数据训练而成,LoRA通过保持原模型的梯度,可以避免预训练泛化能力的坍塌。这是因为在预训练过程中,模型已经学习到了大量的语言知识和结构,这些知识和结构可以被应用到各种下游任务中。但是,在完全微调的过程中,模型的所有参数都被重新训练,这可能会导致模型忘记之前学习到的知识和结构,从而降低了模型的泛化能力。

相比之下,LoRA只对部分参数进行微调,而保持了原模型的梯度。这样做的好处是,LoRA可以在保持原模型的语言知识和结构的同时,对特定任务进行微调,从而提高模型的性能。此外,LoRA的低秩矩阵注入方法可以进一步提高模型的泛化能力,因为低秩矩阵可以捕捉到数据中的共性和规律,从而减少了过拟合的风险。

因此,通过保持原模型的梯度,LoRA可以避免预训练泛化能力的坍塌,并提高模型的泛化能力和性能。

总结

  • LoRA只是参数高效、而并非训练高效,也就是可训练的参数确实是少了很多,但是在单卡上训练速度并没有明显提升。

    在LoRA中,需要整个PLM参与反向传播的计算,而不仅仅是反向传播旁路的部分参数。这是因为LoRA的低秩矩阵注入方法需要使用整个PLM的梯度信息来计算注入矩阵的梯度。具体来说,LoRA的梯度计算包括两个步骤:首先,需要计算整个PLM的梯度;然后,需要使用这些梯度来计算注入矩阵的梯度。

  • 在多卡训练中,LoRA的速度优势主要体现在两个方面:

    1. 计算效率:由于LoRA只需要计算和优化注入的低秩矩阵,因此它的计算效率比完全微调更高。在多卡训练中,LoRA可以将注入矩阵的计算和优化分配到多个GPU上,从而加速训练过程。

    2. 通信效率:在多卡训练中,通信效率通常是一个瓶颈。由于LoRA只需要通信注入矩阵的参数,因此它的通信效率比完全微调更高。在多卡训练中,LoRA可以将注入矩阵的参数分配到多个GPU上,从而减少通信量和通信时间。

    因此,LoRA在多卡训练中通常比完全微调更快。具体来说,LoRA可以将硬件门槛降低多达3倍,从而提高训练的效率。

参阅:

  • 论文阅读:LORA-大型语言模型的低秩适应
  • 大模型训练——PEFT与LORA介绍
  • Ladder Side-Tuning:预训练模型的“过墙梯”

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

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

相关文章

界面组件DevExpress ASP.NET Core v23.1新版亮点 - 增强的数据可视化

DevExpress ASP.NET Core Controls使用强大的混合方法&#xff0c;结合现代企业Web开发工具所期望的所有功能。该套件通过ASP.NET Razor标记和服务器端ASP.NET Core Web API的生产力和简便性&#xff0c;提供客户端JavaScript的性能和灵活性。ThemeBuilder工具和集成的Material…

纯LiDAR Odometry——LinK3D论文详解

先说总结 总体思路是&#xff1a;针对输入来的点云&#xff0c;对每一个scan进行edge特征点的提取&#xff0c;因为提取的特征点因为噪声等原因导致特征点不鲁棒&#xff0c;所以又对特征点通过聚类的方法进行了特征增强&#xff0c;对增加后的特征投影到平面上&#xff0c;分别…

无线通信模块|wifi模块、BLE蓝牙模块、wifi蓝牙二合一模块科普介绍

物联网技术能够帮助智能家居环境中的门厅场景、客厅场景、厨房场景、卧室场景以及阳台场景的智能化管理。现如今智能家居和智能应用之间的配合离不开物联网模块的帮助。没有WiFi模块智能家居就不能很好的工作&#xff0c;甚至不能很好的进行数据的交换。现阶段的物联网智能家居…

程序员必须知道的加密、解密和签名算法

1. 对称加密 对称加密&#xff0c;加密和解密使用相同的秘钥&#xff0c;加密速度快、效率高。常见的有 DES&#xff08;淘汰&#xff09;、3DES&#xff08;淘汰&#xff09;、AES&#xff08;用于替代 DES&#xff0c;是目前常用的&#xff09;等。 加密解密 1.1. DES&#…

建造者模式:详解构造函数、set方法、建造者模式三种对象创建方式

思考&#xff1a; 为什么需要建造者模式 与工厂模式有何区别&#xff1f; 为什么需要建造者模式&#xff1f; 平时常常使用new关键字来创建对象&#xff0c;什么时候new对象时候不适用了呢&#xff1f;可能是创建对象时候可能是构造函数中传入太多的内容吧。 下面通过一个例子…

基于Java电脑硬件库存管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

Linux下从CPU/内存/IO三个方面来分析系统性能

在实际生产环境中是否遇到如下问题&#xff1f; 系统平均负载过高。 CPU使用率过高。 硬盘利用率已经饱和&#xff0c;IO存在瓶颈。 首先明确一下进程的常见6种状态 R运行状态&#xff08;running&#xff09;&#xff1a;并不意味着进程一定在运行中&#xff0c;它表明进程要…

钉钉聊天对话框和截图经常发生白屏

环境&#xff1a; 7.0.30-rel6019102 Win10专业版 L盾加密环境 问题描述&#xff1a; 钉钉聊天对话框和截图经常发生白屏 解决方案&#xff1a; 1.【电脑端钉钉】- 左上角【头像】-【设置】-【高级】- 下拉【网络检测】- 点击【开始检测】 如果变红说明网络有问题&#x…

redis安装后启动报redis-server.exe redis.windows.conf

文章目录 1. 报错的内容2. 解决方法&#xff1a;&#xff08;亲测有效&#xff09; 1. 报错的内容 redis安装后启动报redis-server.exe redis.windows.conf 完整报错如下&#xff1a; 2. 解决方法&#xff1a;&#xff08;亲测有效&#xff09; 先使用命令切换到redis安装目…

Redis常用命令操作

#linux是redis-cli #普通环境 redis-cli.exe -h host -p port -a password #集群环境&#xff0c;否则报&#xff1a;(error) MOVED 6918 127.0.0.1:6381 redis-cli.exe -c -h host -p port -a password#参数说明 #host&#xff1a;远程redis服务器host #port&#xff1a;远程r…

开发人员必备:9个令人惊叹的CSS网格生成器推荐!

微信搜索 【大迁世界】, 我会第一时间和你分享前端行业趋势&#xff0c;学习途径等等。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录&#xff0c;有一线大厂面试完整考点、资料以及我的系列文章。 快来免费体验ChatGpt plus版本的&#xff0c;我们出的钱 体验地…

【分布式应用】zabbix 二:自定义监控、自动发现与自动注册

目录 一、添加zabbix客户端主机1.1环境设置1.2配置zabbix-angent1.3在 Web 页面中添加 agent 主机 二 、自定义监控内容2.1客户端自定义key2.2在Web页面创建自定义监控模板 三、zabbix自动发现四、zabbix自动注册 一、添加zabbix客户端主机 1.1环境设置 systemctl disable --…

2490. 回环句

句子 是由单个空格分隔的一组单词&#xff0c;且不含前导或尾随空格。 例如&#xff0c;"Hello World"、"HELLO"、"hello world hello world" 都是符合要求的句子。 单词 仅 由大写和小写英文字母组成。且大写和小写字母会视作不同字符。 如果…

查询例题(三道)

一、 写法一&#xff1a; 写法二&#xff1a; 二、 1、内连接&#xff1a; 一个部门下有哪些人&#xff0c;找的相关联的数据 2、左外连接&#xff1a; 以部门表为基准&#xff0c;部门下面没有人&#xff0c;但是也会查询出来 3、右外连接&#xff1a; 以员工表为基准&#…

【Spring 丨数据绑定】

数据绑定 概述Databinder核心属性绑定参数绑定元数据绑定验证 概述 Spring 数据绑定(Data Binding)的作用是将用户的输入动态绑定到应用程序的领域模型JavaBean(或用于处理用户输入的任何对象)。 也就是说&#xff0c;Spring数据绑定机制是将属性值设置到目标对象中。如下图所示…

Bug小能手系列(python)_9: 使用sklearn库报错 module ‘numpy‘ has no attribute ‘int‘

AttributeError: module numpy has no attribute int. 0. 错误介绍1. 环境介绍2. 问题分析3. 解决方法3.1 调用解决3.2 库包中存在报错 4. 总结 首先&#xff0c;对于自己使用代码dtypenp.int报错的情况&#xff0c;建议直接修改为np.int_即可解决&#xff0c;也不用向下看了&a…

Python3安装教程在Unix/Linux操作系统

在Linux操作系统上安装Python3教程&#xff0c;先下载Python3安装包&#xff1a; Python3下载&#xff1a;https://www.python.org/downloads/source/ 选择适用于 Unix/Linux 的源码压缩包。下载及解压压缩包 Python-3.x.x.tgz&#xff0c;3.x.x 为你下载的对应版本号。如果你…

triton客户端使用

model_analyzer 简介&#xff1a; Triton Model Analyzer is a CLI tool which can help you find a more optimal configuration, on a given piece of hardware, for single, multiple, ensemble, or BLS models running on a Triton Inference Server. Model Analyzer wil…

SSM框架训练 实现各个功能时遇到的常见问题

快速复制当前代码到下一行&#xff1a;ctrlD 格式化代码&#xff08;快速整理代码&#xff09;&#xff1a;ctrilaltL 一步一步来&#xff0c;后续会不停添加功能。 先创建项目结构&#xff1a;搭建框架 (36条消息) SSM框架模板&#xff08;高配&#xff1a;一次性配完所有…

指针进阶1

目录 本章将学习 1字符指针 2数组指针与指针数组 3数组传参与指针传参 复习指针初阶基本知识点 1指针是个地址&#xff08;编号&#xff09;&#xff0c;指针变量是存放指针的变量&#xff0c;但是我们平常所说的指针就是指的指针变量&#xff0c;指针变量的大小有4(32位平…