论文阅读之PeriodicLoRA: Breaking the Low-Rank Bottleneck in LoRA Optimization(2024)

文章目录

  • 论文地址
  • 主要内容
  • 主要贡献
  • 模型图
  • 技术细节
  • 实验结果

论文地址

PeriodicLoRA: Breaking the Low-Rank Bottleneck in LoRA Optimization

主要内容

这篇文章的主要内容是介绍了一种名为PeriodicLoRA(PLoRA)的参数高效微调(Parameter-Efficient Fine-Tuning,PEFT)方法,旨在解决大型语言模型(Large Language Models,LLMs)微调过程中的低秩瓶颈问题。文章首先讨论了大型语言模型在自然语言处理任务中的应用越来越广泛,但全参数微调这些模型需要大量的计算资源。为了解决这一问题,研究者们开发了参数高效微调方法,其中LoRA(Low-Rank Adaptation)是最广泛使用的方法之一。LoRA通过优化低秩矩阵来减少微调过程中的内存使用,但与全参数微调相比,其性能仍有差距。

为了克服这一限制,文章提出了PLoRA方法,该方法通过多次累积低秩更新矩阵来实现更高的更新秩。PLoRA包含多个训练阶段,在每个阶段结束时,将LoRA权重卸载到主干参数中,然后重新初始化LoRA状态。实验结果表明,PLoRA具有更强的学习能力,最多可达LoRA学习能力的1.8倍,而且不会增加内存使用。此外,文章还介绍了一种基于动量的卸载策略,以减轻PLoRA训练过程中的不稳定性。

文章还讨论了相关工作,包括监督微调、参数高效微调、LoRA及其变体,并详细介绍了PLoRA方法的实现细节。此外,文章还提供了实验设置、数据集、实验结果和讨论,以及PLoRA方法的局限性和未来研究方向。最后,文章总结了PLoRA的贡献,并提供了参考文献列表。

主要贡献

文章的主要贡献可以总结为以下几点:

  1. 提出PLoRA方法:文章引入了PeriodicLoRA(PLoRA),这是一种新的参数高效微调(PEFT)方法,旨在突破LoRA微调中的低秩瓶颈。PLoRA通过在多个训练阶段中累积低秩更新矩阵来实现更高的更新秩,从而提高模型的学习能力。

  2. 实验验证:文章通过在不同PEFT设置下对LLaMA 7B模型进行指令微调,并在多主题多选题、数学推理以及语言理解和推理任务上评估性能,证明了PLoRA相比于相同秩的LoRA具有更好的性能,并且没有引入额外的内存开销。

  3. 深入分析:文章对PLoRA的训练过程进行了详细的分析,揭示了PLoRA相比于原始LoRA具有更强的学习能力。特别是,在不同任务中应用PLoRA后学习能力的提升。

  4. 公开调优结果:文章公开了在调整超参数方面的完整结果,为选择适当的PLoRA设置提供了参考。

  5. 方法的简化和效率:与现有的LoRA变体相比,PLoRA方法更为简单和高效,它通过周期性地卸载和重新初始化LoRA状态来实现高秩更新,而不是通过增加模型复杂性或内存开销。

这些贡献表明,PLoRA是一个有前景的方法,可以在保持参数效率的同时提高大型语言模型在特定任务上的性能,尤其是在资源受限的情况下。此外,文章的实验结果和分析为未来的研究提供了有价值的见解和方向。

模型图

在这里插入图片描述

在LoRA训练中,只有矩阵A和B被更新,而模型权重被冻结(用蓝色表示)。然后,在完成所有训练之后,使用训练后的矩阵A和B来更新模型权重。

而在PLoRA方法中,在每次小批量训练之后,在继续训练之前,转移LoRA中矩阵A和B的权重以更新模型权重并重置它们自己。此循环在一个历元内重复N次。在图中,浅橙色表示小批量的学习能力,而橙色表示截至当前的累积学习能力。

PLoRA就是在训练过程中练一个小的LoRA然后加到预训练模型权重后面,然后LoRA重置,接着练,一个训练过程可以得到好多个LoRA矩阵,练好一个加一个,直到训练过程结束。

技术细节

在这里插入图片描述

首先LoRA就是一次训练过程中,只训练A、B两个低秩矩阵,W预训练参数冻结。

在这里插入图片描述
简单来说,PLoRA就是一次训练过程中,逐渐训练多个A、B矩阵,训练好一组就把他们加到预训练模型参数中,冻结,然后重新初始化一组A、B,继续只训练A、B,过了两个epoch觉得差不多就再加到W冻结,再开一组A、B,因此,一次训练过程可以得到多组A、B

(人多力量大了)

因此:
PLoRA方法的得到的预训练模型的参数:
在这里插入图片描述
例如一次训练过程,搞出了T组A、B,其实相当于有个T个秩为r的矩阵来学习了。

