Czym Jest Sztuczna Siec Neuronowa? Wprowadzenie Dla Kazdego

Celem niniejszego wpisu jest przedstawienie idei sztucznych sieci neuronowych w przystępny sposób, bez wgłębiania się w techniczne detale. Temat ten jest fascynujący, aktualny oraz mam wrażenie, że zwyczajnie modny. Co raz częściej możemy przeczytać nagłówki mówiące raz o nadciągającej apokalipsie ze strony inteligentnych maszyn, raz o ich potencjalnie zbawczych możliwościach, a czasem o wielkich pieniądzach, które czekają na każdego, kto będzie w stanie maszyny uczyć. Jakakolwiek nie jest Twoja motywacja, myślę, że warto poznać ten temat oraz wyrobić sobie intuicję dotyczącą sztucznych sieci neuronowych.

Postaram się unikać technicznych pojęć, natomiast nie uda się ominąć bardzo prostej matematyki. Będę też używał uproszczeń - w miarę możliwości bezstratnych, ale tego nie obiecuję. Moim celem jest, by po przeczytaniu tego wpisu każda osoba - nawet bez technicznego doświadczenia - miała podstawowe pojęcie na temat tego, czym sztuczne sieci neuronowe są.

Papier, Kamień, Nożyce

Za przykład weźmiemy sobie grę w papier, kamień, nożyce. Naszym celem jest zbudowanie sieci neuronowej, która odpowie na pytanie: “Czy wygrałem rozgrywkę w PKN?”. Zanim przejdziemy do budowania sieci, przeanalizujmy problem, który sobie postawiliśmy:

  • Papier pokonuje kamień.
  • Kamień pokonuje nożyce.
  • Nożyce pokonują papier.
  • Mogę wygrać, przegrać lub zremisować - jednak dla naszej maszyny przegrana i remis będę traktowane tak samo (wynika to ze sposobu, w jaki sformułowaliśmy pytanie).

To już całkiem sporo zasad! A teraz spróbujmy wyobrazić sobie jak może wyglądać maszyna do przewidywania wyników: Schemat sieci neuronowej

Po odrobinę bliższej inspekcji możemy ustalić, że mamy dwa “wejścia” i jedno “wyjście”, a po środku “pudło”. Konstrukcja ta ma nas wyręczyć z zadania oznajmiania światu, że wygraliśmy rozgrywkę.

Czar pryska

Jeśli macie nadzieję, że teraz Wam opowiem o tym, jak z pieczą będziemy teraz tworzyć neuron po neuronie finezyjną strukturę sztucznego mózgu, to muszę Was odrobinę rozczarować. Będziemy zajmować się statystyką. Nasza sieć neuronowa będzie mogła powiedzieć: “Wygrałaś/eś na 98,23%!”. Rozłóżmy problem dalej. Prawdopodobieństwo będziemy przedstawiać jako liczbę z przedziału od 0 do 1 (0 będzie odpowiadało 0%, 1 - 100%, a na przykład 0,2345 - 23,45%). Jako, że nasza maszyna nie nauczyła się jeszcze rozumieć ludzkiej mowy naszym “rękom” przypiszemy odpowiednie etykietki liczbowe, 1 dla kamienia, 2 dla nożyczek, 3 dla papieru. Podsumujmy:

  • Wynik będziemy przedstawiać jako “pewność” naszej maszyny dotyczącą tego, czy wygraliśmy przy pomocy liczby z zakresu od 0 do 1.
  • Wybór naszej “ręki” będzie reprezentowany przez liczbowe etykietki:
    • 1 dla kamienia
    • 2 dla nożyczek
    • 3 dla papieru

Powyższe zależności przedstawmy w postaci tabelki:

Moja rękaRęka przeciwnikaWynik
110
121
130
210
220
231
311
320
330

A gdzie to uczenie?

Przeszliśmy ciężki kawałek ścieżki - udało nam się przedstawić problem, który mamy przy pomocy języka liczb, a więc takiego, w którym możemy nasza maszynę uczyć. Pojawia się teraz problem. Niby ma być statystyka, niby mamy pierwszą i ostatnią część obrazka, nic natomiast nie powiedzieliśmy o istocie sprawy - o tym jak nasza sieć ma pamiętać i w jaki sposób ma decydować. Nie zerknęliśmy do bloczku, który na obrazku jest opisany jako “Maszyna ucząca się”.

Krok w przód

W zwyczajnych (a takie teraz omawiamy) sieciach neuronowych nasza maszyna będzie uczyła się poprzez badanie jak dane wejściowe mają wpływ na wynik. Przeanalizujmy to.

Schemat sieci neuronowej

Dane wejściowe

