Was ist die Stapelgröße im neuronalen Netzwerk?


175

Ich benutze Python Keras packagefür neuronales Netzwerk. Dies ist der Link . Ist batch_sizegleich der Anzahl von Testproben? Aus Wikipedia haben wir diese Informationen:

In anderen Fällen kann das Auswerten des Summengradienten jedoch teure Auswertungen der Gradienten von allen Summandenfunktionen erfordern. Wenn der Trainingssatz riesig ist und keine einfachen Formeln existieren, wird die Auswertung der Summen von Verläufen sehr teuer, da die Auswertung des Verlaufs die Auswertung aller Verläufe der Summandenfunktionen erfordert. Um bei jeder Iteration Rechenaufwand zu sparen, tastet der stochastische Gradientenabstieg bei jedem Schritt eine Teilmenge von Summandenfunktionen ab. Dies ist bei großen maschinellen Lernproblemen sehr effektiv.

Die obigen Informationen beschreiben Testdaten? Ist dies dasselbe wie batch_sizein Keras (Anzahl der Proben pro Gradientenaktualisierung)?


3
Es ist gut, den Kurs class.coursera.org/ml-005/lecture/preview zu sehen , besonders für Sie Woche 4-6 + 10. Wikipedia ist möglicherweise keine so wertvolle Ressource für das Erlernen neuronaler Netze.
404pio

Antworten:


230

Die Stapelgröße definiert die Anzahl der Proben, die über das Netzwerk übertragen werden.

Nehmen wir zum Beispiel an, Sie haben 1050 Trainingsmuster und möchten einen batch_sizeWert von 100 einstellen . Der Algorithmus entnimmt die ersten 100 Muster (vom 1. bis zum 100.) aus dem Trainingsdatensatz und trainiert das Netzwerk. Als nächstes werden die zweiten 100 Samples (vom 101. bis zum 200.) genommen und das Netzwerk erneut trainiert. Wir können diesen Vorgang fortsetzen, bis wir alle Samples durch das Netzwerk weitergegeben haben. Möglicherweise tritt ein Problem mit dem letzten Probensatz auf. In unserem Beispiel haben wir 1050 verwendet, was ohne Rest nicht durch 100 teilbar ist. Die einfachste Lösung besteht darin, nur die letzten 50 Proben abzurufen und das Netzwerk zu trainieren.

Vorteile bei Verwendung einer Losgröße <Anzahl aller Proben:

  • Es benötigt weniger Speicher. Da Sie das Netzwerk mit weniger Samples trainieren, benötigt der gesamte Trainingsvorgang weniger Speicher. Dies ist besonders wichtig, wenn Sie nicht in der Lage sind, den gesamten Datensatz in den Speicher Ihres Computers einzupassen.

  • In der Regel trainieren Netzwerke mit Minibatches schneller. Das liegt daran, dass wir die Gewichte nach jeder Weitergabe aktualisieren. In unserem Beispiel haben wir 11 Batches weitergegeben (10 davon hatten 100 Samples und 1 hatte 50 Samples) und nach jedem haben wir die Parameter unseres Netzwerks aktualisiert. Wenn wir alle Samples während der Propagierung verwenden würden, würden wir nur 1 Update für die Netzwerkparameter durchführen.

Nachteile der Verwendung einer Chargengröße <Anzahl aller Proben:

  • Je kleiner die Charge ist, desto ungenauer ist die Schätzung des Gradienten. In der folgenden Abbildung können Sie sehen, dass die Richtung des Minibatch-Verlaufs (grüne Farbe) im Vergleich zur Richtung des vollständigen Batch-Verlaufs (blaue Farbe) viel stärker schwankt.

Verlaufsrichtungen für verschiedene Stapelaufbauten

Stochastisch ist nur ein Mini-Batch mit dem batch_sizeWert 1. In diesem Fall ändert der Gradient seine Richtung noch häufiger als ein Mini-Batch-Gradient.


3
Nein, habe ich nicht. Dies ist eine beliebte Technik in neuronalen Netzen und diese Terminologie können Sie in verschiedenen Bibliotheken, Büchern und Artikeln sehen. Möchten Sie Testdatenfehler in jeder Epoche überprüfen oder das Modell nach dem Training überprüfen?
Itdxer

1
Das Netzwerk konvergiert auch schneller, da die Anzahl der Aktualisierungen erheblich höher ist. Das Einrichten der Mini-Batch-Größe ist eine Kunst, zu klein, und Sie riskieren, dass Ihr Lernen zu stochastisch und schneller wird, aber es wird zu unzuverlässigen Modellen, zu großen Modellen, die nicht in den Speicher passen und noch Ewigkeiten in Anspruch nehmen.
Ramalho

2
Wenn Leute sagen, dass sie online lernen, meinen sie dies normalerweise batch_size=1. Die Idee hinter dem Online-Lernen ist, dass Sie Ihr Modell aktualisieren, sobald Sie das Beispiel sehen. Bei größeren Chargen bedeutet dies, dass Sie zuerst die mehreren Proben durchsuchen, bevor Sie die Aktualisierung durchführen. In RNN kann die Größe der Charge unterschiedliche Bedeutungen haben. Normalerweise ist es üblich, die Trainingssequenz in Fenster fester Größe (wie 10 Wörter) aufzuteilen. In diesem Fall bedeutet das Einschließen von 100 dieser Fenster während des Trainings, dass Sie haben batch_size=100.
Itdxer

