大模型微调技术 --> LoRA 系列之 AdaLoRA

AdaLoRA

1.摘要

之前的微调方法(如低秩更新)通常将增量更新的预算均匀地分布在所有预训练的权重矩阵上,并且忽略了不同权重参数的不同重要性。结果,微调结果不是最优的。

为了弥补这一差距,我们提出了AdaLoRA,它根据权重矩阵的重要性得分自适应地在权重矩阵之间分配参数预算。特别地,AdaLoRA以奇异值分解的形式将增量更新参数化。

这种新的方法允许我们有效地修剪不重要更新的奇异值,这实质上是减少它们的参数预算,但避免了密集的精确 SVD 计算。

我们使用几个预先训练好的模型在自然语言处理、问题回答和自然语言生成方面进行了大量的实验,以验证AdaLoRA的有效性。结果表明,AdaLoRA 与基线相比有显著改善,尤其是在低预算环境中。

2.引言

在这里插入图片描述

图一:假设总可训练参数为0.28 M,我们仅将LoRA应用于DeBERTaV 3-base的选定权重矩阵(左)或选定层(右),并比较MNLI-m的微调性能。
图1a:我们仅微调每个Transformer层的所选类型的权重矩阵,包括查询/键/值投影(Wq,Wk,Wv)、自注意中的输出投影(Wo)以及两层FFN中的两个权重矩阵( W f 1 W_{f_1} Wf1 W f 2 W_{f_2} Wf2)。
在图1b中,我们将LoRA应用于选定层的每个权重矩阵

减少全量微调参数的微调方法有两条主线,

  1. 一个是增加小的神经模块给预训练语言模型并且只微调这个任务特定的模块,基础模型模块保持冻结和共享。
    1. 例如 adapter tuning、prefix tuning 和 prompt tuning 都只增加了少于 1% 的原始模型参数,显著减少了内存消耗
  2. 另一个是不改变模型的架构,对预训练模型的增量进行建模。
    1. 给定预训练的权重矩阵 W ( 0 ) W^{(0)} W(0),例如,diff 剪枝 将其增量更新 Δ 建模为稀疏矩阵。Diff剪枝 将 Δ 初始化为与 W ( 0 ) W^{(0)} W(0) 相同的维数,然后根据条目的大小对 Δ 元素进行剪枝。因此,通过自适应地保留重要的更新并修剪不重要的更新,diff修剪可以显著地提高参数效率。

    2. 但是,diff修剪 有几个限制。

      1. 首先,它依赖于底层实现来加速非结构化稀疏矩阵的计算,而现有的深度学习框架并不很好地支持这一点。因此,在训练过程中,我们必须将Δ存储为密集矩阵。
      2. 第二,它需要用导数来更新Δ的每一个条目,然后对其进行剪枝。这导致与完全微调类似的计算成本(Guo等人,2020年)的报告。
    3. 所以,有人提出了 LoRA(上文介绍了),通过两个小矩阵的点积来作为增量更新

      W = W ( 0 ) + ∆ = W ( 0 ) + B A W = W^{(0)} +∆ = W^{(0)} +BA W=W(0)+=W(0)+BA

      1. 与完全微调相比,仅需不到 0.5% 的额外可训练参数,训练开销可减少高达70。
      2. LoRA实现了与完全微调相当或甚至更好的性能(Hu等人,2022年)的报告。同时,在diff剪枝中,两个小矩阵的乘积比非结构化稀疏矩阵更易于实现和部署。
    4. 但是,LoRA 也有局限性,因为它预先指定每个增量矩阵的秩r是相同的。

      1. 这忽略了这样一个事实,即在微调预训练模型时,权重矩阵的重要性在模块和层之间存在显着差异。为了说明这一点,我们在 图1 中给出了一个具体的例子。我们比较了LoRA在使用相同数量的可训练参数微调特定模块或层时的性能。图1a 显示微调前馈网络(FFN)比自注意模块实现更好的性能。此外,图1b 表明顶层的权重矩阵比底层的权重矩阵更重要

很自然的,有了这个问题:如何根据模块的重要性自适应地分配参数预算,以提高参数有效微调的性能?

为了回答这个问题,作者提出了 AdaLoRA(Adaptive Low-Rank Adaptation),他可以在 类 LoRA 方法 微调期间在权重矩阵之间动态地分配参数预算。

具体的,AdaLoRA 通过调节增量矩阵的秩来控制预算。

