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

221

Welchen Unterschied macht es, wenn Sie ein neuronales Netzwerk trainieren:

  • Batchgröße auf und Anzahl der Iterationen aufbab
  • Batch-Größe auf und Anzahl der Iterationen aufdcd

wo ?ab=cd

Um es anders auszudrücken: Angenommen, wir trainieren das neuronale Netzwerk mit der gleichen Anzahl von Trainingsbeispielen. Wie stellen Sie die optimale Stapelgröße und Anzahl der Iterationen ein? (wobei Batchgröße * Anzahl der Iterationen = Anzahl der Trainingsbeispiele, die dem neuronalen Netzwerk angezeigt werden, wobei dasselbe Trainingsbeispiel möglicherweise mehrmals angezeigt wird)

Mir ist bewusst, dass je höher die Stapelgröße ist, desto mehr Speicherplatz wird benötigt, und die Berechnungen werden häufig schneller. Aber welchen Unterschied macht es in Bezug auf die Leistung des trainierten Netzwerks?

Franck Dernoncourt
quelle
1
In diesem Blog erfahren Sie, wie Sie die richtige Chargengröße auswählen, während Sie die Auswirkungen verschiedener Chargengrößen auf die Genauigkeit des Cifar-10-Datensatzes vergleichen.
Teja Sreenivas

Antworten:

207

Von Nitish Shirish Keskar, Dheevatsa Mudigere, Jorge Nocedal, Michail Smelyanskiy und Ping Tak Peter Tang. Zum Großpacken-Training für tiefes Lernen: Generalisierungslücke und scharfe Minima. https://arxiv.org/abs/1609.04836 :

Die stochastische Gradientenabstiegsmethode und ihre Varianten sind Algorithmen der Wahl für viele Deep-Learning-Aufgaben. Diese Verfahren arbeiten in einem kleinen Batch-Regime, in dem ein Bruchteil der Trainingsdaten, normalerweise 32-512 Datenpunkte, abgetastet wird, um eine Annäherung an den Gradienten zu berechnen. In der Praxis wurde beobachtet, dass bei Verwendung einer größeren Charge eine signifikante Verschlechterung der Qualität des Modells auftritt, gemessen an seiner Fähigkeit zur Verallgemeinerung.Es gab einige Versuche, die Ursache für diesen Verallgemeinerungsrückgang im Großchargenregime zu untersuchen, die genaue Antwort auf dieses Phänomen ist jedoch bisher unbekannt. In diesem Aufsatz präsentieren wir zahlreiche numerische Beweise, die die Ansicht stützen, dass Großchargenmethoden dazu tendieren, zu scharfen Minimierern der Trainings- und Testfunktionen zu konvergieren - und dass scharfe Minima zu einer schlechteren Generalisierung führen. Im Gegensatz dazu konvergieren Small-Batch-Methoden konsequent gegen flache Minimierer, und unsere Experimente stützen die weit verbreitete Ansicht, dass dies auf das inhärente Rauschen bei der Gradientenschätzung zurückzuführen ist. Wir diskutieren auch verschiedene empirische Strategien, die dazu beitragen, die Generalisierungslücke bei großen Ansätzen zu schließen, und schließen mit einer Reihe zukünftiger Forschungsideen und offenen Fragen.

[…]

Der Mangel an Verallgemeinerungsfähigkeit ist auf die Tatsache zurückzuführen, dass Verfahren mit großem Ansatz dazu neigen, zu scharfen Minimierern der Trainingsfunktion zu konvergieren . Diese Minimierer zeichnen sich durch große positive Eigenwerte in und verallgemeinern sich tendenziell weniger gut. Im Gegensatz dazu konvergieren Small-Batch-Methoden zu flachen Minimierern, die durch kleine positive Eigenwerte von . Wir haben beobachtet, dass die Verlustfunktionslandschaft tiefer neuronaler Netze derart ist, dass Großchargenmethoden fast immer von Regionen mit scharfen Minima angezogen werden und im Gegensatz zu Kleinchargenmethoden nicht in der Lage sind, Becken dieser Minimierer zu entkommen.2 f ( x )2f(x)2f(x)

