当前位置: 首页 > news >正文

LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS 论文阅读

一、TL;DR

  1. 为什么要这么做?预训练模型越来越大,比如GPT-3 175B训练独立变得越来越不可行
  2. 方法:冻结预训练模型的权重,在Transformer架构的每一层中注入可训练的低秩分解矩阵
  3. 效果:训练参数量减少10000x,GPU显存减少3x,且不像adapter引入额外的推理延迟

二、方法

2.1 整体介绍

LoRA允许我们通过优化dense layers在微调过程中变化的秩分解矩阵,间接地训练神经网络,同时保持预训练权重冻结,

如图1所示。以GPT-3 175B为例,我们表明即使完整秩(即d)高达12,288,一个非常低的秩(即图1中的r可以是一或二)也足够了,这使得LoRA在存储和计算方面都非常高效。

LoRA具有4个关键优势:

  • 多lora部署模型:部署不同的图1中的矩阵A和B高效地切换任务,显著减少存储需求和任务切换开销。

  • 训练门槛低:LoRA\将显存需求减少了3x,因为不需要为大多数参数计算梯度或维护优化器状态。只需要优化注入的、小得多的低秩矩阵。

  • 无推理延迟成本:简单的线性设计允许在部署时将lora参数和预训练权重合并,与完全微调的模型相比,LoRA不会引入任何推理延迟。

  • 方案灵活可叠加:LoRA可与(prefix-tuning)等方法叠加使用

2.2 问题描述

首先定义一下大型预训练模型如何训练下游任务的问题。

全量微调一个自回归语言模型,模型从预训练权重Φ0​ 开始初始化,并通过反复沿着梯度更新,最大化条件语言模型概率

全参的缺点

对每个下游任务,都需要学习一组不同的参数增量∆Φ,其维度|∆Φ|等于预训练模型的参数维度|Φ₀|。因此,如果预训练模型规模庞大(例如GPT-3,其|Φ₀|约为1750亿),存储和部署众多独立的微调模型实例可能会非常困难,甚至根本不可行

lora的优点

是一种更具参数效率的方法,其中针对特定任务的参数增量∆Φ = ∆Φ(Θ)进一步由一组小得多的参数Θ编码,且|Θ|远小于|Φ₀|。因此,寻找∆Φ的任务就变成了对Θ进行优化

使用一种低秩表示来编码∆Φ,更为高效。举例在GPT-3 175B训练时,可训练参数的数量|Θ|可以小至|Φ₀|的0.01%。

讲人话:

原来是全参训练更新参数,现在是相较预训练模型增量的那部分变化用lora的低秩组成的矩阵来代替,从而达到同样的效果

2.3 现在的解决方案(翻译原文)

添加adapter或优化输入层激活的某些形式,局限性是会引入延迟(细节略,直接翻译见下文):

适配器层会引入推理延迟
适配器有多种变体。我们关注Houlsby等人(2019)最初的设计,该设计在每个Transformer块中包含两个适配器层,以及Lin等人(2020)最近提出的设计,后者每个块中只有一个适配器层,但额外增加了一个LayerNorm(Ba等人,2016)。尽管可以通过剪枝层或利用多任务设置来减少整体延迟(Rücklé等人,2020;Pfeiffer等人,2021),但没有直接的方法可以绕过适配器层中的额外计算。这似乎不是问题,因为适配器层被设计为只有少量参数(有时不到原始模型的1%),通过设置较小的瓶颈维度来限制它们增加的浮点运算量(FLOPs)。然而,大型神经网络依赖硬件并行化来保持低延迟,而适配器层必须按顺序处理。这在在线推理场景中(通常批量大小仅为1)会产生差异。在没有模型并行化的通用场景中,例如在单个GPU上运行GPT-2(Radford等人,b)中等模型时,即使瓶颈维度非常小,使用适配器时也会明显增加延迟(见表1)。

当需要对模型进行分片时(如Shoeybi等人,2020;Lepikhin等人,2020),这个问题会变得更糟,因为额外的深度需要更多的同步GPU操作,如AllReduce和Broadcast,除非我们将适配器参数冗余存储多次。

