PEFT 文件
AdaLoRA
並獲得增強的文件體驗
開始使用
AdaLoRA
AdaLoRA 是一種最佳化方法,用於確定分配給權重矩陣和層的可訓練引數數量。與 LoRA 在所有模組間均勻分配引數不同,AdaLoRA 為重要的權重矩陣和層分配更多引數,而次要的則分配較少。
論文摘要如下:
在下游任務上微調大型預訓練語言模型已成為自然語言處理(NLP)領域的重要正規化。然而,當存在大量下游任務時,微調預訓練模型的所有引數的做法變得不切實際。因此,人們提出了許多微調方法,以引數高效的方式學習預訓練權重的增量更新,例如低秩增量。這些方法通常將增量更新的預算均勻地分配給所有預訓練的權重矩陣,而忽略了不同權重引數的重要性差異。結果導致微調效能不佳。為了解決這個問題,我們提出了 AdaLoRA,它根據權重矩陣的重要性得分,自適應地分配引數預算。具體來說,AdaLoRA 以奇異值分解(SVD)的形式對增量更新進行引數化。這種新穎的方法使我們能夠有效地修剪不重要更新的奇異值,這本質上是減少了它們的引數預算,但避免了高昂的精確 SVD 計算。我們透過在自然語言處理、問答和自然語言生成任務上對多個預訓練模型進行廣泛實驗,驗證了 AdaLoRA 的有效性。結果表明,AdaLoRA 相較於基線方法有顯著提升,尤其是在低預算設定下。我們的程式碼已在 https://github.com/QingruZhang/AdaLoRA 公開。.
AdaLoraConfig
class peft.AdaLoraConfig
< 原始碼 >( 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 target_modules: Optional[Union[list[str], str]] = None exclude_modules: Optional[Union[list[str], str]] = None lora_alpha: int = 8 lora_dropout: float = 0.0 fan_in_fan_out: bool = False bias: Literal['none', 'all', 'lora_only'] = 'none' use_rslora: bool = False modules_to_save: Optional[list[str]] = None init_lora_weights: bool | Literal['gaussian', 'eva', 'olora', 'pissa', 'pissa_niter_[number of iters]', 'corda', 'loftq', 'orthogonal'] = True layers_to_transform: Optional[Union[list[int], int]] = None layers_pattern: Optional[Union[list[str], str]] = None rank_pattern: typing.Optional[dict] = None alpha_pattern: Optional[dict] = <factory> megatron_config: Optional[dict] = None megatron_core: Optional[str] = 'megatron.core' trainable_token_indices: Optional[Union[list[int], dict[str, list[int]]]] = None loftq_config: Union[LoftQConfig, dict] = <factory> eva_config: Optional[EvaConfig] = None corda_config: Optional[CordaConfig] = None use_dora: bool = False use_qalora: bool = False qalora_group_size: int = 16 layer_replication: Optional[list[tuple[int, int]]] = None runtime_config: LoraRuntimeConfig = <factory> lora_bias: bool = False target_parameters: Optional[list[str]] = None target_r: int = 8 init_r: int = 12 tinit: int = 0 tfinal: int = 0 deltaT: int = 1 beta1: float = 0.85 beta2: float = 0.85 orth_reg_weight: float = 0.5 total_step: typing.Optional[int] = None )
引數
- target_r (
int
) — 增量矩陣的目標平均秩。 - init_r (
int
) — 每個增量矩陣的初始秩。 - tinit (
int
) — 初始微調預熱的步數。 - tfinal (
int
) — 最終微調的步數。 - deltaT (
int
) — 兩次預算分配之間的時間間隔。 - beta1 (
float
) — 用於敏感度平滑的 EMA 超引數。 - beta2 (
float
) — 用於不確定性量化的 EMA 超引數。 - orth_reg_weight (
float
) — 正交正則化的係數。 - total_step (
int
) — 應在訓練前指定的總訓練步數。 - rank_pattern (
list
) — 由 RankAllocator 分配給每個權重矩陣的秩。
這是用於儲存 ~peft.AdaLora
配置的配置類。
AdaLoRA 有三個由 tinit
、tfinal
和 total_step
定義的階段。
初始階段可以理解為對介面卡進行預訓練的步驟,這樣當降低它們的秩時,已經有一些資訊被編碼,可以被縮減,而不是隨機矩陣。這個階段透過提供 tinit
來定義。
在初始階段結束後(經過 tinit
步)且最終階段尚未開始時,AdaLoRA 會在每一步中減少分配給每一層的秩預算。這是秩縮減發生的地方。這個過程會持續到達到 total_step - tfinal
步。
最後一個階段,從達到 total_step - tfinal
步開始,不再改變層的秩,而是對前一階段產生的降秩層進行微調。
一個實際例子:tinit
是 10,tfinal
是 20,total_step
是 100。我們將花費 10 步進行不進行秩縮減的預訓練,因為我們的預算是恆定的(初始階段);然後,我們將在縮減階段花費 80(100-20)步,期間我們的預算逐步減少;最後,在不進行縮減的最終微調階段花費 20 步。
AdaLoraModel
class peft.AdaLoraModel
< 原始碼 >( model config adapter_name **kwargs ) → torch.nn.Module
從預訓練的 transformers 模型建立 AdaLoRA(自適應 LoRA)模型。論文:https://openreview.net/forum?id=lq62uWRJjiY
示例
>>> from transformers import AutoModelForSeq2SeqLM >>> from peft import LoraConfig, AdaLoraModel, AdaLoraConfig
>>> config = AdaLoraConfig(
peft_type="ADALORA", task_type="SEQ_2_SEQ_LM", init_r=12, lora_alpha=32, target_modules=["q", "v"],
lora_dropout=0.01,
)
>>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base") >>> model = AdaLoraModel(model, config, "default")
屬性:
- model ([transformers.PreTrainedModel]) — 待適配的模型。
- peft_config ([AdaLoraConfig]): AdaLora 模型的配置。
AdaLoRA 不支援此方法,請改用 LoRA。
此方法更新 Adalora 預算和掩碼。
應在每個訓練步中,在 loss.backward()
之後和 zero_grad()
之前呼叫此方法。
tinit
、tfinal
和 deltaT
都在該方法內部處理。