PEFT documentation

DEFT:面向文本到图像模型的分解式高效微调

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.21.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

DEFT:面向文本到图像模型的分解式高效微调

DEFT(Decompositional Efficient Fine-Tuning)是一种面向文本到图像模型的参数高效微调方法。它将冻结权重矩阵 W 的更新分解为两个可训练组件:一个用于从 W 中移除低秩子空间的投影,以及一个用于向该子空间注入新内容的低秩更新。该公式旨在平衡与目标分布的对齐、从少量图像中学习新概念(个性化),以及保留预训练模型的指令遵循能力和可编辑性。

具体而言,DEFT 结合了两个可训练的低秩组件:(1) 投影到低秩矩阵所张成的低秩子空间的补空间上,以及 (2) 低秩更新。第一个低秩矩阵定义了该子空间,而第二个则允许在该子空间内进行灵活的参数适配。

何时使用 DEFT:它最适合在保留甚至提升基础模型的指令遵循能力的同时,将模型对先前能力的遗忘降至最低,从而将模型适配到新的数据或概念。

对于每个目标层,DEFT 会学习一个投影方向 P(形状为 out_features x r)和一个注入矩阵 R(形状为 r x in_features)。有效权重是残差投影

W' = (I - P_proj) @ W + Q_P @ R

投影器 P_proj 根据 decomposition_method 从 P 推导得出:

  • "relu"(默认值):Q_P = P,P_proj = P @ relu(P).T — 一种非正交投影。
  • "qr": Q_P = qr(P), P_proj = Q_P @ Q_P.T — 正交投影。

