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?

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 yl−1 długości N są wejściami l−1-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=0m−1waya+il−1
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:
∂E∂wa=∑a=0N−m∂E∂xil∂xil∂wa=∑a=0N−m∂E∂wayi+al−1

gdzie mamy sumę nad wszystkimi wyrażeniami, w których wa występuje, które są N−m. Należy również pamiętać, że wiemy, że ostatni termin wynika z faktu, że∂xil∂wa=yi+al−1co widać z pierwszego równania.
Aby obliczyć gradient, musimy znać pierwszy termin, który można obliczyć:
∂E∂xil=∂E∂yil∂yil∂xil=∂E∂yil∂∂xilf(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:

δal−1=∂E∂yil−1=∑a=0m−1∂E∂xi−al∂xi−al∂yil−1=∑a=0m−1∂E∂xi−alwaflipped
Pamiętaj, że ostatni krok można łatwo zrozumieć, zapisując xil-s wrt yil−1-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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.