Gradient Backpropagation über ResNet-Skip-Verbindungen

22

Ich bin neugierig, wie Gradienten mithilfe von ResNet-Modulen / Überspringverbindungen über ein neuronales Netzwerk zurückgewonnen werden. Ich habe ein paar Fragen zu ResNet gesehen (z. B. Neuronales Netzwerk mit Sprungschichtverbindungen ), aber diese Frage bezieht sich speziell auf die Rückübertragung von Verläufen während des Trainings.

Die grundlegende Architektur ist hier:

Bildbeschreibung hier eingeben

Ich habe diesen Artikel gelesen, Studie über verbleibende Netzwerke zur Bilderkennung , und in Abschnitt 2 wird erläutert, wie eines der Ziele von ResNet darin besteht, einen kürzeren / klareren Pfad für die Rückübertragung des Gradienten auf die Basisschicht zu ermöglichen.

Kann jemand erklären, wie der Gradient durch diese Art von Netzwerk fließt? Ich verstehe nicht ganz, wie die Additionsoperation und das Fehlen einer parametrisierten Schicht nach der Addition eine bessere Gradientenausbreitung ermöglichen. Hat es etwas damit zu tun, wie sich der Verlauf beim Durchlaufen eines Additionsoperators nicht ändert und irgendwie ohne Multiplikation neu verteilt wird?

Außerdem kann ich nachvollziehen, wie sich das Problem mit dem verschwindenen Gradienten lindert, wenn der Gradient nicht durch die Gewichtsschichten fließen muss. Wenn jedoch kein Gradient durch die Gewichte fließt, wie werden sie nach dem Rückwärtsdurchlauf aktualisiert?

Simon
quelle
Nur eine idiotische Frage, warum wir x als Sprungverbindung übergeben und nicht invers (F (x)) berechnen, um x am Ende zu erhalten.
Yash Kumar Atri
Ich habe Ihren Standpunkt nicht verstanden the gradient doesn't need to flow through the weight layers, können Sie das erklären?
Anu

Antworten:

13

Add sendet den Farbverlauf gleichmäßig an beide Eingänge zurück. Sie können sich davon überzeugen, indem Sie im Tensorflow Folgendes ausführen:

import tensorflow as tf

graph = tf.Graph()
with graph.as_default():
    x1_tf = tf.Variable(1.5, name='x1')
    x2_tf = tf.Variable(3.5, name='x2')
    out_tf = x1_tf + x2_tf

    grads_tf = tf.gradients(ys=[out_tf], xs=[x1_tf, x2_tf])
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        fd = {
            out_tf: 10.0
        }
        print(sess.run(grads_tf, feed_dict=fd))

Ausgabe:

[1.0, 1.0]

Der Gradient wird also sein:

  • unverändert über die Sprungschicht-Verbindung an vorherige Schichten zurückgegeben und auch
  • an den Block mit Gewichten übergeben und zum Aktualisieren dieser Gewichte verwendet

Edit: es gibt eine Frage: "Was ist die Operation an dem Punkt, an dem die Autobahnverbindung und der neuronale Netzblock wieder zusammengefügt werden, am unteren Rand von Abbildung 2?"

Die Antwort lautet: Sie werden summiert. Dies können Sie der Formel in Abbildung 2 entnehmen:

outputF(x)+x

Was dies sagt ist, dass:

  • die Werte im Bus ( )x
  • werden zu den Ergebnissen der Weitergabe der Buswerte durch das Netzwerk hinzugefügt , dhF ( x )xF(x)
  • um die Ausgabe des Restblocks zu geben, den ich hier alsAusgabe

Bearbeiten 2:

Umschreiben in etwas anderen Worten:

  • In Vorwärtsrichtung fließen die Eingangsdaten über den Bus
    • An Punkten entlang des Busses können verbleibende Blöcke lernen, Werte zum Busvektor hinzuzufügen / daraus zu entfernen
  • in der Rückwärtsrichtung fließen die Steigungen den Bus hinunter
    • Auf dem Weg aktualisieren die Farbverläufe die verbleibenden Blöcke, an denen sie vorbeibewegen
    • Die verbleibenden Blöcke ändern die Farbverläufe ebenfalls geringfügig

Die verbleibenden Blöcke modifizieren die rückwärts fließenden Gradienten, aber es gibt keine "Quetsch" - oder "Aktivierungs" -Funktionen, durch die die Gradienten fließen. Die Funktionen "Squashing" / "Activation" verursachen das Problem des explodierenden / verschwindenden Gradienten. Indem wir diese aus dem Bus selbst entfernen, verringern wir dieses Problem erheblich.

Edit 3: Persönlich stelle ich mir ein resnet in meinem Kopf wie im folgenden Diagramm vor. Es ist topologisch identisch mit Abbildung 2, zeigt jedoch möglicherweise deutlicher, wie der Bus gerade durch das Netzwerk fließt, während die verbleibenden Blöcke nur auf die Werte tippen und einen kleinen Vektor zum Bus hinzufügen / daraus entfernen:

Bildbeschreibung hier eingeben

Hugh Perkins
quelle
1
Wenn der Gradient auch durch die Gewichtsblöcke geleitet wird (genau wie in regulären Netzwerken), woher kommt dann der resnet-Vorteil? Natürlich kann der Verlauf direkt zur Basis-Eingabe springen, aber wie erhöht sich die Leistung, wenn der andere Pfad noch wie gewohnt trainiert wird?
Simon
3
Aha. Ein Farbverlauf springt also direkt zurück zu x, der andere breitet sich durch die Gewichte zurück zu x aus. werden sie aufsummiert, wenn sie x erreichen, weil x in zwei Pfade aufgeteilt wurde? Wenn ja, ändert sich der Farbverlauf dann nicht immer noch, wenn er sich durch diese Ebenen zurückbewegt?
Simon
1
Die Farbverläufe fließen unverändert über den gesamten Stapel. Jeder Block trägt jedoch seine eigenen Gradientenänderungen in den Stapel ein, nachdem er seine Gewichtsaktualisierungen angewendet und seinen eigenen Satz von Gradienten generiert hat. Jeder Block hat sowohl Eingabe als auch Ausgabe, und Gradienten fließen aus der Eingabe zurück in die Gradienten- "Autobahn".
Hugh Perkins
1
@ RonakAgrawal fügte eine Bearbeitung hinzu, die die Summe aus Abbildung 2 zeigt und erklärt
Hugh Perkins
1
eine zweite Änderung hinzugefügt, die meine Erklärung ein wenig umformuliert :)
Hugh Perkins