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

王林
發布: 2024-04-13 08:07:05
轉載
1100 人瀏覽過

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

因此,北京大学的研究团队提出了一种名为 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中文網其他相關文章!

相關標籤:
來源:jiqizhixin.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板