Wird das Training für neuronale Netze einzeln durchgeführt? [Duplikat]

9

Ich versuche, neuronale Netze zu lernen, indem ich mir diese Videoserie ansehe und ein einfaches neuronales Netz in Python implementiere.

Hier ist eines der Dinge, über die ich mich wundere: Ich trainiere das neuronale Netzwerk auf Beispieldaten und habe 1.000 Proben. Das Training besteht darin, die Gewichte und Vorspannungen schrittweise zu ändern, damit die Kostenfunktion zu geringeren Kosten führt.

Meine Frage: Sollte ich die Gewichte / Verzerrungen für jede einzelne Probe ändern, bevor ich zur nächsten Probe übergehe, oder sollte ich zuerst die gewünschten Änderungen für die gesamte Charge von 1.000 Proben berechnen und erst dann damit beginnen, sie auf das Netzwerk anzuwenden?

Ram Rachum
quelle

Antworten:

9

Sollte ich die Gewichte / Vorspannungen für jede einzelne Probe ändern, bevor ich zur nächsten Probe übergehe,

Sie können dies tun. Dies wird als stochastischer Gradientenabstieg (SGD) bezeichnet. In der Regel mischen Sie den Datensatz, bevor Sie ihn jedes Mal durcharbeiten.

oder sollte ich zuerst die gewünschten Änderungen für das gesamte Los von 1.000 Proben berechnen und erst dann damit beginnen, sie auf das Netzwerk anzuwenden?

Sie können dies tun, es wird als Batch- Gradientenabstieg bezeichnet oder in einigen Fällen (insbesondere bei älteren Ressourcen) nur als normaler Ansatz angenommen und als Gradientenabstieg bezeichnet.

Jeder Ansatz bietet Vor- und Nachteile. Allgemein:

  • SGD nimmt jedes Update in Bezug auf die verarbeitete Datenmenge früher vor. Daher benötigen Sie möglicherweise weniger Epochen, bevor Sie auf vernünftige Werte konvergieren können.

  • SGD verarbeitet mehr pro Probe (weil es häufiger aktualisiert wird), ist also auch langsamer in dem Sinne, dass die Verarbeitung jeder Probe länger dauert.

  • SGD kann die Parallelisierung weniger nutzen, da Sie aufgrund der Aktualisierungsschritte jedes Datenelement seriell ausführen müssen (da sich die Gewichte geändert haben und Fehler- / Gradientenergebnisse für einen bestimmten Satz von Gewichten berechnet werden).

  • SGD-Einzelschritte machen normalerweise nur sehr grobe Vermutungen über die richtigen Steigungen, um die Gewichte zu ändern. Dies ist sowohl ein Nachteil (die Leistung des NN gegenüber dem Ziel auf dem Trainingssatz kann sowohl abnehmen als auch zunehmen) als auch ein Vorteil (es besteht eine geringere Wahrscheinlichkeit) aufgrund des "Jitters", den diese zufälligen Unterschiede verursachen, an einem lokalen stationären Punkt hängen zu bleiben.

In der Praxis können Sie mit der meisten Software Kompromisse zwischen Stapelverarbeitung und Einzelprobenverarbeitung eingehen, um die beste Leistung und Aktualisierungseigenschaften zu erzielen. Dies wird als Mini-Batch-Verarbeitung bezeichnet. Dazu gehören:

  • Mischen des Datensatzes zu Beginn jeder Epoche.

  • Beim Durcharbeiten der gemischten Daten können N Elemente pro Zeit, wobei N je nach Problem und Einschränkungen der Hardware zwischen 10 und 1000 variieren kann. Eine häufige Entscheidung besteht darin, die größte Stapelgröße zu verarbeiten, die die GPU-Beschleunigung parallel ausführen kann.

  • Berechnen Sie das für jede kleine Charge erforderliche Update und wenden Sie es dann an.

Dies ist heutzutage die häufigste Aktualisierungsmethode, die die meisten Bibliotheken für neuronale Netze annehmen, und sie akzeptieren fast überall einen Parameter für die Stapelgröße in der Trainings-API. Die meisten Bibliotheken nennen immer noch einfache Optimierer, die diese SGD ausführen. Technisch gesehen sind die berechneten Gradienten immer noch etwas zufällig, da nicht die gesamte Charge verwendet wird. In einigen älteren Veröffentlichungen wird dies jedoch möglicherweise als Mini-Batch-Gradientenabstieg bezeichnet.

