PEFT documentation
DEFT:面向文本到图像模型的分解式高效微调
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
< 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 = 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
< 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 (DeftConfig) — DEFT 模型的配置。
- adapter_name (
str) — 适配器的名称,默认为"default"。 - low_cpu_mem_usage (
bool,optional, defaults toFalse) — 在 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 模型的配置。