PEFT documentation
KaSA
快速入门
指南
方法
API 参考
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).
KaSA
这是 LoRA 的一种变体,因此,除非本页另有说明,LoRA 支持的所有功能在此方法中均适用。
KaSA(Knowledge-aware Singular-value Adaptation,知识感知奇异值自适应)是一种 LoRA 变体,它利用基础权重的奇异值分解来过滤与任务无关的知识,并使用可学习的奇异值来参数化更新。它在两个方面对原始 LoRA 进行了修改:
- 基于知识的冻结基础权重 SVD 截断。 在初始化时,基础权重
W经过 SVD 分解,并丢弃其r个最小(“噪声”/长尾)奇异分量,保留秩为(k - r)的近似值作为新的冻结基础(k = min(in_features, out_features))。随后,可训练分支在已丢弃的残差子空间中重新学习。 - 知识感知的奇异值自适应。可训练的更新以 SVD 形式参数化,在 LoRA 因子之间插入一个可学习的奇异值对角线:
ΔW = scaling * B @ diag(ΔΣ) @ A,其中ΔΣ(lora_diag)是一个可学习的r维向量,也是每层中唯一的新参数。
在 PEFT 中,KaSA 通过 LoraConfig 上的 kasa_config 参数配置为 LoRA 变体:
from peft import KasaConfig, LoraConfig
config = LoraConfig(
target_modules=["q_proj", "v_proj"],
kasa_config=KasaConfig(beta=1e-4, gamma=1e-3),
)该论文还使用两个辅助正则化项进行训练:对可学习奇异值施加 L2 惩罚(权重为 beta),以及对适配器因子施加正交正则化(权重为 gamma),后者软性地强制满足 SVD 参数化所假设的半正交性。PEFT 无法自动注入这些项,因此在训练期间,您必须通过调用底层 LoraModel 的 LoraModel._get_kasa_loss() 将它们添加到任务损失中:
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有关详细用法,请参阅这些说明。
注意事项
- KaSA 目前仅支持标准的 LoRA 线性层,不支持
fan_in_fan_out=True层(例如 transformers 中的Conv1D)。 - KaSA 适配器不能与非 KaSA 适配器在同一模型上组合使用,因为基础权重的截断会改变其他适配器所依赖的基础权重。允许使用多个 KaSA 适配器。
convert_to_lora不受支持:KaSA 更新依赖于lora_diag和截断的基础权重,而这两者都无法在普通的 LoRA 适配器中表示。- 基础权重的 SVD 截断是破坏性的:添加 KaSA 适配器会永久改变该层冻结的权重。禁用或卸载适配器无法恢复原始基础权重,且先执行
merge再执行unmerge的往返操作只会得到截断后的权重,而非原始权重。这是该方法固有的特性。如果需要恢复未修改的基础模型,请保留原始检查点。 - 使用
PeftModel.from_pretrained加载训练好的 KaSA 适配器时,会对新加载的基础权重重新应用相同的截断操作,因此保存和重新加载的结果是一致的。