Welchen Unterschied macht es, wenn Sie ein neuronales Netzwerk trainieren:
- Batchgröße auf und Anzahl der Iterationen aufb
- Batch-Größe auf und Anzahl der Iterationen aufd
wo ?
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?
neural-networks
train
Franck Dernoncourt
quelle
quelle
Antworten:
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 :
Außerdem einige gute Erkenntnisse von Ian Goodfellow, der antwortet, warum man nicht den gesamten Trainingssatz verwendet, um den Gradienten zu berechnen. auf Quora:
Verwandte: Batch-Gefälle versus stochastisches Gefälle
quelle
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.
quelle
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 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.
quelle
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:
quelle
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.
quelle