PEFT 文档
AdaLoRA
并获取增强的文档体验
开始使用
AdaLoRA
AdaLoRA 是一种优化可训练参数数量以分配给权重矩阵和层的方法,与 LoRA 不同,后者将参数均匀分布在所有模块中。 AdaLoRA 为重要的权重矩阵和层分配更多参数预算,而不太重要的矩阵和层则获得较少的参数。
论文摘要如下:
在下游任务上微调大型预训练语言模型已成为 NLP 中的重要范式。然而,常见的做法是微调预训练模型中的所有参数,当存在大量下游任务时,这变得令人望而却步。因此,提出了许多参数高效的微调方法来学习预训练权重的增量更新,例如,低秩增量。这些方法通常在所有预训练权重矩阵之间均匀分配增量更新的预算,而忽略了不同权重参数的不同重要性。因此,微调性能是次优的。为了弥合这一差距,我们提出了 AdaLoRA,它根据权重矩阵的重要性评分自适应地分配权重矩阵之间的参数预算。特别是,AdaLoRA 以奇异值分解的形式参数化增量更新。这种新颖的方法使我们能够有效地修剪不重要更新的奇异值,这本质上是减少它们的参数预算,但避免了密集的精确 SVD 计算。我们对自然语言处理、问题解答和自然语言生成进行了广泛的实验,以验证 AdaLoRA 的有效性。结果表明,AdaLoRA 表现出比基线显着的改进,尤其是在低预算设置中。我们的代码已公开在 https://github.com/QingruZhang/AdaLoRA.
AdaLoraConfig
class peft.AdaLoraConfig
< source >( 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'] = 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 layer_replication: Optional[list[tuple[int, int]]] = None runtime_config: LoraRuntimeConfig = <factory> lora_bias: bool = False 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
< source >( model config adapter_name ) → torch.nn.Module
从预训练的 transformers 模型创建 AdaLoRA (Adaptive 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 budget 和 mask。
应在每个训练步骤中的 loss.backward()
之后和 zero_grad()
之前调用此方法。
tinit
、tfinal
和 deltaT
在方法中处理。