PEFT 文档

AdaLoRA

Hugging Face's logo
加入 Hugging Face 社区

并获得增强型文档体验

开始使用

AdaLoRA

AdaLoRA 是一种优化分配给权重矩阵和层的可训练参数数量的方法,与 LoRA 将参数均匀分布到所有模块不同,AdaLoRA 为重要的权重矩阵和层分配更多参数,而对于不太重要的则分配较少的参数。

论文摘要如下:

在自然语言处理 (NLP) 中,对大型预训练语言模型进行下游任务的微调已成为一种重要的范式。然而,常见的做法是微调预训练模型中的所有参数,当存在大量下游任务时,这将变得非常耗费资源。因此,许多微调方法被提出,以参数高效的方式学习预训练权重的增量更新,例如低秩增量。这些方法通常将增量更新的预算平均分配到所有预训练权重矩阵中,而忽略了不同权重参数的重要性差异。结果导致微调性能欠佳。为了弥合这一差距,我们提出了 AdaLoRA,它根据权重矩阵的重要性得分自适应地分配参数预算。特别是,AdaLoRA 以奇异值分解的形式参数化增量更新。这种新颖的方法使我们能够有效地修剪不重要更新的奇异值,这本质上是减少其参数预算,但避免了密集的精确 SVD 计算。我们使用几个预训练模型在自然语言处理、问答和自然语言生成方面进行了大量实验,以验证 AdaLoRA 的有效性。结果表明,AdaLoRA 在基线方法上表现出显著的改进,尤其是在低预算设置下。我们的代码已公开发布在 https://github.com/QingruZhang/AdaLoRA.

AdaLoraConfig

class peft.AdaLoraConfig

< >

( peft_type: Union = None auto_mapping: Optional = None base_model_name_or_path: Optional = None revision: Optional = None task_type: Union = None inference_mode: bool = False r: int = 8 target_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', 'olora', 'pissa', 'pissa_niter_[number of iters]', 'loftq'] = True layers_to_transform: Optional[Union[list[int], int]] = None layers_pattern: Optional[Union[list[str], str]] = None rank_pattern: Optional = None alpha_pattern: Optional[dict] = <factory> megatron_config: Optional[dict] = None megatron_core: Optional[str] = 'megatron.core' loftq_config: Union[LoftQConfig, dict] = <factory> use_dora: bool = False layer_replication: Optional[list[tuple[int, int]]] = None runtime_config: LoraRuntimeConfig = <factory> 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: Optional = 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 配置的配置类。

AdaLoraModel

class peft.AdaLoraModel

< >

( model config adapter_name ) torch.nn.Module

参数

  • model ([transformers.PreTrainedModel]) — 要适配的模型。
  • config ([AdaLoraConfig]) — AdaLora 模型的配置。
  • low_cpu_mem_usage (bool, 可选, 默认为 False) — 在元设备上创建空的适配器权重。有助于加快加载过程。

返回值

torch.nn.Module

AdaLora 模型。

从预训练的 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 模型的配置。

add_weighted_adapter

< >

( *args **kwargs )

此方法不适用于 AdaLoRA,请改用 LoRA。

update_and_allocate

< >

( global_step )

参数

  • global_step (int) — 当前训练步数,用于计算 adalora 预算。

此方法更新 Adalora 预算和掩码。

loss.backward() 之后和 zero_grad() 之前,应在每个训练步骤中调用此方法。

tinittfinaldeltaT 在方法内部处理。

示例

>>> loss = model(**input).loss
>>> loss.backward()
>>> optimizer.step()
>>> model.base_model.update_and_allocate(i_step)
>>> optimizer.zero_grad()
< > 在 GitHub 上更新