PEFT documentation
KaSA
KaSA
Đây là một biến thể của LoRA và do đó mọi thứ có thể thực hiện được với LoRA đều áp dụng cho phương pháp này, trừ khi có ghi chú khác trên trang này.
KaSA (Knowledge-aware Singular-value Adaptation) là một biến thể của LoRA, sử dụng phân rã giá trị riêng (singular value decomposition) của trọng số cơ sở để lọc bỏ kiến thức không liên quan đến tác vụ và tham số hóa bản cập nhật bằng các giá trị riêng có thể học. Nó thay đổi LoRA thông thường theo hai cách:
- Cắt ngắn SVD dựa trên kiến thức của trọng lượng cơ sở đã đóng băng. Khi khởi tạo, trọng lượng cơ sở
Wđược phân tích SVD vàrthành phần riêng nhỏ nhất (“nhiễu”/đuôi dài) của nó bị loại bỏ, giữ lại xấp xỉ hạng-(k - r)làm cơ sở đóng băng mới (k = min(in_features, out_features)). Nhánh có thể huấn luyện sau đó học lại trong không gian con phần dư đã bị loại bỏ. - Điều chỉnh giá trị riêng nhận thức tri thức. Bản cập nhật có thể huấn luyện được tham số hóa dưới dạng SVD với một đường chéo giá trị riêng có thể học được chèn giữa các hệ số LoRA:
ΔW = scaling * B @ diag(ΔΣ) @ A, trong đóΔΣ(lora_diag) là một vectorrcó thể học được và là tham số mới duy nhất cho mỗi lớp.
Trong PEFT, KaSA được cấu hình như một biến thể của LoRA thông qua đối số kasa_config trên LoraConfig:
from peft import KasaConfig, LoraConfig
config = LoraConfig(
target_modules=["q_proj", "v_proj"],
kasa_config=KasaConfig(beta=1e-4, gamma=1e-3),
)Bài báo cũng huấn luyện với hai bộ điều hòa phụ: một hình phạt L2 trên các giá trị riêng có thể học (được trọng số hóa bởi beta) và một sự điều hòa trực giao trên các hệ số adapter (được trọng số hóa bởi gamma), thứ này thực thi mềm tính bán trực giao được giả định bởi tham số hóa SVD. Những điều này không thể được tiêm tự động bởi PEFT, do đó trong quá trình huấn luyện bạn phải thêm chúng vào tổn thất của tác vụ bằng cách gọi LoraModel._get_kasa_loss() trên LoraModel cơ bản:
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Để biết cách sử dụng chi tiết, hãy xem các hướng dẫn này.
Lưu ý
- KaSA hiện chỉ được hỗ trợ trên các lớp tuyến tính LoRA tiêu chuẩn, và không hỗ trợ các lớp có
fan_in_fan_out=True(ví dụ:Conv1Dcủa transformers). - Các adapter KaSA không thể kết hợp với các adapter không phải KaSA trên cùng một mô hình, vì việc cắt bỏ trọng số cơ bản sẽ làm thay đổi các trọng số cơ bản bên dưới các adapter khác. Cho phép sử dụng nhiều adapter KaSA.
convert_to_lorakhông được hỗ trợ: việc cập nhật KaSA phụ thuộc vàolora_diagvà trọng lượng cơ bản đã bị cắt, trong khi cả hai đều không thể biểu diễn được trong một bộ thích ứng LoRA thông thường.- Việc cắt ngắn SVD trên trọng số gốc là mang tính hủy diệt: việc thêm một adapter KaSA sẽ thay đổi vĩnh viễn trọng số đóng băng của lớp. Việc vô hiệu hóa hoặc unloading adapter sẽ không khôi phục được trọng số gốc ban đầu, và chu trình
mergetiếp theo làunmergesẽ quay về trọng số đã bị cắt ngắn, chứ không phải trọng số gốc. Đây là đặc điểm vốn có của phương pháp này. Hãy giữ lại checkpoint gốc nếu bạn cần khôi phục mô hình gốc chưa bị chỉnh sửa. - Việc tải một adapter KaSA đã được huấn luyện bằng
PeftModel.from_pretrainedsẽ áp dụng lại cùng một phép cắt ngắn lên trọng số cơ sở vừa được tải, do đó việc lưu và tải lại là nhất quán.