Jako dano wejściowe bierzemy wcześniej zetykietowane “ręce” i w postaci pary [moja ręka, ręka przeciwnika] wrzucamy do maszyny.

Współczynniki

Mamy dwa współczynniki. Każdy ze współczynników może przyjmować dowolną wartość - zarówno dodatnią jak i ujemną. Na początku wymyślamy (bierzemy dowolne) wartości tych współczynników. A co z nimi zrobimy? Pomnożymy etykietę odopowiedniej ręki przez odpowiadający mu współczynnik:

  • Moja Ręka * Współczynnik M (tę liczbę nazwiemy sobie M1).
  • Ręka Przeciwnika * Współczynnik P (a tę P1).

Następnie obie te liczby przekazywane są do kolejnego kroku, którym jest:

Sumowanie

W tym wypadku nazwa jest jednocześnie operacją, którą wykonujemy. Dodajemy do siebie M1 oraz P1 i przekazujemy do kolejnego etapu.

Normalizacja

Mając sumę liczb M1 oraz P1 nie mamy pewności, że będzie to liczba z przedziału od 0 do 1. Tutaj znormalizujemy wynik, żeby mieścił się w tym przedziale. Użyjemy funkcji nazywanej sigmoidą, popularnej w domenie sieci neuronowych. Nie ma ona skomplikowanego wzoru: Sigomoida wzór, natomiast jej wykres jest bardziej czytelny dla oka bez matematycznej wprawy:

Sigmoida wykres

Funkcja działa w następujący sposób: im mamy wiekszą sumę M1 + P1, tym bardziej będziemy się zbliżać do 1, a im ta suma będzie mniejsza (należy pamiętać, że suma może być ujemna) - tym bardziej będziemy się zbliżać do 0.

Błąd początkiem nauki

Czytelnik może zadawać sobie pytanie: “Wybraliśmy wartości współczynników, przepuściliśmy przez nią naszą przykładową rozgrywkę, wyszła nam liczba i co z nią zrobić?”. Bardzo słuszne pytanie i prowadzi nas do pojęcia błędu.

Błędem będziemy nazywać różnicę pomiędzy wynikiem dostarczonym przez maszynę (liczba z przedziału od 0 do 1), a oczekiwaną wartością (ta przyjmuje wartość albo 1 - kiedy wygraliśmy, albo 0, kiedy wygrać nam się nie udało).

Celem sieci neuronowej jest minimalizowanie tej różnicy. Im ta różnica będzie mniejsza, tym większa pewność naszej maszyny w przewidywanym wyniku.

Krok w tył

Po przejściu pełnego cyklu w przód nasza maszyna wie jaki popełniła błąd. Będzie teraz musiała się zreflektować nad swoimi współczynnikami i zaktualizować je, tak by przy następnej próbie różnica pomiędzy przewidywaniem naszej maszyny oraz faktycznym wynikiem była możliwie mniejsza w kolejnym kroku. Idea jest prosta - Jak mocno dana wartość wpływa na ostateczny wynik. Do tego konceptu podejdziemy przez analogię.

Backprop

Na powyższym grafie mamy przedstawioną inną “maszynę”, które sumuje liczby A i B, a wynik przypisuje do W. Zanim jednak zsumuje te liczby, wykonuje na nich operacje mnożenia - A mnoży przez 2, a B mnoży przez 1. Tak więc, dla przykładowych wartości A i B mamy:

  • (A = 5, B = 3): W = 5 * 2 + 3 * 1 = 13
  • (A = 6, B = 3): W = 6 * 2 + 3 * 1 = 15
  • (A = 5, B = 4): W = 5 * 2 + 4 * 1 = 14

Można zauważyć, że A wpływa na wynik dwukrotnie mocniej niż B. Oznacza to, że z każdym powiększeniem A o 1 wartość W zmieni się o 2, natomiast z powiększeniem B o 1, wartość W wzrośnie o 1.

Analogicznie nasza maszyna będzie aktualizowała współczynniki. Poprzez badanie jak zetykietowane ręce (odpowiednio nasza i przeciwnika) wpływa na wynik. W tym wypadku proces jest bardziej złożony, gdyż musimy uwzględnić sigmoidę. Wyliczając taki wpływ będziemy mogli aktualizować współczynniki P oraz M, by następne przewidywanie było bliższe oczekiwanej wartości. Ta część jest najbardziej złożona, więc nie przejmuj się nazbyt, jeśli od razu wszystkiego nie złapiesz. Kluczowe jest w tym wpadaku badanie wpływu oraz szczególnie aktualizacja współczynników.

Więcej kroków

