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?
quelle
Antworten:
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 = m a x ( a , 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, und∂J.∂ein ∂J.∂b
Wenna > b
Lokal ist * . Alsom = a ∂J.∂ein= ∂J.∂m
Lokal hängt * nicht von . Alsom b ∂J.∂b= 0
Daher ist wenn , sonst∂J.∂ein= ∂J.∂m a > b ∂J.∂ein= 0
und wenn , sonst∂J.∂b= ∂J.∂m b > a ∂J.∂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.a = b
quelle
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_diff
anderer0*top_diff
.quelle