[…]

Bildbeschreibung hier eingeben

Außerdem einige gute Erkenntnisse von Ian Goodfellow, der antwortet, warum man nicht den gesamten Trainingssatz verwendet, um den Gradienten zu berechnen. auf Quora:

Die Größe der Lernrate wird hauptsächlich durch Faktoren wie die Krümmung der Kostenfunktion begrenzt. Sie können sich Gradientenabstieg als eine lineare Annäherung an die Kostenfunktion vorstellen und sich dann entlang dieser ungefähren Kosten bergab bewegen. Wenn die Kostenfunktion stark nichtlinear (stark gekrümmt) ist, ist die Approximation für sehr große Entfernungen nicht sehr gut, so dass nur kleine Schrittgrößen sicher sind. Weitere Informationen hierzu finden Sie in Kapitel 4 des Lehrbuchs für vertiefendes Lernen zur numerischen Berechnung: http://www.deeplearningbook.org/contents/numerical.html

Wenn Sie m Beispiele in ein Minibatch einfügen, müssen Sie eine O (m) -Berechnung durchführen und den O (m) -Speicher verwenden, aber Sie verringern die Unsicherheit im Verlauf nur um den Faktor O (sqrt (m)). Mit anderen Worten, es gibt abnehmende Grenzerträge, wenn mehr Beispiele in das Minibatch aufgenommen werden. Weitere Informationen hierzu finden Sie in Kapitel 8 des Deep Learning-Lehrbuchs zu Optimierungsalgorithmen für Deep Learning: http://www.deeplearningbook.org/contents/optimization.html

Auch wenn du darüber nachdenkst, gibt dir die Verwendung des gesamten Trainingssatzes nicht wirklich den wahren Gradienten. Der wahre Gradient wäre der erwartete Gradient, wobei die Erwartung über alle möglichen Beispiele hinweg genommen wird, gewichtet durch die Datenerzeugungsverteilung. Bei Verwendung des gesamten Trainingssatzes wird nur eine sehr große Minibatch-Größe verwendet, wobei die Größe Ihres Minibatch durch den Betrag, den Sie für die Datenerfassung ausgeben, und nicht durch den Betrag, den Sie für die Berechnung ausgeben, begrenzt wird.

Verwandte: Batch-Gefälle versus stochastisches Gefälle

Franck Dernoncourt
quelle
Da batch_size den Trainingsdatensatz nur in Batches unterteilt, ist es sinnvoll, den Datensatz (nicht temporär) neu anzuordnen, um eine einheitliche Varianz über alle Batches hinweg zu erzielen. Dies könnte die Notwendigkeit einer Optimierung der Stapelgröße verringern, was nur hilfreich ist, um eine schnellere Konvergenz zu erreichen. wenn ja, wie würde es gemacht werden? Ich dachte, es könnte keine flacheren Minima geben. Würde mich über eine ausführliche Anleitung freuen.
User12348
@ user12348 Wie ordnen Sie den Datensatz neu an? Wie können Sie abschätzen, ob eine bestimmte Datendimension nach dem Training einen bestimmten Merkmalsvektor erzeugt?
Cloud Cho
46

Ich gehe davon aus, dass Sie über das Reduzieren der Stapelgröße in einem stochastischen Ministapel-Gradientenabstiegsalgorithmus sprechen und diesen mit größeren Stapelgrößen vergleichen, die weniger Iterationen erfordern.

Andrew Ng. bietet eine gute Diskussion darüber und einige Bilder in seiner Online-Kursklasse über ML und neuronale Netze. Der Rest dieses Postens ist also hauptsächlich eine Wiederholung seiner Lehren aus dieser Klasse.

Nehmen wir die beiden Extreme: Auf einer Seite wird bei jedem Gradientenabstieg der gesamte Datensatz verwendet. Sie berechnen die Gradienten für jede Probe. In diesem Fall wissen Sie genau das Beste direkt in Richtung eines lokalen Minimums. Sie verschwenden keine Zeit damit, in die falsche Richtung zu gehen. In Bezug auf die Anzahl der Abstiegsschritte mit Gefälle werden Sie in den wenigsten Schritten dorthin gelangen.