然后有选择地更新LoRA,将BA乘积按(1−m)缩放,将A和B矩阵按m缩放。这种方法解决了由于数据集可变性而导致的小批量损失不一致的问题。

可以看一段伪代码加深理解:

import torch
import torch.nn as nn
from torch.optim import AdamW

# 假设我们有一个预训练的Transformer模型
class TransformerModel(nn.Module):
    # ... Transformer模型的定义 ...

    def forward(self, x):
        # ... 前向传播的实现 ...
        return x

# 初始化模型和优化器
model = TransformerModel()
optimizer = AdamW(model.parameters(), lr=1e-4)

# 初始化LoRA的权重矩阵A和B
rank = 10  # 假设我们选择的秩为10
A = torch.randn(model_dim, rank)  # 随机初始化A
B = torch.zeros(model_dim, rank)   # 初始化B为零

# 训练循环
num_stages = 5  # 假设我们有5个训练阶段
for stage in range(num_stages):
    # 在每个阶段,我们只更新A和B
    for data, target in train_loader:
        optimizer.zero_grad()
        
        # 假设我们有一个函数来应用LoRA权重更新
        updated_weights = apply_lora_weights(model, A, B)
        
        # 执行前向传播和损失计算
        output = model(data)
        loss = loss_fn(output, target)
        
        # 反向传播和参数更新
        loss.backward()
        optimizer.step()
        
        # 阶段结束时,将更新的权重应用到模型的主干参数上
        apply_updated_weights_to_model(model, updated_weights)
        
        # 重置A和B为初始状态
        A = torch.randn(model_dim, rank)
        B = torch.zeros(model_dim, rank)

# 应用LoRA权重更新的函数
def apply_lora_weights(model, A, B):
    # 这里应该是将LoRA的权重更新应用到模型的特定层上
    # 具体实现取决于模型的结构和LoRA的实现细节
    pass

# 将更新的权重应用到模型的函数
def apply_updated_weights_to_model(model, updated_weights):
    # 这里应该是将累积的LoRA权重更新应用到模型的主干参数上
    # 具体实现取决于模型的结构和LoRA的实现细节
    pass

# 假设的损失函数和数据加载器
loss_fn = nn.CrossEntropyLoss()
train_loader = ...  # 你的数据加载器

# 开始训练
train(model, loss_fn, optimizer, num_epochs)

实验结果

在这里插入图片描述
基于经验证据,文章将4.8k数据设置为训练期间PLoRA的卸载点。

在这里插入图片描述
PLoRA在复杂任务的表现更好
在这里插入图片描述
调整缩放参数的影响
在这里插入图片描述
PLoRA在复杂任务上收敛更快

还有一些实验结果,先这样

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++第十弹---类与对象(七)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、再谈构造函数 1.1、构造函数体赋值 1.2、初始化列表 1.3、explicit关键字 2、static成员 2.1、概念 2.2、特性 2.3、面试题 总结 1、再…

一个极简的用于 Web 服务鉴权的反向代理服务

Auth Proxy 一个极简的用于 Web 服务鉴权的反向代理服务 Demo(密码为:whoami):https://auth-proxy.wengcx.top/ 极其简约的 UI对你的真实服务无任何侵入性支持容器部署,Docker Image 优化到不能再小(不到…

DS-红黑树(RBTree)

一.红黑树 1.1 红黑树的起源 当对对AVL树做一些结构修改的操作时候,性能较为低下,比如:插入时要维护其绝对平衡,旋转的次数比较多,更差的是在删除时,有可能一直要让旋转持续到根的位置。 因此1972年Rudolf…

极大提高工作效率的 Linux 命令

作为一名软件开发人员,掌握 Linux 命令是必不可少的技能。即使你使用 Windows 或 macOS,你总会遇到需要使用 Linux 命令的场合。例如,大多数 Docker 镜像都基于 Linux 系统。要进行 DevOps 工作,你需要熟悉Linux,至少要…

数据库被.[Goodmorningfriends@onionmail.org].faust勒索病毒加密,能恢复吗?

.faust勒索病毒有什么特点及危害? .faust勒索病毒是一种恶意软件,以其复杂的加密技术和勒索行为而闻名。这种病毒的主要目标是通过加密受害者的数据文件,然后勒索赎金以解密这些文件。它通常通过恶意附件、恶意链接或潜在的不安全下载源传播&…

网络编程套接字——实现简单的TCP网络程序

目录 1、TCP socket API详解 socket(): bind(): listen(): accept(): connect(): 2、简易的TCP网络程序 TcpServer.hpp TcpClient.cc Main.cc Log.hpp ThreadPool.hpp Task.hpp Init.hpp Daemon.hpp dict.txt Makefile 1、TCP socket A…

第六十二回 宋江兵打大名城 关胜议取梁山泊-飞桨ONNX推理部署初探

