PEFT documentation

MonteCLoRA (адаптация низкого ранга с использованием метода Монте-Карло)

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

MonteCLoRA (адаптация низкого ранга с использованием метода Монте-Карло)

Это вариант LoRA, поэтому всё, что возможно с LoRA, применимо и к этому методу, если на этой странице не указано иное.

MonteCLoRA дополняет стандартный адаптер LoRA небольшим вариационным модулем, который во время обучения извлекает выборки Монте-Карло стохастических возмущений поверх матрицы A LoRA. Конкретно, он обучает вариационные параметры (ковариацию на основе распределения Уишарта, член шума с многомерным нормальным распределением для каждой выборки и веса Дирихле по выборкам) и добавляет полученное усреднённое возмущение к lora_A на каждом проходе вперёд. К функции потерь обучения добавляется член KL-дивергенции + энтропии, чтобы удерживать эти вариационные параметры вблизи разумного априорного распределения. На этапе инференса сэмплер отключается, и MonteCLoRA работает точно так же, как обычный адаптер LoRA, поэтому нет дополнительных затрат на инференс и дополнительных параметров для слияния. Полное описание метода см. по ссылке https://huggingface.co/papers/2411.04358.

Вы можете рассмотреть вариант использования MonteCLoRA в следующих случаях:

  • Вы дообучаете модель на небольшом или зашумленном наборе данных и хотите более сильную регуляризацию, чем в стандартном LoRA. Среднее по Монте-Карло и член KL вместе действуют как регуляризатор в стиле байесовского подхода.
  • Вы хотите улучшить калибровку неопределённости / устойчивость вашего адаптера без дополнительных затрат на этапе инференса (вариационный механизм используется только при обучении).
  • Vanilla LoRA переобучается, и уменьшение r или увеличение lora_dropout не помогает.

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

Чтобы включить MonteCLoRA, передайте MontecloraConfig в LoraConfig:

from peft import LoraConfig, MontecloraConfig

monteclora_config = MontecloraConfig(
    num_samples=8,         # number of Monte Carlo samples per forward pass
    sample_scaler=1e-4,    # magnitude of the variational perturbation
    kl_loss_weight=1e-5,   # weight of the KL term added to the training loss
)
config = LoraConfig(
    r=16,
    lora_alpha=32,
    target_modules=["q_proj", "v_proj"],
    monteclora_config=monteclora_config,
)

Во время обучения необходимо добавлять потерю вариационной регуляризации к потере задачи. Самый простой способ — вызвать LoraModel._get_monteclora_loss() на базовой модели LoraModel:

task_loss = ...  # standard loss returned by your model
monteclora_loss = model._get_monteclora_loss()  # 0.0 if MonteCLoRA is not used
total_loss = task_loss + monteclora_loss
total_loss.backward()

Если вы обучаете с помощью Trainer от HF, вы можете просто добавить peft.helpers.MontecloraTrainerMixin, который выполняет это за вас в compute_loss:

from transformers import Trainer
from peft.helpers import MontecloraTrainerMixin


class MontecloraTrainer(MontecloraTrainerMixin, Trainer):
    pass

Полный рабочий пример доступен в examples/monteclora_finetuning.

API

MonteCloraConfig

класс peft.MontecloraConfig

< >

( num_samples: int = 8use_entropy: bool = Falsedirichlet_prior: float = 0.1sample_scaler: float = 0.0001kl_loss_weight: float = 1e-05buffer_size: int = 150 )

Параметры

  • num_samples (int) — Количество выборок Монте-Карло, извлекаемых за один прямой проход. Большие значения обычно обеспечивают более плавное обучение и более точные оценки неопределенности, но увеличивают вычислительные затраты и потребление памяти. Уменьшите это значение, если обучение слишком медленное или ограничено по памяти; увеличьте его, если обучение стабильно и вы хотите более сильное усреднение Монте-Карло.
  • use_entropy (bool) — Определяет, следует ли добавлять член регуляризации энтропии, который предотвращает схлопывание весов Монте-Карло в единственную выборку. Включите этот параметр, если вы наблюдаете, что сэмплер становится очень пиковым, или если вам нужна более сильная регуляризация; оставьте его выключенным, чтобы более точно имитировать стандартный LoRA.
  • dirichlet_prior (float) — Параметр концентрации для априорного распределения Дирихле над весами выборок/экспертов. Большие значения сдвигают веса в сторону более равномерного распределения (более сильная регуляризация, меньшая разреженность), тогда как малые положительные значения поощряют более разреженные, пиковые веса. Увеличьте значение, если сэмплер переобучается; уменьшите (но сохраняйте > 0), если он слишком консервативен.
  • sample_scaler (float) — Общий коэффициент масштабирования для выбранных возмущений, применяемых к весам LoRA. Увеличение этого значения усиливает шум Монте-Карло (что приводит к большей регуляризации и исследованию пространства, но также к повышенной нестабильности обучения); уменьшение значения приближает поведение к стандартному детерминированному LoRA. Установка значения, очень близкого к 0, практически отключает эффект Monteclora.
  • kl_loss_weight (float) — Вес слагаемого KL-дивергенции между вариационным распределением и его априорным распределением. Большие значения сильнее подчёркивают соответствие априорному распределению (более сильная регуляризация, потенциальная недообученность); меньшие значения больше опираются на правдоподобие данных (более слабая регуляризация, потенциальная переобученность). Настройте этот параметр, если вы обнаруживаете, что Monteclora чрезмерно или недостаточно регуляризирует адаптер.
  • buffer_size (int) — Размер внутреннего буфера, используемого сэмплером Монте-Карло (например, для хранения последних статистик). Большие значения могут стабилизировать оцениваемые вариационные параметры за счёт дополнительного потребления памяти; уменьшите это значение, если объём памяти ограничен.

Это класс подконфигурации для хранения конфигурации Monteclora (Monte Carlo Low-Rank Adaptation). Monteclora вводит вариационный вывод в LoRA, добавляя выборку Монте-Карло к весам адаптера.

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

Update on GitHub