PEFT documentation
DEFT: Decompositional Efficient Fine-Tuning для моделей «текст в изображение»
DEFT: Decompositional Efficient Fine-Tuning для моделей «текст в изображение»
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 выводится из P в соответствии с decomposition_method:
"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]]) — Имена модулей, к которым следует применить адаптер. Если это значение указано, будут заменены только модули с указанными именами. При передаче строки выполняется сопоставление по регулярному выражению. При передаче списка строк выполняется точное совпадение или проверяется, заканчивается ли имя модуля каким-либо из переданных строк. Если это значение указано как ‘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(аналогично alpha в LoRA). ЕслиNone, масштабирование не применяется (коэффициент1.0). Член удаления подпространства не затрагивается. - para (
bool) — Использовать ли метод PaRa: чистое удаление подпространства (delta = -P_proj @ W) без инъекционного члена. ЕслиTrue,Rне создаётся,Pявляется единственной обучаемой матрицей, и адаптер не может быть тождественным при инициализации. По умолчаниюFalse(полный DEFT). - fan_in_fan_out (
bool) — Установите это значение вTrue, если заменяемый слой хранит веса в формате (fan_in, fan_out). Например, 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 выводится из P в соответствии с decomposition_method:
"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, по умолчаниюFalse) — Создаёт пустые веса адаптера на meta-устройстве. Полезно для ускорения процесса загрузки.
Возвращает
torch.nn.Module
Модель DEFT.
Создаёт модель DEFT (Decompositional Efficient Fine-Tuning) на основе предобученной модели.
DEFT замораживает базовые веса и обучает, для каждого целевого модуля, направление низкорангового проецирования P и матрицу инъекции R. Эффективный вес становится (I - P_proj) @ W + Q_P @ R, заменяя подпространство W на вновь введённое содержимое (см. DeftConfig для доступных вариантов decomposition_method).
Атрибуты:
- model (
~torch.nn.Module) — Модель, подлежащая адаптации. - peft_config (DeftConfig): конфигурация модели DEFT.