Die Berechnung des Gradienten über den gesamten Datensatz ist natürlich teuer. Also gehen wir jetzt zum anderen Extrem. Eine Losgröße von nur 1 Probe. In diesem Fall kann der Gradient dieses Samples völlig in die falsche Richtung weisen. Aber hey, die Kosten für die Berechnung des einen Gradienten waren ziemlich gering. Wenn Sie Schritte in Bezug auf nur eine Probe unternehmen, "irren" Sie ein wenig umher, aber im Durchschnitt bewegen Sie sich in Richtung eines ebenso vernünftigen lokalen Minimums wie bei einer vollständigen Batch-Gradientenabnahme.

Dies könnte ein Moment sein, um darauf hinzuweisen, dass ich in der Literatur Hinweise darauf gefunden habe, dass dieses Hin- und Herschwingen um den stochastischen Gradientenabstieg von 1 Stichprobe möglicherweise dazu beiträgt, aus einer lokalen Minima herauszukommen, die der vollständige Batch-Modus nicht vermeiden würde, aber das ist fraglich. Einige andere gute Antworten hier sprechen diese Frage direkter an als ich.

Was die Rechenleistung anbelangt, so dauert der stochastische GD-Prozess mit einer Stichprobe zwar viel mehr Iterationen, Sie erreichen ihn jedoch "normalerweise" zu geringeren Kosten als im vollständigen Batch-Modus. So sagt es Andrew Ng.

Lassen Sie uns nun den Mittelweg finden, nach dem Sie gefragt haben. Wir könnten feststellen, dass moderne BLAS-Bibliotheken das Berechnen von Vektormathematik sehr effizient machen. Wenn Sie also Ihren Code richtig vektorisiert haben, ist das gleichzeitige Berechnen von 10 oder 100 Samples kaum arbeitsaufwendiger als das Berechnen von 1 Sample (Sie erzielen so gut wie Speicherrufeffizienzen) Computertricks, die in die effizientesten Mathematikbibliotheken integriert sind). Und die Mittelung über eine Charge von 10, 100, 1000 Proben wird einen Gradienten erzeugen, der eine vernünftigere Annäherung an den wahren, vollständigen Gradienten im Batch-Modus darstellt. Unsere Schritte sind jetzt genauer, dh, wir benötigen weniger Schritte für die Konvergenz und dies zu einem Preis, der nur unwesentlich höher ist als bei der Einzelproben-GD.

Das Optimieren der exakten Größe des zu verwendenden Mini-Batchs ist im Allgemeinen Versuch und Irrtum überlassen. Führen Sie einige Tests an einer Stichprobe des Datensatzes mit Zahlen zwischen einigen zehn und einigen tausend durch, und prüfen Sie, welche am schnellsten konvergiert. Chargengrößen in diesen Bereichen scheinen in der Literatur weit verbreitet zu sein. Und wenn Ihre Daten wirklich IID sind, legt der zentrale Grenzwertsatz für die Variation zufälliger Prozesse auch nahe, dass diese Bereiche eine vernünftige Annäherung an den vollen Gradienten darstellen.

Um zu entscheiden, wann die Iteration beendet werden soll, wird in der Regel Ihr Generalisierungsfehler anhand eines nicht geschulten Validierungssatzes überwacht und der Punkt ausgewählt, an dem sich der Validierungsfehler am niedrigsten Punkt befindet. Wenn Sie zu viele Iterationen trainieren, führt dies zu einer Überanpassung. An diesem Punkt beginnt Ihr Fehler in Ihrem Validierungssatz zu steigen. Wenn Sie dies beobachten, halten Sie am optimalen Punkt an.

David Parks
quelle
22

TL; DR: Eine zu große Kleinserie führt normalerweise zu einer geringeren Genauigkeit!

Für Interessierte hier eine Erklärung.

Es gibt zwei Begriffe von Geschwindigkeit:

  • Rechengeschwindigkeit
  • Konvergenzgeschwindigkeit eines Algorithmus

