PEFT documentation
Методы эффективной дообучения
Методы эффективной дообучения
Методы PEFT обучают как можно меньше параметров, стремясь при этом к производительности, сопоставимой с полной дообучением. Меньшее количество обучаемых параметров обладает меньшей выразительностью, поэтому такая же производительность не гарантируется. Взамен вы используете меньше памяти, часто меньше вычислительных ресурсов, а также получаете такие возможности, как быстрая замена между адаптерами экспертов и меньшее забывание ранее накопленных знаний.
Давать общие советы по обучению больших моделей сложно, но для генеративных моделей, особенно языковых, вы можете следовать этим шагам:
- используйте промптинг (например, few-shot примеры в промпте), чтобы проверить, справляется ли модель с задачей. Если модель решает вашу задачу, отлично! Теперь вы можете использовать Prompt-based methods, чтобы обучить промпт и сэкономить ценные токены.
- Если методов на основе промптов недостаточно, можно использовать настройку по слоям и методы адаптеров. Как правило, эти методы более выразительны, чем методы на основе промптов, и ближе к полной дообучению.
- Убедитесь, что вы измеряете удержание уже освоенных знаний, поскольку каждый шаг дообучения потенциально приводит к потере ранее накопленных знаний.
Комплект для сравнения методов PEFT призван дать общее представление о (большинстве) реализованных методов на выбранных бенчмарках и моделях.
Не все методы PEFT одинаковы, и между ними существуют различия в возможностях:
- Квантование: не все методы поддерживают квантованные базовые модели
- Возможности: не все возможности поддерживаются для всех методов (например, несколько адаптеров, смешанный вывод адаптеров, слияние/отмена слияния)
- Типы слоёв: линейные слои поддерживаются в целом, но не все методы адаптеров поддерживают слои встраивания (важно для расширения словаря) или свёрточные слои (важно для некоторых моделей изображений)
- Время выполнения: методы PEFT, как правило, добавляют накладные расходы во время выполнения, но часть из них можно снизить (например, путем слияния весов адаптера)
Методы на основе промптов
Prompting (подготовка) настраивает замороженную предобученную модель под конкретную задачу, включая в вход текстовый промпт, который описывает задачу или даже демонстрирует пример её выполнения. С помощью prompting можно избежать полной дообучения отдельной модели для каждой задачи, используя вместо этого одну и ту же замороженную предобученную модель. Это значительно проще, поскольку одну и ту же модель можно применять к нескольким различным задачам, а обучение и хранение меньшего набора параметров промпта существенно эффективнее, чем обучение всех параметров модели.
Существует две категории методов промптинга:
- жёсткие промпты — это вручную созданные текстовые промпты с дискретными входными токенами; их недостаток состоит в том, что для создания хорошего промпта требуется значительные усилия
- мягкие промпты — это обучаемые тензоры, конкатенируемые с входными эмбеддингами и оптимизируемые под конкретный набор данных; их недостаток в том, что они не читаемы человеком, поскольку эти «виртуальные токены» не сопоставляются с эмбеддингами реальных слов
Библиотека PEFT поддерживает несколько типов методов промптинга (p-tuning, prefix tuning, prompt tuning, …), полный список методов мягких промптов можно найти в оглавлении. Если вы хотите применить эти методы к другим задачам и сценариям использования, загляните в нашу коллекцию ноутбуков!
Некоторое знакомство с общим процессом обучения каузальной языковой модели было бы очень полезно и позволило бы сосредоточиться на методах мягкого промптинга. Если вы новичок, мы рекомендуем сначала ознакомиться с руководством Causal language modeling в документации Transformers. Когда будете готовы, возвращайтесь и посмотрите, как легко добавить PEFT в ваш процесс обучения!
Настройка слоёв
Layer Tuning объединяет методы, нацеленные на конкретный тип слоя или отдельный аспект слоя, например, LayerNorm Tuning работает только со слоями LayerNorm, а TrainableTokens — только с определенными токенами в матрице эмбеддингов. Это отличает их от prompt-based методов, которые оперируют входом модели, и adapter-методов, расширяющих существующие веса; последние, как правило, менее зависят от типа слоя и нацелены на линейные или сверточные слои.
Методы адаптера
Методы адаптеров можно рассматривать как способ добавить в существующие модели относительно небольшие обучаемые матрицы для дообучения. Цель состоит во введении небольшого количества обучаемых параметров, чтобы направить большую модель в сторону задачи, требующей дообучения, и сэкономить ресурсы, такие как память или вычислительные мощности.
Популярный способ реализации адаптеров — вставка небольших обучаемых матриц, представляющих собой разложение адаптируемых весов по рангу, что позволяет экономить память. Существует несколько способов представления матрицы весов в виде разложения по рангу, но Low-Rank Adaptation (LoRA) является наиболее распространённым методом. Библиотека PEFT поддерживает несколько других вариантов этой формулировки: некоторые являются прямыми вариантами LoRA и описаны в разделе LoRA, а другие достаточно отличаются, чтобы считаться самостоятельными методами, такими как Low-Rank Hadamard Product (LoHa), Low-Rank Kronecker Product (LoKr) и Adaptive Low-Rank Adaptation (AdaLoRA). Если вы хотите применить эти методы к другим задачам и сценариям использования, таким как семантическая сегментация или классификация токенов, загляните в нашу коллекцию ноутбуков!
LoRA — один из самых популярных методов PEFT и хорошая отправная точка, если вы только начинаете работать с PEFT. Изначально он был разработан для больших языковых моделей, но стал чрезвычайно популярным методом обучения для диффузионных моделей благодаря своей эффективности и результативности.
Низкоранговые адаптеры — лишь одна из возможных формулировок адаптеров; PEFT реализует и многие другие типы адаптеров. Например, методы ортогональной дообучения (OFT, BOFT, …) используют ортогональные разложения весов адаптеров для достижения малого размера. Методы вроде MiSS разбивают матрицы на фрагменты и разделяют эти фрагменты для экономии памяти. IA3 вводит обучаемые векторы, которые масштабируют активации ключей, значений и полносвязных слоёв.
Update on GitHub