Uzbrojeni w powyższe informacje możemy przeanalizować, co się stanie, kiedy będziemy podawać kolejne kombinacje rąk. Część z tych kombinacji będzie “ciągnęła” do wyniku bliskiemu 0, część do 1, ciągle aktualizując współczynniki w różne strony. Będziemy musieli maszynie pokazać dziesiątki tysięcy gier, żeby wyciągnęła wnioski i faktycznie mogła przewidzieć wyniki z akceptowalną dokładnością.

Co już wiemy?

Zanim przejdziemy dalej zastanówmy się, co już wiemy i jakie koncepty rozpracowaliśmy:

  • W rzeczywistości nasza maszyna przyjmuje jako dane wejściowe dwie wartości, tj:
    • kombinację rąk - [moja ręka, ręka przeciwnika]
    • rzeczywisty wynik tej rozgrywki, potrzebny po to by nasza maszyna mogła obliczyć błąd swojego przewidywania.
  • Sieć uczy się poprzez aktualizację współczynników, które nazwaliśmy M i P. Wartość zmiany współczynników wyliczamy badając wpływ danych rąk na błąd przewidywania.
  • Nasza sztuczna sieć neuronowa składa się z dwóch warstw - warstwy wejściowej i warstwy wyjściowej.

Dłuższa trasa

Mam niestety złą informację - zbudowana przez nas sieć neuronowa jest zbyt prosta, by mogła przewidywać rozgrywkę w papier, kamień, nożyce. Sieć ta nie jest wystarczająco głęboka. Pogłębianie sieci neuronowej polega na dokładaniu kolejnych warstw. Żeby to lepiej przedstawić wspomożemy się kolejnym rysunkiem. Zmienimy teraz odrobinę konwencję na rysunku, tak by można było go czytelniej przedstawić. Współczynniki będziemy reprezentować połączeniami, natomiast w kwadratach z zaokrąglonymi wierzchołkami będziemy zapisywać wartości pośrednie.

3 warstwowa sieć neuronowa

Mam nadzieję, że powyższy schemat Cię nie przeraża. Przeanalizujmy go krok po kroku.

  • Warstwa wejściowa jest już dobrze znana. Jest to kombinacja [moja ręka, ręka przeciwnika].
  • Kolorowe połączenia reprezentują współczynniki. To właśnie te kolorowe połączenia będą aktualizowane podczas kroku wstecz. Połączenia nazywamy czasem synapsami.
  • Następnie występuje warstwa ukryta. Po przemnożeniu współczynnika przez wartość wejściową sumujemy oba wyniki, normalizujemy (możemy, ale nie musimy, tak jak wcześniej przy pomocy sigmoidy). Pośrednie wyniki “przechowujemy” w warstwie ukrytej (tutaj reprezentowane przy pomocy kwadratów z zakrogląnymi wierzchołkami).
  • Kolejna synapsa łączy wartości pośrednie z warstwy ukrytej z warstwą wyjściową. Tam wartości pośrednie przemnożone przez kolejny zestaw współczynników są sumowane, normalizowane i otrzymujemy wynik - liczbę z przedziału od 0 do 1.

Tak skonstruowana sieć składa się z trzech warstw (czasem mówi się o dwóch, nie wliczając warstwy wejściowej). Pierwsza warstwa ma rozmiar równy 2 (gdyż ma dwa pola - reprezentujące rękę gracza oraz rękę przeciwnika). Druga warstwa ma rozmiar równy 4 (gdyż przechowuje 4 warstwy pośrednie). Ostatnia warstwa ma wymiar 1.

Pierwsza synapsa - łącząca warstwę wejściową oraz ukrytą - ma 8 współczynników (wymiar warstwy wejściowej pomnożony przez wymiar warstwy ukrytej). Druga synapsa - ma 4 współczynniki (wymiar warstwy ukrytej pomnożony przez wymiar warstwy wyjściowej).

Sieć utworzona w taki sposób jest już w stanie rozpoznawać wynik rozgrywki z błędem poniżej 1%, czyli z 99% pewnością.

Podsumowanie

Mam nadzieję, że na podstawie prostej gry udało nam się omówić klasyczny przykład sieci neuronowej. Przy pomocy tego narzędzia - w znacznie bardziej skomplikowanej oraz głębszej postaci - maszyny są w stanie rozpoznawać twarze na obrazach, rozumieć polecenia głosowe, czy przewidywać gusta użytkowników netflixa. Starałem się maksymalnie uprościć technikalia, by przedstawić tylko główne elementy idei. Ominęliśmy więc zarówno rachunek macierzowy jak i pochodne cząstkowe. Mam jednak nadzieję, że ten post odarł sieci neuronowe z półmitycznej otoczki, która jest mu nadawana, a może nawet kogoś zainteresuje by zgłębić temat dalej.


Do you want more?

If you like this content, subscribe to receive updates when more goodness like this is published. No spam, ever.


Updated:

Leave a Comment