PEFT 文件
FourierFT: 離散傅立葉變換微調
並獲得增強的文件體驗
開始使用
FourierFT: 離散傅立葉變換微調
FourierFT 是一種引數高效微調技術,它利用離散傅立葉變換來壓縮模型的可調權重。這種方法在 GLUE 基準測試和常見的 ViT 分類任務中,使用更少的引數就超越了 LoRA。
FourierFT 目前有以下限制:
- 僅支援 `nn.Linear` 層。
- 不支援量化層。
如果這些限制不適用於您的用例,請考慮使用其他方法。
論文摘要如下:
低秩自適應 (LoRA) 最近在基礎模型微調領域引起了廣泛關注。它透過引入低秩矩陣 A 和 B 來表示權重變化(即 Delta W = BA),從而有效減少了可訓練引數的數量。儘管 LoRA 取得了進展,但在處理大量定製化適配或更大的基礎模型時,它仍面臨儲存挑戰。在這項工作中,我們旨在透過利用傅立葉變換強大的表達能力來進一步壓縮可訓練引數。具體來說,我們引入了 FourierFT,它將 Delta W 視為空域中的一個矩陣,並只學習其一小部分頻譜系數。透過訓練得到的頻譜系數,我們實現逆離散傅立葉變換來恢復 Delta W。從經驗上看,我們的 FourierFT 方法在各種任務(包括自然語言理解、自然語言生成、指令微調和影像分類)中,以更少的引數表現出與 LoRA 相當或更好的效能。例如,在 LLaMA2-7B 模型上進行指令微調時,FourierFT 僅用 0.064M 可訓練引數就超越了 LoRA 的 33.5M。
FourierFTConfig
class peft.FourierFTConfig
< 源 >( 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 n_frequency: int = 1000 scaling: float = 150.0 random_loc_seed: Optional[int] = 777 fan_in_fan_out: bool = False target_modules: Optional[Union[list[str], str]] = None exclude_modules: Optional[Union[list[str], str]] = None bias: str = 'none' modules_to_save: Optional[list[str]] = None layers_to_transform: Optional[Union[list[int], int]] = None layers_pattern: Optional[Union[list[str], str]] = None n_frequency_pattern: Optional[dict] = <factory> init_weights: bool = False )
引數
- n_frequency (
int
) — 離散傅立葉變換中可學習的頻率數量。“n_frequency”是一個大於 0 且小於等於 d^2 的整數(假設權重 W 的維度為 d x d)。此外,它也是更新每個 delta W 權重所需的可訓練引數數量。“n_frequency”會影響 PEFT 的效能和效率。具體來說,它對訓練速度影響不大,但其值越高,通常會導致更大的 GPU 視訊記憶體成本和更好的準確性。在相同的 `target_modules` 下,LoRA 的引數數量是 FourierFT 的 (2*d*r/n_frequency) 倍。以下關於“n_frequency”的設定示例可供使用者參考。對於 RoBERTa-large 模型的 NLU 任務,採用“n_frequency”:1000 幾乎可以達到與 LoRA 中“r”:8 相似的結果。此時,LoRA 的引數數量大約是 FourierFT 的 16 倍。對於 Vit-large 模型的影像分類任務,採用“n_frequency”:3000 幾乎可以達到與 LoRA 中“r”:16 相似的結果,其中 LoRA 的引數數量大約是 FourierFT 的 11 倍。 - scaling (
float
) — delta W 矩陣的縮放值。這是一個重要的超引數,用於縮放,類似於 LoRA 方法中的“lora_alpha”引數。“scaling”可以在超引數搜尋過程中確定。但是,如果使用者想跳過此過程,可以參考以下場景中的設定。對於所有 NLU (GLUE) 任務,RoBERTa-base 和 RoBERTa-large 模型均可將此引數設定為 100.0 或 150.0。對於所有指令微調任務,LLaMA 家族模型均可將此引數設定為 300.0。對於所有影像分類任務,ViT-base 和 ViT-large 模型均可將此引數設定為 300.0。 - random_loc_seed (
int
) — 用於頻率隨機位置(即頻譜條目矩陣)的種子。 - target_modules (
Union[list[str],str]
) — 要替換為 FourierFT 的模組名稱列表或模組名稱的正則表示式。例如,['q', 'v'] 或 '.*decoder.*(SelfAttention|EncDecAttention).*(q|v)$'。僅支援線性層。 - exclude_modules (
Optional[Union[List[str], str]]
) — 不應用介面卡的模組名稱。當傳遞字串時,將進行正則表示式匹配。當傳遞字串列表時,將進行精確匹配或檢查模組名稱是否以任何傳遞的字串結尾。 - fan_in_fan_out (
bool
) — 如果要替換的層儲存權重的形式為 (fan_in, fan_out),則設定為 True。 - bias (
str
) — FourierFT 的偏置型別。可以是 'none'、'all' 或 'fourier_only'。 - modules_to_save (
list[str]
) — 除了 FourierFT 層之外,需要設定為可訓練並在最終檢查點中儲存的模組列表。例如,在序列分類或詞元分類任務中,最後一層 `classifier/score` 是隨機初始化的,因此需要設定為可訓練並儲存。 - layers_to_transform (
Union[list[int],int]
) — 要轉換的層索引,如果指定此引數,PEFT 將僅轉換此列表中指定的層索引。如果傳遞單個整數,PEFT 將僅轉換該索引處的層。 - layers_pattern (
Optional[Union[List[str], str]]
) — 層的模式名稱,僅在 `layers_to_transform` 不為 None 且層模式不在常見層模式中時使用。這應該針對模型的 `nn.ModuleList`,通常稱為 `'layers'` 或 `'h'`。 - n_frequency_pattern (
dict
) — 從層名稱或正則表示式到 n_frequency 的對映,這些 n_frequency 與指定的預設值不同。例如,`{model.decoder.layers.0.encoder_attn.k_proj: 1000}`。 - init_weights (
bool
) — 傅立葉權重的初始化。如果頻譜初始化為標準正態分佈,則設定為 False。如果頻譜初始化為零,則設定為 True。
這是用於儲存 FourierFTModel 配置的配置類。
FourierFTModel
class peft.FourierFTModel
< 源 >( 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 (FourierFTConfig) — FourierFT 模型的配置。
- adapter_name (
str
) — 介面卡的名稱,預設為 `"default"`。 - low_cpu_mem_usage (
bool
,optional
, 預設為False
) — 在元裝置上建立空的介面卡權重。有助於加快載入過程。
返回
torch.nn.Module
FourierFT 模型。
從預訓練的 transformers 模型建立 FourierFT 模型。
該方法在 https://huggingface.co/papers/2405.03003 中有詳細描述。
屬性:
- model (
PreTrainedModel
) — 需要被適配的模型。 - peft_config (FourierFTConfig): Fourier 模型的配置。
刪除一個現有的介面卡。
merge_and_unload
< 源 >( progressbar: bool = False safe_merge: bool = False adapter_names: Optional[list[str]] = None )
此方法將傅立葉層合併到基礎模型中。如果有人想將基礎模型用作獨立模型,則需要此操作。
設定活動的介面卡。
透過移除所有傅立葉模組而不合並,恢復基礎模型。這會返回原始的基礎模型。