PEFT documentation

Сокращение разрыва между адаптацией с низким рангом и ортогональной адаптацией с помощью адаптации через отражения Хаусхолдера (HRA)

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

Сокращение разрыва между адаптацией с низким рангом и ортогональной адаптацией с помощью адаптации через отражения Хаусхолдера (HRA)

Bridging The Gap between Low-rank and Orthogonal Adaptation via Householder Reflection Adaptation

HRA предлагает новый взгляд, связывающий LoRA и OFT, что позволяет использовать преимущества обеих стратегий, применяя Householder reflections для сокращения числа параметров и вычислительных затрат при одновременном штрафе за потерю знаний, полученных на этапе предварительного обучения. Метод стабильно обеспечивает более высокую производительность при меньшем количестве обучаемых параметров и превосходит передовые адаптеры на различных моделях, включая большие языковые модели (LLM) и условные генераторы изображений.

HRA строит цепочку из r обучаемых отражений Хаусхолдера (HR). Поскольку матрица отражения Хаусхолдера является ортогональной, а произведение ортогональных матриц также ортогонально, HRA удовлетворяет теоретическому гарантированному условию Orthogonal Finetuning (OFT). При этом HRA можно рассматривать как адаптер для дообучения с низким рангом. Чем выше r, тем больше обучаемых параметров, что приводит к большей ёмкости модели и лучшему качеству. Кроме того, благодаря цепной структуре ортогональность плоскостей HR влияет на ёмкость и регуляризацию HRA. Для достижения баланса между ёмкостью модели и регуляризацией к функции потерь добавляется регуляризатор ортогональности плоскостей HR. Весλ\lambda позволяет контролировать силу регуляризатора.

Аннотация из статьи:

Хотя низкоранговые и ортогональные методы адаптации следуют различным техническим путям, оба они позволяют эффективно адаптировать модели крупномасштабного предобучения под конкретные задачи или области на основе небольшого набора обучаемых параметров. В данной работе мы устраняем разрыв между этими двумя подходами, предлагая простой, но эффективный метод адаптации на основе отражений Хаусхолдера. Для данной предобученной модели наш метод выполняет дообучение её слоёв, умножая каждую замороженную матрицу весов на ортогональную матрицу, построенную цепочкой обучаемых отражений Хаусхолдера (HR). Это ортогональное дообучение на основе HR эквивалентно адаптивной низкоранговой адаптации. Кроме того, мы показываем, что ортогональность плоскостей отражения, соответствующих HR, влияет на ёмкость и регуляризацию модели. Этот анализ побуждает нас регуляризовать ортогональность HR, что приводит к различным реализациям предложенного метода адаптации на основе отражений Хаусхолдера (HRA). По сравнению с методами, демонстрирующими наилучшие результаты, HRA обеспечивает превосходное качество при меньшем количестве обучаемых параметров при адаптации больших языковых моделей и условных генераторов изображений. Код доступен в peft и HRA.

API

HRAConfig

класс peft.HRAConfig

< >

( 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 = 8apply_GS: bool = Falsetarget_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Noneinit_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) — Ранг HRA для разных слоёв. Лучше всего устанавливать ‘r’ в чётное число; в противном случае метод инициализации по умолчанию не будет работать.
  • apply_GS (bool) — Следует ли применять ортогонализацию Грама–Шмидта.
  • target_modules (Optional[Union[List[str], str]]) — Имена модулей, к которым следует применить адаптер. Если это значение указано, будут заменены только модули с указанными именами. При передаче строки выполняется сопоставление по регулярному выражению. При передаче списка строк выполняется точное совпадение или проверяется, заканчивается ли имя модуля каким-либо из переданных строк. Если это значение указано как ‘all-linear’, выбираются все линейные модули, за исключением выходного слоя. Если это значение не указано, модули выбираются в соответствии с архитектурой модели. Если архитектура неизвестна, будет выброшена ошибка — в этом случае следует указать целевые модули вручную.
  • exclude_modules (Optional[Union[List[str], str]]) — Имена модулей, к которым не следует применять адаптер. При передаче строки выполняется сопоставление по регулярному выражению. При передаче списка строк выполняется точное совпадение или проверяется, заканчивается ли имя модуля каким-либо из переданных строк.
  • init_weights (bool) — Выполнять ли инициализацию весов HRA.
  • layers_to_transform (Union[List[int], int]) — Индексы слоёв, подлежащих трансформации. Если передан список целых чисел, адаптер будет применён к слоям с индексами, указанными в этом списке. Если передано одно целое число, трансформации будут применены к слою с этим индексом.
  • layers_pattern (Optional[Union[List[str], str]]) — Имя шаблона слоя, используется только в том случае, если layers_to_transform отличается от None. Этот параметр должен указывать на nn.ModuleList модели, который часто называется 'layers' или 'h'.
  • bias (str) — Тип смещения для HRA. Может быть 'none', 'all' или 'hra_only'.
  • modules_to_save (List[str]) — Список модулей, помимо адаптерных слоёв, которые нужно сделать обучаемыми и сохранить в итоговой контрольной точке.

Это класс конфигурации для хранения настроек модели HRAModel.

HRAModel

класс peft.HRAModel

< >

( 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 (HRAConfig) — конфигурация модели HRA.
  • adapter_name (str) — имя адаптера, по умолчанию "default".
  • low_cpu_mem_usage (bool, optional, по умолчанию False) — Создаёт пустые веса адаптера на meta-устройстве. Полезно для ускорения процесса загрузки.

Возвращает

torch.nn.Module

Модель HRA.

Создаёт модель адаптации Householder reflection adaptation (HRA) на основе предобученной модели. Метод описан в https://huggingface.co/papers/2405.17484

Пример:

>>> from diffusers import StableDiffusionPipeline
>>> from peft import HRAModel, HRAConfig

>>> config_te = HRAConfig(
...     r=8,
...     target_modules=["k_proj", "q_proj", "v_proj", "out_proj", "fc1", "fc2"],
...     init_weights=True,
... )
>>> config_unet = HRAConfig(
...     r=8,
...     target_modules=[
...         "proj_in",
...         "proj_out",
...         "to_k",
...         "to_q",
...         "to_v",
...         "to_out.0",
...         "ff.net.0.proj",
...         "ff.net.2",
...     ],
...     init_weights=True,
... )

>>> model = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
>>> model.text_encoder = HRAModel(model.text_encoder, config_te, "default")
>>> model.unet = HRAModel(model.unet, config_unet, "default")

Атрибуты:

  • model (~torch.nn.Module) — Модель, подлежащая адаптации.
  • peft_config (HRAConfig): конфигурация модели HRA.
Update on GitHub