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

(EACL-2023)DyLoRA:使用动态无搜索低秩自适应对预训练模型进行参数高效调整

DyLoRA:使用动态无搜索低秩自适应对预训练模型进行参数高效调整

paper是滑铁卢大学发表在EACL 2023的工作

paper title:DyLoRA: Parameter Efficient Tuning of Pre-trained Models using Dynamic Search-Free Low Rank Adaptation

Code:https://github.com/huawei-noah/Efficient-NLP

Abstract

随着预训练模型 (PM) 的大小不断增长,微调变得更加昂贵且耗费资源。作为一种补救措施,低秩适配器 (LoRA) 保持模型的主要预训练权重不变,只向模型引入一些可学习的截断 SVD 模块(所谓的 LoRA 块)。虽然 LoRA 块具有参数效率,但它们存在两个主要问题:首先,这些块的大小是固定的,训练后无法修改(例如,如果我们需要更改 LoRA 块的秩,则需要从头开始训练它们);其次,优化它们的秩需要进行详尽的搜索。在这项工作中,我们引入了一种动态低秩自适应 (DyLoRA) 解决方案来同时解决这两个问题。我们的 DyLoRA 方法通过对训练期间在不同秩上学习到的表示进行排序,为一系列秩而不是单个秩训练 LoRA 块。我们使用 RoBERTa 模型在 GLUE 基准测试中的不同任务上评估我们的解决方案。我们的结果表明,我们可以训练 DyLoRA,速度至少比 LoRA 快 7 倍,且不会显著影响性能。 此外,与 LoRA 相比,我们的模型可以在更大范围内的秩上始终表现良好。

1 Introduction

预训练/微调已成为解决自然语言处理 (NLP) [2]–[4] 和计算机视觉 [5]–[10] 中许多任务的流行范例。预训练模型 (PM),例如预训练语言模型 (PLM) [2]、[4] 和预训练视觉语言模型 [11]–[14] 近年来取得了长足进步。随着这些预训练模型的规模不断扩大,下游任务的微调成本越来越高。在这方面有两类解决方案:第一,模型压缩 [15]、[16];第二,参数高效调整 (PET) [17]–[19]。

PLM 有许多不同的模型压缩技术,如矩阵分解 [20]–[22]、修剪 [23]、量化 [24]、[25] 和知识蒸馏 [15]、[26]–[31]。文献中还有不同类型的 PET 技术,如低秩适配器 [18]、[32]–[34] 和基于提示的技术 [35]。

尽管近年来模型压缩解决方案在文献中已经很成熟,但与 PET 技术相比,使用这些技术通常会导致模型性能大幅下降;或者在某些情况下,例如知识提炼,它需要有一个经过微调的更大的教师模型。在所有 PET 技术中,低秩适配器受到了广泛关注,因为与快速调整技术相比,低秩适配器不会增加序列长度。 尽管文献中有几种众所周知的低秩自适应技术,如 [33]、压缩器 [18]、LORA [34];但它们都存在两个主要的共同问题:首先,不清楚如何选择它们的秩的大小(而它们的性能对这种秩选择非常敏感);其次,它们的训练是静态的,这意味着如果基于特定的秩大小训练低秩模型,它在其他秩值下将无法很好地工作(即对于任何其他秩值,我们都需要训练单独的模型)。

在本文中,我们提出了一种动态低秩适配器 (DyLoRA) 来缓解这两个问题。 在不失通用性的前提下,我们专注于 LoRA[1],并通过对训练期间学习到的不同秩的表示进行整理,为一系列秩而不是单个秩训练 LoRA 块。

我们的模型能够在更广泛的秩范围内胜过 LoRA,而无需增加训练时间。此外,我们的技术不需要任何额外的训练即可进行跨秩搜索。

以下是我们贡献的总结:

  • 动态 LoRA:在 LoRA 的基础上,我们开发了一种新算法 (DyLoRA),使其在推理时动态化,而不会产生额外成本。
  • 免搜索 LoRA:我们证明,通过在性能上做出可忽略不计的妥协,可以避免为 LoRA 选择最佳秩的昂贵搜索过程。

2 Related Work

LORA [34] 是一种低秩上投影/下投影变换,没有任何非线性,可并行应用于键和值注意矩阵。LORA 的主要优点是,适配器模块在训练后可以集成到模型的原始权重矩阵中,从而可以实现非常高效的推理时间。然而,文献中所有可用的低秩适配器 [18]、[33]、[36] 都存在两个主要问题:首先,找到最佳秩大小需要大量的穷举训练和搜索;其次,调整后的适配器模块仅在特定秩大小下才能很好地工作。

