Effizientes Deep Learning: Training des ResNet50 Models auf dem ImageNet-Datensatz

Die Geschwindigkeit beim Auffinden der geeigneten Werten ist dabei abhängig vom zu trainierenden Model, der Menge der verwendeten Daten, aber auch von der Leistungsfähigkeit der zur Verfügung stehenden Hardware. Die Parameter-Suche kann sich daher als zeitlichen recht aufwendig erweisen, da ein Trainingsdurchlauf - je nach Modell und Anzahl der verwendeten Trainingsdaten - einige Tage dauern kann. Durch den parallelen Einsatz mehrerer GPUs lässt sich der zeitiche Aufwand schon um einen großen Faktor verringern.

Dieser Artikel unternimmt am Beispiel des Modells 'ResNet-50' mit dem Datensatz 'ImageNet' einen Exkurs, wie passende Werte für die genannten Trainingsparameter zu ermitteln sind und beschreibt den Einfluss dieser Parameter auf den Trainingsfortschritt. Dabei werden praktische Hinweise zur Wahl der Parameter gegeben.

Hierfür stellen wir zunächst das verwendete Modell 'ResNet-50' und den Datensatz 'ImageNet' vor und erklären weitere relevante grundlegende Begriffe. Im Anschluß beschreiben wir die Suche nach der passenden Lernrate und Batch-Size anhand praktischer Arbeitsergebnisse.

ResNet-50

Ein Residuales Neuronales Netz, kurz ResNet, wurde erstmals 2015 zum Klassifizieren von Bildern vorgestellt. ResNet gilt als eines der ersten wirklich tiefen Deep-Learning Netzwerke. Es löste das Problem des verschwindenden/explodierenden Gradienten, welches bei den zuvor verwendeten Perceptron-Netzwerkstrukturen auftrat, wenn die Anzahl der Zwischenschichten erhöht wurde (siehe Deep Residual Learning for Image Recognition). Das Charakteristische bei residualen Netzwerken ist die Verwendung von 'Sprungverbindungen' zwischen den verschiedenen Schichten, mit denen sich einzelne Schichten überspringen lassen. Dadurch lassen sich sehr viel tiefere Netzwerke bilden und das Problem des verschwindenden/explodierenden Gradienten lösen. Das für unseren Exkurs verwendete Modell 'ResNet-50' besteht aus 48 konvolutionalen Schichten, sowie einer MaxPool- und einer Average-Pool-Schicht, also ingsesamt 48+1+1=50 Schichten. Mit der tieferen Netzwerkstruktur dieses Modells wird eine erheblich bessere Erkennungsrate erreicht, als mit den zuvor verwendeten, flacheren Netzwerkstrukturen.

Aus der PyTorch-Bibliothek lässt sich eine mit dem Datensatz ImageNet vortrainierte Version des ResNet-Modells herunterladen. Wir haben allerdings ein untrainiertes ResNet50-Modell verwendet, da wir hier die Optimierung des Trainings mit ImageNet untersuchen wollen.

ImageNet

Der ImageNet Datensatz besteht aus rund 14 Millionen annotierten Bildern die 1.000 verschiedenen Klassen zugeordnet wurden. Seit 2010 wird der Datensatz in der 'ImageNet Large Scale Visual Recognition Challenge' (ILSVRC) für die Bildklassifizierung und Objekterkennung verwendet und als Basis vieler Untersuchungen genutzt. Aufgrund seiner Größe, seiner Qualität und der Zugänglichkeit ist der ImageNet-Datensatz gut geeignet, um das Training von Modellen zur Bildklassifizierung zu erkunden. Er kann von image-net.org oder kaggle kostenlos geladen werden.

TopK Accuracy

Bei der Bewertung der Erkennungsrate eines Modells ist es üblich, die 'TopK-Accuracy' zu betrachten. Bei K=1, also der Top1-Accuracy, wird angegeben, wieviele der Bilder des Test-Datensatzes insgesamt durch das Modell korrekt klassifiziert wurden. Der Test-Datensatz besteht aus Daten (in unserem Fall Bildern), die nicht im Trainings-Datensatz enthalten sind. Somit wird mit der Top1-Accuracy gemessen, wie gut das trainierte Modell eigenständig ihm unbekannte Bilder klassifizieren kann. Es wird also gemessen, bei wievielen Bildern des Test-Datensatzes die Klassifizierungen durch das Modell mit der tatsächlichen Klassifizierung des jeweiligen Bildes übereinstimmt. Hierfür wählt man jeweils die durch das Modell ermittelte Klassifizierung mit der höchsten zugewiesenen Wahrscheinlichkeit, wobei das Modell für jedes zu klassifizierende Bild eine Liste von Klassen mit verschiedenen Wahrscheinlichkeitswerten ausgibt. Es kommt vor, dass eine eindeutige Zuordnung zu einer einzigen Klasse nicht ohne weiteres Möglich ist, z.B. wenn mehrere Objekte gleichzeitig auf einem Bild zu sehen sind. Hier ist es dann sinnvoll, zusätzlich die TopK-Accuracy zu untersuchen. Dabei wird betrachtet, ob sich die tatsächliche Klasse unter den K Klassen befindet, denen das System die höchste Wahrscheinlichkeit zuschreibt. Üblich ist hier der Fall K=5, also die Top5-Accuracy.

