PEFT documentation
KaSA
KaSA
Esta es una variante de LoRA y, por lo tanto, todo lo que es posible con LoRA es válido para este método, salvo que se indique lo contrario en esta página.
KaSA (Knowledge-aware Singular-value Adaptation) es una variante de LoRA que utiliza la descomposición en valores singulares del peso base para filtrar el conocimiento no relevante para la tarea y parametriza la actualización con valores singulares aprendibles. Modifica el LoRA estándar de dos maneras:
- Truncación SVD basada en conocimiento del peso base congelado. Durante la inicialización, el peso base
Wse factoriza mediante SVD y se descartan susrcomponentes singulares más pequeños (los “ruidosos”/de cola larga), dejando la aproximación de rango(k - r)como la nueva base congelada (k = min(in_features, out_features)). La rama entrenable vuelve a aprender entonces en el subespacio residual descartado. - Adaptación de valores singulares con conocimiento. La actualización entrenable se parametriza en forma de SVD con una diagonal de valores singulares aprendibles insertada entre los factores de LoRA:
ΔW = scaling * B @ diag(ΔΣ) @ A, dondeΔΣ(lora_diag) es un vector aprendible dery el único parámetro nuevo por capa.
En PEFT, KaSA se configura como una variante de LoRA a través del argumento kasa_config en LoraConfig:
from peft import KasaConfig, LoraConfig
config = LoraConfig(
target_modules=["q_proj", "v_proj"],
kasa_config=KasaConfig(beta=1e-4, gamma=1e-3),
)El artículo entrena además con dos regularizadores auxiliares: una penalización L2 sobre los valores singulares aprendibles (ponderada por beta) y una regularización ortogonal sobre los factores del adaptador (ponderada por gamma), que impone de forma suave la semi-ortogonalidad asumida por la parametrización SVD. PEFT no puede inyectarlos automáticamente, por lo que durante el entrenamiento debes añadirlos a la pérdida de la tarea llamando a LoraModel._get_kasa_loss() en el LoraModel subyacente:
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_lossPara un uso detallado, consulte estas instrucciones.
Precauciones
- KaSA es compatible actualmente solo con capas lineales estándar de LoRA, y no con capas
fan_in_fan_out=True(p. ej.Conv1Dde transformers). - Los adaptadores KaSA no pueden combinarse con adaptadores no KaSA en el mismo modelo, ya que la truncación de los pesos base modificaría los pesos base bajo los otros adaptadores. Se permiten múltiples adaptadores KaSA.
convert_to_lorano es compatible: la actualización de KaSA depende delora_diagy del peso base truncado, ninguno de los cuales es representable en un adaptador LoRA estándar.- La truncación SVD del peso base es destructiva: al añadir un adaptador KaSA, el peso congelado de la capa cambia de forma permanente. Desactivar o descargar el adaptador no restaura el peso base original, y un ciclo de
mergeseguido deunmergedevuelve el peso truncado, no el original. Esto es inherente al método. Conserve el punto de control original si necesita recuperar el modelo base sin modificar. - Cargar un adaptador KaSA entrenado con
PeftModel.from_pretrainedvuelve a aplicar la misma truncación al peso base recién cargado, por lo que guardar y recargar es consistente.