Rechengeschwindigkeit ist einfach die Geschwindigkeit, mit der numerische Berechnungen in Hardware durchgeführt werden. Wie Sie sagten, ist es normalerweise höher mit einer größeren Mini-Batch-Größe. Dies liegt daran, dass in linearen Algebra-Bibliotheken die Vektorisierung für Vektor- und Matrixoperationen verwendet wird, um sie zu beschleunigen, und dies auf Kosten der Verwendung von mehr Speicher. Gewinne können bis zu einem gewissen Punkt signifikant sein. Nach meiner Erfahrung gibt es einen Punkt, ab dem es nur noch geringfügige Geschwindigkeitszuwächse gibt. Der Punkt hängt vom Datensatz, der Hardware und einer Bibliothek ab, die für numerische Berechnungen (unter der Haube) verwendet wird.

Vergessen wir aber nicht, dass es auch den anderen Begriff der Geschwindigkeit gibt, der uns sagt, wie schnell unser Algorithmus konvergiert.

Was bedeutet es zunächst, dass unser Algorithmus konvergiert? Nun, es liegt an uns zu definieren und zu entscheiden, wann wir mit einer Genauigkeit oder einem Fehler zufrieden sind, die bzw. der auf der Grundlage des Validierungssatzes berechnet wird. Wir können es entweder im Voraus definieren und warten, bis der Algorithmus diesen Punkt erreicht hat, oder wir können den Trainingsprozess überwachen und entscheiden, ihn zu stoppen, wenn der Validierungsfehler signifikant zu steigen beginnt (das Modell beginnt, den Datensatz zu überfüllen). Wir sollten es wirklich nicht sofort beenden, wenn wir mit Minibatches arbeiten und der Fehler im ersten Moment steigt, weil wir Stochastic Gradient Descent (SGD) verwenden. Im Falle eines (vollständigen Batch-) Gradientenabfalls wird der Algorithmus nach jeder Epoche auf ein Minimum festgelegt, sei es lokal oder global. SGD lässt sich nie wirklich auf ein Minimum ein. Es pendelt immer wieder darum herum. Es könnte auf unbestimmte Zeit weitergehen,

Nach all dieser Theorie gibt es jetzt einen "Haken", auf den wir achten müssen. Bei Verwendung einer kleineren Stapelgröße ist die Berechnung des Fehlers rauschbehafteter als bei Verwendung einer größeren Stapelgröße. Man würde sagen, das ist doch schlimm, oder? Die Sache ist, dass Rauschen dem Algorithmus helfen kann, aus einem schlechten lokalen Minimum herauszuspringen und mehr Chancen haben kann, entweder ein besseres lokales Minimum oder hoffentlich das globale Minimum zu finden.

Wenn wir also schneller eine bessere Lösung finden können, indem wir eine kleinere als eine größere Stapelgröße verwenden, können wir mithilfe des "unerwünschten" Rauschens zwischen der Gesamtzeit abstimmen, die unser Algorithmus benötigt, um eine zufriedenstellende Lösung zu finden Lösung und eine höhere Genauigkeit.

Was ich sagen möchte, ist, dass bei einer bestimmten Genauigkeit (oder einem bestimmten Fehler) eine geringere Chargengröße zu einer kürzeren Gesamtschulungszeit führen kann, nicht länger, wie viele glauben.

Oder, wenn wir uns dazu entschließen, die gleiche Trainingszeit wie zuvor beizubehalten, erhalten wir möglicherweise eine etwas höhere Genauigkeit bei einer kleineren Chargengröße, und das werden wir höchstwahrscheinlich, insbesondere wenn wir unsere Lernrate entsprechend gewählt haben.

Wenn Sie Zeit haben, lesen Sie dieses Dokument: Systematische Bewertung der CNN-Fortschritte im ImageNet Lesen Sie insbesondere "3.7. Stapelgröße und Lernrate" und Abbildung 8. Sie werden feststellen, dass große Mini-Stapelgrößen zu einer schlechteren Genauigkeit führen , auch wenn die Lernrate auf eine Heuristik eingestellt ist.

