Articles

Understanding neural networks 2: the math of neural networks in 3 equations

w pierwszej części tej serii omówiliśmy koncepcję sieci neuronowej, a także matematykę opisującą pojedynczy neuron. Istnieje jednak wiele neuronów w jednej warstwie i wiele warstw w całej sieci, więc musimy wymyślić ogólne równanie opisujące sieć neuronową.

pojedynczy neuron

pierwszą rzeczą, jaką nasza sieć musi zrobić, to przekazać informacje do przodu przez warstwy. Wiemy już, jak to zrobić dla pojedynczego neuronu:

wyjście neuronu jest funkcją aktywacji ważonej sumy wejścia neuronu

2 neurony

teraz możemy zastosować tę samą logikę, gdy mamy 2 neurony w drugiej warstwie.

w tym przykładzie każdy neuron pierwszej warstwy jest podłączony do każdego neuronu drugiej warstwy, ten rodzaj sieci nazywa się siecią w pełni połączoną. Neuron Y1 jest połączony z neuronami X1 i X2 o wagach W11 i W12, a neuron Y2 jest połączony z neuronami X1 i X2 o wagach W21 i W22. W tej notacji pierwszy indeks wagi wskazuje neuron wyjściowy, a drugi indeks wskazuje neuron wejściowy, więc na przykład W12 to waga przy połączeniu od X2 do Y1. Teraz możemy napisać równania dla Y1 i Y2:

teraz to równanie można wyrazić za pomocą mnożenia macierzy.

wizualizacja mnożenia macierzy z http://matrixmultiplication.xyz/

jeśli jesteś nowy w mnożeniu macierzy i algebrze liniowej, a to sprawia, że jesteś zdezorientowany, Gorąco polecam serię 3blue1brown linear algebra.

teraz możemy zapisać wyjście pierwszego neuronu jako Y1, A wyjście drugiego neuronu jako Y2. Daje nam to następujące równanie:

cała warstwa

z tego możemy wyciągnąć ogólną regułę wyjścia warstwy:

w tym równaniu wszystkie zmienne są macierzami, a znak mnożenia reprezentuje mnożenie macierzy.

zastosowanie macierzy w równaniu pozwala nam zapisać ją w prostej formie i czyni ją prawdziwą dla dowolnej liczby Wejść i neuronów na wyjściu.

w programowaniu sieci neuronowych stosujemy również mnożenie macierzy, ponieważ pozwala nam to na równoległe przetwarzanie i wykorzystanie do tego wydajnego sprzętu, takiego jak karty graficzne.

teraz mamy równanie dla pojedynczej warstwy, ale nic nie powstrzymuje nas przed pobraniem danych wyjściowych tej warstwy i użyciem jej jako danych wejściowych do następnej warstwy. To daje nam ogólne równanie opisujące wyjście każdej warstwy sieci neuronowej. Jeszcze jedna rzecz, którą musimy dodać, to funkcja aktywacji, wyjaśnię, dlaczego potrzebujemy funkcji aktywacji w następnej części serii, na razie można pomyśleć o sposobie skalowania wyjścia, aby nie stało się zbyt duże lub zbyt nieistotne.

dzięki temu równaniu możemy propagować informacje przez tyle warstw sieci neuronowej, ile chcemy. Ale bez nauki, sieć neuronowa jest tylko zestawem losowych mnożeń macierzy, które nic nie znaczą.

jak więc uczyć naszą sieć neuronową? Najpierw musimy obliczyć błąd sieci neuronowej i pomyśleć, jak przekazać ten błąd do wszystkich warstw.

2: przekazywanie błędnej propagacji wstecznej

aby zrozumieć algorytm propagacji błędów, musimy wrócić do przykładu z 2 neuronami w pierwszej warstwie i 1 neuronem w drugiej warstwie.

