CNN - Wie funktioniert die Backpropagation mit Gewichtsverteilung genau?


8

Betrachten Sie ein Convolutional Neural Network (CNN) für die Bildklassifizierung. Um lokale Merkmale zu erkennen, wird die Gewichtsverteilung zwischen Einheiten in derselben Faltungsschicht verwendet. In einem solchen Netzwerk werden die Kernelgewichte über den Backpropagation-Algorithmus aktualisiert.

Ein Update für das Kernelgewicht hj in Schicht l wäre wie folgt:

hjl=hjlηδRδhjl=hjlηδRδxjLδxjLδxjL1...δxjlδhjl

Wie können die Kernelgewichte aktualisiert werden und trotzdem gleich sein (= geteilt)?

Ich habe 2 mögliche Erklärungen:

  1. Die Gewichte derselben Ebene, die mit demselben Wert initialisiert werden, bleiben gleich (unabhängig von der Eingabe). Dies würde bedeuten, dass der AusdruckδRδhjl ist für alle diese Gewichte gleich h1l zu hJl. Das macht da keinen Sinnxjlist für verschiedene j unterschiedlich. Oder fehlt mir hier etwas?

  2. Es gibt einen Trick, z. B. nach dem Back-Propagation-Update werden die gemeinsamen Gewichte auf ihren Mittelwert gesetzt.

BEARBEITEN Die Verwirrung, die ich hatte, war, dass ich nicht berücksichtigt habe, dass, wenn ein Gewicht geteilt wird, sein Parameterhjlerscheint mehrmals in der Verlustfunktion. Bei der Differenzierung fürhjlwerden mehrere Begriffe (unter Berücksichtigung der entsprechenden Eingaben) "überleben". Daher sind die Updates gleich.

Antworten:


7

Ich denke, Sie verstehen falsch, was "Gewichtsverteilung" hier bedeutet. Eine Faltungsschicht besteht im Allgemeinen aus vielen "Filtern", die üblicherweise 2 × 2 oder 3 × 3 sind. Diese Filter werden in einem "Schiebefenster" auf die Eingabe der gesamten Ebene angewendet. Die "Gewichtsverteilung" verwendet feste Gewichte für diesen Filter über die gesamte Eingabe. Dies bedeutet nicht, dass alle Filter gleichwertig sind.

Stellen wir uns konkret einen 2x2-Filter vor F Schritt 3x3 Eingang Xmit Polsterung, so dass der Filter 4 Mal angewendet wird. Bezeichnen wir den ungerollten Filterβ.

X=[x11x12x13x21x22x23x31x32x33]

F=[w11w12w21w22]

β=[w11,w12,w21,w22]

FX=[β[x11,x12,x21,x22]β[x12,x13,x22,x23]β[x21,x22,x31,x32]β[x22,x23,x32,x33]]

"Gewichtsverteilung" bedeutet, dass wir beim Anwenden dieses 2x2-Filters auf unseren 3x3-Eingang dieselben vier vom Filter angegebenen Gewichte für den gesamten Eingang wiederverwenden. Die Alternative wäre, dass jede Filteranwendung ihren eigenen Satz von Eingaben hat (was wirklich ein separater Filter für jeden Bereich des Bildes wäre), was insgesamt 16 Gewichte ergibt, oder eine dichte Schicht mit 4 Knoten, die 36 Gewichte ergeben.

Das Teilen von Gewichten auf diese Weise reduziert die Anzahl der zu lernenden Gewichte erheblich, was das Erlernen sehr tiefer Architekturen erleichtert, und ermöglicht es uns außerdem, Funktionen zu lernen, die unabhängig davon sind, welcher Bereich der Eingabe berücksichtigt wird.

BEARBEITEN: Um dies weiter zu motivieren, finden Sie hier eine Animation eines 3x3-Filters, der auf einen 5x5-Eingang angewendet wird

Geben Sie hier die Bildbeschreibung ein


1
Vielen Dank, ich kann es jetzt auf eine einfachere Frage reduzieren: Werden die Gewichte durch dargestellt? βdurch Rückausbreitung gelernt?
Andi R

Jep! Sie sind sicher.
David Marx

1
Wie kann βgelernt werden und über die gesamte Eingabe hinweg gleich sein (dh geteilt werden)? Da der Back-Propagation-Algorithmus auch die Eingabe für 2 verschiedene Eingaben berücksichtigt, wird dieβsollte anders aktualisiert werden.
Andi R

1
Die partiellen Ableitungen in der Gewichtsaktualisierung werden relativ zu den Gewichten berechnet (β), nicht die Eingabe. Es ist wirklich nicht anders als Backprop in einem MLP.
David Marx

