首页 科技周边 人工智能 改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果

改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果

Apr 13, 2024 am 08:07 AM
git 工程 北京大学 pissa

随着大模型的参数量日益增长,微调整个模型的开销逐渐变得难以接受。

因此,北京大学的研究团队提出了一种名为 PiSSA 的参数高效微调方法,在主流数据集上都超过了目前广泛使用的 LoRA 的微调效果。

改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果

  • 论文: PiSSA: Principal Singular Values and Singular Vectors Adaptation of Large Language Models

  • 论文链接: https://arxiv.org/pdf/2404.02948.pdf

  • 代码链接: https://github.com/GraphPKU/PiSSA

图1显示,PiSSA(图1c)在模型架构上和LoRA [1] 完全一致(图1b),只是初始化Adapter的方式不同。 LoRA 使用高斯噪声初始化A,使用0初始化B。而PiSSA 使用主奇异值和奇异向量(Principal Singular values and Singular vectors)来初始化Adapter 来初始化A 和 B。

改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果

图1展示了从左到右依次为全参数微调、LoRA和PiSSA。蓝色代表冻结的参数,橙色代表可训练参数及其它的初始化方式。相比全参数微调,LoRA和PiSSA都大幅减少可训练参数量。对于相同输入,这三种方法的初始输出完全相等。然而,PiSSA冻结模型的次要部分,直接微调主要部分(前r个奇异值和奇异向量);而LoRA可看作冻结模型的主要部分,去微调noise部分。

在不同的任务上对比PiSSA、LoRA 的微调效果

研究团队使用llama 2-7B、Mistral-7B 以及Gemma- 7B 作为基础模型,通过微调提升它们的数学、代码和对话能力。其中包括:在MetaMathQA 上训练,在GSM8K 和MATH 数据集上验证模型的数学能力;在CodeFeedBack 上训练,在HumanEval 和MBPP 数据集上验证模型的代码能力;在WizardLM-Evol-Instruct 上训练,在MT -Bench 上验证模型的对话能力。从下表的实验结果可以看出,使用相同规模的可训练参数,PiSSA 的微调效果显着超越了 LoRA,甚至超越了全参数微调。

改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果

对比PiSSA、LoRA 在不同的可训练参数量下微调的效果

研究团队在数学任务上对模型的可训练参数量和效果之间的关系进行消融实验。从图 2.1 发现在训练初期,PiSSA 的训练 loss 下降特别快,而 LoRA 存在不下降,甚至略有上升的阶段。此外,PiSSA 的训练loss 全程低于LoRA,说明对训练集拟合得更好;从图2.2、2.3、2.4 可以看出在每种setting 下,PiSSA 的loss 始终比LoRA 低,准确率始终比LoRA高,PiSSA 能够使用更少的可训练参数追赶上全参数微调的效果。

改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果

图 2.1) 当秩为 1 时 PiSSA、LoRA 在训练过程中的 loss。每幅图的右上角是前 100 步迭代放大的曲线。其中 PiSSA 用橙色线表示,LoRA 用蓝色线表示,全参数微调用绿线展示了最终的 loss 作为参考。秩为 [2,4,8,16,32,64,128] 时的现象与此一致,详见文章附录。

改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果

                                  图2.2)使用秩为[1,2,4,8,16,32,64,128] 的PiSSA和LoRA 的最终training loss。

改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果

                                   图2.3)使用秩为[1,2,4,8,16,32,64,128] 的PiSSA和LoRA 微调的模型在GSM8K 上的准确率。

改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果

                                       图2.4)使用秩为[1,2,4,8,16,32,64,128] 的PiSSA和LoRA 微调的模型在MATH 上的准确率。

PiSSA 方法详解

受到 Intrinsic SAID [2]“预训练大模型参数具有低秩性” 的启发,PiSSA 对预训练模型的参数矩阵改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果进行奇异值分解,其中前 r 个奇异值和奇异向量用来初始化适配器 (adapter) 的两个矩阵改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果;剩余的奇异值和奇异向量用来构造残差矩阵改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果,使得改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果。因此,适配器中的参数包含了模型的核心参数,而残差矩阵中的参数是修正参数。通过微调参数量较小的核心适配器 A、B,冻结参数量较大的残差矩阵改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果,就达成了用很少的参数近似全参数微调的效果。

尽管同样受到 Intrinsic SAID [1] 启发,PiSSA 和 LoRA 背后的原理却截然不同。

