PEFT documentation

PEANuT: Параметрически эффективная адаптация с помощью нейронных твикеров, учитывающих веса

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

PEANuT: Параметрически эффективная адаптация с помощью нейронных твикеров, учитывающих веса

PEANuT — это метод эффективной дообучения, который вводит нейронные модули, учитывающие веса, для генерации обновлений адаптеров непосредственно из замороженных предобученных весов. В отличие от LoRA, где обучается чисто линейное обновление низкого ранга, PEANuT обуславливает преобразование адаптера базовыми весами, что делает правило обновления более выразительным при сохранении малого количества обучаемых параметров.

PEANuT использует входную проекцию A, выходную проекцию B и необязательные промежуточные пары резидуального кодировщика/декодировщика с нелинейными активациями. Это позволяет моделировать более сложные паттерны обновления, чем вес-агностические линейные адаптеры, оставаясь при этом в рамках подхода PEFT.

В настоящее время PEANuT имеет следующие компромиссы:

Преимущества:

  • Более высокая теоретическая выразительная способность по сравнению с линейными обновлениями низкого ранга.
  • Лучшая производительность по сравнению с LoRA на широком спектре задач при сопоставимых бюджетах.
  • Хорошо работает в режимах с очень малым числом параметров, например, около 0.2M обучаемых параметров.

Недостатки:

  • Потребление памяти выше, чем у LoRA, поскольку ΔW явно конструируется перед применением.
  • Обучение и инференс медленнее, чем в случае с LoRA, а более глубокие промежуточные слои дополнительно увеличивают накладные расходы.
  • Нелинейность может требовать более тщательной настройки гиперпараметров, в частности скорости обучения и связанных с ней параметров оптимизации.

Если эти компромиссы не подходят для вашего сценария использования, рассмотрите другие методы PEFT, такие как LoRA.

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

Дообучение крупных предобученных базовых моделей часто обеспечивает превосходные результаты на целевых задачах, однако обновление всех параметров сопряжено с неприемлемо высокими затратами. Методы параметрически эффективного дообучения (PEFT), такие как LoRA, смягчают эту проблему за счёт введения лёгких модулей обновления, однако они обычно опираются на линейные аппроксимации, не зависящие от весов, что ограничивает их выразительную способность. В данной работе мы предлагаем PEANuT — новый фреймворк PEFT, который вводит нейронные модули-«твикеры», учитывающие веса: компактные нейронные модули, генерирующие адаптивные к задаче обновления на основе замороженных предобученных весов. PEANuT обеспечивает гибкий и эффективный способ захвата сложных паттернов обновления без полного дообучения модели. Теоретически мы показываем, что PEANuT достигает эквивалентной или большей выразительной способности по сравнению с существующими линейными методами PEFT при сопоставимом или меньшем количестве параметров. Обширные эксперименты на четырёх бенчмарках с более чем двадцатью наборами данных демонстрируют, что PEANuT стабильно превосходит сильные базовые методы как в задачах NLP, так и в задачах компьютерного зрения, сохраняя при этом низкие вычислительные затраты.

Обзор бенчмарков

API

PeanutConfig

класс peft.PeanutConfig

< >

( 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 = 32depth: int = 0act_fn: str = 'relu'scaling: float = 1.0target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonemodules_to_save: Optional[list[str]] = Nonelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Noneinit_weights: bool = True )

Параметры

  • r (int) — ранг PEANuT. Это скрытое измерение, используемое адаптерами. Аналогично рангу LoRA, увеличение r повышает емкость адаптеров и количество обучаемых параметров.
  • depth (int) — Количество скрытых адаптерных слоёв на стороне энкодера/декодера в PEANuT. Входная проекция A и выходная проекция B всегда присутствуют в дополнение к этим скрытым слоям. Следовательно, depth должно быть неотрицательным целым числом.
    • depth=0: A, B.
    • depth=1: A, один энкодер, один декодер, B.
    • depth=2: A, два кодировщика, два декодер, B.
    • depth=3: A, три кодировщика, три декодера, B и т. д.
  • act_fn (str) — Нелинейная функция активации, применяемая в сети PEANuT. Соответствует non_linear в базовой реализации PyTorch. По умолчанию "relu". Поддерживаются любые ключи активаций, доступные в transformers.activations.ACT2FN, и они могут показывать лучшие результаты на разных задачах.
  • scaling (float) — Скалярный множитель, применяемый к выходу PEANuT перед добавлением к выходу замороженного базового слоя. Итоговый вклад адаптера составляет scaling * (x @ delta_w).
  • target_modules (Union[List[str], str], необязательный) — Имена модулей, к которым следует применить PEANuT. Может быть списком строк с именами модулей (например, ['q_proj', 'v_proj']) или регулярным выражением.
  • modules_to_save (List[str], необязательный) — Список модулей, помимо слоёв PEANuT, которые должны быть установлены как обучаемые и сохранены в итоговом контрольном пункте.
  • exclude_modules (Union[List[str], str], необязательный) — Имена модулей, к которым не следует применять адаптер. При передаче строки выполняется сопоставление по регулярному выражению. При передаче списка строк выполняется точное совпадение или проверяется, заканчивается ли имя модуля каким-либо из переданных строк.
  • layers_to_transform (Union[list[int], int], необязательный) — Индексы слоев, которые необходимо преобразовать. Если этот аргумент указан, PEFT преобразует только те индексы слоев, которые перечислены в этом списке. Если передано одно целое число, PEFT преобразует только слой с этим индексом.
  • layers_pattern (Optional[Union[List[str], str]], необязательный) — Имя шаблона слоя, используется только если layers_to_transform не равно None и если шаблон слоя отсутствует в общем шаблоне слоев.
  • init_weights (bool) — Инициализировать ли веса адаптера PEANuT с использованием схемы инициализации по умолчанию:
    • Если True: все веса, кроме B, инициализируются с помощью равномерного распределения Кайминга, а B инициализируется нулём.
    • Если False: все веса (включая B) инициализируются с помощью равномерного распределения Кайминга.

    Инициализация B нулями позволяет адаптеру начинать работу как точный no-op.

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

Примечания: PEANuT использует путь с учётом весов, где дельта-веса обусловлены базовыми весами. Адаптер A применяется к выходному измерению базовых весов, поэтому A имеет форму (out_dim -> r), а не обычную (in_dim -> r), используемую в методах типа LoRA.

PeanutModel

класс peft.PeanutModel

< >

( 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 (PeanutConfig) — конфигурация модели PEANuT.
  • adapter_name (str) — имя адаптера, по умолчанию "default".

Возвращает

torch.nn.Module

Модель PEANuT PEFT.

Создаёт модель PEANuT на основе предобученной модели transformers.

Метод подробно описан в https://arxiv.org/abs/2410.01870.

Атрибуты:

  • model (PreTrainedModel) — Модель, подлежащая адаптации.
  • peft_config (PeanutConfig): конфигурация модели PEANuT.
Update on GitHub