Wie genau verwenden Faltungsneuralnetze die Faltung anstelle der Matrixmultiplikation?

13

Ich habe Yoshua Bengios Buch über tiefes Lernen gelesen und auf Seite 224 steht:

Faltungsnetzwerke sind einfach neuronale Netzwerke, die Faltung anstelle der allgemeinen Matrixmultiplikation in mindestens einer ihrer Schichten verwenden.

Ich war mir jedoch nicht hundertprozentig sicher, wie man "Matrixmultiplikation durch Faltung ersetzen" kann.

Was mich wirklich interessiert, ist, dies für Eingabevektoren in 1D zu definieren (wie in ), damit ich keine Eingaben als Bilder habe und versuche, die Faltung in 2D zu vermeiden.xRd

So können zum Beispiel in "normalen" neuronalen Netzen die Operationen und das Feed-Ward-Muster genau wie in Andrew Ngs Notizen ausgedrückt werden:

W(l)a(l)=z(l+1)
f(z(l+1))=a(l+1)

Dabei ist der Vektor, der berechnet wurde, bevor er die Nichtlinearität durchlaufen hat . Die Nichtlinearität wirkt pero entry auf den Vektor und ist die Ausgabe / Aktivierung von versteckten Einheiten für die betreffende Ebene.z(l)fz(l)a(l+1)

Diese Berechnung ist für mich klar, da die Matrixmultiplikation für mich klar definiert ist. Es erscheint mir jedoch unklar, nur die Matrixmultiplikation durch Faltung zu ersetzen. dh

f ( z ( l + 1 ) ) = a ( l + 1 )

W(l)a(l)=z(l+1)
f(z(l+1))=a(l+1)

Ich möchte sicherstellen, dass ich die obige Gleichung mathematisch genau verstehe.

Das erste Problem, das ich habe, wenn ich nur die Matrixmultiplikation durch Faltung ersetze, ist, dass man normalerweise eine Zeile von mit einem Skalarprodukt identifiziert . Man weiß also genau, wie sich das ganze auf die Gewichte bezieht, und das entspricht einem Vektor der durch angegebenen Dimension . Wenn man es jedoch durch Faltungen ersetzt, ist mir nicht klar, welche Zeile oder Gewichtung welchen Einträgen in . Es ist mir nicht einmal klar, dass es Sinn macht, die Gewichte tatsächlich als Matrix darzustellen (ich werde später ein Beispiel geben, um diesen Punkt zu erläutern). a ( l ) , z ( l + 1 ) , W ( l ) a ( l )W(l)a(l)z(l+1)W(l)a(l)

Wenn die Ein- und Ausgänge alle in 1D sind, berechnet man dann einfach die Faltung gemäß ihrer Definition und leitet sie dann durch eine Singularität?

Wenn wir zum Beispiel den folgenden Vektor als Eingabe hätten:

x=[1,2,3,4]

und wir hatten die folgenden Gewichte (vielleicht haben wir es mit Backprop gelernt):

W=[5,6,7]

dann ist die Faltung:

xW=[5,16,34,52,45,28]

Wäre es richtig, nur die Nichtlinearität durchzuleiten und das Ergebnis als verborgene Ebene / Darstellung zu behandeln ( für den Moment kein Pooling annehmen )? dh wie folgt:

f(xW)=f([5,16,34,52,45,28])=[f(5),f(16),f(34),f(52),f(45),f(28)])

(Das Stanford UDLF Tutorial, ich denke, schneidet die Kanten, wo die Faltung mit Nullen konvoviert, aus irgendeinem Grund, müssen wir das schneiden?)

Sollte es so funktionieren? Zumindest für einen Eingabevektor in 1D? Ist das kein Vektor mehr?W

Ich habe sogar ein neuronales Netzwerk gezeichnet, wie das aussehen soll, denke ich:

Bildbeschreibung hier eingeben

Charlie Parker
quelle

Antworten:

3