Ich stimme David hier zu, Sie verwechseln Eingabe mit Gewichten Faltungen sind einfache Operationen, bei denen ein Kernel wie oben gezeigt auf ein Eingabebild angewendet wird und die Kernelgewichte mithilfe von Backprop so aktualisiert werden, dass sie die Verlustfunktion minimieren. Der erste Verlust wird anhand berechnet Ihre Aktivierung * Änderungsrate der Aktivität in Bezug auf die gewichtete Summe der Eingaben * Änderungsrate der gewichteten Summe der Eingaben in Bezug auf die Änderungsrate der Gewichte (Kernelgewichte hier).
Khwaja Wisal

6

Ich bin mir nicht sicher, ob Sie akzeptierte Antworten ändern können, aber da die einzige Antwort auf Ihre Frage zur Rückübertragung die Vorwärtsausbreitung ist, habe ich beschlossen, es auszuprobieren.

Im Wesentlichen behandeln Sie das Gewichtsdelta (δRδhjl) das gleiche wie ein Gewichtsdelta für ein lineares Neuron, aber trainieren Sie es einmal für jedes Mal, wenn Sie Ihren Filter (Kernel) über den Eingang legen, alles in einem einzigen Backprop-Durchgang. Das Ergebnis ist die Summe der Deltas für alle Überlagerungen Ihres Filters. Ich denke in Ihrer Notation wäre diesδRδhjl=i=1nxil1δRδxjl+1 wo xl1 ist eine Eingabe, die mit multipliziert wurde hjl für eine Ihrer Überlagerungen während der Vorwärtsausbreitung und xl+1 ist die Ausgabe, die sich aus dieser Überlagerung ergibt.

Zwischen den beiden Ergebnissen von Backprop durch eine Faltungsschicht (Parameterdeltas und Eingabedeltas) scheint es, als wären Sie mehr an Parameterdeltas interessiert, genauer gesagt an den Gewichtsmatrixdeltas (δRδhjl). Der Vollständigkeit halber werde ich beide mit der folgenden Beispielebene behandeln:

Wenn Sie einen 1D-Satz von Eingängen haben [1,2,3]und ein Filter [0.3,0.5] Wenn dies mit Schritt 1, ohne Auffüllen, ohne Vorspannung und ohne Aktivierungsfunktion angewendet wird, hätte die Aktivierung Ihres Filters so ausgesehen [10.3+20.5,20.3+30.5]=[1.3,2.1]. Wenn Sie auf Ihrem Backprop-Pass durch diese Ebene zurückkehren, sagen wir, die Aktivierungsdeltas, die Sie für Ihre Berechnungen verwenden, sind[0.1,0.2].

Gewichtsdeltas:

Als Sie im Vorwärtspass durchgekommen sind, haben Sie Ihre Eingaben zwischengespeichert [1,2,3]Nennen wir das A_prev, da es wahrscheinlich die Aktivierung Ihrer vorherigen Ebene ist. Nehmen Sie für jede mögliche Überlagerung Ihres Filters (in diesem Fall können Sie sie nur an zwei Stellen [ 1,2 , 3] und [1, 2,3 ] auf die Eingabe legen) diese Scheibe der Eingabe A_slice und multiplizieren Sie sie jeweils Element durch das zugehörige Ausgangsdelta dZ, und addieren Sie es für diesen Durchgang zu Ihrem Gewichtsdelta dW. In diesem Beispiel würden Sie hinzufügen[10.1,20.1] für die erste Überlagerung auf dW, dann hinzufügen [20.2,30.2]für die zweite Überlagerung. Alles in allem ist Ihr dW für diese Faltungsschicht auf diesem Backprop-Pass[0.3,0.4].

Bias Deltas:

Wie bei Gewichtsdeltas, aber addieren Sie einfach Ihr Ausgabedelta, ohne mit der Eingabematrix zu multiplizieren.

Eingabedeltas:

Rekonstruieren Sie die Form der Eingabe für diese Ebene, nennen Sie sie dA_prev, initialisieren Sie sie mit Nullen und gehen Sie die Konfigurationen durch, in denen Sie Ihren Filter der Eingabe überlagert haben. Multiplizieren Sie für jede Überlagerung Ihre Gewichtsmatrix mit dem dieser Überlagerung zugeordneten Ausgabedelta und addieren Sie dies zu dem dieser Überlagerung zugeordneten Slice von dA_prev. Das heißt, Overlay 1 wird hinzugefügt[0.30.1,0.50.1]=[0.03,0.05] zu dA_prev resultierend in [0.03,0.05,0], dann wird Overlay 2 hinzugefügt [0.30.2,0.50.2]=[0.06,0.1], ergebend [0.03,0.01,0.1] für dA_prev.

Dies ist eine ziemlich gute Quelle, wenn Sie dieselbe Antwort in verschiedenen Begriffen lesen möchten: Link


Danke, dies beantwortet tatsächlich die ursprüngliche Frage ...
Yan King Yin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.