So stellen Sie die Mini-Batch-Größe in SGD in Keras ein

10

Ich bin neu bei Keras und brauche deine Hilfe.

Ich trainiere ein neuronales Netz in Keras und meine Verlustfunktion ist die Quadrat-Differenz s / w-Netzleistung und der Zielwert.

Ich möchte dies mit Gradient Descent optimieren. Nachdem ich einige Links im Internet durchgesehen habe, habe ich festgestellt, dass es drei Arten von Gradientenabfahrten gibt, die allgemein verwendet werden:

  1. Gradientenabstieg einer einzelnen Probe : Hier wird der Gradient aus nur einer Probe pro Iteration berechnet -> Gradient kann verrauscht sein.
  2. Batch-Gradientenabstieg : Hier ist der Gradient der Durchschnitt der Gradienten, die aus ALLEN Stichproben im Datensatz berechnet wurden -> Der Gradient ist allgemeiner, aber für große Datensätze nicht zu handhaben.
  3. Mini-Batch-Gradientenabstieg : Ähnlich wie bei Batch GD. Anstatt den gesamten Datensatz zu verwenden, werden nur einige der Stichproben (bestimmt durch batch_size) verwendet, um den Gradienten in jeder Iteration zu berechnen -> Nicht sehr verrauscht und auch rechnerisch nachvollziehbar -> Das Beste aus beiden Welten.

Fragen:

  1. Ich möchte einen Mini-Batch-Gradientenabstieg in Keras durchführen. Wie kann ich das machen? Soll ich den SGD-Optimierer verwenden?
  2. Wie setze ich die Batch-Größe, wenn SGD verwendet werden soll? Die SGD-Funktion scheint keinen Parameter zum Festlegen von batch_size zu haben.

    optimizer = keras.optimizers.SGD(lr=0.01, decay=0.1, momentum=0.1, nesterov=False)
  3. In model.fit () in Keras gibt es einen Parameter batch_size.

    history = model.fit(x, y, nb_epoch=num_epochs, batch_size=20, verbose=0, validation_split=0.1)

    Entspricht dies der Chargengröße in Mini-Batch Gradient Descent? Wenn nicht, was bedeutet es genau, auf einer Reihe von Eingaben zu trainieren? Bedeutet das, dass 'batch_size' Nr. von Threads parallel laufen und die Modellgewichte parallel aktualisieren?

Wenn es hilft, hier ist das Python-Code-Snippet, das ich bisher geschrieben habe .

Iceflame007
quelle

Antworten:

8

Ja, du hast recht. In Keras batch_sizebezieht sich auf die Stapelgröße in Mini-Batch-Gradientenabstieg. Wenn Sie einen Batch-Gradientenabstieg ausführen möchten, müssen Sie batch_sizedie Anzahl der Trainingsmuster festlegen . Ihr Code sieht perfekt aus, außer dass ich nicht verstehe, warum Sie die model.fitFunktion in einem Objektverlauf speichern .

Ernest S Kirubakaran
quelle
3
Er speichert in einem Verlaufsobjekt, da in Keras die Funktion "Anpassen" nicht nur das trainierte Modell zurückgibt, sondern auch ein Verlaufsobjekt, das das trainierte Modell, den Trainingsverlauf und viele andere Dinge speichert. Es gibt einige Beispiele in solchen Keras-Beispielen.
Ygor de Mello Canalli
1

Abgesehen von theoretischen Überlegungen würde es angesichts des realen Datensatzes und der Größe eines typischen modernen neuronalen Netzwerks normalerweise unangemessen lange dauern, auf Stapeln der Größe 1 zu trainieren, und Sie haben nicht genügend RAM und / oder GPU-Speicher, um den gesamten Datensatz zu trainieren auf einmal. Daher ist es normalerweise nicht die Frage, ob eine Mini-Charge verwendet werden soll, sondern welche Größe von Chargen Sie verwenden sollten. Das batch_sizeArgument ist die Anzahl der Beobachtungen, die in einem einzigen Schritt trainiert werden müssen. In der Regel funktionieren kleinere Größen besser, da sie regulierend wirken. Darüber hinaus verwenden Benutzer häufig kompliziertere Optimierer (z. B. Adam, RMSprop) und andere Regularisierungstricks, was die Beziehung zwischen Modellleistung, Stapelgröße, Lernrate und Rechenzeit komplizierter macht.

Tim
quelle
Vielen Dank für die Klarstellung. Aber wie würde ich die Datennormalisierung auf diese Weise durchführen? Ich weiß, dass ich alle Trainings- und Testdaten insgesamt normalisieren kann, aber dadurch werden die in den Optimierungsprozess eingespeisten Mini-Batches nicht mehr normalisiert.
Mr.Robot
@ Mr.Robot warum würden Sie annehmen, dass jede Charge unabhängig normalisiert werden muss?
Tim
Ich habe zuvor einen Beitrag gelesen, in dem es heißt, dass Trainings- und Testdaten getrennt behandelt werden sollten (dh zuerst die Aufteilung der Zugtests durchführen und dann einzeln verarbeiten). Ich dachte, dies würde auch bei der Optimierung mit Mini-Batches gelten. Ich vermute, dass dies gut für die Konvergenz sein könnte?
Mr.Robot
@ Mr.Robot reductio ad absurdum : Würden Sie bei Mini-Chargen der Größe 1 als Ihre Daten nur Nullen übergeben ? Sie können es als separate Frage stellen, wenn Sie möchten.
Tim
Vielen Dank für den Hinweis! Jetzt habe ich jetzt die Probleme mit meiner Argumentation.
Mr.Robot