Wie funktioniert die Backpropagation über die Max-Pooling-Ebene, wenn ein Stapel ausgeführt wird?


10

Nehmen wir an, wir verwenden eine Stapelgröße von 100 Proben zum Lernen.

In jeder Charge wird also das Gewicht jedes Neurons (und der Verzerrung usw.) aktualisiert, indem das Minus der Lernrate * der durchschnittliche Fehlerwert, den wir unter Verwendung der 100 Stichproben * gefunden haben, die Ableitung der Fehlerfunktion in Bezug auf addiert wird das aktuelle Neuronengewicht, das aktualisiert wird.

Wenn wir nun eine Max-Pool-Ebene verwenden, wie können wir die Ableitung über diese Ebene berechnen? In jedem Sample, das wir vorwärts speisen, wird ein anderes Pixel (sagen wir) als Maximum ausgewählt. Wenn wir also über 100 Samples zurückpropagieren, in denen jedes Mal ein anderer Pfad ausgewählt wurde, wie können wir das tun? Eine Lösung, an die ich denke, besteht darin, sich an jedes Pixel zu erinnern, das als Maximum ausgewählt wurde, und dann möglicherweise die Ableitung auf alle Maximalpixel aufzuteilen. Wird das getan?


Ich habe die gleiche Frage. Wenn BP mit nur einer Stichprobe ist, ist klar, dass nur die Ableitung des größten Elements nicht Null ist. Wenn BP mit Stichproben im Batch eine andere Stichprobe zu einer unterschiedlichen Position des größten Elements führen kann, können wir einfach die durchschnittliche Ableitung jedes Parameters wie gewohnt berechnen (nur ∂L / ∂wi jeder Probe hinzufügen und durch die Chargengröße dividieren)?
Shaotao Li

Antworten:


8

Wenn ein neuronales Netzwerk einen Stapel verarbeitet, werden alle Aktivierungswerte für jede Schicht für jedes Beispiel berechnet (möglicherweise parallel pro Beispiel, wenn Bibliothek und Hardware dies unterstützen). Diese Werte werden für eine mögliche spätere Verwendung gespeichert - dh ein Wert pro Aktivierung pro Beispiel im Stapel, sie werden in keiner Weise aggregiert

Während der Rückausbreitung werden diese Aktivierungswerte als eine der numerischen Quellen zur Berechnung von Gradienten verwendet, zusammen mit den bisher berechneten Gradienten, die rückwärts arbeiten, und den Verbindungsgewichten. Wie bei der Vorwärtsausbreitung wird die Rückausbreitung pro Beispiel angewendet, sie funktioniert nicht mit gemittelten oder summierten Werten. Erst wenn alle Beispiele verarbeitet wurden, arbeiten Sie mit den summierten oder gemittelten Verläufen für den Stapel.

Dies gilt gleichermaßen für maximale Poolschichten. Sie wissen nicht nur, wie die Ausgabe der Pooling-Ebene für jedes Beispiel im Stapel war, sondern können auch die vorhergehende Ebene anzeigen und bestimmen, welche Eingabe in den Pool die maximale war.

Mathematisch und ohne die Notwendigkeit, Indizes für NN-Schichten und Neuronen zu definieren, kann die Regel so ausgedrückt werden

  • Die Vorwärtsfunktion istm=meinx(ein,b)

  • Wir kennen für eine Zielfunktion J (im neuronalen Netzwerk ist dies die Verlustfunktion, die wir minimieren möchten, und wir gehen davon aus, dass wir bereits bis zu diesem Punkt zurückpropagiert haben).J.m

  • Wir wollen wissen, undJ.einJ.b

  • Wennein>b

    • Lokal ist * . Alsom=einJ.ein=J.m

    • Lokal hängt * nicht von . AlsombJ.b=0

  • Daher ist wenn , sonstJ.ein=J.mein>bJ.ein=0

  • und wenn , sonstJ.b=J.mb>einJ.b=0

Wenn die Rückausbreitung über eine maximale Pooling-Ebene erfolgt, wird der Gradient pro Beispiel verarbeitet und nur der Eingabe der vorherigen Ebene zugewiesen, die das Maximum war. Andere Eingänge erhalten einen Gradienten von Null. Wenn dies gestapelt ist, ist es nicht anders, es wird nur pro Beispiel verarbeitet, möglicherweise parallel. Über einen ganzen Stapel hinweg kann dies bedeuten, dass mehr als eine, möglicherweise alle Eingabeaktivierungen für den maximalen Pool einen Teil des Gradienten erhalten - jeweils aus einer anderen Teilmenge von Beispielen im Stapel.