对比较重要的矩阵给予一个更高的秩,来捕获更细粒度和特定于任务的信息。

对于不太重要的矩阵给予一个低的秩,防止过拟合和节约预算。

大多数算法直接计算矩阵奇异值分解(SVD),然后截断最小奇异值。这样的操作可以显式地操纵秩。但是对于大规模模型,SVD 很昂贵。因此,我们不需要精确计算SVD,而是通过参数化 Δ 为 Δ = PΛQ 来模拟 SVD。为了正则化 P 和 Q 的正交性,向训练损失添加额外的惩罚。这样的参数化避免了 SVD 的密集计算。另外,该方法的另一个优点是只需要去掉不重要的奇异值,而保持奇异向量不变。这就保留了未来恢复的可能性,并稳定了训练。

基于我们的 SVD 参数化,AdaLoRA 通过重要性评分来动态调整 Δ = PVQ 的秩。

具体地说,我们将增量矩阵 PΛQ 划分为三元组,其中每个三元组 G i G_i Gi 包含第 i 个奇异值和对应的奇异向量。

为了量化三元组的重要性,我们提出了一种新的重要性度量,该度量考虑了 G i G_i Gi 中每个条目对模型性能的贡献的报告。

具有低重要性分数的三元组被授予低优先级,因此奇异值被置零。具有高重要性的三元组被保留以进行微调。

此外,我们还提出了一个全局预算计划,以促进训练。特别是,我们从一个比最终预算略高的初始参数预算开始,然后逐渐降低,直到与目标相匹配。这种调度器可以提高训练的稳定性和模型的性能。

我们对各种任务和模型进行了广泛的实验,以证明 AdaLoRA 的有效性。具体地,我们使用 DeBERTaV 3-base 在自然语言理解(GLUE)和问答(SQuADv 1 和 SQuADv 2)数据集上。我们还将我们的方法应用于BART-large,并评估自然语言生成(XSum 和 CNN/DailyMail)任务的性能。我们发现 AdaLoRA 始终优于基线,特别是在低预算设置下。例如,与最先进的方法相比,AdaLoRA 在 SQuAD2.0 数据集上实现了不到 0.1% 的完全微调可训练参数的 1.2% F1改进。

3.背景

  1. 基于 Transformer 的模型
    1. MHA
    2. FFN
  2. LoRA
    1. h = W ( 0 ) x + ∆ x = W ( 0 ) x + B A x h = W^{(0)}x +∆x = W^{(0)}x +BAx h=W(0)x+x=W(0)x+BAx,

4.AdaLoRA 方法

AdaLoRA 有两个重要组件:

  1. 基于 SVD 的适应,该方法以奇异值分解的形式表示增量矩阵
  2. 重要性感知的 秩分配,根据我们新设计的重要性度量修剪冗余奇异值

1.SVD-Based Adaptation

作者提出参数化增量矩阵为

W = W ( 0 ) + ∆ = W ( 0 ) + P Λ Q , W = W^{(0)} +∆ = W^{(0)} +PΛQ, W=W(0)+=W(0)+PΛQ,

G i = { P ∗ i , λ i , Q i ∗ } G_i=\{P_{*i},\lambda_i,Q_{i*}\} Gi={Pi,λi,Qi}是包含第 i 个奇异值和向量的三元组。

Λ Λ Λ 采用 零初始化,P 和 Q 采用随机高斯初始化,确保 ∆ ∆ 最开始等于零

我们注意到,还可以将结构化剪枝 应用于 LoRA 以控制秩(即,在 W = W ( 0 ) + ∆ = W ( 0 ) + B A W = W^{(0)} +∆ = W^{(0)} +BA W=W(0)+=W(0)+BA 中修剪 BA 两次),

2.重要性感知的秩分配

在这里插入图片描述

其中,

  1. L ( P , E , Q ) = C ( P , E , Q ) + γ ∑ k = 1 n R ( P k , Q k ) L(P,E,Q)= C(P,E,Q)+ γ \sum^n_{k=1} R(P_k,Q_k) L(P,E,Q)=C(P,E,Q)+γk=1nR(Pk,Qk), γ γ γ 是正则化系数

  2. R ( P , Q ) = ∣ ∣ P T P − I ∣ ∣ F 2 + ∣ ∣ Q Q T − I ∣ ∣ F 2 R(P,Q)= ||P^T P − I|| ^2_ F + ||QQ ^T− I|| ^2_ F R(P,Q)=∣∣PTPIF2+∣∣QQTIF2

  3. C C C 是训练代价

  4. I ( w i j ) = ∣ w i j ∇ w i j L ∣ I(w_{ij})=|w_{ij}∇_{w_{ij}}L| I(wij)=wijwijL

  5. 如下
    在这里插入图片描述

  6. 如下

    在这里插入图片描述