Optimizer

Beim Trainieren von Deep Learning Modellen geht es im Wesentlichen darum, die Gewichtungen des neuronalen Netzes so lange anzupassen, bis das globale Minimum der Verlustfunktion gefunden wird. Diese Aufgabe übernimmt der Optimizer. Die für meisten Anwendungen geeignetesten Optimizer basieren auf dem Gradientenstufenverfahren, bei dem die Gewichtungsanpassungen anhand des Gradienten der Verlustfunktion berechnet werden. Besonders beliebt ist der Optimizer SGD (Stochastic Gradient Descent), da er durch stochastische Methoden eine vergleichsweise hohe Effizienz mitbringt. Aus diesem Grund haben wir ihn für unsere Messungen in diesem Artikel verwendet.

Lernrate

Der wohl wichtigste Parameter beim Trainieren von Deep Learning Modellen mit dem Gradientenstufenverfahren ist die Lernrate des Optimizers. Sie gibt die Schrittweite an, mit der nach jeder Iteration die Richtung zum Minimum der Verlustfunktion gesucht wird. Die Richtung selbst wird durch den Gradienten der Verlustfunktion festgelegt. Die Schrittweite wird durch den Betrag des Gradienten, sowie der Lernrate als Vorfaktor bestimmt. Eine zu große Schrittweite bzw. Lernrate kann dazu führen, dass das gesuchte Minimum übersprungen und damit "übersehen" wird. Bei sehr schmalen Minima, kann es bei zu großer Schrittweite passieren, dass man aus dem Tal wieder herausspringt. Eine zu kleine Lernrate wiederum kann dazu führen, dass man in einem unerwünschten lokalen Minimum festsitzt. Außerdem konvergiert das System bei kleiner Schrittweite langsamer, wodurch sich die Trainingszeit verlängert.

Momentum

Eine weitere Methode das Training basierend auf dem Gradientenstufenverfahren zu optimieren, ist die Einführung des Momentums. Erstmals vorgestellt 1999 in On the Momentum Term in Gradient Descent Learning Algorithms, wird das Verfahren heute in fast allen gängigen Trainingsalgorithmen, die auf dem Gradientenstufenverfahren beruhen, verwendet. Vereinfacht gesagt fügt das Momentum m (0 < m < 1) einen Teil der vorherigen Gewichtungsänderung der momentanen Gewichtungsänderung hinzu. Wenn z.B. der Gradient stets in die selbe Richtung zeigt, wird die Schrittweite in Richtung des Minimums erhöht, das Training also beschleunigt. Bei ständig wechselnder Richtung des Gradienten werden die Variationen etwas geglättet und somit die Bewegung eher in Richtung des gesuchten Minimums orientiert. In der Fachliteratur hat sich für die meisten Trainingsprozesse der Wert m = 0,9 für das Momentum als am besten geeignet herausgestellt. Die Untersuchung anderer Werte war nicht Gegenstand unserer Experimente, weshalb in allen Prozessen m = 0,9 verwendet wurde.

Batch size

Die Batch-Size (Stapelgröße) definiert, wie viele Samples aus dem Datensatz in einer Trainings-Iteration gleichzeitig verarbeitet werden. Der Trainings-Datensatz wird also in "Batches" aufgeteilt, die dann nacheinander durch das System propagiert werden, bis der gesamte Datensatz durchlaufen wurde und somit die Epoche abgeschlossen ist. Bei kleinen Datensätzen, die komplett in den vorhandenen Speicher passen, kann die BatchSize auch den gesamten Datensatz fassen, wodurch die Epoche dann nur aus einem einzigen Durchlauf besteht. In der Regel ist dies jedoch nicht der Fall, weshalb die Unterteilung in kleinere Batches sinnvoll ist. In der Fachliteratur wird die Batch auch häufig als Mini-Batch bezeichnet, um die Unterscheidung zum kompletten Datensatz deutlich zu machen. Da nach jeder Iteration die Gewichte im Modell an die Erkenntnisse aus der aktuell verwendeten Batch angepasst werden, hat auch die Wahl der Batch-Size Einfluss auf die Trainingsergebnisse.

Augmentation