* Lokal -> wenn nur infinitesimale Änderungen an .m

** Technisch gesehen haben wir , wenn genau ist, eine Diskontinuität, aber in der Praxis können wir dies beim Training eines neuronalen Netzwerks ohne Probleme ignorieren.ein=b


3
Ich bin mir nicht sicher, ob ich dich verstehe. Was Sie sagen, funktioniert, wenn Sie nach einer einzelnen Vorwärtsstütze Backprop machen. Wenn Sie jedoch eine Charge haben, stützen Sie 100 Proben, um eine durchschnittliche Fehlerfunktion zu berechnen. Der springende Punkt eines Stapels ist es, genauere Gradienten erzeugen zu können, und dann machen Sie nur einmal den Backprop basierend auf der Ableitung der Fehlerfunktion in Bezug auf W bei dem gefundenen durchschnittlichen Fehlerwert multipliziert mit der Lernrate. Es ist also immer noch nicht klar, wie Sie die Ableitung der Max-Funktion berechnen, wenn jedes Mal ein anderer Knoten als Maximum ausgewählt wurde. Was vermisse ich?
Nadav B

4
@ NadavB: Ihnen fehlt die Reihenfolge der Ereignisse. 1) Die Charge wird Artikel für Artikel vorwärts berechnet. 2) Die Charge wird Artikel für Artikel zurückpropagiert. 3) Nehmen Sie die Mittelwerte für Steigungen. 4) Wenden Sie einen Gradientenabstiegsschritt an (möglicherweise geändert durch etwas wie Adagrad oder RMSProp). Sie verschieben also Schritt 3 aus der Reihenfolge und fragen sich, wie Sie die durchschnittlichen Gradienten über der maximalen Poolebene entfernen können - aber Sie müssen dies nie tun, da Sie jedes Beispiel einzeln zurücksetzen - Sie aggregieren nur die Ergebnisse für den Stapel danach
Neil Slater

1
Perfekt. Du hast es jetzt klar gemacht.
Nadav B

@NeilSlater Wird die Backpropagation nur Punkt für Punkt durchgeführt, weil sie für die maximale Poolschicht erforderlich ist? In einem MLP wird zuerst der Fehler des gesamten Stapels gemittelt und dann der Gradient anhand dieses durchschnittlichen Fehlers berechnet. Dies ist identisch mit der Berechnung des Gradienten pro Element und dem anschließenden Anpassen der Parameter um die durchschnittliche Lernrate Gradient *, oder? Das Zurückpropagieren des durchschnittlichen Fehlers ist jedoch viel schneller als das Zurückpropagieren aller einzelnen Fehler und das anschließende Anwenden der Aktualisierungen. Wenn möglich, möchten Sie dies so und nur bei Bedarf pro Artikel tun ... wie bei max pool. Ist das richtig?
Lo Tolmencre

@lotolmencre Sie sind falsch bei der Berechnung des durchschnittlichen Fehlers für einen Stapel. Sie sollten sich einzeln zurückbreiten und am Ende die Gradienten summieren. Die Gradientenberechnungen funktionieren ansonsten aufgrund von Nichtlinearitäten nicht korrekt. Wenn Sie mehr darüber wissen möchten, stellen Sie bitte eine neue Frage
Neil Slater

2

Ich habe die gleiche Frage, aber ich finde es wahrscheinlich heraus, indem ich den Quellcode von Caffe überprüfe.

Bitte beachten Sie den Quellcode von Caffe:

Zeile 620 & 631 dieses Codes.

Es berechnet die Ableitung jedes Parameters, indem es die Ableitung (dieses Parameters) jeder Eingabe addiert und dann durch die Stapelgröße dividiert.

Siehe auch Zeile 137 dieses Codes. Die Skalierung wird einfach auf 1 / iter_size skaliert, genau wie der Durchschnitt.

Wir können sehen, dass es bei BP KEINE spezielle Behandlung für die Max Pooling-Schicht gibt.

In Bezug auf die Ableitung von Max Pooling sehen wir uns noch einmal den Quellcode von Caffe an:

Zeile 272 dieses Codes. Offensichtlich ist nur die Ableitung des größten Elements die Ableitung 1*top_diffanderer 0*top_diff.

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.