Transformers documentation
Trainer yöntemlerini alt sınıflandırma
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_checkpointveya_evaluategibi ö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 lossDPO, 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_chosenveπ_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 lossSonraki 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.