PEFT documentation

AdaMSS

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

AdaMSS

AdaMSS (AdaMSS: Adaptive Multi-Subspace Approach for Parameter-Efficient Fine-Tuning) là một phương pháp fine-tuning hiệu quả về tham số, phân rã các ma trận trọng số bằng SVD và nhóm không gian đã phân rã thành nhiều không gian con có thể huấn luyện. Mỗi không gian con học các cập nhật hạng thấp độc lập trong khi các trọng số gốc được giữ nguyên. AdaMSS cũng hỗ trợ Adaptive Subspace Allocation (ASA), cho phép cắt bỏ động các không gian con kém quan trọng hơn trong quá trình huấn luyện dựa trên thông tin gradient.

Tóm tắt từ bài báo là:

Chúng tôi đề xuất AdaMSS, một phương pháp đa không gian con thích ứng cho việc tinh chỉnh hiệu quả tham số của các mô hình lớn. Khác với các phương pháp tinh chỉnh hiệu quả tham số truyền thống hoạt động trong một không gian con lớn duy nhất của trọng số mạng, AdaMSS tận dụng việc phân đoạn không gian con để thu được nhiều không gian con nhỏ hơn và giảm thích ứng số lượng tham số có thể huấn luyện trong quá trình huấn luyện, cuối cùng chỉ cập nhật những tham số liên quan đến một tập con nhỏ các không gian con có liên quan nhất đến tác vụ hạ nguồn mục tiêu. Bằng cách sử dụng biểu diễn hạng thấp nhất, AdaMSS đạt được tính biểu đạt gọn gàng hơn và tinh chỉnh chi tiết hơn các tham số của mô hình. Các phân tích lý thuyết cho thấy AdaMSS có bảo đảm tổng quát hóa tốt hơn so với LoRA, PiSSA và các phương pháp dựa trên hạng thấp không gian con đơn khác. Các thí nghiệm rộng rãi trên các tác vụ phân loại hình ảnh, hiểu ngôn ngữ tự nhiên và sinh ngôn ngữ tự nhiên cho thấy AdaMSS đạt hiệu suất tương đương với tinh chỉnh đầy đủ và vượt trội hơn các phương pháp tinh chỉnh hiệu quả tham số khác trong hầu hết các trường hợp, trong khi vẫn yêu cầu ít tham số có thể huấn luyện hơn. Đáng chú ý, trên mô hình ViT-Large, AdaMSS đạt độ chính xác trung bình cao hơn 4,7% so với LoRA trên bảy tác vụ, chỉ sử dụng 15,4% số tham số có thể huấn luyện. Trên RoBERTa-Large, AdaMSS vượt trội hơn PiSSA 7% về độ chính xác trung bình trên sáu tác vụ trong khi giảm số lượng tham số có thể huấn luyện khoảng 94,4%. Những kết quả này chứng minh hiệu quả của AdaMSS trong tinh chỉnh hiệu quả tham số. Mã nguồn cho AdaMSS có sẵn tại https: //github.com/jzheng20/AdaMSS.

AdaMSS hiện có các ràng buộc sau:

  • Chỉ hỗ trợ các lớp nn.Linear.
  • Yêu cầu scikit-learn cho bước phân cụm KMeans.

Nếu các ràng buộc này không phù hợp với trường hợp sử dụng của bạn, hãy cân nhắc các phương pháp khác.

Tổng quan về benchmark

API

AdamssConfig

lớp peft.AdamssConfig

< >

( task_type: Optional[Union[str, TaskType]] = Nonepeft_type: Optional[Union[str, PeftType]] = Noneauto_mapping: Optional[dict] = Nonepeft_version: Optional[str] = Nonebase_model_name_or_path: Optional[str] = Nonerevision: Optional[str] = Noneinference_mode: bool = Falser: int = 100num_subspaces: int = 5subspace_rank: int = 1target_modules: Optional[Union[list[str], str]] = Noneinit_weights: Optional[Literal['orthogonal']] = 'orthogonal'modules_to_save: Optional[list[str]] = Nonelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Noneuse_asa: bool = Falseasa_target_subspaces: int = 50init_warmup: int = 50final_warmup: int = 1000mask_interval: int = 100asa_importance_beta: float = 0.85asa_uncertainty_beta: float = 0.85asa_schedule_exponent: float = 3.0use_dynamic_rank: bool = Falsesvd_threshold: float = 0.1random_seed: int = 0 )