7.如下

在这里插入图片描述

3.全局预算调度

如第1节所述,调整秩自然是为了控制低秩自适应上下文中的参数预算。因此,我们将预算 b ( t ) b^{(t)} b(t) 定义为所有增量矩阵的总秩,即,总奇异值的数量。

回想一下,预算分配是在微调期间迭代进行的。为了便于训练,我们提出了一个全局预算调度。

具体地,

我们从略高于目标预算 b ( t ) b^{(t)} b(t) 的初始预算 b ( 0 ) b^{(0)} b(0) 开始(例如,1.5乘以 b ( T ) b^{(T)} b(T))。我们将每个增量矩阵的初始秩设为 r = b ( 0 ) / n r = b^{(0)}/n r=b(0)/n

我们对 t i t_i ti 步骤的训练进行热身,然后遵循立方体调度来减少预算 b ( t ) b^{(t)} b(t),直到达到 b ( T ) b^{(T)} b(T)

最后,我们修正了最终的预算分布,并对 t f t_f tf步骤的模型进行了微调。

在这里插入图片描述

5.实验

1.各方法数据集的结果

在这里插入图片描述

2.相同参数量的效果比较(NLU)

在这里插入图片描述

3.相同参数量的效果比较(NLG)

在这里插入图片描述

4.与 LoRA 不同的预算水平的对比

在这里插入图片描述

5.AdaLoRA总是倾向于将更多的预算分配给FFN和顶层

在这里插入图片描述

6.训练细节

1.NLU

在这里插入图片描述

在这里插入图片描述

2.QA

在这里插入图片描述

在这里插入图片描述

3.NLG

在这里插入图片描述

在这里插入图片描述

4.训练成本

在这里插入图片描述

7.超参数微调

1.超参数

  1. 初始秩(initial rank)
    • 每个权重矩阵的初始低秩维度
    • 建议:
      • 通常为 16-32
      • 比传统 LoRA 稍大一些
      • 因为后续会自动裁剪,起始可以激进一些
  2. 目标压缩率(target compression radio)
    • 决定最终要压缩到的参数量
    • 建议
      • 通常 0.1-0.3 之间
      • 越小意味着越大的压缩力度
      • 需要根据具体任务和资源调整
  3. 重要性评估周期(importance evaluation interval)
    • 多少步进行一次重要性评估和秩调整
    • 建议:
      • 通常设置为 50-200 步
      • 太频繁会增加计算开销
      • 太稀疏可能错过优化机会
  4. 裁剪步长(pruning step)
    • 每次评估时裁剪的奇异值数量
    • 建议
      • 通常设置为 1-3
      • 较小的不常能获得更平滑的压缩过程
      • 但会增加总体训练时间

2.具体调参建议

  1. 初始配置建议:

    adalora_config = {"initial_rank": 24,# 初始秩"target_ratio": 0.2,"eval_interval": 100,"prune_step": 2,"target_modules": ["q_proj", "v_proj"]
    }
    
  2. 不同规模模型的参数建议

    • 中小型模型(7B以下):
      • initial_rank: 24-32
      • target_ratio: 0.2-0.3
      • eval_interval: 100
    • 大型模型(7B-70B):
      • initial_rank: 16-24
      • target_ratio: 0.1-0.2
      • eval_interval: 150
    • 超大模型(70B+):
      • initial_rank: 8-16
      • target_ratio: 0.05-0.1
      • eval_interval: 200
  3. 重要性度量设置

    • SVD 分解频率
      • 建议每 100-200 进行一次
    • 梯度敏感度计算
      • 使用最近 100-500 步的梯度信息

3.最佳实践和注意事项

  1. 训练阶段:
    • 第一阶段:先用较大的 initial rank 训练一段时间
    • 第二阶段:开始逐步压缩,直到达到目标压缩率
    • 第三阶段:保持压缩率进行微调