Załóżmy, że warstwa Y jest warstwą wyjściową sieci i neuron Y1 powinien zwrócić pewną wartość. Wartość ta może się znacznie różnić od wartości oczekiwanej, więc w neuronie Y1 występuje błąd. Możemy myśleć o tym błędzie jako o różnicy między zwracaną wartością a wartością oczekiwaną. Znamy błąd na Y1, ale musimy przekazać ten błąd do niższych warstw sieci, ponieważ chcemy, aby wszystkie warstwy się uczyły, nie tylko warstwa Y. Jak przekazać ten błąd do X1 i X2? Naiwnym podejściem byłoby równomierne podzielenie błędu Y1, ponieważ w warstwie X są 2 neurony, możemy powiedzieć, że zarówno błąd X1, jak i X2 jest równy błędowi Y1 wymyślonemu przez 2.

istnieje jednak poważny problem z tym podejściem-neurony mają różne wagi połączone z nimi. Jeśli waga połączona z neuronem X1 jest znacznie większa niż waga połączona z neuronem X2, błąd na Y1 jest znacznie bardziej zależny od X1, ponieważ Y1 = ( X1 * W11 + X2 * X12). Więc jeśli W11 jest większy niż W12, powinniśmy przekazać więcej błędu Y1 neuronowi X1, ponieważ to jest neuron, który się do niego przyczynia.

teraz, gdy to zaobserwowaliśmy, możemy zaktualizować nasz algorytm, aby nie dzielić błędu równomiernie, ale podzielić go zgodnie z racją wagi neuronu wejściowego na wszystkie wagi dochodzące do neuronu wyjściowego.

zaktualizuj wagę

teraz możemy pójść o krok dalej i przeanalizować przykład, w którym w warstwie wyjściowej znajduje się więcej niż jeden neuron.

w tym przykładzie widzimy, że np. neuron X1 przyczynia się nie tylko do błędu Y1, ale także do błędu Y2 i ten błąd jest nadal proporcjonalny do jego wagi. Tak więc, w równaniu opisującym błąd X1, musimy mieć zarówno błąd Y1 pomnożony przez stosunek wag i błąd Y2 pomnożony przez stosunek wag dochodzących do Y2.

równanie to można również zapisać w postaci mnożenia macierzy.

teraz jest jeszcze jedna sztuczka, którą możemy zrobić, aby ten cytat był prostszy bez utraty wielu istotnych informacji. Mianownik wagi działa jako czynnik normalizujący, więc nie dbamy o to zbytnio, częściowo dlatego, że końcowe równanie będzie miało inne sposoby regulacji uczenia się sieci neuronowej.

jest to jeszcze jedna obserwacja, którą możemy poczynić. Widzimy, że macierz z wagą w tym równaniu jest dość podobna do macierzy z algorytmu posuwisto-zwrotnego. Różnica polega na tym, że wiersze i kolumny są przełączane. W algebrze nazywamy to transpozycją macierzy.

ponieważ nie ma potrzeby używania 2 różnych zmiennych, możemy po prostu użyć tej samej zmiennej z algorytmu feed forward. To daje nam ogólne równanie algorytmu propagacji wstecznej

zauważ, że w algorytmie feed-forward przechodzimy od pierwszej warstwy do ostatniej, ale w propagacji wstecznej przechodzimy od ostatniej warstwy Sieci do pierwszej, ponieważ do obliczenia błędu w danej warstwie potrzebujemy informacji o błędzie w następnej warstwie.

popularne artykuły AI:

1. Jak wykorzystałem uczenie maszynowe jako inspirację dla fizycznych obrazów

2. MS czy Startup Job-którędy zrobić karierę w Deep Learning?

3. TOP 100 średnich artykułów związanych ze Sztuczną Inteligencją

4. Konferencja sztucznej inteligencji

teraz, gdy wiemy, jak przekazać informacje do przodu i przekazać błąd do tyłu, możemy użyć błędu na każdej warstwie, aby zaktualizować wagę.