Tham số

  • r (int) — Tổng bậc cho phân rã SVD (ký hiệu là R trong bài báo). Tham số này xác định số lượng vector riêng được sử dụng để biểu diễn ma trận trọng số trước khi phân cụm. Giá trị cao hơn nắm bắt nhiều thông tin hơn từ trọng số gốc nhưng đòi hỏi nhiều tính toán và bộ nhớ hơn. Giá trị thấp hơn cung cấp mức chuẩn hóa mạnh hơn. Các giá trị điển hình dao động từ 50 đến 500. Giá trị mặc định là 100.
  • num_subspaces (int) — Số lượng không gian con (K) để phân cụm không gian đã phân rã SVD. Mỗi không gian con học các cập nhật hạng thấp độc lập. Tăng giá trị này cho phép thích ứng chi tiết hơn nhưng làm tăng số lượng tham số có thể huấn luyện theo tỷ lệ tương ứng. Khi sử dụng ASA (Phân bổ không gian con thích ứng), giá trị này xác định số lượng không gian con ban đầu trước khi cắt tỉa. Các giá trị điển hình dao động từ 3 đến 10. Mặc định là 5.
  • subspace_rank (int) — Rank (r_i) cho từng subspace có thể huấn luyện. Tham số này kiểm soát khả năng của mỗi subspace trong việc học các sự thích ứng. Giá trị cao hơn làm tăng tính biểu đạt nhưng cũng làm tăng số lượng tham số có thể huấn luyện. Tổng số tham số có thể huấn luyện tỷ lệ theo O(num_subspaces subspace_rank (in_dim + out_dim) / num_subspaces). Đối với hầu hết các tác vụ, các giá trị từ 1 đến 4 hoạt động tốt. Mặc định là 1.
  • target_modules (Optional[Union[list[str], str]]) — Tên của các module cần áp dụng AdaMSS. Nếu được chỉ định, chỉ các module này sẽ được thích ứng. Có thể là một danh sách các tên module chính xác hoặc một biểu thức regex. Ví dụ, ['q_proj', 'v_proj'] cho các lớp attention, hoặc '.*decoder.*(SelfAttention|EncDecAttention).*(q|v)$' cho khớp regex.
  • modules_to_save (Optional[list[str]]) — Danh sách các module ngoài các lớp AdaMSS cần được đặt là có thể huấn luyện và lưu trong checkpoint cuối cùng. Các module này sẽ được fine-tune hoàn toàn (không chỉ low-rank). Bắt buộc đối với các head được khởi tạo ngẫu nhiên như classifier hoặc score trong các tác vụ phân loại.
  • init_weights (Literal["orthogonal"]) — Phương pháp khởi tạo cho các trọng số có thể huấn luyện của AdaMSS. Hiện tại chỉ hỗ trợ “orthogonal”, sử dụng khởi tạo trực giao cho các ma trận B (chiếu đầu ra). Các ma trận A được khởi tạo bằng 0 để đảm bảo mô hình bắt đầu từ các trọng số đã được huấn luyện trước. Đặt thành None để bỏ qua bước khởi tạo khi tải từ checkpoint. Mặc định là “orthogonal”.
  • layers_to_transform (Optional[Union[list[int], int]]) — Các chỉ số lớp cụ thể để áp dụng AdaMSS. Nếu được chỉ định, chỉ các lớp này sẽ được thích ứng, hữu ích cho việc thử nghiệm xem lớp nào hưởng lợi nhiều nhất từ thích ứng. Có thể là một số nguyên duy nhất hoặc một danh sách các số nguyên.
  • layers_pattern (Optional[Union[list[str], str]]) — Mẫu để khớp tên lớp khi layers_to_transform được chỉ định. Được dùng để trích xuất chỉ số lớp từ tên module không tuân theo mẫu phổ biến.
  • use_asa (bool) — Có bật Adaptive Subspace Allocation (ASA) hay không. Khi được bật, ASA sẽ cắt bỏ động các subspace kém quan trọng hơn trong quá trình huấn luyện dựa trên thông tin gradient, giúp giảm số lượng tham số hiệu dụng trong khi vẫn duy trì hiệu suất. Yêu cầu tích hợp với một training callback. Mặc định là False.
  • asa_target_subspaces (int) — Tổng số subspace hoạt động mục tiêu trên tất cả các lớp khi ASA được bật. ASA sẽ cắt giảm subspace một cách dần dần cho đến khi đạt được mục tiêu này. Các giá trị thấp hơn dẫn đến việc cắt giảm mạnh mẽ hơn và ít tham số có thể huấn luyện hơn. Phải nhỏ hơn num_subspaces * num_target_modules. Các giá trị điển hình dao động từ 20 đến 100 tùy thuộc vào kích thước mô hình. Mặc định là 50. Phải là một số nguyên dương khi use_asa=True.
  • init_warmup (int) — Số bước huấn luyện cần chờ trước khi bắt đầu cắt tỉa ASA. Trong giai đoạn warmup, tất cả các không gian con vẫn được kích hoạt để cho phép các điểm quan trọng ổn định. Giá trị cao hơn cung cấp thêm thời gian để ước lượng độ quan trọng chính xác hơn nhưng làm trì hoãn việc cắt tỉa. Các giá trị điển hình dao động từ 50 đến 200. Mặc định là 50. Phải nhỏ hơn final_warmup khi use_asa=True.
  • final_warmup (int) — Bước huấn luyện mà tại đó ASA hoàn tất việc cắt tỉa và đạt được asa_target_subspaces không gian con hoạt động. Việc cắt tỉa được phân bổ giữa init_warmup và final_warmup. Nên được thiết lập dựa trên tổng số bước huấn luyện; thường là từ 1/3 đến 1/2 tổng số bước huấn luyện. Mặc định là 1000. Phải lớn hơn init_warmup khi use_asa=True.
  • mask_interval (int) — Số bước huấn luyện giữa các lần cập nhật ASA mask. Giá trị thấp cho phép thích ứng thường xuyên hơn nhưng làm tăng chi phí. Giá trị cao cung cấp các ước lượng độ quan trọng ổn định hơn giữa các lần cập nhật. Giá trị điển hình dao động từ 50 đến 200. Mặc định là 100. Phải là số nguyên dương khi use_asa=True.
  • asa_importance_beta (float) — Hệ số trung bình động mũ (EMA) để làm mượt điểm quan trọng của không gian con. Các giá trị cao hơn (gần 1.0) sẽ đặt trọng số lớn hơn cho độ quan trọng trong quá khứ, mang lại sự ổn định. Các giá trị thấp hơn khiến độ quan trọng phản ứng nhanh hơn với các gradient gần đây. Các giá trị điển hình dao động từ 0,8 đến 0,95. Giá trị mặc định là 0,85.
  • asa_uncertainty_beta (float) — Hệ số EMA để làm mượt các ước lượng độ bất định của tầm quan trọng. Kiểm soát tốc độ thích ứng của độ bất định với phương sai gradient. Tương tự như asa_importance_beta, các giá trị cao hơn cung cấp các ước lượng ổn định hơn. Các giá trị điển hình dao động từ 0,8 đến 0,95. Giá trị mặc định là 0,85.
  • asa_schedule_exponent (float) — Số mũ của lịch trình kiểm soát tốc độ suy giảm từ tổng số không gian con xuống asa_target_subspaces trong quá trình ASA warmup. Các giá trị cao hơn dẫn đến việc cắt tỉa ban đầu nhanh hơn (giảm mạnh hơn ở giai đoạn đầu), trong khi các giá trị thấp hơn cung cấp sự suy giảm từ từ, giống tuyến tính hơn. Công thức là: current_active_subspaces = asa_target_subspaces + (asa_total_subspaces - asa_target_subspaces) * (progress ** exponent). Các giá trị điển hình dao động từ 1.0 (tuyến tính) đến 5.0 (mạnh mẽ). Mặc định là 3.0. Phải là một số dương khi use_asa=True (số mũ bằng không hoặc âm sẽ khiến lịch trình suy biến thành một thao tác không làm gì vĩnh viễn hoặc, một khi progress đạt đúng 0.0, sẽ gây ra ZeroDivisionError).
  • use_dynamic_rank (bool) — Xác định bậc của từng không gian con một cách động dựa trên độ lớn của các giá trị riêng. Khi có giá trị True, bậc của mỗi không gian con được xác định bằng cách đếm số giá trị riêng lớn hơn ngưỡng, cho phép các không gian con có bậc hiệu dụng khác nhau. Khi có giá trị False, tất cả các không gian con đều sử dụng subspace_rank cố định. Giá trị mặc định là False.
  • svd_threshold (float) — Tỷ lệ ngưỡng cho việc chọn bậc động, chỉ được sử dụng khi use_dynamic_rank=True. Một giá trị riêng được coi là có ý nghĩa nếu nó lớn hơn threshold * max_singular_value. Các giá trị cao hơn dẫn đến bậc hiệu dụng thấp hơn (cắt bỏ mạnh hơn). Các giá trị điển hình dao động từ 0.05 đến 0.2. Mặc định là 0.1 (10% của giá trị lớn nhất).

