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), ağırlık matrislerini SVD kullanarak ayrıştıran ve ayrıştırılmış uzayı birden fazla eğitilebilir alt uzaya kümeleyen parametre-verimli ince ayar yöntemidir. Her alt uzay, orijinal ağırlıklar dondurulurken bağımsız düşük-rank güncellemeleri öğrenir. AdaMSS ayrıca, eğitim sırasında gradyan bilgisine dayanarak daha az önemli alt uzayları dinamik olarak budayan Adaptive Subspace Allocation (ASA) özelliğini de destekler.

Makalenin özeti şudur:

Büyük modellerin parametre-verimli ince ayarı için AdaMSS adlı, adaptif çok-alt-uzay yaklaşımını öneriyoruz. Ağ ağırlıklarının büyük, tek bir alt-uzayında çalışan geleneksel parametre-verimli ince ayar yöntemlerinin aksine AdaMSS, alt-uzay segmentasyonundan yararlanarak birden fazla daha küçük alt-uzay elde eder ve eğitim sırasında eğitilebilir parametre sayısını adaptif olarak azaltır; nihayetinde yalnızca hedef aşağı akış göreviyle en ilgili küçük bir alt-uzay alt kümesiyle ilişkili olanları günceller. En düşük rütbeli temsilin kullanılmasından ötürü AdaMSS, model parametrelerinin daha kompakt bir ifade gücü ve daha ince ayarını sağlar. Teorik analizler, AdaMSS'in LoRA, PiSSA ve diğer tek-alt-uzay, düşük-rütbeli tabanlı yöntemlere kıyasla daha iyi genelleme garantisi sunduğunu göstermektedir. Görsel sınıflandırma, doğal dil anlama ve doğal dil üretimi görevlerinde yapılan kapsamlı deneyler, AdaMSS'in tam ince ayar ile karşılaştırılabilir performans elde ettiğini ve çoğu durumda diğer parametre-verimli ince ayar yöntemlerinden daha iyi sonuç verdiğini, tüm bunları daha az eğitilebilir parametre gerektirerek başardığını göstermektedir. Özellikle ViT-Large modelinde AdaMSS, yedi görev boyunca LoRA'dan ortalama doğrulukta %4,7 daha yüksek performans gösterirken yalnızca eğitilebilir parametrelerin %15,4'ünü kullanmaktadır. RoBERTa-Large üzerinde ise AdaMSS, altı görev boyunca ortalama doğrulukta PiSSA'dan %7 daha iyi performans gösterirken eğitilebilir parametre sayısını yaklaşık %94,4 oranında azaltmaktadır. Bu sonuçlar, AdaMSS'in parametre-verimli ince ayar konusundaki etkinliğini ortaya koymaktadır. AdaMSS'in kodu https: //github.com/jzheng20/AdaMSS adresinde mevcuttur.

AdaMSS şu anda aşağıdaki kısıtlamalara sahiptir:

  • Yalnızca nn.Linear katmanları desteklenir.
  • KMeans kümeleme adımı için scikit-learn gerektirir.

Bu kısıtlamalar kullanım senaryonuza uygun değilse, bunun yerine başka yöntemleri düşünün.

Karma performans değerlendirmesi genel bakış

API

AdamssConfig

sınıf 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 )

