### KaSA

> [!NOTE]
> 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](https://huggingface.co/papers/2412.06071) (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:

1. **Truncación SVD basada en conocimiento del peso base congelado.** Durante la inicialización, el peso base `W` se factoriza mediante SVD y se descartan sus `r` componentes singulares más pequeños (los «ruidosos» o 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.
2. **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 de `r` y 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](/docs/peft/main/es/package_reference/lora#peft.LoraConfig):

```py
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:

```py
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
```

Para un uso detallado, consulte [estas instrucciones](https://github.com/huggingface/peft/tree/main/examples/kasa_finetuning).

#### Precauciones

- KaSA es compatible actualmente solo con capas lineales estándar de LoRA, y no con capas `fan_in_fan_out=True` (p. ej. `Conv1D` de 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_lora` no es compatible: la actualización de KaSA depende de `lora_diag` y 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 `merge` seguido de `unmerge` devuelve 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_pretrained` vuelve a aplicar la misma truncación al peso base recién cargado, por lo que guardar y recargar es consistente.