石秀和卢俊义在城内走投无路,又被抓住。梁中书把他两个人押入死牢。蔡福把他俩关在一处,好酒好菜照顾着,没让两人吃苦。 第二天就接到城外梁山泊的帖子,说大军已经来到,要替天行道,让他放人,并…

数据结构从入门到精通——快速排序

快速排序 前言一、快速排序的基本思想常见方式通用模块 二、快速排序的特性总结三、三种快速排序的动画展示四、hoare版本快速排序的代码展示普通版本优化版本为什么要优化快速排序代码三数取中法优化代码 五、挖坑法快速排序的代码展示六、前后指针快速排序的代码展示七、非递…

【Netty】TCP粘包、拆包、编解码问题

TCP粘包、拆包、编解码问题 UserInfo userInfo1new UserInfo();ByteBuf buf Unpooled.copiedBuffer(userInfo1.toString().getBytes(StandardCharsets.UTF_8));UserInfo userInfo1new UserInfo(); 这行代码创建了一个新的UserInfo对象,并将其引用存储在名为userInf…

力扣242. 有效的字母异位词

思路:字母相互抵消的思路,本题字符串中只包含小写字母26位,那就新建record数组int[26],下标0-25,代表小写字母a-z, 需要通过 某字符减a 来达到这一目的; class Solution {public boolean isAnagram(String…

Tomcat 下载以及安装

Tomcat安装及配置教程主要分为四步: 步骤一:首先确认自己是否已经安装JDK 1. cmd:查看java的版本 步骤二:下载安装Tomcat 1. 下载tomcat :Apache Tomcat - Welcome! 2. 选择对应的tomcat版本: 3. 进行安装&#…

如何使用 Elasticsearch 作为向量数据库

在今天的文章中,我们将很快地通过 Docker 来快速地设置 Elasticsearch 及 Kibana,并设置 Elasticsearch 为向量搜索。 拉取 Docker 镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:8.12.2 docker pull docker.elastic.co/kibana/kiba…

Red Hat Enterprise Linux 9.2

Red Hat Enterprise Linux 9.2的安装 插入安装光盘,从光盘启动,选择 第一个选项,安装Red Hat Enterprise Linux 9.2 9.2支持简体中文 此次安装选择了英文安装,估计在生产环境大多也是选择的英文安装 安装选项此次也是选择的mi…

利用MSF生成php,windows,Linux三类木马

一、什么是msfvenom? msfvenom是msf中的一个独立的负载生成器,它可以利用msf中的payloads和encoders来生成各种格式的木马文件,并在目标机上执行,配合meterpreter在本地监听上线。msfvenom是msfpayload和msfencode的结合体&#x…

保姆级教学 - C语言 之 动态内存管理

🌈 个人主页:白子寰 🔥 分类专栏:魔法指针,进阶C,C语言,C语言题集,C语言实现游戏👈 希望得到您的订阅和支持~ 💡 坚持创作博文(平均质量分79.9),分…

shell常用通配符

目录 介绍 示例 * ? [a,b,...] / [ab...] [^a,b,...] / [^ab...] [x1-x2] {"xxx","xxx","xxx",...} {x1..x2} 介绍 示例 * 匹配0或多个字符 ls的-d选项可以只列出当前目录下的文件,而不会列出他们包含的内容: ? 只匹配任意一个字符 …

MySQL基础(DDL,DML,DQL)

目录 一DDL 1.1数据库操作 1.1.1查询所有数据库: 1.1.2创建数据库 1.1.3 使用数据库 1.1.4 删除数据库 1.2表操作 1.2.1表操作 1.2.1.1创建表 1.2.1.1.1约束 1.2.1.1.2 数据类型 1.2.1.1.2.1 数值类型 1.2.1.1.2.2 字符串类型 1.2.1.1.2.3日期类型 1.…

Linux源码包安装

目录 一、transmission源码包安装 二、 nginx源码包安装 一、transmission源码包安装 1、下载编译环境所需的软件包依赖 2、下载transmision源码包到用户主目录下 https://github.com/transmission/transmission/releases/download/4.0.5/transmission-4.0.5.tar.xz 3、解压…

支持度和置信度

支持度和置信度是数据挖掘和关联规则挖掘领域中常用的两个指标,用于衡量项集之间的关联程度。 支持度(Support):支持度是指某个项集在数据集中出现的频率,即该项集在数据集中出现的次数与总事务数之比。支持度用来衡量…

Qt 利用共享内存实现一次只能启动一个程序(单实例运行)

Qt 利用共享内存实现一次只能启动一个程序 文章目录 Qt 利用共享内存实现一次只能启动一个程序摘要利用共享内存实现一次只能启动一个程序示例代码 关键字: Qt、 unique、 单一、 QSharedMemory、 共享内存 摘要 今天接着在公司搞我的屎山代码,按照…