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:
- Gradientenabstieg einer einzelnen Probe : Hier wird der Gradient aus nur einer Probe pro Iteration berechnet -> Gradient kann verrauscht sein.
- 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.
- 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:
- Ich möchte einen Mini-Batch-Gradientenabstieg in Keras durchführen. Wie kann ich das machen? Soll ich den SGD-Optimierer verwenden?
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)
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 .
quelle
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_size
Argument 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.quelle