3 : Aktualizacja wag

teraz, gdy wiemy, jakie błędy popełniają sieci neuronowe na każdej warstwie, możemy w końcu zacząć uczyć naszą sieć, aby znaleźć najlepsze rozwiązanie problemu.

ale jakie jest najlepsze rozwiązanie?

błąd informuje nas o tym, jak błędne są nasze rozwiązania, więc oczywiście najlepszym rozwiązaniem byłoby to, w którym funkcja błędu jest minimalna.

funkcja błędu zależy od wag sieci, dlatego chcemy znaleźć takie wartości wag, które powodują globalne minimum w funkcji błędu. Zauważ, że to zdjęcie służy tylko do wizualizacji. W rzeczywistych zastosowaniach mamy więcej niż 1 wagę, więc funkcja błędu jest funkcją wysokowymiarową.

ale jak znaleźć minimum tej funkcji? Prosty pomysł polega na tym, aby zacząć od losowych wag, obliczyć funkcję błędu dla tych wag, a następnie sprawdzić nachylenie tej funkcji, aby zejść w dół.

ale jak poznać nachylenie funkcji?

możemy jeszcze raz użyć algebry liniowej i wykorzystać fakt, że pochodna funkcji w danym punkcie jest równa nachyleniu funkcji w tym punkcie. Pochodną tę możemy zapisać w następujący sposób:

gdzie E jest naszą funkcją błędu, A W oznacza wagę. Zapis ten informuje nas, że chcemy znaleźć pochodną funkcji błędu względem wagi. Używamy n + 1 W z błędem, ponieważ w naszej notacji wyjście sieci neuronowej po wag Wn jest na + 1.

możemy wtedy użyć tej pochodnej do aktualizacji wagi:

oznacza to „zejście w dół” każda iteracja uczenia się (epoka) aktualizujemy wagę zgodnie ze spadkiem pochodnej funkcji błędu.

jest jeszcze jedna rzecz, której potrzebujemy przed przedstawieniem ostatecznego równania, a mianowicie learning-rate. Learning-rate reguluje, jak duże kroki podejmujemy podczas zjazdu.

jak widać przy większym stopniu uczenia się, podejmujemy większe kroki. Oznacza to, że możemy szybciej osiągnąć optymalną funkcję, ale istnieje również szansa, że ją przegapimy.

przy mniejszym stopniu uczenia się podejmujemy mniejsze kroki, co skutkuje potrzebą większej liczby epok, aby osiągnąć minimum funkcji, ale jest mniejsza szansa, że ją przegapimy.

dlatego w praktyce często stosujemy szybkość uczenia się zależną od poprzednich kroków np. jeśli istnieje silna tendencja do podążania w jednym kierunku, możemy podjąć większe kroki (większy wskaźnik uczenia się), ale jeśli kierunek się zmienia, powinniśmy podjąć mniejsze kroki (mniejszy wskaźnik uczenia się), aby szukać lepszego minimum. W naszym przykładzie jednak przyjmiemy proste podejście i użyjemy stałej wartości współczynnika uczenia. To daje nam następujące równanie.

Learning rate (Lr) to liczba w rage 0 — 1. Im mniejszy jest, tym mniejsza zmiana wagi. Jeśli nauka jest bliska 1. używamy pełnej wartości pochodnej do aktualizacji wag i jeśli jest ona bliska 0, używamy tylko niewielkiej jej części. Oznacza to, że wskaźnik uczenia się, jak sama nazwa wskazuje, reguluje, ile sieć „uczy się” w jednej iteracji.

aktualizacja wag była ostatnim równaniem, którego potrzebowaliśmy w naszej sieci neuronowej. To właśnie równania są odpowiedzialne za rzeczywiste uczenie się sieci i uczenie jej, aby dawała znaczące wyniki zamiast losowych wartości.

Feed-forward

propagacja pleców

aktualizacja wag

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.