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

Esta é uma variante do LoRA e, portanto, tudo o que é possível com o LoRA é válido para este método, exceto quando indicado o contrário nesta página.

KaSA (Knowledge-aware Singular-value Adaptation) é uma variante do LoRA que usa a decomposição em valores singulares do peso base para filtrar conhecimento irrelevante para a tarefa e parametriza a atualização com valores singulares aprendíveis. Ela altera o LoRA vanilla de duas maneiras:

  1. Truncagem de SVD baseada em conhecimento do peso base congelado. Na inicialização, o peso base W é fatorado por SVD e seus r menores componentes singulares (“ruidosos”/cauda longa) são descartados, deixando a aproximação de posto (k - r) como o novo base congelado (k = min(in_features, out_features)). O ramo treinável então reaprende no subespaço residual descartado.
  2. Adaptação de valores singulares com conhecimento. A atualização treinável é parametrizada na forma SVD, com um diagonal de valores singulares aprendível inserido entre os fatores LoRA: ΔW = scaling * B @ diag(ΔΣ) @ A, onde ΔΣ (lora_diag) é um vetor aprendível de dimensão r e o único novo parâmetro por camada.

No PEFT, o KaSA é configurado como uma variante de LoRA por meio do argumento kasa_config em LoraConfig:

from peft import KasaConfig, LoraConfig

config = LoraConfig(
    target_modules=["q_proj", "v_proj"],
    kasa_config=KasaConfig(beta=1e-4, gamma=1e-3),
)

O artigo também treina com dois regularizadores auxiliares: uma penalidade L2 nos valores singulares aprendíveis (ponderada por beta) e uma regularização ortogonal nos fatores do adaptador (ponderada por gamma), que impõe suavemente a semi-ortogonalidade assumida pela parametrização SVD. Esses não podem ser injetados automaticamente pelo PEFT, portanto, durante o treinamento, você deve adicioná-los à perda da tarefa chamando LoraModel._get_kasa_loss() no LoraModel subjacente:

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 instruções detalhadas de uso, consulte estas instruções.

Observações

  • KaSA é atualmente suportado apenas em camadas lineares padrão de LoRA e não em camadas com fan_in_fan_out=True (por exemplo, Conv1D dos transformers).
  • Os adaptadores KaSA não podem ser combinados com adaptadores não-KaSA no mesmo modelo, pois a truncagem dos pesos base alteraria os pesos base sob os outros adaptadores. Vários adaptadores KaSA são permitidos.
  • convert_to_lora não é suportado: a atualização KaSA depende de lora_diag e do peso base truncado, nenhum dos quais é representável em um adaptador LoRA padrão.
  • A truncação SVD do peso base é destrutiva: adicionar um adaptador KaSA altera permanentemente o peso congelado da camada. Desativar ou descarregar o adaptador não restaura o peso base original, e o ciclo de ida e volta de merge seguido por unmerge resulta no peso truncado, não no original. Isso é inerente ao método. Mantenha o checkpoint original caso precise recuperar o modelo base não modificado.
  • Carregar um adaptador KaSA treinado com PeftModel.from_pretrained reaplica o mesmo truncamento ao peso base recém-carregado, de modo que salvar e recarregar é consistente.
Update on GitHub