Beim Training von Modellen zur Bildklassifizierung besteht oft das Problem einer Überanpassung des Modells an die Trainingsdaten. Das Modell erkennt die Trainingsdaten immer besser, verliert aber die gewünschte Eigenschaft, vorher nicht trainierte Bilder richtig zu klassifizieren. Dieser Effekt lässt sich minimieren, indem man bestimmte Bildeigenschaften bei jeder Iteration mittels Bildbearbeitungsverfahren leicht verändert, z.B. durch die Manipulation des Seitenverhältnises, der Orientierung oder einer Verzerrung. Diese Veränderung der Eingangsbilder wird automatisiert und innerhalb eines Parameterbereichs zufällig bei jedem Trainingsdurchlauf durchgeführt. Da hierdurch der Trainingsdatensatz quasi künstlich vergrößert wird, spricht man von Augmentation (Erweiterung).

Durch die Augmentation des Datensatzes werden Objekte tatsächlich unabhäng von deren Abmessungen und ihrer Orientierung besser und zuverlässiger erkannt.

Suche nach passender Lernrate und Batch-Size

Eine optimale Kombination aus Lernrate und Batch-Size findet man durch das Ausprobieren verschiedener Werte und dem Vergleich des hierdurch erzielten Trainingsfortschritts anhand der Top1-Accuracy. Zu Anwendung kam eine AIME T600 multi-GPU Workstation mit insgesamt vier NVIDIA RTX 3090 GPUs, mit jeweils 24 GB GPU-Speicher. Die hohen Performance der AIME Workstation ermöglichte relativ kurze Trainingszeiten von 14 Minuten pro Epoche für einen Trainingsdurchlauf der ImageNet-Daten. Zusätzlich konnten wir durch den kombinierten Speicher der vier GPUs eine recht hohe Batch-Size wählen, was weitere Vorteile für den Trainingsfortschritt bedeutet.

Zunächst haben wir bei maximaler Batch-Size (in diesem Fall 768) verschiedene, konstante Lernraten ausprobiert. Zum Vergleich haben wir jeweils die Top1-Accuracy über die Trainingsepochen aufgetragen und miteinander verglichen (siehe Abb.1).

Abb. 1: Dargestellt ist der Verlauf der Top1-Accurary über die Trainingsepoche für verschiedene konstante Lernraten.

Aus Abb. 1 geht hervor, dass bei sehr kleinen Lernraten, wie 0,0001, die Erkennungsrate deutlich langsamer wächst und selbst nach 90 Trainingsepochen keinen zufriedenstellenden Wert erreicht. Bei höheren Lernraten, wie 0,001 und 0,01 wächst die Kurve zwar schneller, stagniert jedoch nach einer gewissen Anzahl an Epochen. Hier wurde vermutlich nicht das gesuchte globale Minimum, sondern ein unerwünschtes lokales Minimum gefunden. Bei einer sehr großen Lernrate von 1 wächst die Kurve zwar sehr schnell, erreicht aber nur rund 30% Erkennungsrate, da die Auflösung zu schlecht ist. Außerdem sind hier starke Schwankungen zu erkennen, was vermutlich dadurch bedingt ist, dass das System aufgrund der hohen Lernrate wieder aus den Tälern "herausspringt" und nicht das zugehörige Minimum erreichen kann, sondern nur die Flanke des entsprechenden Tals.

Die besten Ergebnisse wurden mit einer Lernrate von 0,1 erzielt. Allerdings wurden auch hier nur Erkennungsraten unter 60% erreicht. Vermutlich wurde hier zwar das zum globalen Minimum zugehörige Tal gefunden, das Minimum selbst aber nicht erreicht, da die Schrittweite zu groß und damit die Auflösung zu grob ist. Daher ist es sinnvoll, die Lernrate im Laufe des Trainings zu verkleinern, um näher an das zugehörige Minimum heranzukommen. Damit wird quasi, nachdem mit grober Auflösung das richtige Tal gefunden wurde, mit feinerer Auflösung das Minimum dieses Tals identifiziert.

Dynamische Anpassung der Lernrate

Es gibt verschiedene Realisationsmöglichkeiten einer solchen dynamischen Lernraten-Anapssung. In unseren Versuchen haben wir jeweils nach einer bestimmten Anzahl an Epochen die Lernrate um den Faktor 10 verkleinert. Abb. 2 zeigt zwei Trainingsprozesse, bei denen die Verkleinerung der Lernrate nach jeweils 20 Epochen und nach jeweils 30 Epochen stattfand.

Abb. 2: Dargestellt ist der Vergleich zwischen den Trainingsverläufen mit einer Verkleinerung der Lernrate nach jeweils 20 Epochen und nach jeweils 30 Epochen.

