PEFT documentation
KaSA
KaSA
Il s’agit d’une variante de LoRA et, par conséquent, tout ce qui est possible avec LoRA s’applique à cette méthode, sauf indication contraire sur cette page.
KaSA (Knowledge-aware Singular-value Adaptation) est une variante de LoRA qui utilise la décomposition en valeurs singulières du poids de base pour filtrer les connaissances non pertinentes pour la tâche et qui paramètre la mise à jour avec des valeurs singulières apprenables. Elle modifie le LoRA standard de deux manières :
- Troncature SVD fondée sur les connaissances du poids de base figé. À l'initialisation, le poids de base
West factorisé par SVD et sesrplus petites composantes singulières (« bruitées » / longue traîne) sont écartées, laissant l'approximation de rang(k - r)comme nouveau poids de base figé (k = min(in_features, out_features)). La branche entraînable réapprend ensuite dans le sous-espace résiduel écarté. - Adaptation des valeurs singulières tenant compte des connaissances. La mise à jour entraînable est paramétrée sous forme de SVD, avec une diagonale de valeurs singulières apprenables insérée entre les facteurs LoRA :
ΔW = scaling * B @ diag(ΔΣ) @ A, oùΔΣ(lora_diag) est un vecteur apprenable de dimensionret le seul nouveau paramètre par couche.
Dans PEFT, KaSA est configuré comme une variante de LoRA via l'argument kasa_config de LoraConfig :
from peft import KasaConfig, LoraConfig
config = LoraConfig(
target_modules=["q_proj", "v_proj"],
kasa_config=KasaConfig(beta=1e-4, gamma=1e-3),
)L’article entraîne également le modèle avec deux régulariseurs auxiliaires : une pénalité L2 sur les valeurs singulières apprenables (pondérée par beta) et une régularisation orthogonale sur les facteurs de l’adaptateur (pondérée par gamma), qui impose de manière souple la semi-orthogonalité supposée par la paramétrisation SVD. PEFT ne peut pas les injecter automatiquement, il faut donc les ajouter à la perte de la tâche pendant l’entraînement en appelant LoraModel._get_kasa_loss() sur le LoraModel sous-jacent :
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_lossPour un usage détaillé, consultez ces instructions.
Limites
- KaSA est actuellement pris en charge uniquement sur les couches linéaires LoRA standard, et non sur les couches
fan_in_fan_out=True(par exemple,Conv1Dde Transformers). - Les adaptateurs KaSA ne peuvent pas être combinés avec des adaptateurs non-KaSA sur le même modèle, car la troncature des poids de base modifierait les poids de base sous les pieds des autres adaptateurs. Plusieurs adaptateurs KaSA sont autorisés.
convert_to_loran'est pas pris en charge : la mise à jour KaSA dépend delora_diaget du poids de base tronqué, aucun des deux n'étant représentable dans un adaptateur LoRA standard.- La troncature SVD du poids de base est destructive : l’ajout d’un adaptateur KaSA modifie de manière permanente le poids figé de la couche. Désactiver ou décharger l’adaptateur ne restaure pas le poids de base d’origine, et un aller-retour
mergesuivi deunmergeaboutit au poids tronqué, et non au poids d’origine. C’est inhérent à la méthode. Conservez le point de contrôle d’origine si vous devez récupérer le modèle de base non modifié. - Charger un adaptateur KaSA entraîné avec
PeftModel.from_pretrainedréapplique la même troncature au poids de base nouvellement chargé, garantissant ainsi la cohérence entre l’enregistrement et le rechargement.