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.