Lớp cấu hình cho phương pháp Adamss (Adaptive Multi-Subspaces).

AdaMSS là một phương pháp tinh chỉnh hiệu quả về tham số, phân rã các ma trận trọng số bằng SVD và nhóm không gian đã phân rã thành nhiều không gian con có thể huấn luyện. Phương pháp này học các cập nhật hạng thấp trong các không gian con đó trong khi giữ nguyên các trọng số gốc.

AdamssModel

lớp peft.AdamssModel

< >

( modelconfigadapter_namelow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict] = None ) → torch.nn.Module

Tham số

  • model (torch.nn.Module) — Mô hình cần được thích ứng.
  • config (AdamssConfig) — Cấu hình của mô hình Adamss.
  • adapter_name (str) — Tên của adapter, mặc định là "default".

Trả về

torch.nn.Module

Mô hình Adamss.

Tạo mô hình Adamss (Adaptive Multi-Subspaces) từ một mô hình được huấn luyện trước.

Phương pháp này phân rã các ma trận trọng số bằng SVD và phân cụm không gian đã phân rã thành nhiều không gian con có thể huấn luyện được để tinh chỉnh hiệu quả tham số.

Ví dụ:

>>> from transformers import AutoModelForImageClassification
>>> from peft import AdamssConfig, get_peft_model