LoRA 认为大模型微调前后矩阵的变化 △W 具有很低的本征秩 r,因此通过改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果相乘得到的低秩矩阵来模拟模型的变化 △W。初始阶段,LoRA 使用高斯噪声初始化 A,使用 0 初始化 B,因此改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果,以此保证模型初始能力没有变化,并微调 A 和 B 实现对 W 进行更新。与此相比,PiSSA 不关心 △W,而是认为 W 具有很低的本征秩 r。因此直接对 W 进行奇异值分解,分解成主成分 A、B,以及残差项改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果,使得改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果。假设 W 的奇异值分解为改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果,A、B 使用 SVD 分解后奇异值最大的 r 个奇异值、奇异向量进行初始化:

改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果

残差矩阵使用其余的奇异值、奇异向量进行初始化:

改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果

PiSSA 直接对 W 的低秩主成分 A、B 进行微调,冻结次要的修正项。相比 LoRA 用高斯噪声以及 0 初始化适配器参数、冻结核心模型参数,PiSSA 收敛更快、效果更好。

PiSSA 的发音类似 “披萨”(pizza)--- 如果把整个大模型类比为一个完整的披萨,PiSSA 切掉其中一角,而且是馅料最丰富的一角(主奇异值、奇异向量),重新烘焙(在下游任务上微调)成喜欢的口味。

由于 PiSSA 采用了和 LoRA 完全相同的架构,其可以作为 LoRA 的一种可选初始化方式,在 peft 包中很方便的进行修改和调用 (如以下代码所示)。相同的架构也使得 PiSSA 继承了大多数 LoRA 的优点,如:对残差模型使用 4bit 量化 [3],减小训练开销;微调完成后适配器能合并进残差模型,不改变推理过程的模型架构;无需分享完整模型参数,只需要分享参数量很少的 PiSSA 模块,使用者直接加载 PiSSA 模块就能自动进行奇异值分解以及赋值;一个模型可以同时使用多个 PiSSA 模块等等。一些对 LoRA 方法的改进,也能与 PiSSA 进行结合:比如不固定每层的秩,通过学习找到最佳的秩 [4];用 PiSSA 指导的更新 [5],从而突破秩的限制等等。

# 在 peft 包中 LoRA 的初始化方式后面增加了一种 PiSSA 初始化选项:if use_lora:nn.init.normal_(self.lora_A.weight, std=1 /self.r)nn.init.zeros_(self.lora_B.weight) elif use_pissa:Ur, Sr, Vr = svd_lowrank (self.base_layer.weight, self.r, niter=4) # 注意:由于 self.base_layer.weight 的维度是 (out_channel,in_channel, 所以 AB 的顺序相比图示颠倒了一下)self.lora_A.weight = torch.diag (torch.sqrt (Sr)) @ Vh.t ()self.lora_B.weight = Ur @ torch.diag (torch.sqrt (Sr))   self.base_layer.weight = self.base_layer.weight - self.lora_B.weight @ self.lora_A.weight
登录后复制

对比高中低奇异值微调效果实验

为了验证使用不同大小奇异值、奇异向量初始化适配器对模型的影响,研究人员分别使用高、中、低奇异值初始化 LLaMA 2-7B、Mistral-7B-v0.1、Gemma-7B 的适配器,然后在 MetaMathQA 数据集上进行微调,实验结果展示在图 3 中。从图中可以看出,使用主要奇异值初始化的方法训练损失最小,在 GSM8K 和 MATH 验证集上的准确率更高。这一现象验证了微调主要奇异值、奇异向量的有效性。

改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果

图 3)从左到右依次为训练 loss、在 GSM8K 上的准确率、在 MATH 上的准确率。其中蓝色表示最大奇异值、橙色表示中等奇异值、绿色表示最小奇异值。

快速奇异值分解

PiSSA 继承了 LoRA 的优点,使用起来方便,效果超越 LoRA。代价是在初始化阶段,需要对模型进行奇异值分解。虽然仅需要在初始化时分解一次,但是仍然可能需要几分钟甚至几十分钟的开销。因此,研究人员使用一种快速奇异值分解 [6] 方法替代标准的 SVD 分解,通过下表的实验可以看出,仅需几秒钟的时间,就能逼近标准 SVD 分解的训练集拟合效果。其中 Niter 表示迭代次数,Niter 越大,时间越久但是误差越小。Niter = ∞表示标准 SVD。表格中的平均误差表示快速奇异值分解与标准 SVD 得到的 A、B 之间的平均 L_1 距离。