Es hört sich für mich so an, als wären Sie auf dem richtigen Weg, aber vielleicht kann ich helfen, es zu klären.

Einzelausgang

Stellen wir uns eine herkömmliche neuronale Netzwerkschicht mit n Eingabeeinheiten und 1 Ausgabe vor (nehmen wir auch keine Verzerrung an). Diese Schicht hat einen Vektor von Gewichten , der mit verschiedenen Methoden (Backprop, genetische Algorithmen usw.) gelernt werden kann, aber wir werden das Lernen ignorieren und uns nur auf die Vorwärtsausbreitung konzentrieren.wRn

Die Schicht nimmt eine Eingabe xRn und bildet sie auf eine Aktivierung aR indem sie das Punktprodukt von x mit berechnet wund dann eine Nichtlinearität anwendet σ:

a=σ(xw)

Hier geben die Elemente von , wie viel die entsprechenden Elemente von x zu gewichten sind , um die Gesamtaktivierung der Ausgabeeinheit zu berechnen. Man könnte sich dies sogar als "Faltung" vorstellen, bei der das Eingangssignal (wx ) die gleiche Länge wie das Filter () hat.xw

In einer Faltungsumgebung gibt es in mehr Werte als in ; Nehmen wir nun unsere Eingabe für . Wir können die Aktivierung der Ausgabeeinheit in dieser Einstellung berechnen, indem wir das Skalarprodukt von berechnenw x R m m > n w x a 1xwxRmm>nw mit zusammenhängenden Teilmengen von :x

a1=σ(x1:nw)a2=σ(x2:n+1w)a3=σ(x3:n+2w)amn+1=σ(xmn+1:mw)

(Hier wiederhole ich die ärgerliche Verwechslung zwischen Kreuzkorrelation und Faltung, die viele Autoren von neuronalen Netzen machen. Wenn wir diese richtigen Faltungen machen würden, würden wir die Elemente von umdrehen . Ich nehme auch eine "gültige" an. Faltung, die nur berechnete Elemente beibehält, bei denen sich das Eingangssignal und das Filter vollständig überlappen, dh ohne Auffüllung.)w

Sie haben dies bereits in Ihre Frage aufgenommen, aber ich versuche, die Verbindung mit den Schichten des Vanille-Neuronalen Netzwerks zu durchlaufen, indem ich das Skalarprodukt verwende, um darauf hinzuweisen. Der Hauptunterschied zu Vanille-Netzwerkschichten besteht darin, dass eine Faltung die Ausgabe der Netzwerkschicht in einen Vektor verwandelt, wenn der Eingabevektor länger als der Gewichtsvektor ist - in Faltungsnetzwerken sind es die Vektoren ganz nach unten! Dieser Ausgabevektor wird als "Feature-Map" für die Ausgabeeinheit in dieser Schicht bezeichnet.

Mehrere Ausgänge

Ok, stellen wir uns vor, wir fügen unserer Netzwerkebene eine neue Ausgabe hinzu, so dass sie Eingaben und 2 Ausgaben hat. Es wird einen Vektor für die erste Ausgabe und einen Vektor für die zweite Ausgabe geben. (Ich verwende hochgestellte Zeichen, um Ebenenausgaben zu kennzeichnen.)nw1Rnw2Rn

Für eine Vanilleschicht werden diese normalerweise zu einer Matrix gestapelt, wobei die einzelnen Gewichtsvektoren die Spalten der Matrix sind. Wenn wir dann die Ausgabe dieser Schicht berechnen, berechnen wir oder in kürzerer MatrixnotationW=[w1w2]

a1=σ(xw1)a2=σ(xw2)
a=[a1a2]=σ(xW)
wobei die Nichtlinearität elementweise angewendet wird.