(I - P_proj) @ W 项会移除预训练权重中的一个子空间,而 Q_P @ R 则向其中注入新的内容。 默认情况下(init_weights=True),R 的初始化方式使得更新在初始化时恰好为单位变换 (W' == W),因此训练从预训练权重开始,并学习注入过程。该更新等价于一个 低秩加性增量 Q_P @ (R - right.T @ W),其计算过程无需构建 out x out 投影矩阵,并且可以合并到基础权重中,以实现免推理部署。

设置 para=True 可选择 PaRa(Parameter Rank Reduction,参数秩降低)变体:这是一种仅移除的更新 W' = (I - P_proj) @ W,仅保留子空间移除项并丢弃注入项。仅训练投影 P(没有注入矩阵 R),因此适配器在初始化时不是恒等映射。PaRa 最初是为个性化文本到图像扩散模型而提出的,在此作为 DEFT 的一个特例提供。

DEFT 目前适用于 torch.nn.Linear 和 Conv1D(例如 gpt-2,通过 fan_in_fan_out)层。原始实现以及论文中的实验(Dreambooth、Dreambench Plus、InsDet、VisualCloze,在 Stable Diffusion 和统一模型上)可在 github.com/MAXNORM8650/DEFT 上获取。

如果您在研究中使用 DEFT,请引用以下论文:

@article{kumar2026deft,
  title={DEFT: Decompositional Efficient Fine-Tuning for Text-to-Image Models},
  author={Kumar, Komal and Anwer, Rao and Shahbaz Khan, Fahad and Khan, Salman and Laptev, Ivan and Cholakkal, Hisham},
  journal={Advances in Neural Information Processing Systems},
  volume={38},
  pages={102009--102035},
  year={2026}
}

如果您使用的是 PaRa 变体(para=True),请同时引用:

@inproceedings{chen2025personalizing,
  title={Para: Personalizing text-to-image diffusion via parameter rank reduction},
  author={Chen, Shangyu and Pan, Zizheng and Cai, Jianfei and Phung, Dinh},
  booktitle={International Conference on Learning Representations},
  year={2025}
}

DeftConfig

类 peft.DeftConfig

< >

( 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 = 8target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonedecomposition_method: Literal['relu', 'qr'] = 'relu'init_scale: float = 1.0alpha: Optional[int] = Nonepara: bool = Falsefan_in_fan_out: bool = Falsedeft_dropout: float = 0.0init_weights: bool = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Nonebias: str = 'none'modules_to_save: Optional[list[str]] = None )

参数

  • r (int) — DEFT 投影/注入在各层之间的秩。
  • target_modules (Optional[Union[List[str], str]]) — 要应用适配器(adapter)的模块名称。如果指定了此参数,则只有名称匹配的模块会被替换。传入字符串时,将执行正则表达式匹配。传入字符串列表时,将执行精确匹配,或检查模块名称是否以列表中的任一字符串结尾。如果指定为 ‘all-linear’,则选择所有线性模块,但排除输出层。如果未指定,将根据模型架构选择模块。如果架构未知,则会引发错误——在这种情况下,应手动指定目标模块。
  • exclude_modules (Optional[Union[List[str], str]]) — 不应用适配器的模块名称。传入字符串时,将执行正则表达式匹配。传入字符串列表时,将执行精确匹配,或检查模块名称是否以传入的任一字符串结尾。
  • decomposition_method (str) — 投影器 P_proj 如何从 P 推导而来。可以是 "relu"(默认,非正交 P @ relu(P).T) 或 "qr"(正交 Q_P @ Q_P.T)。
  • init_scale (float) — 应用于用于初始化注入矩阵 R 的标准差的缩放因子(仅在 init_weights=False 时使用)。较小的值会使初始化时注入的更新更接近于零。默认为 1.0。
  • alpha (Optional[int]) — 注入项的缩放因子,其缩放比例为 alpha / r(类似于 LoRA 的 alpha)。如果为 None,则不应用缩放(因子为 1.0)。子空间移除项不受影响。
  • para (bool) — 是否使用 PaRa 方法:纯子空间移除(delta = -P_proj @ W),不包含注入项。当 True 时,不会创建 R,P 是唯一的可训练矩阵,且适配器在初始化时不能为单位矩阵。默认为 False(完整 DEFT)。
  • fan_in_fan_out (bool) — 如果待替换的层以 (fan_in, fan_out) 的形式存储权重,请将此项设置为 True。例如,gpt-2 使用的 Conv1D 以 (fan_in, fan_out) 的形式存储权重,因此应将其设置为 True。
  • deft_dropout (float) — 应用于层输入的 dropout 概率。默认值为 0.0。
  • init_weights (bool) — 是否使用 DEFT 的默认(恒等)初始化来初始化适配器权重,使适配器在训练开始时不产生任何影响。除非您完全清楚自己在做什么,否则请勿更改此设置。默认为 True。
  • layers_to_transform (Union[List[int], int]) — 要转换的层索引。如果传入一个整数列表,则会将适配器应用于该列表中指定的层索引。如果传入单个整数,则会对该索引处的层应用转换。
  • layers_pattern (Optional[Union[List[str], str]]) — 层模式名称,仅在 layers_to_transform 不同于 None 时使用。它应指向模型的 nn.ModuleList,该列表通常命名为 'layers' 或 'h'。
  • bias (str) — DEFT 的偏置类型。可以是 'none'、'all' 或 'deft_only'。
  • modules_to_save (List[str]) — 除适配器层外,需要设置为可训练并在最终检查点中保存的模块列表。

这是用于存储 DeftModel 配置的类。

DEFT(Decompositional Efficient Fine-Tuning)通过残差投影更新执行知识注入。对于冻结的基础权重 W,会学习一个低秩投影方向 P(形状为 out_features x r)和一个注入矩阵 R(形状为 r x in_features)。适配后的权重为 W' = (I - P_proj) @ W + Q_P @ R,其中投影器 P_proj 根据 decomposition_method 从 P 推导得出:

  • "relu"(默认):Q_P = P,P_proj = P @ relu(P).T(非正交投影)
  • "qr": Q_P = qr(P), P_proj = Q_P @ Q_P.T(正交投影)

默认情况下(init_weights=True),R 的初始化方式使得在初始化时更新操作为精确的恒等变换(即适配后的权重等于 W),因此训练从预训练权重开始,并学习注入部分。

DeftModel

类 peft.DeftModel

< >

( 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 (DeftConfig) — DEFT 模型的配置。
  • adapter_name (str) — 适配器的名称,默认为 "default"。
  • low_cpu_mem_usage (bool, optional, defaults to False) — 在 meta 设备上创建空的适配器权重。有助于加快加载过程。

返回值

torch.nn.Module

DEFT 模型。

从预训练模型创建一个 DEFT(Decompositional Efficient Fine-Tuning)模型。

DEFT 冻结基础权重,并为每个目标模块学习一个低秩投影方向 P 和一个注入矩阵 R。有效权重变为 (I - P_proj) @ W + Q_P @ R,即用新注入的内容替换 W 的一个子空间(有关可用的 decomposition_method 变体,请参阅 DeftConfig)。

属性:

  • model (~torch.nn.Module) — 要适配的模型。
  • peft_config (DeftConfig): DEFT 模型的配置。
Update on GitHub