PEFT documentation
Prefix tuning
Prefix tuning

Prefix tuning, önceden eğitilmiş modelin dondurulması sağlanırken öğrenilebilen, girdi dizisine bir dizi görev özelinde vektör ekler. Önek parametreleri, modelin tüm katmanlarına yerleştirilir.
Makalenin özeti şudur:
İnce ayar, büyük önceden eğitilmiş dil modellerini aşağı akış görevlerini gerçekleştirmek için kullanmanın fiili yoludur. Ancak bu yöntem, dil modelinin tüm parametrelerini değiştirir ve bu nedenle her görev için tam bir kopya saklamayı gerektirir. Bu makalede, dil modelinin parametrelerini dondururken küçük, sürekli ve göreve özgü bir vektörü (prefix olarak adlandırılır) optimize eden, doğal dil üretimi görevleri için ince ayarın hafif bir alternatifi olan prefix-tuning'i öneriyoruz. Prefix-tuning, ilhamını prompting'den alır ve sonraki token'ların bu prefix'e sanki “sanal token”lar gibi davranıyormuş gibi dikkat etmesine olanak tanır. Prefix-tuning'i tablo-metne üretim için GPT-2'ye ve özetleme için BART'a uyguluyoruz. Sadece parametrelerin %0,1'ini öğrenerek prefix-tuning'in tam veri ayarında karşılaştırılabilir performans elde ettiğini, düşük veri ayarlarında ince ayarı geride bıraktığını ve eğitim sırasında görülmemiş konulara sahip örneklerde daha iyi genelleme yaptığını buluyoruz.
Not Kodlayıcı-çözücü modellerinde (seq2seq), önek yalnızca çözücüye uygulanır; bu, makaledeki spesifikasyonla örtüşmez (bkz. örn. Şekil 2). Önek ayarı bu model mimarilerinde yine de ince ayarlanabilir ancak performans beklentilerin altında kalabilir; kodlayıcı-çözücü modeller için başka PEFT yöntemlerini kullanmayı düşünün.
Prefix tuning, prompt tuning ile çok benzerdir. Temel fark, prefix parametrelerinin modelin tüm katmanlarına eklenmesi, prompt tuning'in ise yalnızca model giriş gömme değerlerine prompt parametreleri eklemesidir. Soft prompt'lar üzerinde doğrudan eğitim yapmak istikrarsızlığa ve performans düşüşüne yol açtığı için, prefix parametreleri bunun yerine ayrı bir ileri beslemeli ağ (FFN) ile optimize edilir. Soft prompt'lar güncellendikten sonra FFN atılır.
Sonuç olarak, yazarlar, prefix tuning'in parametre sayısı tam ince ayarın 1000 katı daha az olmasına rağmen modele benzer performans gösterdiğini ve düşük veri ortamlarında hatta daha iyi performans sergilediğini tespit etmiştir.
Temel Kullanım
Görev türünü ve ekleyip öğreneceğiniz sanal token sayısını içeren bir PrefixTuningConfig oluşturun.
from peft import PrefixTuningConfig, get_peft_model
peft_config = PrefixTuningConfig(task_type="CAUSAL_LM", num_virtual_tokens=20)
model = get_peft_model(model, peft_config)
model.print_healthcheck()Olası Başlangıç Değerleri
Varsayılan olarak, prefix tuning rastgele başlatılmış sanal jetonlar kullanır. Vektörlerin bir no-op'a yakın olacak şekilde başlatılması (sıfıra başlatılır, yine de olasılık kütlesini biraz kaydırır) seçeneği de mevcuttur. Bu, KV-cache'e enjekte edilen öneklerin başlangıçta daha az etkiye sahip olduğu ve eğitim performansındaki varyansı azalttığı anlamına gelir.
PEFT, mevcut bir KV önbellek önekinden (örneğin, bir istem/kurumun ilk p belirteçlerinden) bir prefix-tuning adaptörü başlatmak için de yardımcılar sağlar. Bu, öğrenilen parametrelerin KV önekinin kendisi olduğu durumlarda yalnızca prefix_projection=False (varsayılan) olduğunda desteklenir.
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PrefixTuningConfig, get_peft_model, initialize_kv_prefix_from_text
base = AutoModelForCausalLM.from_pretrained("gpt2")
tok = AutoTokenizer.from_pretrained("gpt2")
peft_cfg = PrefixTuningConfig(task_type="CAUSAL_LM", num_virtual_tokens=20, prefix_projection=False)
model = get_peft_model(base, peft_cfg)
initialize_kv_prefix_from_text(
model,
tok,
text="...a long context with at least num_virtual_tokens tokens...",
use_chat_template=False,
)m peft import PrefixTuningConfig, get_peft_model, initialize_kv_prefix_from_text
base = AutoModelForCausalLM.from_pretrained("gpt2")
tok = AutoTokenizer.from_pretrained("gpt2")
peft_cfg = PrefixTuningConfig(task_type="CAUSAL_LM", num_virtual_tokens=20, prefix_projection=False)
model = get_peft_model(base, peft_cfg)
initialize_kv_prefix_from_text(
model,
tok,
text="...a long context with at least num_virtual_tokens tokens...",
use_chat_template=False,
)
Metnin, en az num_virtual_tokens token üretecek kadar uzun olduğundan emin olun; aksi takdirde başlatma işlemi başarısız olur.
Bir kılavuz olarak:
initialize_kv_prefix_from_textkullanarak nötr bir başlangıç dizisiyle başlayın, bu “Question: ” gibi çok kısa bir dize olabilir- bu işe yaramazsa, görevle ilgili daha uzun bir dizi (yani tasarlanmış bir istem) kullanın; bu size sığdırılacak daha fazla sanal token sağlar ancak modelin yönlendirilmesini de artırır
- başlangıç metni kullanmak mümkün değilse veya prefix tuning'in uygulanabilirliğini hızlıca kontrol etmek istiyorsanız, projeksiyonsuz sıfır başlatma kullanın
Karma performans değerlendirmesi genel bakış
API
PrefixTuningConfig
sınıf peft.PrefixTuningConfig
< source >( 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 = Falsenum_virtual_tokens: int = Nonetoken_dim: int = Nonenum_transformer_submodules: Optional[int] = Nonenum_attention_heads: Optional[int] = Nonenum_layers: Optional[int] = Nonemodules_to_save: Optional[list[str]] = Noneinit_weights: typing.Literal['zero'] | None = Noneencoder_hidden_size: int = Noneprefix_projection: bool = False )
Parametreler
- init_weights (
Optional[str]) — Ayarlanmazsa ağırlıklar rastgele başlatılır; “zero” olarak ayarlanırsa ağırlıklar, aktivasyonların bir no-op (sıfır) olacağı şekilde başlatılır. - encoder_hidden_size (
int) — Prompt kodlayıcısının gizli boyutu. - prefix_projection (
bool) — Önek gömme projeksiyonunun uygulanıp uygulanmayacağını belirtir.
Bu, bir PrefixEncoder yapılandırmasını depolamak için kullanılan yapılandırma sınıfıdır.
PrefixEncoder
sınıf peft.PrefixEncoder
< source >( config )
Parametreler
- config (PrefixTuningConfig) — Önek kodlayıcısının yapılandırması.
Öneki kodlamak için kullanılan torch.nn modeli.
Örnek:
>>> from peft import PrefixEncoder, PrefixTuningConfig
>>> config = PrefixTuningConfig(
... peft_type="PREFIX_TUNING",
... task_type="SEQ_2_SEQ_LM",
... num_virtual_tokens=20,
... token_dim=768,
... num_transformer_submodules=1,
... num_attention_heads=12,
... num_layers=12,
... encoder_hidden_size=768,
... )
>>> prefix_encoder = PrefixEncoder(config)Öznitelikler:
- embedding (
torch.nn.Embedding) — Önek kodlayıcının gömme katmanı. - transform (
torch.nn.Sequential) —prefix_projectionTrueise önek gömme vektörlerini dönüştürmek için kullanılan iki katmanlı MLP. - prefix_projection (
bool) — Önek gömme vektörlerinin projeksiyonunun uygulanıp uygulanmayacağını belirtir.
Girdi şekli: (batch_size, num_virtual_tokens)
Çıktı şekli: (batch_size, num_virtual_tokens, 2*layers*hidden)
PEFT tarafından kaydedilen düzleştirilmiş istek gömme değerlerini (prompt_embeddings) yükleyin.
Önek ayarı (prefix tuning) için bu, yalnızca prefix_projection=False durumunda desteklenir; çünkü bu durumda öğrenilen parametreler KV öneğinin kendisidir (embedding.weight biçimi [num_virtual_tokens, num_layers*2*token_dim] şeklindedir).
prefix_projection=True ise, parametreler (sanal token gömme değerleri + bir MLP) şeklindedir ve düzleştirilmiş bir KV önekinden bu parametreleri geri getirmek için projeksiyonu tersine çevirmenin genel bir yolu yoktur.