改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果

总结与展望

本工作对预训练模型的权重进行奇异值分解,通过将其中最重要的参数用于初始化一个名为 PiSSA 的适配器,微调这个适配器来近似微调完整模型的效果。实验表明,PiSSA 比 LoRA 收敛更快,最终效果更好,唯一的代价仅是需要几秒的 SVD 初始化过程。

那么,您愿意为了更好的训练效果,多花几秒钟时间,一键更改 LoRA 的初始化为 PiSSA 吗?

参考文献

[1] LoRA: Low-Rank Adaptation of Large Language Models

[2] Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning

[3] QLoRA: Efficient Finetuning of Quantized LLMs

[4] AdaLoRA: Adaptive Budget Allocation for Parameter-Efficient Fine-Tuning

[5] Delta-LoRA: Fine-Tuning High-Rank Parameters with the Delta of Low-Rank Matrices

[6] Finding structure with randomness: Probabilistic algorithms for constructing approximate matrix decompositions

以上是改变LoRA的初始化方式,北大新方法PiSSA显着提升微调效果的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
威尔R.E.P.O.有交叉游戏吗?
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

git怎么删除仓库 git怎么删除仓库 Apr 17, 2025 pm 04:03 PM

要删除 Git 仓库,请执行以下步骤:确认要删除的仓库。本地删除仓库:使用 rm -rf 命令删除其文件夹。远程删除仓库:导航到仓库设置,找到“删除仓库”选项,确认操作。

git commit怎么用 git commit怎么用 Apr 17, 2025 pm 03:57 PM

Git Commit 是一种命令,将文件变更记录到 Git 存储库中,以保存项目当前状态的快照。使用方法如下:添加变更到暂存区域编写简洁且信息丰富的提交消息保存并退出提交消息以完成提交可选:为提交添加签名使用 git log 查看提交内容

git下载不动怎么办 git下载不动怎么办 Apr 17, 2025 pm 04:54 PM

解决 Git 下载速度慢时可采取以下步骤:检查网络连接,尝试切换连接方式。优化 Git 配置:增加 POST 缓冲区大小(git config --global http.postBuffer 524288000)、降低低速限制(git config --global http.lowSpeedLimit 1000)。使用 Git 代理(如 git-proxy 或 git-lfs-proxy)。尝试使用不同的 Git 客户端(如 Sourcetree 或 Github Desktop)。检查防火

git服务器怎么连接公网 git服务器怎么连接公网 Apr 17, 2025 pm 02:27 PM

将 Git 服务器连接到公网包括五个步骤:1. 设置公共 IP 地址;2. 打开防火墙端口(22、9418、80/443);3. 配置 SSH 访问(生成密钥对、创建用户);4. 配置 HTTP/HTTPS 访问(安装服务端、配置权限);5. 测试连接(使用 SSH 客户端或 Git 命令)。

git代码冲突怎么处理 git代码冲突怎么处理 Apr 17, 2025 pm 02:51 PM

代码冲突是指当多个开发者修改同一段代码导致 Git 合并时无法自动选择更改而出现的冲突。解决步骤包括:打开有冲突的文件,找出冲突代码。手动合并代码,将要保留的更改复制到冲突标记内。删除冲突标记。保存并提交更改。

git怎么下载项目到本地 git怎么下载项目到本地 Apr 17, 2025 pm 04:36 PM

要通过 Git 下载项目到本地,请按以下步骤操作:安装 Git。导航到项目目录。使用以下命令克隆远程存储库:git clone https://github.com/username/repository-name.git

如何解决PHP项目中的高效搜索问题?Typesense助你实现! 如何解决PHP项目中的高效搜索问题?Typesense助你实现! Apr 17, 2025 pm 08:15 PM

在开发一个电商网站时,我遇到了一个棘手的问题:如何在大量商品数据中实现高效的搜索功能?传统的数据库搜索效率低下,用户体验不佳。经过一番研究,我发现了Typesense这个搜索引擎,并通过其官方PHP客户端typesense/typesense-php解决了这个问题,大大提升了搜索性能。

git提交后怎么回退 git提交后怎么回退 Apr 17, 2025 pm 01:06 PM

要回退 Git 提交,可以使用 git reset --hard HEAD~N 命令,其中 N 代表要回退的提交数量。详细步骤包括:确定要回退的提交数量。使用 --hard 选项以强制回退。执行命令以回退到指定的提交。

See all articles