# 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](/docs/transformers/main/tr/main_classes/trainer#transformers.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](/docs/transformers/main/tr/main_classes/trainer#transformers.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](./trainer_callbacks) 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.

> [!NOTE]
> Alt sınıflandırabileceğiniz yöntemlerin tam listesi için [Trainer](/docs/transformers/main/tr/main_classes/trainer#transformers.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()](/docs/transformers/main/tr/main_classes/trainer#transformers.Trainer.get_train_dataloader) metodu bir batch yükler, üzerinde eğitim yapar, onu atar ve bir sonraki batch'i yükler.

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

[GRPO](https://huggingface.co/docs/trl/en/grpo_trainer), eğitimden önce tamamlamalar üreten çevrimiçi bir pekiştirmeli öğrenme algoritmasıdır. Her adımda tamamlama üretmek, otoregresif olduğu için pahalıdır. 512 jetonluk bir tamamlama, bir eğitim adımı için tek bir ileri geçişe kıyasla ~512 ardışık ileri geçiş gerektirir. [GRPOTrainer](https://huggingface.co/docs/trl/main/en/grpo_trainer#trl.GRPOTrainer), üretimi birden fazla adım arasında toplu hale getirmek için [get_train_dataloader()](/docs/transformers/main/tr/main_classes/trainer#transformers.Trainer.get_train_dataloader) sınıfını alt sınıflandırır.

`trl.GRPOTrainer.get_train_dataloader`, `steps_per_generation` argümanını çarpan olarak kullanarak birden fazla eğitim adımı için *batch*ler 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.

```py
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()](/docs/transformers/main/tr/main_classes/trainer#transformers.Trainer.compute_loss), model tarafından hesaplanan çapraz entropi kaybını döndürür.

```py
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](https://huggingface.co/docs/trl/en/dpo_trainer), 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](https://huggingface.co/docs/trl/main/en/dpo_trainer#trl.DPOTrainer), kayıp hesabı standart çapraz entropiden birkaç açıdan farklılaştığı için [compute_loss()](/docs/transformers/main/tr/main_classes/trainer#transformers.Trainer.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()](/docs/transformers/main/tr/main_classes/trainer#transformers.Trainer.compute_loss) yöntemine uymuyor.

```py
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](https://huggingface.co/docs/trl/main/en/grpo_trainer#trl.GRPOTrainer) ve [DPOTrainer](https://huggingface.co/docs/trl/main/en/dpo_trainer#trl.DPOTrainer)'in [Trainer](/docs/transformers/main/tr/main_classes/trainer#transformers.Trainer)'i nasıl genişlettiğini veya [Axolotl](https://github.com/axolotl-ai-cloud/axolotl/tree/main/src/axolotl/core/trainers)'ü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](./trainer_callbacks) kılavuzunu kontrol edin.

