Jak dokładnie splotowe sieci neuronowe używają splotu zamiast mnożenia macierzy?

13

Czytałem książkę Yoshua Bengio o głębokim uczeniu się i na stronie 224 napisano:

Sieci splotowe to po prostu sieci neuronowe, które używają splotu zamiast ogólnego mnożenia macierzy w co najmniej jednej z ich warstw.

nie byłem jednak w 100% pewien, jak „zastąpić mnożenie macierzy splotem” w matematycznie precyzyjnym sensie.

To, co naprawdę mnie interesuje, to zdefiniowanie tego dla wektorów wejściowych w 1D (jak w ), więc nie będę mieć danych wejściowych jako obrazów i staram się unikać splotu w 2D.xRd

Na przykład w „normalnych” sieciach neuronowych operacje i wzór totemów żywieniowych można zwięźle wyrazić, jak w notatkach Andrew Ng:

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

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

gdzie jest wektorem obliczonym przed przepuszczeniem go przez nieliniowość . Nieliniowość działa na wejście wektora a jest wyjściem / aktywacją ukrytych jednostek dla danej warstwy. f z ( l ) a ( l + 1 )z(l)fz(l)a(l+1)

To obliczenie jest dla mnie jasne, ponieważ mnożenie macierzy jest dla mnie jasno określone, jednak samo zastąpienie mnożenia macierzy przez splot wydaje mi się niejasne. to znaczy

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

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

Chcę się upewnić, że dokładnie rozumiem powyższe równanie matematycznie.

Pierwszym problemem, jaki mam po prostu zastępując mnożenie macierzy splotem, jest to, że zwykle jeden wiersz jest iloczynem kropkowym. Tak więc wyraźnie wiadomo, jak całość odnosi się do wag, a to odwzorowuje na wektor wymiaru, jak wskazano przez . Kiedy jednak zamienia się go na zwoje, nie jest dla mnie jasne, który wiersz lub wagi odpowiada, które wpisy w . Nie jest nawet dla mnie jasne, czy sensowne jest już przedstawianie wag jako macierzy (podam przykład, aby wyjaśnić ten punkt później) a ( l ) z ( l + 1 ) W ( l ) a ( l )W(l)a(l)z(l+1)W(l)a(l)

W przypadku, gdy wszystkie wejścia i wyjścia są w 1D, czy po prostu oblicza się splot zgodnie z jego definicją, a następnie przepuszcza go przez osobliwość?

Na przykład, jeśli jako dane wejściowe mieliśmy następujący wektor:

x=[1,2,3,4]

i mieliśmy następujące wagi (być może nauczyliśmy się tego z backprop):

W=[5,6,7]

to splot jest:

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

czy poprawne byłoby po prostu przejście przez nieliniowość i potraktowanie wyniku jako ukrytej warstwy / reprezentacji (zakładając, że na chwilę obecną nie ma puli )? tj. w następujący sposób:

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

( myślę, że samouczek UDLF Stanforda przycina krawędzie, w których splot konwertuje się z zer z jakiegoś powodu, czy musimy to przycinać?)

Czy tak to powinno działać? Przynajmniej dla wektora wejściowego w 1D? Czy nie jest już wektorem?W

Narysowałem nawet sieć neuronową, jak to ma wyglądać, jak sądzę:

wprowadź opis zdjęcia tutaj

Charlie Parker
źródło

Odpowiedzi:

3

Wydaje mi się, że jesteś na dobrej drodze, ale może pomogę ci to wyjaśnić.

Pojedyncze wyjście

Wyobraźmy sobie tradycyjną warstwę sieci neuronowej z jednostkami wejściowymi i 1 wyjściem (załóżmy też, że nie ma stronniczości). Ta warstwa ma wektor wag którego można nauczyć się przy użyciu różnych metod (backprop, algorytmy genetyczne itp.), Ale zignorujemy uczenie się i skupimy się na propagacji do przodu.w R nnwRn

