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
从预训练的 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
在方法内部处理。