Wie berechne ich den Delta-Term einer Faltungsschicht unter Berücksichtigung der Delta-Terme und Gewichte der vorherigen Faltungsschicht?

10

Ich versuche, ein künstliches neuronales Netzwerk mit zwei Faltungsschichten (c1, c2) und zwei verborgenen Schichten (c1, c2) zu trainieren. Ich verwende den Standard-Backpropagation-Ansatz. Im Rückwärtsdurchlauf berechne ich den Fehlerterm einer Schicht (Delta) basierend auf dem Fehler der vorherigen Schicht, den Gewichten der vorherigen Schicht und dem Gradienten der Aktivierung in Bezug auf die Aktivierungsfunktion der aktuellen Schicht. Genauer gesagt sieht das Delta der Schicht l folgendermaßen aus:

delta(l) = (w(l+1)' * delta(l+1)) * grad_f_a(l)

Ich kann den Gradienten von c2 berechnen, der sich zu einer regulären Ebene verbindet. Ich multipliziere einfach die Gewichte von h1 mit seinem Delta. Dann forme ich diese Matrix in die Form der Ausgabe von c2 um, multipliziere sie mit dem Gradienten der Aktivierungsfunktion und bin fertig.

Jetzt habe ich den Delta-Term von c2 - Dies ist eine 4D-Matrix der Größe (featureMapSize, featureMapSize, filterNum, patternNum). Außerdem habe ich die Gewichte von c2, die eine 3D-Matrix der Größe sind (filterSize, filterSize, filterNum).

Mit diesen beiden Termen und dem Gradienten der Aktivierung von c1 möchte ich das Delta von c1 berechnen.

Um es kurz zu machen:

Wie berechne ich angesichts des Delta-Terms einer vorherigen Faltungsschicht und der Gewichte dieser Schicht den Delta-Term einer Faltungsschicht?

cdwoelk
quelle

Antworten:

6

Ich leite zunächst der Einfachheit halber den Fehler für eine Faltungsschicht unten für ein eindimensionales Array (Eingabe) ab, das dann leicht auf ein mehrdimensionales Array übertragen werden kann:

Wir nehmen hier an, dass die der Länge N die Eingaben der l - 1- ten Konv. Sind. Schicht, m ist die Kerngröße der Gewichte w, die jedes Gewicht mit w i bezeichnen, und die Ausgabe ist x l . Daher können wir schreiben (beachten Sie die Summation von Null): x l i = m - 1 a = 0 w a y l - 1 a + i wobei y l iyl- -1N.l- -1mwwichxl

xichl=ein=0m- -1weinyein+ichl- -1
und f die Aktivierungsfunktion (zB sigmoidal). Damit können wir nun einige Fehlerfunktionen E und die Fehlerfunktion auf der Faltungsschicht (die Ihrer vorherigen Schicht) betrachten, die durchE /y l i gegeben ist . Wir wollen nun die Abhängigkeit des Fehlers in einer der Gewichte der vorherigen Schicht (en) herausfinden: E.yichl=f(xichl)fE.E./.yichl wobei wir die Summe über alle Ausdrücke haben, in denenwavorkommt, dieN-m sind. Beachten Sie auch, dass wir wissen, dass der letzte Term aus der Tatsacheresultiert, dassx l i
E.wein=ein=0N.- -mE.xichlxichlwein=ein=0N.- -mE.weinyich+einl- -1

weinN.- -m was Sie aus der ersten Gleichung sehen können. Um den Gradienten zu berechnen, müssen wir den ersten Term kennen, der berechnet werden kann durch: E.xichlwein=yich+einl- -1
wobei der erste Term wiederum der Fehler in der vorherigen Schicht undfdie nichtlineare Aktivierungsfunktion ist.
E.xichl=E.yichlyichlxichl=E.yichlxichlf(xichl)
f

Mit allen notwendigen Entitäten können wir nun den Fehler berechnen und effizient zurück auf die wertvolle Schicht übertragen:

δeinl- -1=E.yichl- -1=ein=0m- -1E.xich- -einlxich- -einlyichl- -1=ein=0m- -1E.xich- -einlweinflichpped
xichlyichl- -1flichppedT.

Daher können Sie den Fehler in der nächsten Ebene einfach berechnen durch (jetzt in Vektornotation):

δl=(wl)T.δl+1f'(xl)

welches für eine Faltungs- und Unterabtastschicht wird:

δl=upseinmple((wl)T.δl+1)f'(xl)
bei dem die upseinmple Operation überträgt den Fehler durch die maximale Pooling-Schicht.

Bitte zögern Sie nicht, mich hinzuzufügen oder zu korrigieren!

Referenzen siehe:

http://ufldl.stanford.edu/tutorial/supervised/ConvolutionalNeuralNetwork/ http://andrew.gibiansky.com/blog/machine-learning/convolutional-neural-networks/

und für eine C ++ - Implementierung (ohne Installation): https://github.com/nyanp/tiny-cnn#supported-networks

LeoW.
quelle