直接优化提示词是困难的
另一个方向,以前缀调整(Li和Liang,2021)为例,面临着不同的挑战。我们观察到前缀调整难以优化,并且其性能会随着可训练参数的变化而非单调变化,这证实了原始论文中的类似观察。更根本的是,为适应保留一部分序列长度,必然会减少可用于处理下游任务的序列长度,我们怀疑这使得提示词调整的性能不如其他方法。关于任务性能的研究将在第5节中进行讨论。

三 本文的方法

3.1 LORA原理

假设在适应过程中,权重的更新具有较低的“内在秩”。对于一个预训练的权重矩阵 W0​∈Rd×k,我们通过低秩分解来约束其更新:W0​+ΔW=W0​+BA,其中 B∈Rd×r,A∈Rr×k,且秩 r≪min(d,k)。

在训练过程中,W0​ 是固定的,不会接收梯度更新,而 A 和 B 包含可训练参数。注意,W0​ 和 ΔW=BA 都与相同的输入相乘,并且它们的输出向量是逐坐标相加的。修改后的前向传播结果为:

我们在图1中展示了这种重新参数化。

具体来说:

  1. 随机高斯初始化 A,并将 B 初始化为零,在训练开始时,ΔW=BA 为零。然后我们将 ΔWx 缩放 rα​,其中 α 是一个与 r 相关的常数。当使用Adam优化时,调整 α 大致等同于调整学习率,只要我们适当地缩放初始化即可。因此,我们只需将 α 设置为我们尝试的第一个 r,而无需对其进行调整。这种缩放有助于减少在变化 r 时重新调整超参数的需求(Yang & Hu, 2021)。

上述原理可以支持多lora进行部署,即共用一套预训练模型,但是不同下游的A和B矩阵进行merge计算并部署

3.2 将LoRA应用于Transformer

在Transformer架构中,自注意力模块中有四个权重矩阵(Wq​,Wk​,Wv​,Wo​),在gpt3.5的模型训练中,发现同时调整Wq和Wv效果是比较好的,因此更应该倾向于用低秩微调不同的参数

3.3 experiments

核心结论:lora比其他的参数微调方法都要稳定和效果好

核心结论:r设置多少和更新哪几个权重比较好?明显是r=2/4且更新多个权重比较好

核心结论:top奇异向量的作用最大,其他的奇异可能会引入更多的噪声。这证明了更新参数矩阵ΔW存在极小的‘内在秩’(这个图我没看懂,下周在更新怎么理解这个图)

四、官方code

微软的官方lora-code:

上面同时初始化了矩阵A和B,但是都是直接全0初始化的,然后执行下面对矩阵A进行初始化:

权重的merge:

前向推理过程:(注意,尺度参数默认是秩的的倒数1/r)

注意,在官方开源的代码里面,CNN也是可以进行lora的,从简单原理上来说,CNN的shape是(input_dim, kernel_size, kernel_size, output_dim),transformer的权重shape是(input_dim, output_dim),CNN的操作会复杂一些(就是将4维的矩阵reshap到2维进行lora,然后,用这2个矩阵的乘积和输入相乘,再累加到原来的4维weights*input里面):

原文地址:https://blog.csdn.net/lovep1/article/details/146166829
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mrgr.cn/news/94739.html

相关文章:

  • 解决Windows版Redis无法远程连接的问题
  • python爬虫Scrapy(6)之增量式
  • itsdangerous加解密源码分析|BUG汇总
  • Linux实时内核稳定性案例
  • Java:引用其他类的方法
  • Spring bean的作用域详解
  • Spring面试:Spring,SpringMVC,SpringBoot
  • Excel(函数篇):IF函数、FREQUNCY函数、截取函数、文本处理函数、日期函数、常用函数详解
  • 24.策略模式实现日志
  • 蓝桥杯专项复习——结构体、输入输出
  • 【入门初级篇】布局类组件的使用(1)
  • 市面上常用的23种设计模式,分析实现方式以及实际使用场景案例
  • Centos离线安装openssl-devel
  • 自探索大语言模型微调(一)
  • VSTO(C#)Excel开发8:打包发布安装卸载
  • 守护中国软件供应链安全,未名湖畔的筑梦人
  • Redis--Zset类型
  • 本地部署Spark集群
  • 【AIGC】OpenAI 集成 Langchain 操作实战使用详解
  • Ubuntu从源码安装Webots