>>> config = AdamssConfig(
...     r=500,
...     num_subspaces=5,
...     target_modules=["query", "value"],
... )

>>> model = AutoModelForImageClassification.from_pretrained("google/vit-base-patch16-224")
>>> adamss_model = get_peft_model(model, config)

Thuộc tính:

  • model (~torch.nn.Module) — Mô hình cần được thích ứng.
  • peft_config (AdamssConfig): Cấu hình của mô hình Adamss.

update_and_allocate

< >

( global_step: int )

Tham số

  • global_step (int) — Bước huấn luyện hiện tại.

Cập nhật điểm quan trọng và áp dụng che phủ ASA (nếu được bật).

Phương thức này nên được gọi ở mọi bước huấn luyện sau loss.backward() và trước optimizer.zero_grad() khi ASA được bật. Bên trong nó:

  1. Tích lũy các điểm quan trọng thông qua EMA ở mỗi bước trong giai đoạn khởi động.
  2. Tại các khoảng thời gian mask, áp dụng che top-K toàn cục và đặt lại độ quan trọng.

Đây là điểm vào duy nhất cho ASA – việc sử dụng AdamssAsaCallback với Trainer của HuggingFace đơn giản là chuyển tiếp đến phương thức này. Đối với các vòng lặp huấn luyện tùy chỉnh, hãy gọi trực tiếp phương thức này thay vì callback.

Ví dụ:

for step, batch in enumerate(dataloader):
loss = model(**batch).loss loss.backward() optimizer.step() model.base_model.update_and_allocate(step)
optimizer.zero_grad()
Update on GitHub