Im Allgemeinen ist die Stapelgröße 32 ein guter Ausgangspunkt, und Sie sollten es auch mit 64, 128 und 256 versuchen. Andere Werte (niedriger oder höher) können für einige Datensätze in Ordnung sein, der angegebene Bereich ist jedoch im Allgemeinen der beste experimentiere mit. Unter 32 kann es jedoch zu langsam werden, da die Rechengeschwindigkeit erheblich abnimmt und die Vektorisierung nicht in vollem Umfang genutzt wird. Wenn Sie die Fehlermeldung "Nicht genügend Speicher" erhalten, sollten Sie trotzdem versuchen, die Mini-Batch-Größe zu reduzieren.

Es geht also nicht nur darum, die größtmögliche Mini-Batch-Größe zu verwenden, die in den Speicher passt.

Zum Abschluss und zur Beantwortung Ihrer Frage führt eine kleinere (nicht zu kleine) Ministapelgröße in der Regel nicht nur zu einer geringeren Anzahl von Iterationen eines Trainingsalgorithmus als eine große Stapelgröße, sondern auch zu einer insgesamt höheren Genauigkeit, dh Ein neuronales Netzwerk, das bei gleicher oder geringerer Trainingszeit eine bessere Leistung erbringt.

Vergessen Sie nicht, dass das höhere Rauschen dazu beitragen kann, dass es aus einem schlechten lokalen Minimum herausspringt, anstatt es darin hängen zu lassen.

ivanbgd
quelle
14

Ich füge dieser Frage eine weitere Antwort hinzu, um auf ein neues (2018) ICLR-Konferenzpapier von Google zu verweisen, in dem diese Frage fast direkt angesprochen wird.

Titel: Verringern Sie nicht die Lernrate, sondern erhöhen Sie die Stapelgröße

https://arxiv.org/abs/1711.00489

Das Abstract aus dem obigen Artikel wird hier kopiert:

Es ist üblich, die Lernrate zu verringern. Hier zeigen wir, dass man normalerweise die gleiche Lernkurve sowohl für Trainings- als auch für Testsätze erzielen kann, indem man stattdessen die Stapelgröße während des Trainings erhöht. Dieses Verfahren ist bei stochastischem Gradientenabstieg (SGD), SGD mit Impuls, Nesterov-Impuls und Adam erfolgreich. Es erreicht nach der gleichen Anzahl von Trainingsepochen äquivalente Testgenauigkeiten, jedoch mit weniger Parameteraktualisierungen, was zu größerer Parallelität und kürzeren Trainingszeiten führt. Wir können die Anzahl der Parameteraktualisierungen weiter reduzieren, indem wir die Lernrate erhöhen und die Stapelgröße B skalieren. Schließlich kann man den Impulskoeffizienten m und die Skala B∝1 / (1 − m) erhöhen, obwohl dies dazu neigt, die Testgenauigkeit geringfügig zu verringern. Entscheidend ist, Unsere Techniken ermöglichen es uns, vorhandene Trainingspläne für großes Chargentraining ohne Hyperparametertuning umzuwandeln. Wir trainieren ResNet-50 auf ImageNet mit einer Validierungsgenauigkeit von 76,1% in weniger als 30 Minuten.

David Parks
quelle
1
Ein größerer Speicherbedarf scheint ein schlechter Kompromiss zu sein, wenn einfach vermieden wird, einen Wert zu verringern. Auch IMHO, bei dem der Speicherbedarf während des Trainings zunimmt, sorgt für einen weniger, nicht mehr skalierbaren Algorithmus.
P-Gn
3

Ich zeige einige empirische Erfahrung hier . Ich habe ein Experiment mit Losgröße 4 und Losgröße 4096 durchgeführt. Die Größe 4096 bewirkt 1024x weniger Backpropagations. Meine Intuition ist also, dass größere Chargen weniger und gröbere Suchschritte für die optimale Lösung ausführen und daher konstruktionsbedingt weniger wahrscheinlich für die optimale Lösung konvergieren.

Lars Ericson
quelle