PEFT documentation
Bağlama Duyarlı İstem Ayarlama: Adversarial Yöntemlerle Bağlam İçi Öğrenmeyi İlerletme
Bağlama Duyarlı İstem Ayarlama: Adversarial Yöntemlerle Bağlam İçi Öğrenmeyi İlerletme

Context-Aware Prompt Tuning (CPT), yalnızca bağlam gömme vektörlerini (context embeddings) iyileştirerek az örnekli sınıflandırmayı (few-shot classification) geliştirmek üzere tasarlanmıştır. Bu yaklaşım, In-Context Learning (ICL), Prompt Tuning (PT) ve adversarial optimizasyondaki fikirleri birleştirerek model uyarlamanın hem parametre verimli hem de etkili olmasına odaklanır. CPT'de yalnızca belirli bağlam token gömme vektörleri optimize edilirken, modelin geri kalanı dondurulmuş (frozen) kalır. Aşırı öğrenmeyi (overfitting) önlemek ve kararlılığı korumak için CPT, bağlam gömme vektörlerindeki izin verilen değişiklikleri tanımlı bir aralıkla sınırlamak üzere kontrollü perturbasyonlar kullanır. Ayrıca, bağlamın sonundaki örneklerin öncekilerden daha çok önceliklendirilmesine yol açan recency bias (sonluluk yanlılığı) olgusunu ele almak için CPT, bir sönümleme kaybı katsayısı (decay loss factor) uygular.
Makalenin özeti şudur:
Büyük Dil Modelleri (LLM), hem optimizasyona dayalı yaklaşımları hem de Bağlam İçi Öğrenme (ICL) yöntemini kullanarak az örnekli (few-shot) öğrenme gerçekleştirebilir. Optimizasyona dayalı yöntemler, sınırlı veriyle çok sayıda parametrenin güncellenmesini gerektirdiğinden genellikle aşırı öğrenme (overfitting) sorunu yaşar. Buna karşılık ICL, aşırı öğrenmeyi önler ancak genellikle optimizasyona dayalı yöntemlere kıyasla daha düşük performans gösterir ve gösterim örneklerinin seçimine, sıralamasına ve biçimine karşı son derece hassastır. Bu zorlukları aşmak için, ICL, Prompt Tuning (PT) ve adversarial saldırılardan ilham alan Bağlam Bilinçli Prompt Tuning (CPT) yöntemini sunuyoruz. CPT, girdiden önce örnekleri birleştiren ICL stratejisini temel alır ve eğitim örneklerinden daha derin içgörüler çıkararak bağlam gömme (embedding) değerlerini iteratif optimizasyon yoluyla iyileştirmek için PT benzeri öğrenmeyi entegre ederek bu stratejiyi genişletir. Yaklaşımımız, bağlam içindeki örneklerin benzersiz yapısını dikkate alarak belirli bağlam token'larını dikkatle değiştirir. Bağlamı PT benzeri optimizasyonla güncellemekle kalmayıp CPT, adversarial saldırılardan da ilham alarak, kullanıcı tarafından sağlanan verilerin içsel değerini korurken girdiyi bağlamda mevcut olan etiketlere göre ayarlar. Optimizasyon sırasında sağlamlık ve kararlılığı sağlamak için, token gömme değerlerinin orijinal değerlerine yakın kalmasını kısıtlayarak bağlamın kalitesini koruyan bir projeksiyonlu gradyan inişi (projected gradient descent) algoritması kullanıyoruz. Yöntemimiz, çeşitli LLM modelleri kullanılarak birden fazla sınıflandırma görevinde üstün doğruluk göstermiş, mevcut baz çizgileri (baselines) performansını aşmış ve az örnekli öğrenmedeki aşırı öğrenme sorununu etkili bir şekilde ele almıştır.
CPT ile bir modelin nasıl eğitileceğine dair adım adım bir kılavuz için Örnek'e göz atın.
Çalışma Prensibi
Context-aware Prompt Tuning, seçtiğiniz bir metin prompt'unu almanıza ve bu prompt'un token'larını, yalnızca bu prompt'un token'larını, prompt token'ları üzerinde ikinci bir token embedding'ine sahip olmaları sayesinde eğitilebilir kılmanıza izin vermesi bakımından Prompt Tuning'e benzer. Bir CPT modelini sorguladığınızda, 'yumuşak' prompt'unuz normal girdinizin embedding'ine baştan eklenir. CPT, Prompt Tuning'den, eğitilmeyecek belirli kısımları işaretleyerek yumuşak prompt'unuzun bağlamsallaştırılabilmesi bakımından farklıdır. CPT'ye özgü token embedding matrisi, temel modelin embedding matrisinden başlatılan statik bir embedding ve öğrenilebilir token-özel delta değerlerinden oluşur.
CPT, talimatların örnekler ve doğru cevaplar/etiketlerle birlikte yer aldığı bir promptunuz varsa faydalıdır. Talimatlar suboptimal olabilir ve bu nedenle eğitim sırasında optimize edilmekten (prompt tuning gibi) fayda görür, ancak prompta dahil ettiğiniz örnekler/etiketlerin değişmesi beklenmez. Bu, prompting'in nerede bittiğini ve örneklerin nerede başladığını açıkça tanımlayarak zorunlu kılınabilir. CPT, prompttaki örnekler için modelinizin standart bir sonraki token tahmin kaybına bir token kaybı ekleyerek verilen örneklerin en iyi şekilde kullanılmasını sağlar.
CPT, istemdeki farklı bölümleri işaretlemek için beş farklı tip kimliği kullanır:
- 0: separator: tamamen yok sayılır, cümle başı/sonu belirteçleri için kullanışlıdır
- 1: giriş işareti: ek bilgiler dahil olmak üzere, tüm giriş tarafı şablonunu işaret eden istemi tanımlayan jetonlar
- 2: girdi sorgusu: bir örneğin kullanıcı girdisini tanımlayan jetonlar
- 3: çıktı işareti: bir örneğin beklenen çıktısının başlangıcını tanımlayan jetonlar
- 4: label: örneğin etiketine ait jetonlar
Bu oldukça soyut bir konu, bu yüzden bir CPT istemci örneği ve buna karşılık gelen tür tanımlayıcılarını aşağıda bulabilirsiniz. Basitlik adına her kelime = 1 token olduğunu varsayıyoruz:
prompt_text = "Example 1: Input: 1+1 Answer: 2 Example 2: 1+3 Answer: 4"
token_ids = [15, 2, 11, 9, 1, 9, 11, 3, 11, 8, 9, 4, 2, 4, 9, 11, 3, 6, 8, 9, 10]
# BOS, Example 1 : Input : 1 + 1 Answer : 2 Example 2 : 1 + 3 Answer : 4
type_ids = [0, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8]
# 1, 1, 1, 2, 2, 2, 3, 3, 4token_ids, taban modelin tokenizer’ı tarafından kodlanmış istemdir ve ~CPTConfig.cpt_token_ids ile eşleşir. type_ids, istem token tür kimlikleridir; istemin farklı bölümlerini tanımlar ve ~CPTConfig.cpt_tokens_type_mask ile eşleşir.
Bireysel kimliklerin eğitim süreci üzerindeki etkileri farklıdır:
- 0: tamamen yok sayılır, kayba katkıda bulunmaz ve bu tokenlar eğitilmez; yalnızca teknik nedenlerle orada bulunan ve aksi halde parametre uzayını gereksiz yere büyütecek tokenlar için faydalıdır (ör. EOS tokenları)
- 1 ve 3: bu jetonlar biçimlendirme için dikkate alınır ve gömme farklarının (embedding delta) maksimum normu
opt_projection_format_epsilon()tarafından kontrol edilir. Norm, bu tür için öğrenilen delta gömlemelerinin (delta embeddings) yönelebileceği maksimum büyüklüğü kontrol eder. Daha yüksek normlar, anlamda daha yüksek bir değişim potansiyeli anlamına gelir. - 2: bu jetonlar bir örneğin girdisi olarak değerlendirilir ve gömme farklarının (embedding delta) maksimum normu
opt_projection_epsilon()tarafından kontrol edilir. Norm, bu tür için öğrenilen delta gömlemelerinin (delta embeddings) yönelebileceği maksimum büyüklüğü kontrol eder. Daha yüksek normlar, anlamda daha yüksek bir değişim potansiyeli anlamına gelir. - 4: İfadenin etiket token'ları, eğitim verinizdeki standart kayba ek olarak ek bir sonraki token tahmin hedefleri olarak eklenir; diğer tüm yumuşak-istek token'ları kayıptan maskelenir. Etiket anlamlarının korunması için etiket token'larının delta gömme değerleri asla değiştirilmez.
type_ids içindeki ikinci örnekteki sayıların 4 kaydırıldığını fark etmiş olabilirsiniz. CPT, prompt’ta sağladığınız örneklerin kaybı için üstel bir ağırlıklandırma uygular; son örnek en az sönümlenen, ilk örneğin kaybı ise en çok sönümlenen olur. Bu, gerçek girdi sorgusuna daha yakın olan örneklerin ağırlığını artırır ve opt_weighted_loss_type() "decay" olarak ayarlandığında opt_loss_decay_factor() tarafından kontrol edilir. Örnekleri 4 kaydırarak, kaybın her örneğe farklı sönümlenme ağırlıklandırmalarını verebilmesi için farklı örnekleri numaralandırabiliriz.
Not edin ki cpt_tokens_type_mask yalnızca yumuşak istemi (soft prompt) kendisini tanımlar. Eğitim sırasında, her partiyle birlikte ayrıca bir input_type_mask tensörü geçirin ve gerçek girdinizin token'larına tip kimlikleri atayın (yukarıdaki gibi 0-4 kimliklerini kullanarak, dolgu veya cümle sonu token'larını 0 olarak işaretleyin). CPT, bu kimlikleri isteminizdeki örnek sayısına göre otomatik olarak kaydırır, bu nedenle kendiniz kaydırmak zorunda değilsiniz. Bu, girdiyi istemdeki örnekler listenizin sonuna eklemeye eşdeğerdir. Kimliklerin 4'e göre modüler olarak yorumlandığını aklınızda tutun: 4'ün katları kadar kaydırmak zararsızdır, ancak başka herhangi bir ofset, hangi token'ların kaybın (loss) hesabına katkıda bulunduğunu sessizce değiştirir. input_type_mask geçirilmezse, CPT, tüm girdi token'ları için tip 4 varsayarak kaybı tüm girdi dizisi üzerinde hesaplamaya geri döner.
Karma performans değerlendirmesi genel bakış
Bu yöntem için henüz bir benchmark yoktur. Bir deneysel yapılandırma katkıda bulunmaktan çekinmeyin, ancak önce burada bir issue oluşturmaya özen gösterin.
API
CPTConfig
sınıf peft.CPTConfig
< 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]] = Nonecpt_token_ids: list[int] | None = Nonecpt_mask: list[int] | None = Nonecpt_tokens_type_mask: list[int] | None = Noneopt_weighted_loss_type: typing.Literal['none', 'decay'] | None = 'none'opt_loss_decay_factor: float | None = 1.0opt_projection_epsilon: float | None = 0.1opt_projection_format_epsilon: float | None = 0.1tokenizer_name_or_path: str | None = None )
Bağlam Duyarlı İstem Ayarlama (CPT) için PeftConfig'i genişleten CPT Configuration sınıfı.
Bu sınıf, CPT için gerekli ek parametreleri tanıtır, örneğin:
- Token türü maskeleri
- Prompt tuning başlatma
- Kayıp ağırlıklandırma
- Projeksiyon ayarları
Daha fazla ayrıntı için makaleye bakın: https://huggingface.co/papers/2410.17222
CPTEmbedding
CPTEmbedding, PEFT içinde Bağlam Duyarlı İstem Ayarlama (CPT) için tasarlanmış özel bir gömme katmanıdır. Gömme değerlerini başlatır, isteme özgü projeksiyonları uygular ve etiket maskeleri kullanarak kaybı hesaplar.
calculate_loss
< source >( base_model_outputlabelscpt_type_maskconfig ) → ModelOutput
Parametreler
- base_model_output (ModelOutput) — Logit'ler içeren taban model çıktısı.
- labels (torch.Tensor) — Girdi jetonları için doğru etiketler.
- cpt_type_mask (torch.Tensor) — Geçerli kayıp terimlerini filtrelemek için kullanılan token türü maskesi.
- config (Namespace) — Kayıp (loss) ile ilgili hiperparametreleri içeren yapılandırma nesnesi.
Dönüş değeri
ModelOutput
Hesaplanan kayıpla birlikte temel model çıktısı.
Opsiyonel üstel azalma ile CPT modelleri için kaybı hesaplar.
forward
< source >( indices ) → torch.Tensor
İstem gömme değerlerini hesaplar ve delta ayarlamalarını uygular.
Normlarını kontrol etmek için delta gömme vektörlerine epsilon tabanlı projeksiyon uygular.
CPT token türü maskesine göre token gradyanlarını seçici olarak güncellemek için geriye doğru bir kanca (backward hook) kurar.