Warstwa przyjmuje dane wejściowe i mapuje je na aktywację , obliczając iloczyn iloczynu pomocą a następnie stosując nieliniowość :xRnaRxwσ

a=σ(xw)

Tutaj elementy określają, ile ważyć odpowiednie elementy aby obliczyć całkowitą aktywację jednostki wyjściowej. Można nawet pomyśleć o tym jak o „splotie”, w którym sygnał wejściowy ( ) ma taką samą długość jak filtr ( ).wxxw

W splotowego ustawienia istnieje więcej wartości w niż w ; załóżmy, że teraz nasze wejście dla . Możemy obliczyć aktywację jednostki wyjściowej w tym ustawieniu, obliczając iloczyn iloczynu przy ciągłych podzbiorach :xwxRmm>nwx

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

(W tym miejscu powtarzam to irytujące zamieszanie między korelacją krzyżową a splotem, które wielu autorów sieci neuronowych robi; jeśli mielibyśmy dokonać tych właściwych zwojów, zmienilibyśmy elementy . Zakładam również „prawidłowy” splot, który zachowuje tylko elementy obliczone, w których sygnał wejściowy i filtr zachodzą na siebie całkowicie, tj. bez wypełnienia).w

W zasadzie już umieściłeś to w swoim pytaniu, ale staram się przejść przez połączenie z waniliowymi warstwami sieci neuronowej, używając produktu kropkowego, aby zwrócić uwagę. Główną różnicą w przypadku waniliowych warstw sieciowych jest to, że jeśli wektor wejściowy jest dłuższy niż wektor wagowy, splot przekształca wynik warstwy sieciowej w wektor - w sieciach splotowych wektory są całkowicie w dół! Ten wektor wyjściowy nazywany jest „mapą funkcji” dla jednostki wyjściowej w tej warstwie.

Wiele wyjść

Ok, wyobraźmy sobie, że dodajemy nowe wyjście do naszej warstwy sieci, aby miało wejść i 2 wyjścia. Będzie wektor dla pierwszego wyjścia, a wektor dla drugiego wyjścia. (Używam indeksów górnych do oznaczenia wyników warstw).nw1Rnw2Rn

W przypadku warstwy waniliowej są one zwykle układane w stosy razem w macierzy gdzie poszczególne wektory ciężaru są kolumnami macierzy. Następnie, obliczając wynik tej warstwy, obliczamy lub w krótszym zapisie macierzowym, gdzie nieliniowość jest stosowana elementarnie.W=[w1w2]

a1=σ(xw1)a2=σ(xw2)
a=[a1a2]=σ(xW)

W przypadku splotowym wyjścia naszej warstwy są nadal powiązane z tymi samymi wektorami parametrów i . Podobnie jak w przypadku pojedynczego wyjścia, warstwa splotu generuje wartości wyjściowe o wartościach wektorowych dla każdego wyjścia warstwy, więc istnieje i (ponownie przy założeniu „prawidłowych” zwojów). Te mapy filtrów, po jednej dla każdego wyjścia warstwy, są zwykle ułożone razem w macierz .w1w2a1=[a11a21amn+11]a2=[a12a22amn+12]A=[a1a2]

Jeśli się nad tym zastanowić, dane wejściowe w przypadku splotowym można również traktować jako macierz zawierającą tylko jedną kolumnę („jeden kanał wejściowy”). Więc możemy napisać transformację dla tej warstwy jako , gdzie „splot” jest w rzeczywistości korelacja krzyżowa i zdarza się tylko wzdłuż kolumny i .

A=σ(XW)
XW

Te skróty notacje są rzeczywiście bardzo pomocne, ponieważ teraz to łatwo zauważyć, że aby dodać kolejne wyjście do warstwy, po prostu dodać kolejną kolumnę ciężarków do .W

Mam nadzieję, że to jest pomocne!