Im Faltungsfall sind die Ausgaben unserer Schicht immer noch denselben Parametervektoren und . Genau wie im Fall der Einzelausgabe generiert die Faltungsschicht für jede vektorwerte Ausgaben, daher gibt es und (wieder unter der Annahme "gültiger" Windungen). Diese Filtermaps, eine für jede Ebenenausgabe, werden gemeinsam zu einer Matrix gestapelt .w1w2a1=[a11a21amn+11]a2=[a12a22amn+12]A=[a1a2]

Wenn Sie es sich vorstellen, können Sie sich die Eingabe im Faltungsfall auch als Matrix vorstellen, die nur eine Spalte enthält ("einen Eingabekanal"). Wir könnten also die Transformation für diese Schicht als schreiben, wobei die "Faltung" tatsächlich eine Kreuzkorrelation ist und nur entlang der Spalten von und .

A=σ(XW)
XW

Diese Notations-Shortcuts sind eigentlich sehr hilfreich, da jetzt leicht zu erkennen ist, dass wir eine weitere Spalte mit Gewichten hinzufügen, um der Ebene eine weitere Ausgabe hinzuzufügen .W

Hoffentlich ist das hilfreich!

lmjohns3
quelle
1

Eine Faltungsschicht ist eine strikte Teilmenge eines vollständig verbundenen Netzwerks, dh eine Matrixmultiplikation. Eine Faltungsschicht im Vorwärtsdurchlauf entspricht tatsächlich einer Matrixmultiplikation, wobei:

  • Einige Gewichte sind gebunden / geteilt
  • Einige Gewichte sind Null

Im Rückwärtsdurchlauf werden die Gewichte entsprechend den Gewichten aktualisiert, die wie viel zum Vorwärtsdurchlauf beigetragen haben. dh die Gewichte, die Null waren, sind immer noch Null. Die Gewichte, die über mehrere Ausgaben hinweg verknüpft wurden, erhalten einen Gradienten von allen diesen Ausgaben (wobei die Gradienten summiert werden, um die endgültige Gradientenaktualisierung für dieses Gewicht zu erzeugen).

Hugh Perkins
quelle
0

Nein, so soll es nicht funktionieren. Bei der Faltungsoperation wird der Eingang immer kleiner (bei Filtern mit einer Größe> 1) und nicht größer als in Ihrem Beispiel.

Es ist einfach eine elementweise Multiplikation. Wenn die ersten drei Elemente der Eingabe gefaltet werden, ist die Ausgabe . ( Ein Beispiel finden Sie unter deeplearning.stanford.edu )15+26+37=38

pir
quelle
N+n1Nn+1
Die in dieser Webseite verwendete Faltung ist nicht die Definition der mathematischen Faltung.
Charlie Parker
1
nnn1
1
Ich sehe, ich denke, das macht Sinn, jetzt, wo ich es nachgeschlagen habe. Es gibt jedoch einen kleinen Fehler. Die Eingabe macht es nicht immer kleiner, ich bin mir der unterschiedlichen Art von Windungen jetzt bewusst und selbst in der CNN gibt es laut Yoshua Bengios Buch drei Arten von Windungen (voll, gültig, gleich) iro.umontreal.ca/ ~ bengioy / dlbook . Ich verstehe sie nicht im Detail, aber zumindest bin ich mir ihrer bewusst! Vielen Dank, Felbo. Die Visionsgemeinschaft sollte nicht das Wort Konvolutionen verwenden, es ist verwirrend und irritierend. Trotzdem danke.
Charlie Parker
1
@CharlieParker Die Conv-Funktion in Matlab hat die gleichen 3 Arten von "Formen" (voll, gültig, gleich). Matlab ist standardmäßig "voll" - siehe docs unter mathworks.com/help/matlab/ref/conv.html . Eine Faltung ohne Umdrehen des Kernels ist also eine Kreuzkorrelation xcorr(x, y) = conv(x, fliplr(y)). Die NN-Community neigt dazu, Faltung zu sagen, wenn sie tatsächlich eine Kreuzkorrelation durchführt, aber es ist ziemlich ähnlich.
lmjohns3