PEFT documentation

KaSA

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

KaSA

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

KaSA (Knowledge-aware Singular-value Adaptation) — это вариант LoRA, который использует разложение по сингулярным значениям базовых весов для отфильтровывания знаний, не относящихся к задаче, и параметризует обновление с помощью обучаемых сингулярных значений. Он изменяет обычный LoRA двумя способами:

  1. Обрезка SVD на основе знаний для замороженных базовых весов. При инициализации базовые веса W разлагаются методом SVD, и их r наименьших («шумовых»/длиннохвостовых) сингулярных компонента отбрасываются, в результате чего приближение ранга (k - r) становится новыми замороженными базовыми весами (k = min(in_features, out_features)). Затем обучаемая ветвь заново обучается в отброшенном остаточном подпространстве.
  2. Адаптация собственных значений с учётом знаний. Обучаемое обновление параметризуется в форме SVD с обучаемой диагональю собственных значений, вставленной между факторами LoRA: ΔW = scaling * B @ diag(ΔΣ) @ A, где ΔΣ (lora_diag) — обучаемый r-вектор и единственный новый параметр на слой.

В PEFT KaSA настраивается как вариант LoRA через аргумент kasa_config в LoraConfig:

from peft import KasaConfig, LoraConfig

config = LoraConfig(
    target_modules=["q_proj", "v_proj"],
    kasa_config=KasaConfig(beta=1e-4, gamma=1e-3),
)

В статье дополнительно используется обучение с двумя вспомогательными регуляризаторами: L2-штрафом на обучаемые сингулярные значения (с весом beta) и ортогональным регуляризатором для факторов адаптера (с весом gamma), который мягко обеспечивает полуортогональность, предполагаемую параметризацией SVD. PEFT не может добавить их автоматически, поэтому во время обучения вы должны добавить их к функции потерь задачи, вызвав LoraModel._get_kasa_loss() для базовой модели LoraModel:

task_loss = ...  # standard loss returned by your model
kasa_loss = model._get_kasa_loss()  # 0.0 if KaSA is not used
total_loss = task_loss + kasa_loss

Для подробных сведений об использовании см. эти инструкции.

Ограничения

  • В настоящее время KaSA поддерживается только для стандартных линейных слоёв LoRA и не работает со слоями, у которых fan_in_fan_out=True (например, Conv1D в transformers).
  • Адаптеры KaSA нельзя комбинировать с адаптерами, не являющимися KaSA, в рамках одной модели, поскольку усечение базовых весов изменит базовые веса, на которые опираются другие адаптеры. Использование нескольких адаптеров KaSA допустимо.
  • convert_to_lora не поддерживается: обновление KaSA зависит от lora_diag и от усечённого базового веса, ни одно из которых не может быть представлено в стандартном адаптере LoRA.
  • Обрезка по SVD базовых весов является необратимой: добавление адаптера KaSA навсегда изменяет замороженные веса слоя. Отключение или выгрузка адаптера не восстанавливают исходные базовые веса, а последовательность merge и unmerge приводит к обрезанным весам, а не к исходным. Это свойство метода. Сохраните исходную контрольную точку, если вам нужно восстановить неизменную базовую модель.
  • Загрузка обученного адаптера KaSA с помощью PeftModel.from_pretrained повторно применяет то же самое усечение к только что загруженному базовому весу, поэтому сохранение и повторная загрузка согласованы.
Update on GitHub