Parametreler

  • r (int) — SVD ayrıştırması için toplam rütbe (makalede R olarak belirtilir). Bu, kümelemeye geçilmeden önce ağırlık matrisini temsil etmek için kullanılan tekil vektör sayısını belirler. Daha yüksek değerler, orijinal ağırlıklardan daha fazla bilgi yakalar ancak daha fazla hesaplama ve bellek gerektirir. Daha düşük değerler daha güçlü bir düzenleme sağlar. Tipik değerler 50 ile 500 arasında değişir. Varsayılan değer 100'dür.
  • num_subspaces (int) — SVD ile ayrıştırılmış uzayın kümelendirileceği alt uzay sayısı (K). Her alt uzay bağımsız düşük r'li güncellemeler öğrenir. Bu değerin artırılması daha ince taneli uyarlama sağlar ancak eğitilebilir parametre sayısını orantılı olarak artırır. ASA (Adaptive Subspace Allocation) kullanıldığında, budama öncesi başlangıç alt uzay sayısını belirler. Tipik değerler 3 ile 10 arasında değişir. Varsayılan değer 5'tir.
  • subspace_rank (int) — Eğitilebilir her alt uzay için rütbe (r_i). Bu, her alt uzayın adaptasyonları öğrenme kapasitesini kontrol eder. Daha yüksek değerler ifade gücünü artırır ancak eğitilebilir parametre sayısını da artırır. Toplam eğitilebilir parametreler O(num_subspaces subspace_rank (in_dim + out_dim) / num_subspaces) olarak ölçeklenir. Çoğu görev için 1-4 arası değerler iyi çalışır. Varsayılan değer 1'dir.
  • target_modules (Optional[Union[list[str], str]]) — AdaMSS'nin uygulanacağı modüllerin adları. Belirtilirse, yalnızca bu modüller uyarlanır. Tam modül adlarının bir listesi veya bir regex ifadesi olabilir. Örneğin, dikkat katmanları için ['q_proj', 'v_proj'] veya regex eşleştirme için '.*decoder.*(SelfAttention|EncDecAttention).*(q|v)$'.
  • modules_to_save (Optional[list[str]]) — AdaMSS katmanları dışında, eğitilebilir olarak ayarlanacak ve nihai checkpoint'te kaydedilecek modüllerin listesi. Bu modüller tamamen ince ayarlanacak (yalnızca düşük rütbeli değil). Sınıflandırma görevlerinde classifier veya score gibi rastgele başlatılmış başlar için gereklidir.
  • init_weights (Literal["orthogonal"]) — AdaMSS eğitilebilir ağırlıkları için başlatma yöntemi. Şu anda yalnızca “orthogonal” desteklenmektedir; bu yöntem, B matrisleri (çıktı projeksiyonu) için ortogonal başlatma kullanır. Modelin önceden eğitilmiş ağırlıklardan başlamasını sağlamak için A matrisleri sıfıra başlatılır. Kontrol noktasından (checkpoint) yüklerken başlatmayı atlamak için None olarak ayarlayın. Varsayılan değer “orthogonal”dir.
  • layers_to_transform (Optional[Union[list[int], int]]) — AdaMSS uygulanacak belirli katman indeksleri. Belirtilirse, yalnızca bu katmanlar uyarlanır; bu, uyarlamadan en çok fayda sağlayan katmanları denemek için kullanışlıdır. Tek bir tamsayı veya tamsayı listesi olabilir.
  • layers_pattern (Optional[Union[list[str], str]]) — layers_to_transform belirtildiğinde katman adlarını eşleştirmek için kullanılan desen. Ortak deseni takip etmeyen modül adlarından katman indekslerini çıkarmak için kullanılır.
  • use_asa (bool) — Adaptive Subspace Allocation (ASA) etkinleştirilecek mi. Etkinleştirildiğinde ASA, eğitim sırasında gradyan bilgisine dayanarak daha az önemli alt uzayları dinamik olarak budar; bu sayede performansı korurken etkin parametre sayısını azaltır. Bir eğitim geri çağrısıyla entegrasyon gerektirir. Varsayılan değer False'tur.
  • asa_target_subspaces (int) — ASA etkinleştirildiğinde, tüm katmanlar arasında hedeflenen toplam aktif alt uzay sayısı. ASA, bu hedefe ulaşılana kadar alt uzayları kademeli olarak budar. Daha düşük değerler, daha agresif budama ve daha az eğitilebilir parametre sonucunu verir. num_subspaces * num_target_modules değerinden küçük olmalıdır. Model boyutuna bağlı olarak tipik değerler 20 ile 100 arasında değişir. Varsayılan değer 50'dir. use_asa=True olduğunda pozitif bir tam sayı olmalıdır.
  • init_warmup (int) — ASA budama işlemine başlanmadan önce beklenmesi gereken eğitim adım sayısı. Isınma süresince tüm alt uzaylar aktif kalır ve önem skorlarının kararlılaşmasına izin verilir. Daha yüksek değerler, doğru önem tahmini için daha fazla süre sağlar ancak budamayı geciktirir. Tipik değerler 50 ile 200 arasında değişir. Varsayılan değer 50'dir. use_asa=True olduğunda final_warmup'dan küçük olmalıdır.
  • final_warmup (int) — ASA'nın budamayı tamamladığı ve asa_target_subspaces aktif alt uzaya ulaştığı eğitim adımı. Budama, init_warmup ile final_warmup arasında dağıtılır. Toplam eğitim adımına göre ayarlanmalıdır; genellikle toplam eğitim adımının 1/3'ü ile 1/2'si arasıdır. Varsayılan değer 1000'dir. use_asa=True olduğunda init_warmup değerinden büyük olmalıdır.
  • mask_interval (int) — ASA mask güncellemeleri arasındaki eğitim adım sayısı. Daha düşük değerler daha sık uyarlama sağlar ancak maliyeti artırır. Daha yüksek değerler, güncellemeler arası daha kararlı önem tahminleri sunar. Tipik değerler 50 ile 200 arasında değişir. Varsayılan değer 100'dür. use_asa=True olduğunda pozitif bir tam sayı olmalıdır.
  • asa_importance_beta (float) — Alt uzay önem puanlarını yumuşatmak için üstel hareketli ortalama (EMA) katsayısı. Daha yüksek değerler (1.0'a yakın) geçmiş öneme daha fazla ağırlık vererek kararlılık sağlar. Daha düşük değerler, önemin son gradyanlara karşı daha duyarlı olmasını sağlar. Tipik değerler 0.8 ile 0.95 arasında değişir. Varsayılan değer 0.85'tir.
  • asa_uncertainty_beta (float) — Önem belirsizliği tahminlerini yumuşatmak için EMA katsayısı. Belirsizliğin gradyan varyansına ne kadar hızlı uyum sağladığını kontrol eder. asa_importance_beta ile benzer şekilde, daha yüksek değerler daha kararlı tahminler sağlar. Tipik değerler 0.8 ile 0.95 arasında değişir. Varsayılan değer 0.85'tir.
  • asa_schedule_exponent (float) — ASA ısınma sırasında toplam alt uzaylardan asa_target_subspaces değerine doğru azalma hızını kontrol eden zamanlama üstel sayısı. Daha yüksek değerler daha hızlı başlangıç budamasına (daha agresif erken azalmaya) yol açarken, daha düşük değerler daha kademeli, doğrusal benzeri bir azalma sağlar. Formül şöyledir: current_active_subspaces = asa_target_subspaces + (asa_total_subspaces - asa_target_subspaces) * (progress ** exponent). Tipik değerler 1.0 (doğrusal) ile 5.0 (agresif) arasında değişir. Varsayılan değer 3.0'dır. use_asa=True olduğunda pozitif bir sayı olmalıdır (sıfır veya negatif bir üstel, zamanlamayı kalıcı bir işlevsiz duruma indirger veya progress tam olarak 0.0 değerine ulaştığında ZeroDivisionError hatası fırlatır).
  • use_dynamic_rank (bool) — Tekil değer büyüklüklerine göre alt uzay derecelerini dinamik olarak belirleyip belirlemeyeceğini belirtir. True olduğunda, her alt uzayın derecesi, eşik değerin üzerindeki tekil değerlerin sayılmasıyla belirlenir ve bu da farklı alt uzayların farklı etkili derecelere sahip olmasına olanak tanır. False olduğunda, tüm alt uzaylar sabit subspace_rank değerini kullanır. Varsayılan değer False'tur.
  • svd_threshold (float) — Dinamik rütbe seçimi için eşik oranı, yalnızca use_dynamic_rank=True olduğunda kullanılır. Bir tekil değer, threshold * max_singular_value değerini aşıyorsa önemli kabul edilir. Daha yüksek değerler, daha düşük etkili rütbelerle sonuçlanır (daha agresif kesme). Tipik değerler 0.05 ile 0.2 arasında değişir. Varsayılan değer 0.1'dir (maksimumun %10'u).