1
@Oleg Melnikov, wenn Ihre letzte Charge bedeutend kleiner ist (sagen wir, es ist 1 statt 50), ist die Schätzung für den Gradienten ungenauer und kann Ihre Gewichte ein wenig durcheinander bringen. Stellen Sie sich im obigen Bild vor, Sie führen 10 Aktualisierungen mit einem Minibatch 100 (grüne Linien) und einem mit Minibatch 1 (rote Linie) durch. Dies bedeutet, dass in der nächsten Epoche einige wenige erste Iterationen beginnen können, das Problem mit dem letzten Mini-Batch 1-Update aus der vorherigen Epoche zu lösen.
Itdxer

1
@OlegMelnikov MIT Deep Learning-Buch hat eine gute Erklärung für dieses Problem (Kapitel 8.1.3
itdxer

153

In der neuronalen Netzwerkterminologie:

  • Eine Epoche = ein Vorwärtsdurchlauf und ein Rückwärtsdurchlauf aller Trainingsbeispiele
  • Losgröße = Anzahl der Trainingsbeispiele in einem Vor- / Rücklauf. Je höher die Stapelgröße, desto mehr Speicherplatz wird benötigt.
  • Anzahl der Iterationen = Anzahl der Durchläufe, jeder Durchlauf unter Verwendung von [Stapelgröße] Anzahl der Beispiele. Um es klar auszudrücken, ein Durchgang = ein Vorwärtsdurchgang + ein Rückwärtsdurchgang (wir zählen den Vorwärtsdurchgang und den Rückwärtsdurchgang nicht als zwei verschiedene Durchgänge).

Beispiel: Wenn Sie 1000 Trainingsbeispiele haben und Ihre Stapelgröße 500 ist, werden 2 Iterationen benötigt, um 1 Epoche abzuschließen.

FYI: Kompromiss zwischen Stapelgröße und Anzahl der Iterationen zum Trainieren eines neuronalen Netzwerks


Aber was ist der Unterschied zwischen der Verwendung von [Batchgröße] Anzahl Beispielen und dem Trainieren des Netzwerks für jedes Beispiel und dem Fortfahren mit den nächsten [Batchgröße] Anzahl Beispielen. Da Sie ein Beispiel durch das Netzwerk führen und SGD anwenden, um das nächste Beispiel zu erstellen, spielt es keine Rolle, ob die Chargengröße 10 oder 1000 oder 100000 beträgt nächste Charge folgt. Es macht nur dann einen Unterschied, wenn die [Stapelgröße] der Beispielnummern das [Anzahl der Iterationen] -fache des Netzwerks überschreiten und dann mit den nächsten [Stapelgröße] -Beispielen fortfahren.
Erhard Dinhobl

Ein wichtiger Unterschied ist, dass der Lernschritt (ein Schritt) einmal für jede Charge angewendet wird, während Sie alle Chargen durchlaufen müssen, um eine Epoche zu machen. Der Unterschied ist also nicht nur im Speicher algorithmisch: Größere Stapel bedeuten, dass Sie den Gradienten über mehr Samples mitteln.
Meduz

Was ist der Unterschied zwischen Epoche und Iteration?
Goldname

2
@Goldname 1 Epoche enthält alle Trainingsbeispiele, wohingegen 1 Iteration nur die [Stapelgröße] Anzahl der Trainingsbeispiele enthält.
Franck Dernoncourt

3

Wenn Sie ein Optimierungsproblem mit einer CPU lösen, wenden Sie iterativ einen Algorithmus auf einige Eingabedaten an. In jeder dieser Iterationen aktualisieren Sie normalerweise eine Metrik Ihres Problems, indem Sie einige Berechnungen für die Daten durchführen. Wenn die Größe Ihrer Daten groß ist, kann es einige Zeit dauern, bis jede Iteration abgeschlossen ist, und es kann eine Menge Ressourcen verbraucht werden. Manchmal wählen Sie diese iterativen Berechnungen für einen Teil der Daten aus, um Zeit und Rechenressourcen zu sparen. Dieser Teil ist batch_size und der Prozess wird (im Neural Network Lingo) Stapelverarbeitung genannt. Wenn Sie Ihre Berechnungen auf alle Ihre Daten anwenden, führen Sie eine Online-Datenverarbeitung durch. Ich denke, die Terminologie stammt aus den 60ern und noch früher. Erinnert sich jemand an die. bat DOS-Dateien? Aber natürlich bedeutet das inkarnierte Konzept einen Thread oder einen Teil der Daten, die verwendet werden sollen.


2

Die Dokumentation für Kerasetwa Chargengröße können Sie unter der finden fitFunktion in den Modellen (funktionale API) Seite

batch_size: Integer oder None. Anzahl der Proben pro Gradientenaktualisierung. Wenn nicht angegeben, wird batch_size standardmäßig auf 32 gesetzt.

Wenn Sie einen kleinen Datensatz haben, ist es am besten, die Stapelgröße an die Größe der Trainingsdaten anzupassen. Versuchen Sie es zuerst mit einer kleinen Charge und erhöhen Sie dann die Menge, um Zeit zu sparen. Wie bereits erwähnt, gibt es einen Kompromiss zwischen Genauigkeit und Geschwindigkeit.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.