Transformers documentation

Trainer yöntemlerini alt sınıflandırma

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.2).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Trainer yöntemlerini alt sınıflandırma

Eğitim davranışını tüm döngüyü yeniden yazmadan değiştirmek için Trainer yöntemlerini alt sınıflandırın. Alt sınıflandırma, örneğin ileri geçiş veya kayıp hesabı gibi eğitim döngüsünü değiştirir.

Alt sınıf oluşturmadan önce, Trainer'ın ne hesapladığını mı yoksa ne zaman ve ne koşullarda hareket ettiğini mi değiştirmeniz gerektiğini değerlendirin. Zamanlama ve koşullu mantık için bunun yerine bir Callback kullanın. Callback'ler olayların ne zaman gerçekleştiğini (loglama, değerlendirme, erken durdurma) kontrol ederken, alt sınıf oluşturma olayların ne şekilde gerçekleştiğini (kayıp hesaplama, veri yükleme, optimizasyon) değiştirir.

Alt sınıflandırabileceğiniz yöntemlerin tam listesi için Trainer API belgelerine bakın. _ önekiyle başlayan _save_checkpoint veya _evaluate gibi özel yöntemler de yeniden tanımlanabilir, ancak bunlar haber verilmeksizin değişebilir.

get_train_dataloader

Standart get_train_dataloader() metodu bir batch yükler, üzerinde eğitim yapar, onu atar ve bir sonraki batch'i yükler.

def get_train_dataloader(self):
    return self._get_dataloader(
        batch_size=self._train_batch_size,
        ...
)

GRPO, eğitimden önce tamamlamalar üreten çevrimiçi bir pekiştirmeli öğrenme algoritmasıdır. Her adımda tamamlama üretmek, otoregresif doğası gereği maliyetlidir. 512 jetonluk bir tamamlama, bir eğitim adımı için tek bir ileri geçişe kıyasla yaklaşık 512 ardışık ileri geçiş gerektirir. GRPOTrainer, üretimi birden fazla adım arasında toplu işlemek için get_train_dataloader() metodunu yeniden tanımlar.

trl.GRPOTrainer.get_train_dataloader, steps_per_generation argümanını çarpan olarak kullanarak birden fazla eğitim adımı için batchler halinde üretim istemlerini yükler. train_batch_size=4 ve steps_per_generation=8 ise, dataloader 32'lik batch'ler üretir ve üretim maliyetini 8 kat azaltır.

def get_train_dataloader(self):
    dataloader_params = {
        "batch_size": self._train_batch_size * self.args.steps_per_generation, # this is the only change
        ...
    }

Kayıp hesapla

compute_loss(), model tarafından hesaplanan çapraz entropi kaybını döndürür.

def compute_loss(self, model, inputs, return_outputs=False, num_items_in_batch=None):
    ...
    outputs = model(**inputs)
    ...
    loss = outputs["loss"] # get loss from model

    return (loss, outputs) if return_outputs else loss

DPO, referans modele göre politika modelinin reddedilen bir yanıt yerine seçilen yanıtı ne kadar güçlü tercih ettiğini ölçer. DPOTrainer, kayıp hesabı standart çapraz entropiden birkaç açıdan farklılaştığı için compute_loss() alt sınıfını oluşturur:

  • model etiketleri asla görmez; DPO'nun log-olasılıkları hesaplaması için yalnızca logit'leri döndürür
  • seçilen ve reddedilen yanıtlar birleştirilir
  • a reference model calculates its own log-probs
  • kayıp, π_chosen, π_rejected, π_ref_chosen ve π_ref_rejected'nin bir fonksiyonudur

Yukarıdakilerin hiçbiri standart Trainer.compute_loss() yöntemine uymuyor.

def compute_loss(
    self,
    model: PreTrainedModel | nn.Module,
    inputs: dict[str, torch.Tensor | Any],
    return_outputs=False,
    num_items_in_batch=None,
) -> torch.Tensor | tuple[torch.Tensor, dict[str, float]]:
    ...
    outputs = model(**inputs)
    logits = outputs.logits
    logps = get_logps(logits, inputs)
    chosen_logps, rejected_logps = logps.chunk(2, dim=0)  # batch is [chosen, rejected]
    ref_logits = self.ref_model(**inputs).logits
    ref_logps = get_logps(ref_logits, inputs)
    ref_chosen_logps, ref_rejected_logps = ref_logps.chunk(2, dim=0)  # batch is [chosen, rejected]
    chosen_scores = chosen_logps - ref_chosen_logps
    rejected_scores = rejected_logps - ref_rejected_logps
    per_sequence_loss = -F.logsigmoid(self.beta * chosen_scores - rejected_scores)
    loss = per_sequence_loss.mean()
    return (loss, outputs) if return_outputs else loss

Sonraki adımlar

  • Daha fazla gerçek dünya örneği için, TRL'de GRPOTrainer ve DPOTrainer'in Trainer'i nasıl genişlettiğini veya Axolotl'ün bunun üzerine özel trainer'lar nasıl oluşturduğunu inceleyin.
  • Eğitim adımı sonunda metrikleri günlüğe kaydetme gibi bir eğitim olayı sırasında gerçekleşenleri özelleştirmeniz gerekiyorsa Callbacks kılavuzunu kontrol edin.
Update on GitHub