Hugging Face PEFT 新 LoRA 合併方法

Hugging Face 已將多種新合併方法整合至 PEFT 函式庫,讓開發者能結合同一基礎模型衍生的多個 LoRA 適配器。此更新可即時合成模型能力,使單一合併後的適配器能執行需要多個專門適配器結合知識的任務。

支援的 LoRA 合併方法

PEFT 現在支援多種合併演算法,每種演算法以不同方式處理適配器權重(矩陣 $A$ 與 $B$),以在效能與記憶體使用之間取得平衡。

連接(cat

連接是 LoRA 適配器的精確加權合併。它會將參與的適配器的 $A$ 與 $B$ 矩陣串接起來,允許它們具有不同的秩。雖然此方法通常能產生優異結果,但結合大量適配器可能導致適配器尺寸增大,甚至出現記憶體不足(OOM)錯誤。

線性/任務算術(linear

此方法基於《Editing Models with Task Arithmetic》論文,對各自的 $A$ 與 $B$ 矩陣執行加權求和。此做法要求所有參與的 LoRA 適配器具有相同的秩。

奇異值分解(svd

SVD 將乘積 $BA$(增量權重)視為任務權重。它先計算合併後的增量權重,然後使用 SVD 近似出新的 $A$ 與 $B$ 矩陣。此方法支援不同秩的適配器,且允許使用者指定合併後適配器的秩,然而它對 GPU 記憶體需求較高。

TIES(ties, ties_svd

TIES(TRIM, ELECT SIGN & MERGE)在合併模型時解決干擾問題。它會根據 density 比例剪除任務權重中最小的值,計算多數符號遮罩(使用 total 幅度或 frequency 符號頻率),並執行不相交的合併。此方法提供標準版與 SVD 變體兩種形式。

DARE(dare_linear, dare_ties, dare_linear_svd, dare_ties_svd

DARE 會根據 1-density 比例隨機剪除任務權重,並以 1/density 重新縮放剩餘的權重。DARE 作為插件,可與線性/任務算術或 TIES 方法結合使用。

大小剪枝(magnitude_prune, magnitude_prune_svd

此方法根據 density 比例剪除任務權重中最小的值,然後對剩餘的任務張量執行加權求和。提供標準版與 SVD 變體兩種形式。

實作與功能

使用者可透過 PEFT 中的 add_weighted_adapter() 類別方法實作這些合併方式。

結合專業能力

合併適配器可讓模型支援單一適配器無法單獨處理的使用情境。例如,將「心理健康」適配器與「Hinglish」(印地語-英語)語言適配器結合,即可讓模型以 Hinglish 提供具體的心理健康建議;而單獨的適配器只能以英文提供建議,或僅以 Hinglish 的語言風格呈現,卻缺乏專業知識。

擴展至文字生成影像

這些合併方法同樣適用於透過 🤗Diffusers 函式庫的文字生成影像。透過從 LoRA 檢查點取得 PeftModel,並使用 add_weighted_adapter(),使用者可結合不同風格或主題的 LoRA(例如將「toy-face」LoRA 與「Pixel-Art」LoRA 合併),以產生同時具備兩種特徵的圖像。

技術觀察與建議

根據 Hugging Face 的測試,以下指南建議用於選擇合併方法:

  • 起始點: 在大多數情況下,若適配器數量較少,建議先使用 cat 方法以獲得最佳結果。
  • 替代線性方法:cat 無法滿足需求,依序嘗試 linearmagnitude_prunedare_linear。對於 magnitude_prunedare_linear,建議將 density 設為 0.7 至 0.8 之間。
  • TIES 設定: 使用 ties 時,majority_sign_method="frequency" 通常比預設的 total 表現更佳。建議的起始 density 為 0.5。
  • SVD 變體: 在處理不同秩的 Stable Diffusion LoRA 適配器時,請使用 *svd 系列方法。需注意 SVD 計算成本高且需要更多 GPU 記憶體。
  • DARE 效能: 觀察到 dare_ties 變體未能產生良好結果。

Sources