Ich bin dabei, ein großes LSTM-Netzwerk mit 2-3 Millionen Artikeln zu trainieren und habe Probleme mit Speicherfehlern (ich verwende AWS EC2 g2x2large).
Ich fand heraus, dass eine Lösung darin besteht, die batch_size
. Ich bin mir jedoch nicht sicher, ob dieser Parameter nur mit Problemen der Speichereffizienz zusammenhängt oder ob er sich auf meine Ergebnisse auswirkt. In der Tat ist mir auch aufgefallen, dass batch_size
die in Beispielen verwendete Potenz normalerweise eine Zweierpotenz ist, die ich auch nicht verstehe.
Es macht mir nichts aus, wenn das Training in meinem Netzwerk länger dauert, aber ich würde gerne wissen, ob die Reduzierung batch_size
die Qualität meiner Vorhersagen mindert.
Vielen Dank.
deep-learning
keras
Hipoglucido
quelle
quelle
Antworten:
Nach eineinhalb Jahren komme ich zu meiner Antwort zurück, weil meine vorherige Antwort falsch war.
Die Stapelgröße beeinflusst das Lernen erheblich. Wenn Sie einen Stapel über Ihr Netzwerk übertragen, werden die Gradienten gemittelt. Das Konzept ist, dass bei einer ausreichend großen Stapelgröße eine ausreichend stabile Schätzung des Gradienten des vollständigen Datensatzes möglich ist. Indem Sie Stichproben aus Ihrem Datensatz entnehmen, schätzen Sie den Gradienten und senken gleichzeitig die Rechenkosten erheblich. Je niedriger Sie gehen, desto ungenauer ist Ihre Schätzung. In einigen Fällen können diese lauten Verläufe jedoch tatsächlich dazu beitragen, lokalen Minima zu entkommen. Wenn der Wert zu niedrig ist, können Ihre Netzwerkgewichte einfach herumspringen, wenn Ihre Daten verrauscht sind und möglicherweise nicht gelernt werden können oder wenn sie sehr langsam konvergieren, was sich negativ auf die Gesamtberechnungszeit auswirkt.
Ein weiterer Vorteil der Stapelverarbeitung ist die GPU-Berechnung. GPUs können die Berechnungen in neuronalen Netzen sehr gut parallelisieren, wenn ein Teil der Berechnung identisch ist (z. B. wiederholte Matrixmultiplikation über dieselbe Wichtungsmatrix Ihres Netzwerks). Dies bedeutet, dass eine Losgröße von 16 weniger als das Doppelte einer Losgröße von 8 benötigt.
Für den Fall, dass Sie größere Chargen benötigen, diese jedoch nicht auf Ihre GPU passen, können Sie eine kleine Charge füttern, die Gradientenschätzungen speichern und eine oder mehrere Chargen füttern und anschließend eine Gewichtsaktualisierung durchführen. Auf diese Weise erhalten Sie einen stabileren Verlauf, da Sie die Größe Ihres virtuellen Stapels erhöht haben.
FALSCHE ALTE ANTWORT: [[[Nein, die Batch-Größe beeinflusst im Durchschnitt nur die Geschwindigkeit Ihres Lernens, nicht die Qualität des Lernens. Die batch_sizes müssen auch keine Potenzen von 2 sein, obwohl ich verstehe, dass bestimmte Pakete nur Potenzen von 2 zulassen. Sie sollten versuchen, Ihre batch_size so hoch wie möglich zu setzen, um die maximal mögliche Geschwindigkeit zu erreichen .]]]]
quelle
Ich halte die akzeptierte Antwort möglicherweise für falsch. Es gibt Varianten in Gradient-Descent-Algorithmen .
Vanille-Gefälle : Hier wird das Gefälle für alle Datenpunkte auf einmal berechnet und der Durchschnitt gebildet. Daher haben wir eine glattere Version des Farbverlaufs, die länger dauert, um zu lernen.
Stochastic Gradient Descent ( Stochastischer Gradient-Abstieg) : Hier wird der Gradient zu einem bestimmten Zeitpunkt aggressiv sein (verrauschte Gradienten), daher wird es viele Oszillationen geben (wir verwenden Momentum-Parameter - z. B. Nesterov, um dies zu steuern). Es besteht also die Möglichkeit, dass Ihre Oszillationen dazu führen, dass der Algorithmus ein lokales Minimum nicht erreicht (Abweichung).
Mini-Batch Gradient Descent ( Minibatch-Gefälle) : Mit den Vorteilen der beiden vorherigen wird das Gefälle eines kleinen Batches gemittelt. Daher nicht zu aggressiv wie SGD und erlaubt Online-Lernen, was Vanilla GD niemals erlaubt.
Je kleiner der Mini-Batch ist, desto besser ist die Leistung Ihres Modells (nicht immer) und natürlich hat dies mit Ihrem zu schnellen Lernen zu tun. Wenn Sie mit großen Datenmengen trainieren, möchten Sie eine schnellere Konvergenz mit guter Leistung, daher wählen wir Batch-GDs.
SGD hatte feste Lernparameter, daher starten wir andere Adaptive Optimizer wie Adam, AdaDelta, RMS Prop usw., die die Lernparameter basierend auf der Verlaufsgeschichte von Verläufen ändern.
quelle
Seltsamerweise stellte ich fest, dass bei größeren Chargengrößen mit Keras mehr Zeiträume erforderlich sind, um konvergieren zu können.
Zum Beispiel kann die Ausgabe von diesem Skript basierend auf keras' Integrationstest ist
verbunden
BatchNormalization
, was sich auf die Ergebnisse auswirkte.Edit: die meisten der Zeit, die Erhöhung
batch_size
gewünscht wird die Berechnung zu beschleunigen, aber es gibt andere , einfachere Möglichkeiten , dies zu tun, wie unter Verwendung von Datentypen einer kleineren Stellfläche über dasdtype
Argument, ob in keras oder tensorflow , zBfloat32
stattfloat64
quelle