PEFT documentation
PEANuT: Параметрически эффективная адаптация с помощью нейронных твикеров, учитывающих веса
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
< 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 = 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
< 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 (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.