PEFT documentation
AdaMSS
AdaMSS
AdaMSS (AdaMSS: Adaptive Multi-Subspace Approach for Parameter-Efficient Fine-Tuning) — это метод параметрически эффективной дообучения, который декомпозирует матрицы весов с помощью SVD и кластеризует декомпозированное пространство на несколько обучаемых подпространств. Каждое подпространство обучает независимые обновления низкого ранга, при этом исходные веса остаются замороженными. AdaMSS также поддерживает Adaptive Subspace Allocation (ASA), который динамически отбраковывает менее важные подпространства во время обучения на основе информации о градиентах.
Аннотация из статьи:
Мы предлагаем AdaMSS — адаптивный подход с несколькими подпространствами для параметрически эффективной дообучения больших моделей. В отличие от традиционных методов параметрически эффективного дообучения, которые работают в рамках одного большого подпространства весов сети, AdaMSS использует сегментацию подпространств для получения нескольких меньших подпространств и адаптивно сокращает количество обучаемых параметров в процессе обучения, в конечном итоге обновляя только те, которые связаны с небольшим подмножеством подпространств, наиболее релевантных целевой задаче. Используя представление с наименьшим рангом, AdaMSS обеспечивает более компактную выразительность и более точную настройку параметров модели. Теоретический анализ показывает, что AdaMSS обладает лучшими гарантиями обобщения, чем LoRA, PiSSA и другие методы на основе низкоранговых представлений в одном подпространстве. Многочисленные эксперименты на задачах классификации изображений, понимания естественного языка и генерации естественного языка показывают, что AdaMSS достигает производительности, сопоставимой с полным дообучением, и превосходит другие методы параметрически эффективного дообучения в большинстве случаев, при этом требуя меньшего количества обучаемых параметров. Примечательно, что на модели ViT-Large AdaMSS достигает на 4,7% более высокой средней точности, чем LoRA, по семи задачам, используя всего 15,4% обучаемых параметров. На RoBERTa-Large AdaMSS превосходит PiSSA на 7% по средней точности на шести задачах, сокращая количество обучаемых параметров примерно на 94,4%. Эти результаты демонстрируют эффективность AdaMSS в параметрически эффективном дообучении. Код AdaMSS доступен по адресу https: //github.com/jzheng20/AdaMSS.
В настоящее время AdaMSS имеет следующие ограничения:
- Поддерживаются только слои
nn.Linear. - Для шага кластеризации KMeans требуется scikit-learn.
Если эти ограничения не подходят для вашего сценария использования, рассмотрите другие методы.
Обзор бенчмарков
API
AdamssConfig
класс peft.AdamssConfig
< 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 = 100num_subspaces: int = 5subspace_rank: int = 1target_modules: Optional[Union[list[str], str]] = Noneinit_weights: Optional[Literal['orthogonal']] = 'orthogonal'modules_to_save: Optional[list[str]] = Nonelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Noneuse_asa: bool = Falseasa_target_subspaces: int = 50init_warmup: int = 50final_warmup: int = 1000mask_interval: int = 100asa_importance_beta: float = 0.85asa_uncertainty_beta: float = 0.85asa_schedule_exponent: float = 3.0use_dynamic_rank: bool = Falsesvd_threshold: float = 0.1random_seed: int = 0 )
Параметры
- r (
int) — Общий ранг для разложения по сингулярным значениям (обозначается как R в статье). Эта величина определяет, сколько сингулярных векторов используется для представления матрицы весов перед кластеризацией. Более высокие значения сохраняют больше информации из исходных весов, но требуют больше вычислений и памяти. Более низкие значения обеспечивают более сильную регуляризацию. Типичные значения находятся в диапазоне от 50 до 500. По умолчанию — 100. - num_subspaces (
int) — Количество подпространств (K), на которые кластеризуется пространство, разложенное методом SVD. Каждое подпространство обучает независимые обновления низкого ранга. Увеличение этого значения позволяет осуществлять более тонкую адаптацию, но пропорционально увеличивает количество обучаемых параметров. При использовании ASA (Adaptive Subspace Allocation) этот параметр определяет начальное количество подпространств до их отсечения. Типичные значения находятся в диапазоне от 3 до 10. По умолчанию — 5. - subspace_rank (
int) — Ранг (r_i) для каждого обучаемого подпространства. Этот параметр управляет ёмкостью каждого подпространства для обучения адаптаций. Более высокие значения увеличивают выразительность, но также увеличивают количество обучаемых параметров. Общее количество обучаемых параметров масштабируется как O(num_subspaces subspace_rank (in_dim + out_dim) / num_subspaces). Для большинства задач хорошо работают значения от 1 до 4. По умолчанию — 1. - target_modules (
Optional[Union[list[str], str]]) — Имена модулей, к которым следует применить AdaMSS. Если указано, адаптироваться будут только эти модули. Может быть списком точных имён модулей или регулярным выражением. Например,['q_proj', 'v_proj']для слоёв внимания, или'.*decoder.*(SelfAttention|EncDecAttention).*(q|v)$'для сопоставления по регулярному выражению. - modules_to_save (
Optional[list[str]]) — Список модулей, помимо слоёв AdaMSS, которые нужно сделать обучаемыми и сохранить в итоговой контрольной точке. Эти модули будут полностью дообучены (а не только с использованием низкоранговых адаптеров). Обязательно для случайно инициализированных головок, таких какclassifierилиscoreв задачах классификации. - init_weights (
Literal["orthogonal"]) — Метод инициализации обучаемых весов AdaMSS. В настоящее время поддерживается только “orthogonal”, который использует ортогональную инициализацию для матриц B (выходное преобразование). Матрицы A инициализируются нулями, чтобы модель начинала работу с предобученных весов. Установите None, чтобы пропустить инициализацию при загрузке из чекпоинта. По умолчанию — “orthogonal”. - layers_to_transform (
Optional[Union[list[int], int]]) — Конкретные индексы слоев, к которым следует применить AdaMSS. Если указано, адаптируются только эти слои, что полезно для экспериментов с определением, какие слои получают наибольшую выгоду от адаптации. Может быть целым числом или списком целых чисел. - layers_pattern (
Optional[Union[list[str], str]]) — Шаблон для сопоставления с именами слоёв, когда указаноlayers_to_transform. Используется для извлечения индексов слоёв из имён модулей, которые не следуют общему шаблону. - use_asa (
bool) — Определяет, следует ли включить Adaptive Subspace Allocation (ASA). При включении ASA динамически отбраковывает менее важные подпространства во время обучения на основе информации о градиентах, что снижает эффективное количество параметров при сохранении производительности. Требует интеграции с callback обучения. По умолчанию False. - asa_target_subspaces (
int) — Целевое общее количество активных подпространств во всех слоях при включённом ASA. ASA будет постепенно удалять подпространства, пока не будет достигнуто это целевое значение. Более низкие значения приводят к более агрессивному удалению и меньшему количеству обучаемых параметров. Должно быть меньшеnum_subspaces * num_target_modules. Типичные значения варьируются от 20 до 100 в зависимости от размера модели. По умолчанию 50. Должно быть положительным целым числом, еслиuse_asa=True. - init_warmup (
int) — Количество шагов обучения, в течение которых следует подождать перед началом обрезки ASA. Во время warmup все подпространства остаются активными, чтобы оценки важности могли стабилизироваться. Большие значения дают больше времени для точной оценки важности, но откладывают обрезку. Типичные значения находятся в диапазоне от 50 до 200. По умолчанию — 50. Должно быть меньшеfinal_warmup, еслиuse_asa=True. - final_warmup (
int) — Шаг обучения, на котором ASA завершает обрезку и достигаетasa_target_subspacesактивных подпространств. Обрезка распределяется междуinit_warmupиfinal_warmup. Значение следует задавать на основе общего числа шагов обучения; обычно это 1/3–1/2 от общего числа шагов обучения. По умолчанию 1000. Должно быть больше, чемinit_warmup, еслиuse_asa=True. - mask_interval (
int) — Количество шагов обучения между обновлениями маски ASA. Меньшие значения позволяют чаще адаптироваться, но увеличивают накладные расходы. Большие значения обеспечивают более стабильные оценки важности между обновлениями. Типичные значения находятся в диапазоне от 50 до 200. По умолчанию — 100. Должно быть положительным целым числом, еслиuse_asa=True. - asa_importance_beta (
float) — Коэффициент экспоненциальной скользящей средней (EMA) для сглаживания оценок важности подпространств. Более высокие значения (ближе к 1.0) придают больший вес исторической важности, обеспечивая стабильность. Более низкие значения делают оценку важности более отзывчивой к недавним градиентам. Типичные значения находятся в диапазоне от 0.8 до 0.95. По умолчанию 0.85. - asa_uncertainty_beta (
float) — Коэффициент EMA для сглаживания оценок неопределённости важности. Определяет, насколько быстро неопределённость адаптируется к дисперсии градиентов. Аналогично asa_importance_beta, более высокие значения обеспечивают более стабильные оценки. Типичные значения находятся в диапазоне от 0,8 до 0,95. По умолчанию 0,85. - asa_schedule_exponent (
float) — Показатель степени расписания, управляющий скоростью затухания от общего числа подпространств доasa_target_subspacesво время ASA warmup. Большие значения приводят к более быстрому начальному прунингу (более агрессивному раннему сокращению), тогда как меньшие значения обеспечивают более плавное, близкое к линейному затухание. Формула: current_active_subspaces = asa_target_subspaces + (asa_total_subspaces - asa_target_subspaces) * (progress ** exponent). Типичные значения варьируются от 1.0 (линейное) до 5.0 (агрессивное). По умолчанию 3.0. Должно быть положительным числом, еслиuse_asa=True(нулевой или отрицательный показатель степени либо приводит к вырождению расписания в постоянный no-op, либо, как толькоprogressдостигает ровно 0.0, вызываетZeroDivisionError). - use_dynamic_rank (
bool) — Определять ли ранги подпространств динамически на основе величин сингулярных значений. Если True, ранг каждого подпространства определяется подсчётом сингулярных значений, превышающих порог, что позволяет разным подпространствам иметь разные эффективные ранги. Если False, все подпространства используют фиксированныйsubspace_rank. По умолчанию False. - svd_threshold (
float) — Коэффициент порога для динамического выбора ранга, используется только приuse_dynamic_rank=True. Собственное значение считается значимым, если оно превышаетthreshold * max_singular_value. Большие значения приводят к меньшим эффективным рангам (более агрессивное усечение). Типичные значения находятся в диапазоне от 0.05 до 0.2. По умолчанию 0.1 (10% от максимального значения).
Класс конфигурации для метода Adamss (Adaptive Multi-Subspaces).
AdaMSS — это метод эффективной дообучения с малым числом параметров, который декомпозирует матрицы весов с помощью SVD и кластеризует декомпозированное пространство на несколько обучаемых подпространств. Он обучает обновления низкого ранга внутри этих подпространств, сохраняя исходные веса замороженными.
AdamssModel
класс peft.AdamssModel
< source >( modelconfigadapter_namelow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict] = None ) → torch.nn.Module
Создаёт модель Adamss (Adaptive Multi-Subspaces) на основе предобученной модели.
Метод декомпозирует матрицы весов с помощью SVD и кластеризует декомпозированное пространство на несколько обучаемых подпространств для параметрически эффективной дообучения.
Пример:
>>> from transformers import AutoModelForImageClassification
>>> from peft import AdamssConfig, get_peft_model
>>> config = AdamssConfig(
... r=500,
... num_subspaces=5,
... target_modules=["query", "value"],
... )
>>> model = AutoModelForImageClassification.from_pretrained("google/vit-base-patch16-224")
>>> adamss_model = get_peft_model(model, config)Атрибуты:
- model (
~torch.nn.Module) — Модель, подлежащая адаптации. - peft_config (AdamssConfig): конфигурация модели Adamss.
update_and_allocate
< source >( global_step: int )
Обновите оценки важности и примените маскировку ASA (если включена).
Этот метод следует вызывать на каждом шаге обучения после loss.backward() и перед optimizer.zero_grad(), когда ASA включен. Внутренне он:
- Накапливает оценки важности с помощью EMA на каждом шаге в течение периода прогрева.
- На интервалах маскирования применяет глобальное top-K маскирование и сбрасывает важность.
Это единственный входной пункт для ASA – использование AdamssAsaCallback с HuggingFace Trainer просто делегирует вызов этому методу. Для пользовательских циклов обучения вызывайте этот метод напрямую, а не callback.