Warum ist die Mini-Batch-Größe besser als ein einzelner „Batch“ mit allen Trainingsdaten?

40

Ich habe oft gelesen, dass bei Deep-Learning-Modellen die übliche Praxis darin besteht, Mini-Batches (im Allgemeinen kleine, 32/64) über mehrere Trainingsepochen anzuwenden. Ich kann den Grund dafür nicht wirklich ergründen.

Wenn ich mich nicht irre, gibt die Stapelgröße die Anzahl der Trainingsinstanzen an, die das Modell während einer Trainingsiteration gesehen hat. und die Epoche ist eine vollständige Wende, wenn das Modell jede der Trainingsinstanzen gesehen hat. In diesem Fall kann ich den Vorteil nicht erkennen, dass ich die Trainingsinstanzen gegenüber einer fast unbedeutenden Teilmenge mehrmals iteriere, im Gegensatz zum Anwenden eines "maximalen Stapels", indem ich alle verfügbaren Trainingsinstanzen in jeder Runde auf das Modell lege (vorausgesetzt natürlich, dass dies ausreicht) die Erinnerung). Was ist der Vorteil dieses Ansatzes?

Hendrik
quelle
1
Kasse diese Antwort.
Icyblade
2
und
Kompromiss zwischen Stapelgröße

Antworten:

46

Der Hauptvorteil der Verwendung von Minibatch gegenüber dem vollständigen Datensatz beruht auf der Grundidee des stochastischen Gradientenabfalls 1 .

Beim Batch-Gefälle berechnen Sie das Gefälle über das gesamte Dataset und bilden einen Durchschnitt über möglicherweise eine große Menge an Informationen. Es braucht viel Gedächtnis, um das zu tun. Das eigentliche Handicap ist jedoch die Batch-Steigung, mit der Sie an einem schlechten Punkt (Sattelpunkt) landen.

In reinem SGD hingegen aktualisieren Sie Ihre Parameter, indem Sie den für eine einzelne Instanz des Datasets berechneten Gradienten (Minuszeichen) hinzufügen . Da es auf einem zufälligen Datenpunkt basiert, ist es sehr verrauscht und kann in eine Richtung weit vom Stapelgradienten abweichen. Das Rauschen ist jedoch genau das, was Sie bei der nicht-konvexen Optimierung wünschen, da es Ihnen hilft, Sattelpunkten oder lokalen Minima zu entkommen (Satz 6 in [2]). Der Nachteil ist, dass es schrecklich ineffizient ist und Sie den gesamten Datensatz viele Male durchlaufen müssen, um eine gute Lösung zu finden.

Die Minibatch-Methode ist ein Kompromiss, der bei jeder Gradientenaktualisierung genügend Rauschen erzeugt und gleichzeitig eine relativ schnelle Konvergenz erzielt.

1 Bottou, L. (2010). Maschinelles Lernen in großem Maßstab mit stochastischem Gefälle. In Proceedings of COMPSTAT'2010 (S. 177-186). Physica-Verlag HD.

[2] Ge, R., Huang, F., Jin, C. & Yuan, Y. (2015, Juni). Flucht aus dem Sattelpunkte-Online-Stochastikgradienten für die Tensor-Zersetzung. In COLT (S. 797-842).

EDIT:

Ich habe gerade diesen Kommentar auf Yann LeCuns Facebook gesehen, der eine neue Perspektive auf diese Frage bietet (ich weiß leider nicht, wie ich auf fb verlinken soll).

Training mit großen Minibatches ist gesundheitsschädlich. Noch wichtiger ist, es ist schlecht für Ihren Testfehler. Freunde lassen Freunde keine Minibatches größer als 32 verwenden. Seien wir ehrlich: Die einzigen , die seit 2012 auf Minibatch-Größen größer als 1 umgestellt haben, sind GPUs, die für Batch-Größen kleiner als 32 ineffizient sind. Das ist ein schrecklicher Grund. Es bedeutet nur, dass unsere Hardware zum Kotzen ist.

Er zitierte diesen Artikel, der vor einigen Tagen (April 2018) auf arXiv veröffentlicht wurde und der es wert ist, gelesen zu werden.