2.关键优化建议:

  • 为不同层设置不同的 target-radio

    • 底层可以设置较大的比例(0.2-0.3)
    • 顶层可以设置较小的比例(0.1-0.2)
  • 调整重要性评估策略

    • 可以考虑基于验证集性能
    • 或者使用 Fisher 信息矩阵

    Fisher 信息矩阵 I ( θ ) I(\theta) I(θ) 表示的是模型参数 θ \theta θ 的 Fisher 信息,它定义为对数似然函数的二阶导数(即 Hessian 矩阵)的期望值,或等价地,它可以被视为似然函数的曲率矩阵:

    I ( θ ) = − E [ ∂ 2 log ⁡ L ( θ ) ∂ θ 2 ] I(\theta) = - \mathbb{E} \left[ \frac{\partial^2 \log L(\theta)}{\partial \theta^2} \right] I(θ)=E[θ22logL(θ)]

    这里, L ( θ ) L(\theta) L(θ) 是似然函数, θ \theta θ 是模型的参数, E \mathbb{E} E 表示期望

  1. 常见问题解决
    1. 如果训练不稳定
      1. 降低裁剪不常
      2. 增加评估间隔
    2. 如果压缩效果不理想
      1. 调整初始秩
      2. 放缓压缩速度
      3. 重新评估目标压缩率

4. 在 Hugging Face 中

  1. 核心参数

    from peft import AdaLoraConfigadalora_config = AdaLoraConfig(init_r=12,                  # 初始秩target_r=4,                 # 目标秩beta1=0.85,                 # 重要性评估的momentumbeta2=0.85,                 # 自适应学习的momentumtarget_modules=["q_proj", "v_proj"],importance_measure="approximate_fish", # 重要性度量方法
    )
    
  2. 主要参数建议

    1. init_r 和 target_r

      • 小模型:init_r=16, target_r=8
      • 中型模型:init_r=12, target_r=4
      • 大模型:init_r=8, target_r=2
    2. importance_measure

      # 建议配置
      importance_measure="approximate_fish"  # 更快
      # 或
      importance_measure="weight_norm"      # 更稳定
      
    3. feedback_interval

      # 每多少步更新一次重要性
      feedback_interval=100  # 小数据集
      feedback_interval=500  # 大数据集
      

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

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

相关文章

带你搞懂红黑树的插入和删除

文章目录 1. 红黑树1.1 红黑树的概念1.2 红黑树的性质1.3 红黑树节点的定义1.4 红黑树的插入找到插入的位置调节平衡 1.5 红黑树的删除删除节点平衡调整 1.6 红黑树和AVL树的比较 1. 红黑树 1.1 红黑树的概念 红黑树也是一种二叉搜索树,但是在每一个节点上增加了一个存储位表…

揭秘全向轮运动学:机动艺术与上下位机通信的智慧桥梁

