Jak obliczyć wartość delta dla warstwy konwergentnej, biorąc pod uwagę warunki delta i wagi poprzedniej warstwy konwergentnej?

10

Próbuję trenować sztuczną sieć neuronową z dwiema warstwami splotowymi (c1, c2) i dwiema warstwami ukrytymi (c1, c2). Używam standardowego podejścia do propagacji wstecznej. W przejściu wstecznym obliczam wartość błędu warstwy (delta) na podstawie błędu poprzedniej warstwy, wag poprzedniej warstwy i gradientu aktywacji w odniesieniu do funkcji aktywacji bieżącej warstwy. Mówiąc dokładniej, delta warstwy l wygląda następująco:

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

Jestem w stanie obliczyć gradient c2, który łączy się ze zwykłą warstwą. Po prostu mnożę wagi h1 przez jego deltę. Następnie przekształcam tę macierz w postać wyjścia c2, mnożę ją przez gradient funkcji aktywacyjnej i gotowe.

Teraz mam delta c2 - która jest macierzą 4D wielkości (featureMapSize, featureMapSize, filterNum, patternNum). Ponadto mam wagi c2, które są matrycą 3D wielkości (filterSize, filterSize, filterNum).

Z tymi dwoma warunkami i gradientem aktywacji c1 chcę obliczyć deltę c1.

Krótko mówiąc:

Biorąc pod uwagę deltę poprzedniej warstwy splotowej i wagi tej warstwy, jak obliczyć deltę warstwy splotowej?

cdwoelk
źródło

Odpowiedzi:

6

Najpierw wyprowadzam błąd dla poniższej warstwy splotowej dla uproszczenia dla jednowymiarowej tablicy (danych wejściowych), którą można łatwo przenieść na wielowymiarowy:

Zakładamy tutaj, że yl1 długości N są wejściami l1-ty konw. warstwa,m jest wagą wielkości jądra w oznaczając każdą wagę przez wi i wynik jest xl.
Dlatego możemy napisać (zanotuj sumę od zera):

xil=a=0m1waya+il1
gdzie yil=f(xil) i ffunkcja aktywacji (np. sigmoidalna). Mając to pod ręką, możemy teraz rozważyć pewną funkcję błęduE oraz funkcja błędu w warstwie splotowej (tej z poprzedniej warstwy) podana przez E/yil. Chcemy teraz dowiedzieć się, jaka jest zależność błędu w jednym z wag poprzednich warstw:
Ewa=a=0NmExilxilwa=a=0NmEwayi+al1

gdzie mamy sumę nad wszystkimi wyrażeniami, w których wa występuje, które są Nm. Należy również pamiętać, że wiemy, że ostatni termin wynika z faktu, żexilwa=yi+al1co widać z pierwszego równania.
Aby obliczyć gradient, musimy znać pierwszy termin, który można obliczyć:
Exil=Eyilyilxil=Eyilxilf(xil)
gdzie znowu pierwszym terminem jest błąd w poprzedniej warstwie i f nieliniowa funkcja aktywacji.

Mając wszystkie niezbędne byty, jesteśmy w stanie obliczyć błąd i skutecznie propagować go z powrotem do cennej warstwy:

δal1=Eyil1=a=0m1Exialxialyil1=a=0m1Exialwaflipped
Pamiętaj, że ostatni krok można łatwo zrozumieć, zapisując xil-s wrt yil1-s. Theflipped odnosi się do transponowanej masy maxtrix (T).

Dlatego możesz po prostu obliczyć błąd w następnej warstwie przez (teraz w notacji wektorowej):

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

która staje się warstwą splotową i podpróbkowania:

δl=upsample((wl)Tδl+1)f(xl)
gdzie upsample Operacja propaguje błąd przez maksymalną warstwę puli.

Dodaj mnie lub popraw!

Odniesienia patrz:

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

i dla implementacji C ++ (bez konieczności instalacji): https://github.com/nyanp/tiny-cnn#supported-networks

LeoW.
źródło