Dominic Masters, Carlo Luschi, Überarbeitung des Small Batch-Trainings für tiefe neuronale Netze , arXiv: 1804.07612v1

Aus dem Abstrakten,

Während die Verwendung großer Mini-Batches die verfügbare Rechenparallelität erhöht, wurde gezeigt, dass das Training in kleinen Batches eine verbesserte Generalisierungsleistung bietet ...

Die beste Leistung wurde durchweg für Kleinseriengrößen zwischen m = 2 und m = 32 erzielt, was im Gegensatz zu den jüngsten Arbeiten steht, die die Verwendung von Kleinseriengrößen in Tausenden befürworten.

HoraceT
quelle
2
Warum sollte ein Minibatch-Gradientenabstieg mit größerer Wahrscheinlichkeit schlechte lokale Minima vermeiden als ein Batch-Gradientenabstieg? Haben Sie etwas, das diese Behauptung stützt?
Martin Thoma
@MartinThoma Siehe Satz 6 in [2], einem kürzlich erschienenen Artikel über JMLR.
HoraceT
2
Dieses Papier ist auch auf arXiv . Ich verstehe auch nicht, wie dies Ihre Behauptung stützt. Sie haben noch nie von einem Mini-Batch-Gefälle gesprochen. Ich verstehe diesen Satz nicht (zB was ist "g (X)"? Wo haben sie diese Notation eingeführt? In Statistikklassen ist g (X) = E (X) ... aber das macht hier nicht viel Sinn) . Was ist ? - Die Aussage dieses Theorems scheint darauf hinzudeuten, dass es keine schlechten lokalen Minima gibt. Dies gilt jedoch sowohl für SGD- und Batch-Gradienten-Abfahrten als auch für Mini-Batch-Gradienten-Abfahrten, oder? ϕ(w,X)
Martin Thoma
2
@MartinThoma Da es ein globales Minimum für den Datensatz gibt, den wir erhalten, hängt der genaue Pfad zu diesem globalen Minimum von verschiedenen Faktoren für jede GD-Methode ab. Bei Chargen sind die Gewichte bei der Initialisierung der einzige stochastische Aspekt. Der Gradientenpfad ist derselbe, wenn Sie den NN erneut mit denselben Anfangsgewichten und demselben Datensatz trainieren. Für Mini-Batch und SGD weist der Pfad zwischen den einzelnen Schritten einige stochastische Aspekte auf, die sich aus der stochastischen Abtastung von Datenpunkten für das Training in jedem Schritt ergeben. Dies ermöglicht es Mini-Batch und SGD, lokalen Optima zu entkommen, wenn sie unterwegs sind.
Wesley
8

Der Speicher ist nicht wirklich der Grund, dies zu tun, weil Sie könnten nur Ihre Steigungen , wie Sie durchlaufen den Datensatz akkumulieren, und wenden sie am Ende, aber immer noch in SGD Sie gelten sie bei jedem Schritt.

Gründe, warum SGD so weit verbreitet ist, sind:

1) Effizienz. Insbesondere zu Beginn des Trainings tendieren die Parametergradienten für verschiedene Teilmengen der Daten in der Regel dazu, in die gleiche Richtung zu weisen. Gradienten, die mit einem Hundertstel der Daten bewertet werden, weisen also in etwa in die gleiche allgemeine Richtung wie der gesamte Datensatz, erfordern jedoch nur ein Hundertstel der Berechnung. Da die Konvergenz in einem hochgradig nichtlinearen, tiefen Netzwerk normalerweise Tausende oder Millionen von Iterationen erfordert, unabhängig davon, wie gut Ihre Verläufe sind, ist es sinnvoll, viele Aktualisierungen auf der Grundlage billiger Schätzungen des Verlaufs vorzunehmen, anstatt nur wenige Aktualisierungen auf der Grundlage guter.

2) Optimierung: Durch laute Updates können Sie möglicherweise aus schlechten lokalen Optima herausspringen (obwohl ich keine Quelle habe, aus der hervorgeht, dass dies in der Praxis von Bedeutung ist).