✨✨ Rqtz 个人主页 : 点击✨✨ 🌈Qt系列专栏:点击 🎈Qt智能车上位机专栏: 点击🎈 本篇文章介绍的是有关于全向轮运动学分析,单片机与上位机通信C代码以及ROS里程计解算的内容。 目录 大纲 ROS(机器人操作系统&…

移远通信推出八款天线新品,覆盖5G、4G、Wi-Fi和LoRa领域

近日,全球领先的物联网整体解决方案供应商移远通信宣布,再次推出八款高性能天线新品,进一步丰富其天线产品阵容,更好地满足全球客户对高品质天线的更多需求。具体包括5G超宽带天线YECT005W1A和YECT004W1A、5G天线YECT028W1A、4G天…

【设计模式系列】桥接模式(十三)

一、什么是桥接模式 桥接模式(Bridge Pattern)是一种结构型设计模式,其核心目的是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式主要用于处理那些在设计时无法确定实现细节的场合,或者需要在多个实现之间…

Java多态和继承(下篇)

今天接着学习多态和继承 目录 1 继承1.1 再谈初始化1.2 protect关键字1.3 继承方式1.4 final 关键字1.5 组合 2 多态2.1 多态的概念2.2 多态实现条件2.3 重写2.4 向上转型和向下转型2.4.1 向上转型2.4.2 向下转型 2.5 多态的优缺点2.6 避免在构造方法中使用重写的方法 总结 1 继…

动态规划理论基础和习题【力扣】【算法学习day.25】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴&am…

数据结构之顺序表(C语言)

1 线性表 线性表是n个具有相同特性的数据元素的有限序列,是一种在实际中广泛应用的数据结构,常见的线性表有:顺序表、链表、栈、队列、字符串等。 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是…

Qt——窗口

一.窗口概述 Qt 窗口是通过 QMainWindow 类来实现的。 QMainWindow是一个为用户提供主窗口程序的类,继承QWidget类,并且提供一个预定义的布局。包含一个菜单栏(menu bar),多个工具栏(tool bars&#xff0…

长亭那个检测能力超强的 WAF,出免费版啦

告诉你们一个震撼人心的消息,那个检测能力超强的 WAF——长亭雷池,他推出免费社区版啦,体验地址见文末。 八年前我刚从学校毕业,在腾讯做安全研究,看到宇森在 BlackHat 上演讲的议题 《永别了,SQL 注入》 …

漏洞分析 | Spring Framework路径遍历漏洞(CVE-2024-38816)

漏洞概述 VMware Spring Framework是美国威睿(VMware)公司的一套开源的Java、JavaEE应用程序框架。该框架可帮助开发人员构建高质量的应用。 近期,网宿安全演武实验室监测到Spring Framework在特定条件下,存在目录遍历漏洞&…

tp接口 入口文件 500 错误原因

一、描述 二、可能的原因 1、runtime目录没权限 2、关闭了Tp记录日志的功能 3、关闭debug调试模式 4、关闭了debug模式还是报错 一、描述 Thinkphp项目本地正常,上传到线上后静态文件访问正常,访问tp接口报500错误。 经调试发现,在php入…

第07章 运算符的使用

一、算数运算符 算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达式,对数值或表达式进行加 ()、减(-)、乘(*)、除(/)和取模(%&a…

十七 MyBatis的注解式开发

十七、MyBatis的注解式开发 mybatis中也提供了注解式开发方式,采用注解可以减少Sql映射文件的配置。 当然,使用注解式开发的话,sql语句是写在java程序中的,这种方式也会给sql语句的维护带来成本。 官方是这么说的: 使…

用 Python 写了一个天天酷跑(附源码)

Hello,大家好,给大家说一下,我要开始装逼了 这期写个天天酷跑玩一下叭! 制作一个完整的“天天酷跑”游戏涉及很多方面,包括图形渲染、物理引擎、用户输入处理、游戏逻辑等。由于Python是一种高级编程语言,…

Kettle——CSV文件转换成excel文件输出

1.点击—文件—新建—转换 拖入两个组件: 按shift+鼠标左击建立连接,并点击主输出步骤, 点击CSV文件输入,选择浏览的csv文件,然后点击确定 同样,Excel也同上,只是要删除这个xls 并…

高效管理iPhone存储:苹果手机怎么删除相似照片

在使用iPhone的过程中,我们经常会遇到存储空间不足的问题,尤其是当相册中充满了大量相似照片时。这些照片不仅占用了宝贵的存储空间,还可能使iPhone出现运行卡顿的情况。因此,我们迫切需要寻找苹果手机怎么删除相似照片的方法&…

用示例来看C2Rust工具的使用和功能介绍

C2Rust可以将C语言的源代码转换成Rust语言的源代码。下面是一个简单的C语言代码示例&#xff0c;以及使用c2Rust工具将其转换为Rust安全代码的过程。 C语言源代码示例 // example.c #include <stdio.h>int add(int a, int b) {return a b; }int main() {int result a…

赛普EAP平台 Download.aspx 任意文件读取漏洞复现

0x01 产品描述&#xff1a; ‌赛普EAP平台‌是一款专门为房地产企业打造的数字化管理系统&#xff0c;旨在帮助企业实现业务流程的优化、管理效率的提升和客户体验的改善。该系统集成了项目管理、销售管理、客户关系管理、财务管理、报表分析等多个模块&#xff0c;能够满足企业…

前端三件套-css

一、元素选择器 元素选择器&#xff1a;利用标签名称。p,h1-h6...... 行内样式&#xff08;内联样式&#xff09;&#xff1a;例如<p style"color:red;font-size:50px"> id选择器&#xff1a;针对某一个特定的标签来使用。以#定义。 class&#xff08;类&a…

服务器被攻击排查记录

起因 我的深度学习的所有进程突然被killed&#xff0c;我以为是检修&#xff0c;后面发现好像简单的python代码可以正常运行。但是我的训练进程一启动就会被killed 第一时间没有用htop查看cpu&#xff0c;用top看着挺正常的&#xff0c;但是后面看htop&#xff0c;全是绿的&a…