Es ist zu erkennen, dass direkt nach der Verkleinerung der Lernrate die Erkennungsrate deutlich zunimmt. In diesem Fall scheint es keinen großen Unterschied zu machen, ob die Verkleinerung nach 20 oder 30 Epochen stattfindet. Allerdings lässt sich dies schlecht verallgemeinern, da bei anderen Startparametern die Erkennungsrate langsamer steigen kann. Um sicher zu gehen, dass die Anpassung nicht zu früh passiert, haben wir uns für die folgenden Versuche für eine Anpassung nach jeweils 30 Epochen entschieden. Als nächsten Schritt haben wir verschiedene Batch-Sizes und verschiedene Lernraten in der Größenordnung von 0,1 untersucht und wieder den Trainingsfortschritt verglichen.

Abb. 3: Dargestellt sind die Trainingsverläufe für verschiedene Batch-Sizes und Lernraten.

In Abb. 3 ist zu erkennen, dass sich kurz nach der Verkleinerung der Lernrate nach jeweils 30 Epochen, die Erkennungsrate deutlich verbessert. Während sich in den ersten 30 Epochen die Verläufe zwischen den verschiedenen Parameter-Sätzen noch stark unterscheiden, nähern sie sich mit zunehmendem Training immer weiter an. Allerdings lässt sich anhand der Graphen eine Überanpassung des Modells an die Trainingsdaten vermuten, da die Erkennungsrate nach Anpassung der Lernrate mit fortschreitendem Training wieder abnimmt.

Vermeidung von Überanpassung durch Augmentation

Laut Image Classification on ImageNet lässt sich mit 75,3% eine bessere Erkennungsrate für das ResNet-50 Training mit dem ImageNet-Datensatz erreicht, als die hier erzielten rund 70%. Die Augmentation der Daten soll im Folgenden daher eine weitere Leistungssteigerung erbringen.

Abb. 4: Dargestellt sind die Trainingsverläufe für verschiedene Batch-Sizes und Lernraten mit der Augmentation des Datensatzes.

Aus Abb. 4 geht hervor, dass diese Anpassung die Erkennungsraten auf bis zu 76% verbessert. Auch nach längerem Training bleibt dieser Wert stabil. Dies lässt vermuten, dass durch die Augmentation eine Überanpassung an die Trainingsdaten verhindert wurde. Auch in dieser Meßreihe gibt es zu Beginn des Trainings große Unterschiede zwischen den Verläufen der Erkennungsrate der verschiedenen Parametersätze, die mit fortlaufendem Training und nach Verkleinerung der Lernrate geringer werden. Es zeigt sich allerdings, dass das Modell mit höheren Batch-Sizes schneller zu trainieren scheint, als mit kleineren Batch-Sizes. Der schnellste Trainingsverlauf konnte bei einer Lernrate von 0,1 mit einer Batch-Size von 768 beobachtet werden. Hier könnte die Lernrate bereits nach weniger als 30 Epochen verkleinert werden, um das Training noch weiter zu beschleunigen.

Unsere Erkenntnisse

Unseren Trainingsexperimente vermittelten uns folgenden Erkenntnisse hinsichtlich der Parameter-Wahl 'Lernrate' und 'Batch-Size' beim Deep-Learning Modell ResNet50:

  • Für die Wahl der richtigen Lernrate lohnt sich das Experimentieren mit mehreren Werten aus einem großen Wertebereich. Zu wählen ist dann die Lernrate, die in den ersten Epochen die beste Erkennungsrate (Accuracy) erzielt.
  • Beim Start mit einer zu kleinen Lernrate führt auch ein längeres Training nicht zu einer optimalen Erkennungsrate.
  • Die Verkleinerung der Lernrate bei fortschreitendem Training führt zu besseren Ergebnissen, als das Training mit konstanter Lernrate.
  • Es ist sinnvoll, das Training mit einer großen Lernrate zu beginnen, und diese dann im Trainingsverlauf dynamisch zu verkleinern.
  • Das verkleinern der Lernrate mit fortschreitendem Training ist essentiell um das beste Ergebnis zu erhalten.
  • Eine große Batchsize hat keinen nachteiligen Einfluß auf die Lernergebnisse und führt zu ähnlichen oder leicht besseren Ergebnissen. Es ist also sinnvoll, die maximale mögliche Batchgröße der GPU zu verwenden.
  • Durch Augmentation lässt sich der Überanpassung des Modells entgegen wirken.
  • Durch die Erhöhung der parallel genutzten GPU-Anzahl, sowie die Verwendung von GPUs mit höherer Speicherkapazität kann die Batch-Size noch weiter erhöht und damit das Training noch weiter beschleunigt werden.
  • Die mit den hier beschriebenen Methoden erreichte Erkennungsrate von rund 76% stimmt mit der Erkennungsrate des vortrainierten Modells aus der PyTorch-Bibliothek überein.

Die Messungen in diesem Artikel wurden mit unserem Benchmark-Tool auf einer AIME T600 Workstation auf 4x RTX 3090 GPUs durchgeführt.