Wie aktualisiert der Minibatch-Gradientenabstieg die Gewichte für jedes Beispiel in einem Stapel?

11

Wenn wir beispielsweise 10 Beispiele in einem Stapel verarbeiten, können wir meines Erachtens den Verlust für jedes Beispiel summieren. Wie funktioniert die Rückausbreitung in Bezug auf die Aktualisierung der Gewichte für jedes Beispiel?

Beispielsweise:

  • Beispiel 1 -> Verlust = 2
  • Beispiel 2 -> Verlust = -2

Dies führt zu einem durchschnittlichen Verlust von 0 (E = 0). Wie würde dies also jedes Gewicht aktualisieren und konvergieren? Ist es einfach durch die Randomisierung der Chargen, dass wir früher oder später "hoffentlich" konvergieren? Berechnet dies nicht auch nur den Gradienten für den ersten Satz von Gewichten für das zuletzt verarbeitete Beispiel?

Kohlenstoff berechnet
quelle

Antworten:

15

Der Gradientenabstieg funktioniert nicht ganz so, wie Sie es vorgeschlagen haben, aber ein ähnliches Problem kann auftreten.

Wir berechnen nicht den durchschnittlichen Verlust aus der Charge, sondern die durchschnittlichen Gradienten der Verlustfunktion. Die Gradienten sind die Ableitung des Verlusts in Bezug auf das Gewicht, und in einem neuronalen Netzwerk hängt der Gradient für ein Gewicht von den Eingaben dieses spezifischen Beispiels und auch von vielen anderen Gewichten im Modell ab.

Wenn Ihr Modell 5 Gewichte hat und Sie eine Mini-Batch-Größe von 2 haben, erhalten Sie möglicherweise Folgendes:

Beispiel 1. Verlust = 2, Farbverläufe=(1.5,- -2.0,1.1,0,4,- -0,9)

Beispiel 2. Verlust = 3, Farbverläufe=(1.2,2.3,- -1.1,- -0,8,- -0,7)

Der Durchschnitt der Gradienten in dieser Mini-Charge wird berechnet (1,35,0,15,0,- -0,2,- -0,8)

0

als Antwort auf Kommentare bearbeiten:

kL.ichwj

L.wj=1kich=1kL.ichwj

Der Tutorial-Code, auf den Sie in den Kommentaren verlinkt haben, verwendet Tensorflow, um den durchschnittlichen Verlust zu minimieren.

Tensorflow zielt darauf ab, zu minimieren1kich=1kL.ich

Um dies zu minimieren, werden die Gradienten des durchschnittlichen Verlusts in Bezug auf jedes Gewicht berechnet und die Gewichte mithilfe des Gradientenabfalls aktualisiert:

L.wj=wj1kich=1kL.ich

Die Differenzierung kann in die Summe gebracht werden, so dass sie dem Ausdruck aus dem Ansatz in meinem Beispiel entspricht.

wj1kich=1kL.ich=1kich=1kL.ichwj

Hugh
quelle
Erwischt. Sie möchten immer noch den Verlust über die Batch-Größe richtig mitteln? Ich bin nicht sicher, ob Sie mit Tensorflow vertraut sind, aber ich habe versucht, mein Verständnis mit diesem Tutorial in Einklang zu bringen: tensorflow.org/get_started/mnist/beginners Sie können sehen, dass der Verlust über den Stapel gemittelt wird (Reduce_Mean-Code). Ich nehme an, Tensorflow hält eine interne Zählung / Durchschnittswerte der Gewichte?
Carboncomputed
1
@carboncomputed Oh ja, Sie haben Recht, sie mitteln den Verlust, sodass Tensorflow bei der Berechnung der Gradienten des durchschnittlichen Verlusts effektiv den Durchschnitt der Gradienten für jeden Verlust berechnet. Ich werde meine Antwort bearbeiten, um die Mathematik dafür zu zeigen.
Hugh
Interessant. Danke für die Klarstellung. Werden die Gewichtsgradienten, um ein bisschen tiefer zu graben, während des Vorwärtsdurchlaufs pro Beispiel berechnet und gespeichert oder werden sie während des Optimierungsprozesses im Tensorflow berechnet? Ich vermisse wohl nur "wo" sind diese Gradienten im Tensorflow? Ich sehe den Vorwärtsdurchlauf und den Verlust, also führt Tensorflow diese Gradientenberechnungen / Mittelung unter der Haube für mich durch?
Kohlenstoff berechnet
1
@carboncomputed Das ist der Reiz von Tensorflow, es verwendet symbolische Mathematik und kann die Differenzierung unter der Haube tun
Hugh
Vielen Dank für eine nette Antwort. Jedoch konnte ich verstehen , wie TF weiß , wie propagiert mit einem durchschnittlichen Verlust zu sichern , wie in gezeigt diesem Beispiel , code line 170?
Sünder
-1

