Hat batch_size in Keras irgendwelche Auswirkungen auf die Qualität der Ergebnisse?

38

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_sizedie 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_sizedie Qualität meiner Vorhersagen mindert.

Vielen Dank.

Hipoglucido
quelle
Diese Frage ist nicht spezifisch für Keras. Ich denke, der allgemeine Konsens ist, dass kleinere Stichprobengrößen langsamer konvergieren, aber weniger dazu neigen, in der lokalen Minima stecken zu bleiben
Alex,
Ich habe Fälle gesehen, in denen eine zu große Stapelgröße die Konvergenz auch bei gleicher Anzahl von Trainingsepochen verhindern kann.
Curtis White

Antworten:

43

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 .]]]]

Jan van der Vegt
quelle
32 kann ich mir nicht leisten, aber 16 kann ich mir leisten. Allerdings ist mir aufgefallen, dass es zu langsam ist. Glaubst du, ich sollte ein paar Werte zwischen 16 und 32 probieren oder bei 16 bleiben?
Hipoglucido
Ich würde versuchen, einige Werte zu messen. Jede Epoche sollte ungefähr zur selben Zeit verlaufen, damit es nicht zu lange dauert. Versuchen Sie 17 zuerst, um zu sehen, ob es schneller oder langsamer ist, weil ich daran interessiert bin, da diese Potenz von 2 von der GPU und / oder dem Backend von Keras abhängt. Aber ich denke, es ist wahrscheinlich am besten, es nur bis zum Rand zu füllen
Jan van der Vegt,
9
Sind Sie sicher, dass die Stapelgröße keinen Einfluss auf die Lernqualität hat? Ich erinnere mich, dass ich einige Blogs / Artikel (?) Gelesen habe, in denen gesagt wurde, dass kleinere Stapel lauter verlaufen als größere, aber Lärm kann nützlich sein, um aus lokalen Minimas herauszukommen. Nicht sicher, ob / wie dies auf LSTMs zutrifft.
stmax
Nicht ganz überzeugt, habe selbst nicht genug Erfahrung, aber das ist, was ich gelesen habe. Ich kann sehen, dass die Steigungen weniger stabil sind, so dass ich möglicherweise ausgeschaltet bin.
Jan van der Vegt
2
Eineinhalb Jahre später und jetzt viel sachkundiger, da stimme ich zu. Ich werde meine Antwort ändern
Jan van der Vegt
11

Ich halte die akzeptierte Antwort möglicherweise für falsch. Es gibt Varianten in Gradient-Descent-Algorithmen .

  1. 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.

  2. 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).

  3. 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.

Jil Jung Juk
quelle
3) wird in der Regel Minibatch genannt
Alex
@Alex: hat die Änderung hinzugefügt.
Jil Jung Juk
1
Ich bin damit einverstanden, dass es keine Regel bezüglich des Chargengrößenparameters gibt. Diese Aussage - "Je kleiner der Mini-Batch, desto besser die Leistung Ihres Modells" - widerspricht jedoch der allgemeinen Regel. Sie möchten im Allgemeinen die Stapelgröße maximieren
MonsieurBeilto
4

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

epochs 15   , batch size 16   , layer type Dense: final loss 0.56, seconds 1.46
epochs 15   , batch size 160  , layer type Dense: final loss 1.27, seconds 0.30
epochs 150  , batch size 160  , layer type Dense: final loss 0.55, seconds 1.74

verbunden

Die Verwendung einer zu großen Stapelgröße kann sich negativ auf die Genauigkeit Ihres Netzwerks während des Trainings auswirken, da dadurch die Stochastizität des Gradientenabfalls verringert wird.

Edit: die meisten der Zeit, die Erhöhung batch_sizegewü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 das dtypeArgument, ob in keras oder tensorflow , zB float32stattfloat64

shadi
quelle
Bei größeren Stapeln (und damit weniger pro Epoche) werden pro Epoche weniger Verlaufsaktualisierungen durchgeführt. "Epoche" ist nur ML-Jargon für "einen Durchgang durch Ihre Daten während des Trainings". Wenn Sie versuchen, das Training zu beschleunigen, messen Sie die Wandzeit und ignorieren Sie Epochen.
Andrew Wagner