尽管文献中已经在动态网络方面做出了一些努力,例如 DynaBERT [37] 和 GradMax [38],但据我们所知,分解网络和低秩适配器的这个问题仍然悬而未决。DRONE [16] 提出了一种数据感知低秩模型压缩技术,但是他们的方法不是免搜索的,也不是动态的。DynaBERT 引入了一种两阶段方法来训练宽度和深度动态网络。然而,DynaBERT 需要一个经过微调的教师模型来训练其动态子网络,这是处理大型 PLM 的主要限制。GradMax 是一种在不触及已经训练过的神经元的情况下逐渐增加网络神经元的技术。但目前尚不清楚如何部署 GradMax 来减少低秩适配器中的秩搜索问题。[23] 提出了一种结构化剪枝技术,称为分解低秩剪枝(FLOP)。 FLOP 将网络的权重矩阵分解为秩为 1 的分量之和,这些分量在训练期间被正则化以获得稀疏性。值得一提的是,FLOP 旨在压缩主模型,即使它可以用于在完整权重矩阵的低秩表示中找到一个好的秩,最终的低秩模型也不会是动态的(即它只针对一个秩进行良好的训练,而不是一个秩范围,与 LoRA 相同)。

3 Our Method: DyLoRA

在本节中,我们介绍了一种解决方案,即获取动态低秩适配器,该适配器可以在一系列秩上进行训练并部署,而不是在单个特定秩上(使用固定的训练预算)。 这种灵活性可以让我们免于通过多次训练模型来搜索最佳秩。

在不失一般性的情况下,我们基于 LoRA 来解释我们的解决方案。在每个 LoRA 模块中,我们有一个升维投影矩阵 ( W u p ∈ R m × r W_{up} \in \mathbb{R}^{m \times r} WupRm×r) 和一个降维投影矩阵 ( W d w ∈ R r × d W_{dw} \in \mathbb{R}^{r \times d} WdwRr×d)。假设我们希望训练 LoRA 模块,使其能够在 r ∈ Range ⁡ [ r min ⁡ , r max ⁡ ] r \in \operatorname{Range}\left[r_{\min}, r_{\max}\right] rRange[rmin,rmax] 的范围内工作,其中 r min ⁡ r_{\min} rmin r max ⁡ r_{\max} rmax 可以视为新的超参数。

为了使 LoRA 模块能够在一系列秩而非单一秩范围内工作,我们需要确保增加或减少秩不会显著影响模型性能。一种实现此行为的方法是在 LoRA 模块的训练过程中对不同秩的信息内容进行排序。为此,在每次训练步骤中,我们从一个预定义的离散分布中采样 b ∼ p B ( ) , b ∈ { r min ⁡ , r min ⁡ + 1 , … , r max ⁡ } b \sim p_B(),b \in\left\{r_{\min}, r_{\min}+1, \ldots, r_{\max}\right\} bpB()b{rmin,rmin+1,,rmax}(其支持范围为 [ r min ⁡ , r max ⁡ ] \left[r_{\min}, r_{\max}\right] [rmin,rmax]),并相应地截断 W d w W_{dw} Wdw W u p W_{up} Wup 矩阵:

W d w ↓ b = W d w [ 1 : b , : ] W u p ↓ b = W u p [ : , 1 : b ] \begin{aligned} & W_{dw \downarrow b} = W_{dw}[1: b,:] \\ & W_{up \downarrow b} = W_{up}[:, 1: b] \end{aligned} Wdwb=Wdw[1:b,:]Wupb=Wup[:,1:b]

其中, W d w ↓ b W_{dw \downarrow b} Wdwb W u p ↓ b W_{up \downarrow b} Wupb 分别是 W d w W_{dw} Wdw W u p W_{up} Wup b b b 截断版本(见图 1 进行可视化)。此外,我们定义 W d w b W_{dw}^b Wdwb W d w W_{dw} Wdw 的第 b b b 行, W u p b W_{up}^b Wupb 对应于 W u p W_{up} Wup 的第 b b b 列:

W d w b = W d w [ b , : ] W u p b = W u p [ : , b ] \begin{aligned} & W_{dw}^b = W_{dw}[b,:] \\ & W_{up}^b = W_{up}[:, b] \end{aligned} Wdwb=Wdw[b,:]Wupb=Wup[:,b]

在训练过程中,截断 LoRA 模块的前向传播计算如下:

h = W 0 x + α b W u p ↓ b W d w ↓ b x h = W_0 x + \frac{\alpha}{b} W_{up \downarrow b} W_{dw \downarrow b} x h=W0x+bαWupbWdwbx

图1

图 1:DyLoRA:我们提出的方法的总体图。在训练期间,在每次迭代中,我们从预定义的随机分布中进行采样,这将有助于我们截断 LoRA [1] 目标中的上投影和下投影矩阵。

