PEFT documentation
KaSA
KaSA
Это вариант LoRA, поэтому всё, что возможно с LoRA, применимо и к этому методу, если на этой странице не указано иное.
KaSA (Knowledge-aware Singular-value Adaptation) — это вариант LoRA, который использует разложение по сингулярным значениям базовых весов для отфильтровывания знаний, не относящихся к задаче, и параметризует обновление с помощью обучаемых сингулярных значений. Он изменяет обычный LoRA двумя способами:
- Обрезка SVD на основе знаний для замороженных базовых весов. При инициализации базовые веса
Wразлагаются методом SVD, и ихrнаименьших («шумовых»/длиннохвостовых) сингулярных компонента отбрасываются, в результате чего приближение ранга(k - r)становится новыми замороженными базовыми весами (k = min(in_features, out_features)). Затем обучаемая ветвь заново обучается в отброшенном остаточном подпространстве. - Адаптация собственных значений с учётом знаний. Обучаемое обновление параметризуется в форме 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повторно применяет то же самое усечение к только что загруженному базовому весу, поэтому сохранение и повторная загрузка согласованы.