Adamss (Adaptive Multi-Subspaces) yöntemi için yapılandırma sınıfı.

AdaMSS, ağırlık matrislerini SVD kullanarak ayrıştıran ve ayrıştırılmış uzayı birden fazla eğitilebilir alt uzaya kümeleyen parametre-verimli ince ayar yöntemidir. Orijinal ağırlıklar dondurulurken bu alt uzaylar içinde düşük rütbeli güncellemeler öğrenir.

AdamssModel

sınıf peft.AdamssModel

< >

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

Parametreler

  • model (torch.nn.Module) — Uyarlanacak model.
  • config (AdamssConfig) — Adamss modelinin yapılandırması.
  • adapter_name (str) — Adaptörün adı, varsayılan olarak "default"'tır.

Dönüş değeri

torch.nn.Module

Adamss modeli.

Önceden eğitilmiş bir modelden Adamss (Adaptive Multi-Subspaces) modeli oluşturur.

Yöntem, ağırlık matrislerini SVD kullanarak ayrıştırır ve parametrik olarak verimli ince ayar için ayrıştırılmış uzayı birden fazla eğitilebilir alt uzaya kümeleştirir.

Örnek:

>>> 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)

Öznitelikler:

  • model (~torch.nn.Module) — Uyarlanacak model.
  • peft_config (AdamssConfig): Adamss modelinin yapılandırması.

update_and_allocate

< >

( global_step: int )

Parametreler

  • global_step (int) — Mevcut eğitim adımı.

Önem skorlarını güncelleyin ve ASA maskelemesini uygulayın (etkinse).

ASA etkin olduğunda, bu yöntem loss.backward() sonrasında ve optimizer.zero_grad() öncesinde her eğitim adımında çağrılmalıdır. İçeride:

  1. Isınma dönemi boyunca her adımda EMA yoluyla önem puanlarını biriktirir.
  2. Maske aralıklarında, küresel top-K maskelenmesini uygular ve önem değerlerini sıfırlar.

Bu, ASA için tek giriş noktasıdır – HuggingFace Trainer ile AdamssAsaCallback kullanmak, yalnızca bu yönteme devredilir. Özel eğitim döngüleri için, geri çağırma yerine doğrudan bunu çağırın.

Örnek:

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