PEFT 文件

透過 Householder 反射自適應 (HRA) 彌合低秩自適應與正交自適應之間的差距

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

透過 Householder 反射自適應 (HRA) 彌合低秩自適應與正交自適應之間的差距

HRA 是一種簡單而有效的基於介面卡的微調方法,它利用了 Householder 反射。該方法利用了兩種策略的優勢,減少了引數和計算成本,同時抑制了預訓練知識的損失。它在不同模型(包括大型語言模型 (LLM) 和條件影像生成器)上,以更少的可訓練引數持續獲得更好的效能,並優於最先進的介面卡。

論文摘要如下:

儘管遵循不同的技術路線,低秩自適應和正交自適應技術都可以基於少量可訓練引數,有效地將大規模預訓練模型應用於特定任務或領域。在本研究中,我們彌合了這兩種技術之間的差距,提出了一種基於 Householder 反射的簡單而有效的自適應方法。給定一個預訓練模型,我們的方法透過將每個凍結的權重矩陣與一個由一系列可學習的 Householder 反射 (HR) 構建的正交矩陣相乘來對其層進行微調。這種基於 HR 的正交微調等效於自適應的低秩自適應。此外,我們表明,與 HR 對應的反射平面的正交性會影響模型的容量和正則性。該分析促使我們對 HR 的正交性進行正則化,從而產生了我們提出的 Householder 反射自適應 (HRA) 方法的不同實現。與最先進的方法相比,HRA 在自適應大型語言模型和條件影像生成器時,以更少的可學習引數取得了卓越的效能。程式碼可在 peftHRA 獲取。

HRAConfig

class peft.HRAConfig

< >

( task_type: typing.Union[str, peft.utils.peft_types.TaskType, NoneType] = None peft_type: typing.Union[str, peft.utils.peft_types.PeftType, NoneType] = None auto_mapping: typing.Optional[dict] = None base_model_name_or_path: typing.Optional[str] = None revision: typing.Optional[str] = None inference_mode: bool = False r: int = 8 apply_GS: bool = False target_modules: Optional[Union[list[str], str]] = None exclude_modules: Optional[Union[list[str], str]] = None init_weights: bool = True layers_to_transform: Optional[Union[list[int], int]] = None layers_pattern: Optional[Union[list[str], str]] = None bias: str = 'none' modules_to_save: Optional[list[str]] = None )

引數

  • r (int) — HRA 在不同層之間的秩。最好將“r”設定為偶數;否則,預設的初始化方法將無法工作。
  • apply_GS (bool) — 是否應用 Gram-Schmidt 正交化。
  • target_modules (Optional[Union[List[str], str]]) — 應用介面卡的模組名稱。如果指定,只有具有指定名稱的模組才會被替換。當傳遞字串時,將執行正則表示式匹配。當傳遞字串列表時,將執行精確匹配,或者檢查模組名稱是否以任何傳遞的字串結尾。如果指定為“all-linear”,則選擇所有線性模組,不包括輸出層。如果未指定,將根據模型架構選擇模組。如果架構未知,將引發錯誤——在這種情況下,您應該手動指定目標模組。
  • exclude_modules (Optional[Union[List[str], str]]) — 不應用介面卡的模組名稱。當傳遞字串時,將執行正則表示式匹配。當傳遞字串列表時,將執行精確匹配,或者檢查模組名稱是否以任何傳遞的字串結尾。
  • init_weights (bool) — 是否執行 HRA 權重的初始化。
  • layers_to_transform (Union[List[int], int]) — 要轉換的層索引。如果傳遞一個整數列表,它將把介面卡應用於此列表中指定的層索引。如果傳遞單個整數,它將對該索引處的層應用轉換。
  • layers_pattern (Optional[Union[List[str], str]]) — 層模式名稱,僅在 layers_to_transform 不為 None 時使用。這應針對模型的 nn.ModuleList,通常稱為 'layers''h'
  • modules_to_save (List[str]) — 除了介面卡層之外,要設定為可訓練並儲存在最終檢查點中的模組列表。

這是用於儲存 HRAModel 配置的配置類。

HRAModel

class peft.HRAModel

< >

( model peft_config: Union[PeftConfig, dict[str, PeftConfig]] adapter_name: str low_cpu_mem_usage: bool = False state_dict: Optional[dict[str, torch.Tensor]] = None ) torch.nn.Module

引數

  • model (torch.nn.Module) — 將附加介面卡調諧器層的模型。
  • config (HRAConfig) — HRA 模型的配置。
  • adapter_name (str) — 介面卡的名稱,預設為 "default"
  • low_cpu_mem_usage (bool, optional, 預設為 False) — 在元裝置上建立空的介面卡權重。有助於加快載入過程。

返回

torch.nn.Module

HRA 模型。

從預訓練模型建立 Householder 反射自適應 (HRA) 模型。該方法在 https://huggingface.co/papers/2405.17484 中有描述。

示例

>>> from diffusers import StableDiffusionPipeline
>>> from peft import HRAModel, HRAConfig

>>> config_te = HRAConfig(
...     r=8,
...     target_modules=["k_proj", "q_proj", "v_proj", "out_proj", "fc1", "fc2"],
...     init_weights=True,
... )
>>> config_unet = HRAConfig(
...     r=8,
...     target_modules=[
...         "proj_in",
...         "proj_out",
...         "to_k",
...         "to_q",
...         "to_v",
...         "to_out.0",
...         "ff.net.0.proj",
...         "ff.net.2",
...     ],
...     init_weights=True,
... )

>>> model = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
>>> model.text_encoder = HRAModel(model.text_encoder, config_te, "default")
>>> model.unet = HRAModel(model.unet, config_unet, "default")

屬性:

  • model (~torch.nn.Module) — 將要被適配的模型。
  • peft_config (HRAConfig): HRA 模型的配置。

delete_adapter

< >

( adapter_name: str )

引數

  • adapter_name (str) — 要刪除的介面卡名稱。

刪除一個現有的介面卡。

merge_and_unload

< >

( progressbar: bool = False safe_merge: bool = False adapter_names: typing.Optional[list[str]] = None )

引數

  • progressbar (bool) — 是否顯示指示解除安裝和合並過程的進度條
  • safe_merge (bool) — 是否啟用安全合併檢查以檢查介面卡權重中是否存在任何潛在的 NaN
  • adapter_names (List[str], optional) — 應合併的介面卡名稱列表。如果為 None,則將合併所有活動的介面卡。預設為 None

此方法將 HRA 層合併到基礎模型中。如果有人想將基礎模型用作獨立模型,則需要這樣做。

unload

< >

( )

透過移除所有 hra 模組而不進行合併,恢復基礎模型。這將恢復原始的基礎模型。

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.