为了简化起见,我们假设网络中只有一个 LoRA 模块(即公式 (3) 中描述的那个)。首先,考虑网络 f ( x ; W d w , W u p ) f\left(x ; W_{dw}, W_{up}\right) f(x;Wdw,Wup) 的常规静态损失函数( L S \mathcal{L}^{\mathcal{S}} LS),其中 W d w W_{dw} Wdw W u p W_{up} Wup 是可调参数,针对 N N N 个给定的输入-输出对 ( x , y ) = ( x i , y i ) i = 1 N (\mathbf{x}, \mathbf{y})=\left(x_i, y_i\right)_{i=1}^N (x,y)=(xi,yi)i=1N,定义如下:

min ⁡ W d w , W u p L S ( x , y ; W d w , W u p ) ≜ ∑ i = 1 N l ( f ( x i ; W d w , W u p ) , y i ) \begin{aligned} & \min _{W_{dw}, W_{up}} \mathcal{L}^{\mathcal{S}}\left(\mathbf{x}, \mathbf{y} ; W_{dw}, W_{up}\right) \triangleq \\ & \sum_{i=1}^N l\left(f\left(x_i ; W_{dw}, W_{up}\right), y_i\right) \end{aligned} Wdw,WupminLS(x,y;Wdw,Wup)i=1Nl(f(xi;Wdw,Wup),yi)

其中, l ( f , y ) l(f, \mathbf{y}) l(f,y) 是一种损失函数,用于衡量网络预测与目标标签之间的偏差。

接下来,考虑到 b b b 截断过程,将训练损失扩展为动态损失。我们可以定义动态损失函数 L D Y \mathcal{L}^{\mathcal{DY}} LDY 如下:

L ↓ b D Y = ∑ i = 1 N l ( f ( x i ; W d w ↓ b , W u p ↓ b ) , y i ) . \mathcal{L}_{\downarrow b}^{\mathcal{DY}}=\sum_{i=1}^N l\left(f\left(x_i ; W_{dw \downarrow b}, W_{up \downarrow b}\right), y_i\right). LbDY=i=1Nl(f(xi;Wdwb,Wupb),yi).

在参数更新阶段,也可以仅更新截断阶段采样的第 b b b 行和第 b b b 列对应的参数,以避免影响低秩参数。具体更新规则如下:

W d w b ← W d w b − η ∇ W d w b L ↓ b D Y W u p b ← W u p b − η ∇ W u p b L ↓ b D Y \begin{aligned} & W_{dw}^b \leftarrow W_{dw}^b - \eta \nabla_{W_{dw}^b} \mathcal{L}_{\downarrow b}^{\mathcal{DY}} \\ & W_{up}^b \leftarrow W_{up}^b - \eta \nabla_{W_{up}^b} \mathcal{L}_{\downarrow b}^{\mathcal{DY}} \end{aligned} WdwbWdwbηWdwbLbDYWupbWupbηWupbLbDY

其中:

  • W d w b W_{dw}^b Wdwb 是降维投影矩阵 W d w W_{dw} Wdw 的第 b b b 行。
  • W u p b W_{up}^b Wupb 是升维投影矩阵 W u p W_{up} Wup 的第 b b b 列。
  • η \eta η 是学习率。
  • L ↓ b D Y \mathcal{L}_{\downarrow b}^{\mathcal{DY}} LbDY 是基于截断的动态损失。

http://www.kler.cn/a/503527.html

相关文章:

  • PySpark用sort-merge join解决数据倾斜的完整案例
  • 【Unity功能集】TextureShop纹理工坊(十三)打开、保存工程【TSD文件】(终章)
  • day10_Structured Steaming
  • 极客说|Azure AI Agent Service 结合 AutoGen/Semantic Kernel 构建多智能体解决⽅案
  • vue 与 vue-json-viewer 实现 JSON 数据可视化
  • docker mysql5.7如何设置不区分大小写
  • Springboot + vue 小区物业管理系统
  • OpenCV实现多尺度细节提升算法
  • Kafka消费者如何优雅下线
  • RTK北斗高精度定位4G执法记录仪在铁路作业安全风险管控中的应用
  • 【kubernetes】K8S节点状态的维护
  • C++并发编程之普通无锁队列与单生成者单消费者队列
  • 数据结构与算法之栈: LeetCode 151. 反转字符串中的单词 (Ts版)
  • 概率论考前一天
  • Elasticsearch面试题总结
  • Linux Kernel 之十 详解 PREEMPT_RT、Xenomai 的架构、源码、构建及使用
  • 高级运维:源码编译安装httpd 2.4,提供系统服务管理脚本并测试
  • 【华为OD-E卷 - 猜数字 100分(python、java、c++、js、c)】
  • 代码随想录算法训练营第十二天|第18题. 四数之和
  • golang之数据库操作
  • ctf竞赛
  • VirtualBox环境中vscode报错:提取扩展时出错。Failed to fetch
  • Steam个人开发者注册备记
  • 解锁未来情感科技:AI 机器人 Ropet 搭载的前沿智能黑科技
  • K8s数据存储之详解(Detailed Explanation of K8s Data Storage)
  • 【JVM-2.2】使用JConsole监控和管理Java应用程序:从入门到精通