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

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 :

  1. Troncature SVD fondée sur les connaissances du poids de base figé. À l'initialisation, le poids de base W est factorisé par SVD et ses r plus 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é.
  2. 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 dimension r et 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_loss

Pour 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, Conv1D de 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_lora n'est pas pris en charge : la mise à jour KaSA dépend de lora_diag et 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 merge suivi de unmerge aboutit 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_pretrained réapplique la même troncature au poids de base nouvellement chargé, garantissant ainsi la cohérence entre l’enregistrement et le rechargement.
Update on GitHub