Skip to main content

Early Stopping anhand von HuggingFace-Beispielen

Mache Feineinstellung deines HuggingFace-Transformers mit Early Stopping-Regulierung
Created on March 18|Last edited on February 2
Dieser Artikel wurde aus dem Englischen übersetzt. Hier ist das Original.

Einleitung

In diesem Bericht behandeln wir Beispiele, bei denen mit der Early Stopping-Regulierung die Feineinstellung deines HuggingFace-Transformers vorgenommen werden. Behandelt wird der Gebrauch von Early Stopping mit nativem PyTorch und TensorFlow, gemeinsam mit der HuggingFace Trainer API (Schnittstelle zur Programmierung von Anwendungen).

early-stopping-en.png



Natives TensorFlow

Nimm die Feineinstellung des HuggingFace-Transformers durch den Gebrauch von TF in Colab vor →\rightarrow

Wenn du TensorFlow (Keras) verwendest, um die Feineinstellung des HuggingFace-Transformers vorzunehmen, funktioniert das Einfügen von Early Stopping ganz unkompliziert mit tf.keras.callbacks.EarlyStopping Callback. Es nimmt den Namen des Maßes an, das du überwachst, und die Anzahl der Epochen, nach der das Training beendet wird, wenn sich keine Verbesserung zeigt.

early_stopper = tf.keras.callbacks.EarlyStopping(monitor='val_loss', 
                                                 patience=5, 
                                                 restore_best_weights=True)

Hier ist early_stopper der Callback, der mit modell.fit verwendet werden kann.

model.fit(trainloader, 
          epochs=10, 
          validation_data=validloader,
          callbacks=[early_stopper])

Beobachtungen

  • Das Modell unterlag schnell einer Überanpassung an das Trainings-Datenset, was sich am Validationsverlust zeigt.

  • Trainings-Modelle mit Early Stopping führen zu früher Beendigung des Trainingsprozesses. Das wiederum spart Rechenkosten und –zeit.

  • Da der beste Fall des Modells (niedriger Validationsverlust) während des Gebrauchs des EarlyStopping Callbacks gespeichert wurde, indiziert die resultierende Testgenauigkeit ei pauschalisierteres Modell.




Run set
4


Natives PyTorch

Nimm die Feineinstellung des HuggingFace-Transformers durch den Gebrauch von PyTorch in Colab vor →\rightarrow

Natives PyTorch hat keine gebrauchsfertige Early Stopping-Methode. Aber wenn du die Feineinstellung deines HuggingFace-Transformers durch den Gebrauch von PyTorch vornimmst, findest du hier eine GitHub-Kernaussage, die einen funktionierenden Early Stopping-Aufhänger bietet.

class EarlyStopping(object):
    def __init__(self, mode='min', min_delta=0, patience=10, percentage=False):
        self.mode = mode
        self.min_delta = min_delta
        self.patience = patience
        self.best = None
        self.num_bad_epochs = 0
        self.is_better = None
        self._init_is_better(mode, min_delta, percentage)

        if patience == 0:
            self.is_better = lambda a, b: True
            self.step = lambda a: False

    def step(self, metrics):
        if self.best is None:
            self.best = metrics
            return False

        if np.isnan(metrics):
            return True

        if self.is_better(metrics, self.best):
            self.num_bad_epochs = 0
            self.best = metrics
        else:
            self.num_bad_epochs += 1

        if self.num_bad_epochs >= self.patience:
            print('terminating because of early stopping!')
            return True

        return False

    def _init_is_better(self, mode, min_delta, percentage):
        if mode not in {'min', 'max'}:
            raise ValueError('mode ' + mode + ' is unknown!')
        if not percentage:
            if mode == 'min':
                self.is_better = lambda a, best: a < best - min_delta
            if mode == 'max':
                self.is_better = lambda a, best: a > best + min_delta
        else:
            if mode == 'min':
                self.is_better = lambda a, best: a < best - (
                            best * min_delta / 100)
            if mode == 'max':
                self.is_better = lambda a, best: a > best + (
                            best * min_delta / 100)


Informiere dich mit diesem Colab notebook, wie du Early Stopping in deiner Trainingsschleife verwenden kannst.

es = EarlyStopping(patience=5)

num_epochs = 100
for epoch in range(num_epochs):
      train_one_epoch(model, data_loader)  # train the model for one epoch.
      metric = eval(model, data_loader_dev)  # evalution on dev set.
      if es.step(metric):
          break  # early stop criterion is met, we can stop now

Ich empfehle sehr, deinen PyTorch-Code zu reorganisieren, indem du PyTorch Lightning verwendest. Es stellt Early Stopping and viele andere Techniken gebrauchsfertig zur Verfügung. Wenn du dich mit PyTorch Lightning noch nicht auskennst, sind hier einige Berichte, die dir beim Start helfen:




Run set
2

Iterate on AI agents and models faster. Try Weights & Biases today.