Der Grund für die Verwendung von Mini-Batches besteht darin, dass ein gutes Trainingsbeispiel vorhanden ist, sodass das mögliche Rauschen durch Mittelung der Auswirkungen verringert wird. Es handelt sich jedoch auch nicht um einen vollständigen Batch, der für viele Datensätze eine große Menge an Speicherplatz erfordern könnte. Eine wichtige Tatsache ist, dass der Fehler, den Sie auswerten, immer eine Entfernung istzwischen Ihrer vorhergesagten Ausgabe und der tatsächlichen Ausgabe: Das bedeutet, dass es nicht negativ sein kann, sodass Sie, wie Sie sagten, keinen Fehler von 2 und -2 haben können, der sich aufhebt, sondern stattdessen zu einem Fehler von 4 wird Anschließend bewerten Sie den Gradienten des Fehlers in Bezug auf alle Gewichte, sodass Sie berechnen können, welche Änderung der Gewichte ihn am meisten reduzieren würde. Sobald Sie dies tun, machen Sie einen "Schritt" in diese Richtung, basierend auf der Größe Ihrer Lernrate Alpha. (Dies sind die Grundkonzepte. Ich werde nicht näher auf die Backpropagation für Deep NN eingehen.) Nachdem Sie dieses Training für eine bestimmte Anzahl von Epochen in Ihrem Datensatz ausgeführt haben, können Sie erwarten, dass Ihr Netzwerk konvergiert, wenn Ihr Lernschritt nicht zu groß ist lass es auseinander gehen. Sie könnten immer noch in einem lokalen Minimum endenDies kann vermieden werden, indem Sie Ihre Gewichte unterschiedlich initialisieren, verschiedene Optimierer verwenden und versuchen, sie zu regulieren.

dante
quelle
Nur um hinzuzufügen: Wir verwenden Mini-Batches hauptsächlich aus Gründen der Recheneffizienz. Wir haben einen Kompromiss zwischen der Genauigkeit des Abstiegs und der Häufigkeit der Aktualisierung der Gewichte. Daten müssen extrem groß sein, damit sie nicht in den Speicher passen.
Łukasz Grad
Ich verstehe jeden, aber wie aktualisieren wir unsere Gewichte für eine bestimmte Charge? Werden die Gewichtsverläufe auch für jedes Beispiel summiert?
Carboncomputed
Nein, es gibt nur einen Gradienten, der ein Vektor von Derivaten ist, über den gesamten Chargenfehler. Dies bedeutet, dass wir unsere Gewichte basierend auf dem Gradienten aktualisieren, dh die Aktualisierungsrichtung, durch die der Fehler bei dieser Mini-Charge am stärksten abnimmt. Der Gradient besteht aus partiellen Ableitungen, dh der Ableitung des Mini-Batch-Fehlers in Bezug auf jedes Gewicht: Dies sagt uns, ob und wie viel jedes Gewicht kleiner oder größer werden soll. Alle Gewichte erhalten eine Aktualisierung für die Charge, um den Fehler bei dieser Mini-Charge zu verringern, der von anderen Mini-Chargen unabhängig ist.
Dante