lmjohns3
źródło
1

Warstwa splotowa jest ścisłym podzbiorem w pełni połączonej sieci, tj. Mnożeniem macierzy. Warstwa splotowa w przebiegu do przodu jest w rzeczywistości równoważna mnożeniu macierzy, gdzie:

  • niektóre wagi są powiązane / współdzielone
  • niektóre wagi są zerowe

W przejeździe do tyłu wagi zostaną zaktualizowane zgodnie z tym, które wagi przyczyniły się do tego, ile w przejeździe do przodu. tzn. wagi, które były zerowe, wciąż są zerowe. Wagi powiązane z wieloma wyjściami otrzymają gradient ze wszystkich tych wyników (które gradienty są sumowane, aby uzyskać ostateczną aktualizację gradientu dla tej wagi).

Hugh Perkins
źródło
0

Nie, nie tak powinno to działać. Operacja splotu zawsze zmniejsza dane wejściowe (dla filtrów o rozmiarze> 1), a nie większe jak w twoim przykładzie.

Jest to po prostu mnożenie elementarne. Podczas splotu na pierwszych 3 elementach wejścia wartość wyjściowa wynosiłaby . (patrz przykład deeplearning.stanford.edu )15+26+37=38

pir
źródło
próbowałeś conv ([1, 2, 3, 4], [5,6,7]) w Matlabie? Idź do terminalu i sprawdź to sam. Jeśli użyjesz konwencjonalnej definicji splotu, możesz ręcznie obliczyć wektor [5,16,34,52,45,28]. Wektor nie zawsze się kurczy. To zależy od tego, od czego zaczniesz splot i czy potraktujesz rzeczy poza zakresem indeksu jako zero. Jeśli zrobisz to tak, jak zasugerowałem w tym poście, otrzymasz wektor o rozmiarze . Jeśli przycinasz krawędzie (ponieważ indeks wykraczający poza zakres) otrzymujesz wektor o rozmiarze , gdzie N i n są wielkościami wektorów. N - n + 1N+n1Nn+1
Charlie Parker,
Splot stosowany w tej sieci nie jest definicją splotu matematycznego.
Charlie Parker,
2
Tak, splot używany dla CNN nie jest zwykłym splotem. Jest to mylące dla wszystkich, ale tak właśnie jest :) Biorąc pod uwagę naturę CNN, tj. Przeanalizuj obraz, zawsze zacznie się od pierwszych elementów, gdzie jest rozmiarem filtra, a następnie zostanie przekazany na wejściu. Jednak nie zostanie przedłużony poza koniec, więc wynik zostanie zmniejszony o . n n - 1nnn1
pir
1
Rozumiem, myślę, że to ma sens teraz, kiedy to sprawdziłem. Jest jednak jeden drobny błąd. Dane wejściowe nie zawsze są mniejsze, teraz jestem świadomy różnego rodzaju zwojów, a nawet w CNN, zgodnie z książką Yoshua Bengio istnieją 3 rodzaje zwojów (pełne, ważne, takie same) iro.umontreal.ca/ ~ bengioy / dlbook . Nie rozumiem ich szczegółowo, ale przynajmniej jestem ich świadomy! Dzięki Felbo. Społeczność wizjonerów nie powinna używać słowa „konwolucje”, ponieważ jest mylące i irytujące. W każdym razie dzięki.
Charlie Parker,
2
@CharlieParker Funkcja conv w Matlabie ma te same 3 typy „kształtów” (pełny, poprawny, taki sam), Matlab po prostu domyślnie „pełny” - patrz dokumenty na mathworks.com/help/matlab/ref/conv.html . Splot bez przerzucania jądra jest więc korelacją krzyżową xcorr(x, y) = conv(x, fliplr(y)). Społeczność NN ma tendencję do mówienia o konwolucji, kiedy faktycznie dokonuje korelacji krzyżowej, ale jest całkiem podobna.
lmjohns3