Neil Slater
quelle
"Eine häufige Entscheidung besteht darin, die größte Stapelgröße zu verarbeiten, die die GPU-Beschleunigung parallel ausführen kann." Wie bestimmen Sie das? Ich habe keine Ressource gesehen, in der es kommentiert werden kann, wenn die
Stapelgröße
Eine ähnliche Frage wurde bereits auf dieser Website gestellt. Ich denke sogar, dass es ein Duplikat ist (wenn auch aus einer anderen Perspektive). Siehe: ai.stackexchange.com/q/11667/2444 .
nbro
"Eine häufige Entscheidung besteht darin, die größte Stapelgröße zu verarbeiten, die die GPU-Beschleunigung parallel ausführen kann." - Du hast es rückwärts! Die erste Heuristik besteht darin, die kleinste Mini-Batch-Größe zu verarbeiten, die zu einer akzeptablen Leistung führt. Bei vielen Modellen stoßen Sie jedoch an Speichergrenzen, bevor Sie die Hardwareeffizienz sättigen, sodass Sie am Ende das größte Modell ausführen, das in den Arbeitsspeicher passt. Im Allgemeinen finden kleinere Chargengrößen jedoch bessere Minima, da sie eine höhere Stochastizität aufweisen. Eine Einschränkung ist, dass die Chargennorm bei sehr kleinen Chargengrößen bricht.
Aleksandr Dubinsky
@AleksandrDubinsky RAM ist Hardware.
DuttaA
0

Im Idealfall müssen Sie die Gewichte aktualisieren, indem Sie alle Stichproben im Datensatz durchgehen. Dies wird als bezeichnet Batch Gradient Descent bezeichnet . Aber als die Nr. Die Anzahl der Trainingsbeispiele nimmt zu, die Berechnung wird riesig und das Training wird sehr langsam sein. Mit dem Aufkommen des tiefen Lernens liegt die Trainingsgröße in Millionen und die Berechnung unter Verwendung aller Trainingsbeispiele ist sehr unpraktisch und sehr langsam.

Hier wurden zwei Optimierungstechniken bekannt.

  1. Mini-Batch-Gradientenabstieg
  2. Stochastischer Gradientenabstieg (SGD)

Beim Mini-Batch-Gradientenabstieg verwenden Sie eine Batch-Größe, die erheblich unter der Gesamtzahl liegt. von Trainingsbeispielen und aktualisieren Sie Ihre Gewichte, nachdem Sie diese Beispiele durchlaufen haben.

Beim stochastischen Gradientenabstieg aktualisieren Sie die Gewichte, nachdem Sie jedes Trainingsbeispiel durchlaufen haben.

Vor- und Nachteile der drei von uns diskutierten Methoden.

  • Der Batch-Gradientenabstieg konvergiert allmählich zum globalen Minimum, ist jedoch langsam und erfordert eine enorme Rechenleistung.

  • Der stochastische Gradientenabstieg konvergiert schnell, aber nicht gegen das globale Minimum. Er konvergiert irgendwo in der Nähe des globalen Minimums und schwebt um diesen Punkt herum, konvergiert jedoch nie gegen das globale Minimum. Der konvergierte Punkt beim stochastischen Gradientenabstieg ist jedoch für alle praktischen Zwecke gut genug.

  • Der Mini-Batch-Gradient ist ein Kompromiss zwischen den beiden oben genannten Methoden. Wenn Sie jedoch eine vektorisierte Implementierung der Gewichtsaktualisierung haben und
    mit einem Multi-Core-Setup trainieren oder das Training an
    mehrere Maschinen senden , ist dies die beste Methode sowohl hinsichtlich der Zeit für das Training als auch hinsichtlich der Konvergenz zum globalen Minimum.

Sie können die Kostenfunktion mit der Nr. von Iterationen, um den Unterschied zwischen Konvergenz in allen 3 Arten des Gradientenabstiegs zu verstehen.

  • Das Diagramm für den Batch-Gradientenabstieg fällt gleichmäßig und langsam ab, stabilisiert sich und erreicht das globale Minimum.

  • Das stochastische Gradientenabstiegsdiagramm weist Schwingungen auf, fällt schnell ab, bewegt sich jedoch um das globale Minimum.

In einigen Blogs werden die Vor- und Nachteile der einzelnen Methoden ausführlich erläutert sowie grafisch dargestellt, wie sich die Kostenfunktion für alle drei Methoden mit Iterationen ändert.

https://adventuresinmachinelearning.com/stochastic-gradient-descent/

https://machinelearningmastery.com/gentle-introduction-mini-batch-gradient-descent-configure-batch-size/

Kartik Podugu
quelle