3) Verallgemeinerung. Es scheint (siehe Zhang et al.: Theorie des tiefen Lernens III: Generalisierungseigenschaften von SGD ), dass SGD die Generalisierung tatsächlich unterstützt, indem "flache" Minima auf dem Trainingssatz gefunden werden, die wahrscheinlicher auch Minima auf dem Testsatz sind. Intuitiv können wir denken von SGD als eine Art Absackung - durch Berechnung unserer Parameter basierend auf vielen minibatches der Daten, reenforce wir Regeln verallgemeinern über minibatches und Regeln aufheben , die dies nicht tun, wodurch uns weniger anfällig für Überanpassung an die Trainingsset.

Peter
quelle
3

Wenn ich mich nicht irre, gibt die Stapelgröße die Anzahl der Trainingsinstanzen an, die das Modell während einer Trainingsiteration gesehen hat

Richtig (obwohl ich es "Gewichtsaktualisierungsschritt" nennen würde)

und die Epoche ist eine vollständige Wende, wenn das Modell jede der Trainingsinstanzen gesehen hat

Richtig

In diesem Fall kann ich den Vorteil nicht erkennen, dass ich die Trainingsinstanzen gegenüber einer fast unbedeutenden Teilmenge mehrmals iteriere, im Gegensatz zum Anwenden eines "maximalen Stapels", indem ich alle verfügbaren Trainingsinstanzen in jeder Runde auf das Modell lege (vorausgesetzt natürlich, dass dies ausreicht) die Erinnerung). Was ist der Vorteil dieses Ansatzes?

Nun, so ziemlich das. Normalerweise haben Sie nicht genug Speicher. Nehmen wir an, wir sprechen über die Klassifizierung von Bildern. ImageNet ist ein äußerst beliebter Datensatz. VGG-16D war lange Zeit eines der beliebtesten Modelle. Es werden 15 245 800 Floats (in den Feature-Maps) für ein 224 x 224-Bild benötigt. Dies bedeutet ungefähr 61 MB pro Bild. Dies ist nur eine grobe Untergrenze dafür, wie viel Speicher Sie während des Trainings für jedes Bild benötigen. ImageNet enthält mehrere tausend (ich denke etwa 1,2 Millionen?) Bilder. Während Sie vielleicht so viel Hauptspeicher haben, haben Sie sicherlich nicht so viel GPU-Speicher. Ich habe gesehen, wie die GPU die Dinge auf das 21-fache beschleunigte. Sie möchten also unbedingt die GPU verwenden.

Außerdem: Die Zeit für eine Mini-Charge ist viel kürzer. Die Frage ist also: Würden Sie lieber n Aktualisierungsschritte mit Mini-Batch pro Stunde auf einer GPU ausführen oder m Aktualisierungsschritte mit Batch ohne GPU, wobei n >> m.

Martin Thoma
quelle
Es geht wirklich nicht um begrenztes Gedächtnis. Es ist immer möglich, den Gradienten in mehreren Stapeln mit festen Modellparametern über Ihren Datensatz zu berechnen (funktionell äquivalent zur Berechnung des Gradienten in einem einzelnen Riesenstapel). Praktisch geht es mehr um die Generalisierungseigenschaften, die durch Stochastizität / Rauschen von SGD / MBGD verursacht werden, und die Tatsache, dass weniger Zeiträume durch Ihren Datensatz erforderlich sind, um Konvergenz zu erreichen. Das Aktualisieren von Modellparametern innerhalb einer einzelnen Epoche führt zu besseren Zwischenparametern, wodurch weitere Gradientenberechnungen innerhalb der Epoche informativer werden.
Madison,
1

Abgesehen von den anderen Antworten sollte ich darauf hinweisen, dass es zwei Größen gibt, die sich unterscheiden, aber oft miteinander verbunden sind:

  1. Die Anzahl der Eingaben, die zur Berechnung des Gradienten der Parameter in jedem Schritt verwendet werden.

Wie bereits erwähnt, ist der Gradient in Bezug auf ein Minibatch eine Annäherung an den tatsächlichen Gradienten. Je größer das Minibatch ist, desto besser ist die Approximation.

  1. Die Anzahl der Eingaben, die in einem Array gesammelt und "gleichzeitig" berechnet wurden

Hier geht es nur um Leistung (Speicher / Zyklen).

Diese Mengen sind in der Regel gleich, dh die Minibatchgröße, können aber grundsätzlich entkoppelt werden.

zenna
quelle