PEFT documentation
DeLoRA:解耦低秩适配
DeLoRA:解耦低秩适配
DeLoRA 是一种参数高效微调技术,通过对可学习的低秩矩阵进行归一化和缩放,隐式地维护相对于预训练权重的 Frobenius 边界。这有效地解耦了权重更新的方向(BA 项)和幅度(边界项)的学习,避免了适配权重发生灾难性偏移,并增强了对超参数选择的鲁棒性。
注意:
- 使用比标准 LoRA 变体大 10 到 100 倍的学习率(典型值从 1e-3/1e-2/.. 开始)
- 确保初始边界参数 lambda 不要过小(典型值约为 10/15/..)。可以为不同的层设置不同的 lambda
DeLoRA 目前存在以下限制:
- 仅支持 nn.Linear 层。
- 不支持量化层。
如果这些约束条件不适用于您的使用场景,请考虑采用其他方法。
该论文的摘要如下:
参数高效微调(PEFT)方法近期因大规模预训练模型的广泛可用而获得了显著的关注。这些方法能够以极低的计算成本快速适配下游任务。然而,诸如 LoRA 等流行的微调方法在超参数选择或延长训练设置方面表现出有限的鲁棒性,从而阻碍了开箱即用的最佳性能。相比之下,有界方法(如 ETHER)提供了更高的鲁棒性,但仅限于极低秩适配和固定强度的变换,这降低了其适配表达能力。在本工作中,我们提出了解耦低秩适配(DeLoRA),这是一种新颖的微调方法,用于对可学习的低秩矩阵进行归一化和缩放。通过限制变换的距离,DeLoRA 有效地将角度学习与适配强度解耦,从而在不牺牲性能的情况下增强了鲁棒性。通过在主题驱动图像生成、自然语言理解和指令微调上的评估,我们表明 DeLoRA 在性能上匹配或超越了竞争性的 PEFT 方法,同时表现出更强的鲁棒性。
基准测试概览
API
DeloraConfig
类 peft.DeloraConfig
< source >( task_type: Optional[Union[str, TaskType]] = Nonepeft_type: Optional[Union[str, PeftType]] = Noneauto_mapping: Optional[dict] = Nonepeft_version: Optional[str] = Nonebase_model_name_or_path: Optional[str] = Nonerevision: Optional[str] = Noneinference_mode: bool = Falser: int = 8delora_lambda: int = 15module_dropout: float = 0.0target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonebias: Literal['none', 'all', 'delora_only'] = 'none'init_weights: bool = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Nonerank_pattern: Optional[dict] = <factory>lambda_pattern: Optional[dict] = <factory>modules_to_save: Optional[list[str]] = None )
参数
- r (
int) — DeLoRA 适配器的秩。 - delora_lambda (
int) — DeLoRA 适配器边界的初始值。该变量为权重变化的 Frobenius 范数设置上限,避免微调后的模型偏离原始模型过多。 - module_dropout (
float) — 训练期间禁用 DeLoRA 模块的 dropout 概率。 - target_modules (
Optional[Union[List[str], str]]) — 要应用适配器(adapter)的模块名称。如果指定了此参数,则只有名称匹配的模块会被替换。传入字符串时,将执行正则表达式匹配。传入字符串列表时,将执行精确匹配,或检查模块名称是否以列表中的任一字符串结尾。如果指定为 ‘all-linear’,则选择所有 linear/Conv1D 模块,但不包括输出层。如果未指定,将根据模型架构选择模块。如果架构未知,则会引发错误——在这种情况下,应手动指定目标模块。 - exclude_modules (
Optional[Union[List[str], str]]) — 不应用适配器的模块名称。传入字符串时,将执行正则表达式匹配。传入字符串列表时,将执行精确匹配,或检查模块名称是否以传入的任一字符串结尾。 - bias (
str) — DeLoRA 的偏置类型。可以是 ‘none’、‘all’ 或 ‘delora_only’。如果设置为 ‘all’ 或 ‘delora_only’,对应的偏置将在训练期间被更新。请注意,这意味着即使禁用了适配器,模型的输出也不会与未进行适配的基础模型相同。 - init_weights (
bool) — 是否执行适配器权重的初始化。如果为True(默认值):A 使用 kaiming uniform 初始化,而 B 初始化为零。如果为False:A 和 B 均使用 kaiming uniform 初始化,从而立即产生非零的增量。通常不建议在常规使用中采用此设置。 - layers_to_transform (
Union[List[int], int]) — 要转换的层索引。如果传入一个整数列表,则会将适配器应用于该列表中指定的层索引。如果传入单个整数,则会对该索引处的层应用转换。 - layers_pattern (
Optional[Union[List[str], str]]) — 层模式名称,仅在layers_to_transform不同于None时使用。它应指向模型的nn.ModuleList,该列表通常命名为'layers'或'h'。 - rank_pattern (
dict) — 从层名称或正则表达式到与r指定的默认 rank 不同的 rank 的映射。例如,{'^model.decoder.layers.0.encoder_attn.k_proj': 16}。 - lambda_pattern (
dict) — 从层名称或正则表达式到与delora_lambda指定的默认 lambda 不同的 lambda 的映射。例如,{'^model.decoder.layers.0.encoder_attn.k_proj': 16}。 - modules_to_save (
Optional[List[str]]) — 除适配器层外,需要设置为可训练并在最终检查点中保存的模块列表。
这是用于存储 DeloraModel 配置的类。
DeloraModel
类 peft.DeloraModel
< source >( modelpeft_config: Union[PeftConfig, dict[str, PeftConfig]]adapter_name: strlow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict[str, torch.Tensor]] = None ) → torch.nn.Module
参数
- model (
torch.nn.Module) — 要适配的模型。 - config (DeloraConfig) — DeLoRA 模型的配置。
- adapter_name (
str) — 适配器的名称,默认为"default"。
返回值
torch.nn.Module
DeLoRA 模型。
从预训练的 transformers 模型创建 DeLoRA 模型。
该方法在DeLoRA: Decoupled Low-rank Adaptation中有详细描述。
属性:
- model (PreTrainedModel) — 要适配的模型。
- peft_config (DeloraConfig): DeLoRA 模型的配置。