Jestem pewien, że wiele osób odpowie linkami „Pozwól mi to wygooglować”, więc chcę powiedzieć, że próbowałem obliczyć to się kończy, więc proszę wybacz mi mój brak zrozumienia, ale nie mogę zrozumieć, jak faktycznie działa praktyczna implementacja sieci neuronowej.
Rozumiem warstwę wejściową i rozumiem, jak normalizować dane, rozumiem również jednostkę odchylenia, ale jeśli chodzi o warstwę ukrytą, jakie są rzeczywiste obliczenia w tej warstwie i jak odwzorowuje się na wyjście jest tylko trochę zamglone. Widziałem diagramy ze znakami zapytania w ukrytej warstwie, funkcje logiczne, takie jak AND / OR / XOR, funkcje aktywacji i węzły wejściowe, które są mapowane na wszystkie ukryte jednostki i węzły wejściowe, które mapują tylko kilka ukrytych jednostek. Mam tylko kilka pytań dotyczących aspektu praktycznego. Oczywiście, proste wyjaśnienie całego procesu sieci neuronowej, tak jak chciałbyś wyjaśnić dziecku, byłoby niesamowite.
Jakie obliczenia są wykonywane w warstwie ukrytej ?
W jaki sposób te obliczenia są odwzorowywane na warstwę wyjściową?
Jak działa warstwa wyjściowa? Odnormalizowanie danych z warstwy ukrytej?
Dlaczego czy niektóre warstwy w warstwie wejściowej są połączone z warstwą ukrytą, a inne nie?
Komentarze
- Ludzie tutaj są mili, nigdy nie widziałem „Pozwól mi to wygooglować”, ale wiele zaskakująco dokładnych i wnikliwych odpowiedzi na pytania, które na początku wydawały się być podstawowymi. Niestety nie mogę ' Twoje, ale wydaje się całkiem istotne, więc z radością głosuję za tym.
- Dziękuję za komentarz i głos Gael, jestem ' prawdopodobnie trochę zblazowany przez społeczność SO, jak wszyscy wiemy, jak ci ludzie mogą się zdobyć 🙂 Cieszę się, że widzę tu więcej ducha współpracy, a nie próby zdobywania odznak i punktów za edycję / zamykanie pytań.
- Nie jestem ekspert w dziedzinie sieci neuronowych, chociaż angażuję się w ich zastosowania i metody. Moją odpowiedzią może być to, że konkretne obliczenia w ukryciu zależą od ' funkcji kosztu ', którym jesteś narzucanie na swój wynik, czyli to, co próbujesz osiągnąć. Na przykład, jeśli chcesz pogrupować elementy wejściowe w zbiory klastrowe, obliczysz odległości między elementami w warstwie ukrytej. Może to przechodzić przez różne iteracje i cykle optymalizacji w tej warstwie, dopóki nie spełnisz kryterium błędu, które pozwala procesowi „ opuścić ' tę warstwę.
Odpowiedź
Wersja z trzema zdaniami:
-
Każda warstwa może zastosować dowolną funkcję do poprzedniej warstwy (zwykle jest to transformacja liniowa, po której następuje zgniatająca nieliniowość).
-
Zadaniem warstw ukrytych jest przekształcenie danych wejściowych w coś, czego może używać warstwa wyjściowa.
-
Warstwa wyjściowa przekształca aktywacje warstwy ukrytej w dowolną skalę, w jakiej chcesz, aby Twoje wyjście było.
Like you „re 5:
Jeśli chcesz, aby komputer informował Cię, czy na obrazie jest magistrala, byłoby łatwiej, gdyby miał odpowiednie narzędzia.
Więc twój detektor autobusu może składać się z wykrywacza kół (aby pomóc ci powiedzieć, że jest to pojazd) i detektora pudełek (ponieważ autobus ma kształt dużego pudełka) i detektora rozmiaru (aby powiedzieć jest za duży na samochód) .To są trzy elementy twojej ukrytej warstwy: „nie są częścią surowego obrazu, to są narzędzia, które zaprojektowałeś, aby pomóc ci zidentyfikować autobusy.
Jeśli wszystkie trzy detektory włączą się (lub jeśli są szczególnie aktywne), to istnieje duża szansa, że masz przed sobą autobus.
Sieci neuronowe są przydatne l ponieważ istnieją dobre narzędzia (takie jak propagacja wsteczna) do tworzenia wielu detektorów i składania ich razem.
Tak jak ty ”jesteś osobą dorosłą
Sieć neuronowa typu feed-forward stosuje do danych szereg funkcji. Dokładne funkcje będą zależeć od sieci neuronowej, której „używasz: najczęściej te funkcje obliczają liniową transformację poprzedniej warstwy, po której następuje zgniatająca nieliniowość. Czasami funkcje robią coś innego (np. Obliczanie funkcji logicznych w twoich przykładach lub uśrednianie na sąsiednich pikselach obrazu). Role różnych warstw mogą więc zależeć od obliczanych funkcji, ale postaram się być bardzo ogólny.
Nazwijmy dane wejściowe wektor $ x $, aktywacja ukrytej warstwy $ h $ i aktywacja wyjścia $ y $. Masz pewną funkcję $ f $, która odwzorowuje z $ x $ na $ h $ i inną $ g $, która odwzorowuje z $ h $ do $ y $.
Zatem aktywacja warstwy ukrytej to $ f (x) $, a wyjście sieci to $ g (f (x)) $.
Po co dwie funkcje ($ f $ i $ g $) zamiast tylko jednej?
Jeśli poziom złożoności funkcji jest ograniczony, to $ g (f (x)) $ może obliczyć rzeczy, których $ f $ i $ g $ nie są w stanie zrobić indywidualnie.
Przykład z funkcjami logicznymi:
Na przykład, jeśli zezwalamy tylko na $ f $ i $ g $, aby były prostymi operatorami logicznymi, takimi jak „AND”, „OR” i „NAND”, wtedy nie można obliczyć innych funkcji, takich jak „XOR”, używając tylko jednej z nich. Z drugiej strony, moglibyśmy obliczyć „XOR”, gdybyśmy chcieli nałożyć te funkcje na siebie:
Funkcje pierwszej warstwy:
- Upewnij się, że co najmniej jeden element jest „TRUE” (używając OR)
- Upewnij się, że nie wszystkie są „TRUE” (używając NAND)
Funkcja drugiej warstwy:
- Upewnij się, że oba kryteria pierwszej warstwy są spełnione (używając ORAZ)
Dane wyjściowe sieci to po prostu wynik tej drugiej funkcji. Pierwsza warstwa przekształca dane wejściowe w coś, czego może używać druga warstwa, tak aby cała sieć mogła wykonać XOR.
Przykład z obrazami:
Slajd 61 z tego wystąpienia – również dostępne tutaj jako pojedynczy obraz – pokazuje (jeden sposób wizualizacji), czego szukają różne ukryte warstwy w określonej sieci neuronowej.
Pierwsza warstwa szuka krótkich krawędzi obrazu: są one bardzo łatwe do znalezienia na podstawie surowych danych pikseli, ale same w sobie nie są zbyt użyteczne, aby stwierdzić, czy patrzysz na twarz, autobus lub słonia.
Następna warstwa tworzy krawędzie: jeśli krawędzie z dolnej ukrytej warstwy pasują do siebie w określony sposób, może się włączyć jeden z detektorów wzroku na środku skrajnej lewej kolumny . Trudno byłoby stworzyć pojedynczą warstwę, która byłaby tak dobra w znalezieniu czegoś tak specyficznego z surowych pikseli: detektory oka są znacznie łatwiejsze do zbudowania z detektorów krawędzi niż z surowych pikseli.
Następna warstwa up składa detektory oka i detektory nosa w twarze. Innymi słowy, zapalą się one, gdy detektory oczu i nosa z poprzedniej warstwy włączą się z właściwymi wzorami. Są one bardzo dobre w wyszukiwaniu określonych rodzajów twarzy: jeśli jedna lub więcej z nich się zaświeci, warstwa wyjściowa powinna zgłosić obecność twarzy.
Jest to przydatne, ponieważ wykrywacze twarzy są łatwe do zbudowania z wykrywaczy oczu i nosa, ale naprawdę trudne do zbudowania z intensywności pikseli.
Więc każda warstwa przenosi Cię coraz dalej od surowych pikseli i bliżej ostatecznego celu (np. wykrywania twarzy lub wykrywania magistrali).
Odpowiedzi na różne inne pytania
„Dlaczego niektóre warstwy w warstwie wejściowej są połączone z warstwą ukrytą, a inne nie?”
Odłączone węzły w sieci nazywane są węzłami „bias”. Jest „naprawdę fajne wyjaśnienie tutaj . Krótka odpowiedź jest taka, że„ są jak wyrażenia przechwytujące w regresji.
„Gdzie czy obrazy „wykrywacza oczu” na przykładzie obrazu pochodzą?
Nie sprawdziłem dwukrotnie konkretnych obrazów, do których utworzyłem łącze, ale ogólnie te wizualizacje pokazują zestaw piksele w warstwie wejściowej, które maksymalizują aktywność odpowiedniego neuronu. Jeśli więc pomyślimy o neuronie jako detektorze oka, jest to obraz, który neuron uważa za najbardziej podobny do oka. Ludzie zwykle znajdują te zestawy pikseli z optymalizacją (wspinaczka górska).
W tym artykule , którego autorem jest kilku użytkowników Google z jedną z największych sieci neuronowych na świecie, pokazują neuron „wykrywający twarz” i neuron „wykrywacz kota” w ten sposób, a także drugi sposób: Pokazują również rzeczywiste obrazy , które najsilniej aktywują neuron (rysunek 3, rysunek 16). Drugie podejście jest fajne, ponieważ pokazuje, jak elastyczna i nieliniowa jest sieć – te „detektory” wysokiego poziomu są wrażliwe na wszystkie te obrazy, nawet jeśli nie wyglądają szczególnie podobnie na poziomie pikseli.
Daj mi znać, jeśli cokolwiek tutaj jest niejasne lub jeśli masz więcej pytań.
Komentarze
- Czy jest tylko jeden zdefiniowany algorytm dla każdego węzła w danej warstwie i wagi są tym, co sprawia, że wyniki są różne? A może możesz zaprogramować każdy węzeł w warstwie tak, aby był inny?
- @GeorgeMcDowd oto kluczowy problem: patrząc na Piksele i identyfikacja magistrali jest trudna, jak sugerowałeś. Na szczęście patrzenie na piksele i znajdowanie krawędzi jest łatwe – to ' to wszystko, co próbuje zrobić pierwsza ukryta warstwa. Następna warstwa próbuje wyciągać wnioski na podstawie krawędzi, co jest znacznie łatwiejsze niż próba zrobienia tego na podstawie pikseli.
- SO powinien dać ci inną nagrodę (niż tylko punkty) za czas i wysiłek włożony w tę odpowiedź!
- @JoshuaEnfield Myślę, że logika z 1980 roku s było połączeniem bycia podobnym do tego, jak ludzie myśleli, że mózg działa, że można go różniczkować wszędzie i że wartości były ograniczone, jak wspomniałeś. Od tego czasu ludzie często stwierdzili, że
f(x) = max(x, 0)
(” rektyfikowana jednostka liniowa „) działa lepiej, mimo że ' nie ma wielu z tych właściwości. - Przykład magistrali i łańcuch funkcji po prostu go przydały. Nie ' nie rozumiem, dlaczego podręczniki nie mogą ' być tak opisowe.
Odpowiedź
Spróbuję dodać do intuicyjnego opisu działania …
Dobrym intuicyjnym sposobem myślenia o sieci neuronowej jest myślenie o tym, do czego stara się model regresji liniowej. Regresja liniowa wymaga pewnych danych wejściowych i tworzy model liniowy, który bierze każdą wartość wejściową pomnożoną przez niektóre optymalne współczynniki ważenia modelu i próbuje odwzorować sumę tych wyników na odpowiedź wyjściową, która jest ściśle pasuje do rzeczywistego wyniku. Współczynniki są określane przez znalezienie wartości, które zminimalizują pewien błąd metryki między żądaną wartością wyjściową a wartością wyuczoną przez model. Innym sposobem jest to, że model liniowy spróbuje utworzyć mnożniki współczynników dla każdego wejścia i zsumuj je wszystkie, aby spróbować określić związek między (wieloma) wartościami wejściowymi i (zazwyczaj pojedynczą) wartością wyjściową ues. Ten sam model można niemal traktować jako podstawowy element składowy sieci neuronowej; pojedynczy perceptron jednostkowy.
Ale perceptron pojedynczej jednostki ma jeszcze jeden element, który przetwarza sumę ważonych danych w sposób nieliniowy. Zwykle używa do tego funkcji zgniatania (sigmoidalnej lub tanh). Mamy więc podstawową jednostkę warstwy ukrytej, która jest blokiem, który zsumuje zestaw ważonych danych wejściowych – następnie przekazuje zsumowaną odpowiedź do funkcji nieliniowej, aby utworzyć odpowiedź węzła wyjściowego (warstwy ukrytej). Jednostka odchylenia jest taka sama, jak w regresji liniowej, przy czym stałe przesunięcie jest dodawane do każdego przetwarzanego węzła. Z powodu nieliniowego bloku przetwarzania nie jesteś już ograniczony tylko do odpowiedzi liniowych (jak w modelu regresji liniowej).
Ok, ale kiedy masz wiele pojedynczych jednostek perceptronowych pracujących razem, każda może mieć różne mnożniki wagi wejściowej i różne odpowiedzi (nawet jeśli WSZYSTKIE przetwarzają ten sam zestaw wejść z tym samym blokiem nieliniowym opisanym wcześniej). To, co sprawia, że odpowiedzi są różne, to fakt, że każda z nich ma różne wagi współczynników, które są uczone przez sieć neuronową podczas uczenia (niektóre formy obejmują zejście gradientowe). Wynik działania wszystkich perceptronów jest następnie ponownie przetwarzany i przekazywany do warstwy wyjściowej, tak jak przetwarzane były poszczególne bloki. Powstaje zatem pytanie, w jaki sposób są określane prawidłowe wagi dla wszystkich bloków?
Powszechnym sposobem uczenia się prawidłowych wag jest rozpoczęcie od losowych wag i zmierzenie odpowiedzi na błąd między rzeczywistym rzeczywistym wyjściem a wyuczonym wyjście modelu. Błąd jest zwykle przekazywany wstecz przez sieć, a algorytm sprzężenia zwrotnego indywidualnie zwiększa lub zmniejsza te wagi o pewną proporcję do błędu. Sieć będzie wielokrotnie iterować, przechodząc do przodu, mierząc odpowiedź wyjściową, a następnie aktualizując (przechodząc wstecz korekty wagi) i korygując wagi, aż do osiągnięcia pewnego zadowalającego poziomu błędu. W tym momencie masz model regresji, który może być bardziej elastyczny niż model regresji liniowej, jest to tak zwany uniwersalny aproksymator funkcji.
Jednym ze sposobów, który naprawdę pomógł mi dowiedzieć się, jak naprawdę działa sieć neuronowa, jest zbadanie kodu implementacji sieci neuronowej i zbudowanie go. Jedno z najlepszych podstawowych wyjaśnień dotyczących kodu można znaleźć w rozdziale poświęconym sieciom neuronowym (ogólnie dostępnym) „Przewodniku naukowca i inżyniera po DSP” Rozdz. 26. Jest w większości napisany w bardzo podstawowym języku (myślę, że to był fortran), który naprawdę pomaga ci zobaczyć, co się dzieje.
Odpowiedź
Mam zamiar opisać mój pogląd na ten temat w dwóch krokach: krok wejścia do ukrycia i krok ukrycia do wyjścia. Najpierw wykonam krok ukrywania do wyjścia, ponieważ wydaje mi się to mniej interesujące (dla mnie).
Ukryty do wyjścia
Dane wyjściowe warstwy ukrytej mogą być różne, ale na razie załóżmy, że wynikają one z sigmoidalne funkcje aktywacji. Są to więc wartości z przedziału od 0 do 1, a dla wielu wejść mogą wynosić po prostu 0 „si 1”.
Lubię myśleć o transformacji między wyjściami tych ukrytych neuronów a warstwą wyjściową jako o zwykłym tłumaczeniu (w sensie językowym, a nie geometrycznym). Jest to z pewnością prawdą, jeśli transformacja jest odwracalne , a jeśli nie, to coś zostało utracone w tłumaczeniu. Ale w zasadzie mamy tylko wyjścia ukrytych neuronów widziane z innej perspektywy.
Wejście do ukrycia
Powiedzmy, że masz 3 neurony wejściowe (tak żebym mógł z łatwością napisz tutaj kilka równań) i kilka ukrytych neuronów. Każdy ukryty neuron otrzymuje jako dane wejściowe sumę ważoną wejść, więc może na przykład
hidden_1 = 10 * (input_1) + 0 * (input_2) + 2 * (input_3)
Oznacza to, że wartość hidden_1
jest bardzo wrażliwa na wartość input_1
, w ogóle niewrażliwe na input_2
i tylko nieznacznie wrażliwe na input_3
.
Można więc powiedzieć, że hidden_1
przechwytuje określony aspekt danych wejściowych, który można nazwać „input_1
jest ważny „aspekt.
Dane wyjściowe z hidden_1
są zwykle tworzone przez przepuszczenie danych wejściowych przez jakąś funkcję, więc powiedzmy, że używasz funkcji sigmoidy . Ta funkcja przyjmuje wartości od 0 do 1; więc pomyśl o tym jako o przełączniku, który mówi, że albo input_1
jest ważny, albo nie jest „t.
Więc to właśnie robi warstwa ukryta! Wydobywa aspekty lub cechy z przestrzeni wejściowej.
Teraz wagi również mogą być ujemne! Co oznacza, że możesz uzyskać takie aspekty jak „input_1
jest ważne, ALE RÓWNIEŻ input_2
odbiera to znaczenie”:
hidden_2 = 10 * (input_1) - 10 * (input_2 ) + 0 * (input_3)
lub input_1
i input_3
mają „wspólne” znaczenie:
hidden_3 = 5 * (input_1) + 0 * (input_2) + 5 * (input_3)
Więcej geometrii
Jeśli znasz jakieś algebra liniowa, możesz myśleć geometrycznie w kategoriach rzutowania wzdłuż określonych kierunków. W powyższym przykładzie wykonałem rzut wzdłuż input_1
kierunku.
Spójrzmy ponownie na hidden_1
, od powyżej. Gdy wartość w input_1
jest wystarczająco duża, sygnał wyjściowy funkcji aktywacji esicy pozostanie na 1, nie będzie już większy . Innymi słowy, coraz więcej input_1
nie będzie miało wpływu na wynik. Podobnie, jeśli porusza się w przeciwnym (tj. Ujemnym) kierunku, to po punkcie wyjście pozostanie niezmienione.
Ok, dobrze. Ale przypuśćmy, że nie chcemy czułości w kierunku nieskończoności w pewnym kierunku i chcemy, aby była aktywowana tylko dla określonego zakresu w linii. Znaczenie dla bardzo ujemnych wartości nie ma żadnego wpływu , a dla bardzo dodatnich wartości nie ma żadnego efektu, ale w przypadku wartości między powiedzmy 5 a 16 chcesz, aby się wybudził. W tym miejscu użyjesz radialnej funkcji bazowej do funkcji aktywacji.
Podsumowanie
Ukryta warstwa wyodrębnia cechy przestrzeni wejściowej, a warstwa wyjściowa przekłada je na pożądany kontekst. Może być o wiele więcej niż to, co w sieciach wielowarstwowych itp., ale to, co do tej pory rozumiem.
EDYTUJ: Ta strona ze wspaniałymi interaktywnymi wykresami radzi sobie lepiej niż moja długa i uciążliwa odpowiedź powyżej. : http://neuralnetworksanddeeplearning.com/chap4.html
Komentarze
- Podobnie jak w przypadku OP, ' jestem trochę zdezorientowany co do warstwy ukrytej w sieciach neuronowych. W twoim przykładzie, jak algorytm NN znajduje wagi dla neuronów hidden_1, hidden_2 i hidden_3? A ponieważ hidden_1, hidden_2 i hidden_3 są wyprowadzane z tych samych zmiennych wejściowych, czy nie ' t wagi nie zbiegają się do tego samego rozwiązania?
Odpowiedź
Weźmy przykład klasyfikacji. Warstwa wyjściowa próbuje oszacować prawdopodobieństwo warunkowe, że próbka należy do danej klasy, tj. Jakie jest prawdopodobieństwo, że próbka będzie należała do danej klasy. Z punktu widzenia geometrii, łączenie warstw w sposób nieliniowy za pomocą funkcji progowych pozwala sieciom neuronowym rozwiązywać najciekawsze problemy nie wypukłe (rozpoznawanie mowy, rozpoznawanie obiektów itd.) Innymi słowy, jednostki wyjściowe są w stanie generować niewypukłe funkcje decyzyjne, takie jak te przedstawione tutaj .
Jednostki w warstwach ukrytych można postrzegać jako uczenie się złożonych cech na podstawie danych, które pozwalają warstwie wyjściowej na lepsze rozróżnianie jednej klasy od drugiej w celu generowania dokładniejszych granic decyzyjnych. Na przykład w przypadku rozpoznawania twarzy jednostki w pierwszych warstwach uczą się cech przypominających krawędzie (wykrywają krawędzie w określonych orientacjach i pozycjach), a warstwy wyższe uczą się łączyć te elementy, aby stać się detektorami rysów twarzy, takich jak nos, usta lub oczy. Wagi każdej ukrytej jednostki reprezentują te cechy, a jej wynik (zakładając, że jest to sigmoida) reprezentuje prawdopodobieństwo, że ta cecha jest obecna w twojej próbce.
Ogólnie rzecz biorąc, znaczenie wyników wyjściowych i ukryte warstwy zależą od problemu, który próbujesz rozwiązać (regresja, klasyfikacja) i zastosowanej funkcji straty (entropia krzyżowa, błędy najmniejszych kwadratów, …)