qBlog Quadina w świecie PHP

4kwi/100

Sztuczna inteligencja – teoria

Temat jest bardzo skomplikowany i zawiły, powiedzieć można że nie jest szeroki jak rzeka, ale jak ocean. Na swojej drodze programowania w PHP nauczyłem się upraszczać pewne modele rzeczywiste do znacznie prostszych wirtualnych. Bardzo często moje wirtualne modele mają tylko wejście i wyjście takie samo, a środek zupełnie odbiegający od rzeczywistości. W związku z tym realia sztucznej inteligencji bardzo mi się spodobały. Dany wirtualny mózg przetwarza informacje w taki sposób, że nie da się w prosty sposób debugować praktycznie żadnych operacji. Takich operacji tak jak w naszym ludzkim mózgu jest po prostu za dużo. Ale możemy postarać się zrozumieć teorie na podstawie której będziemy mogli choć w jakimś procencie przyswoić sobie wiedzę o sztucznej inteligencji, a może nawet o naszej własnej?

Uprościmy wszystko do wersji dość "łopatologicznej", a więc poniższy artykuł prócz zrozumienia teorii nie stanowi żadnego edukacyjnego materiału, którego będziecie mogli użyć w szkole, na studiach czy gdziekolwiek indziej. Mimo tego mam nadzieje, że przyda się ono Wam do zrozumienia zasad działania takich sieci.

Zacznijmy od teorii. Czy wiesz z czego skonstruowany jest Twój mózg? Oczywiście, że wiesz - neurony. Cały mózg to nieskończenie zawiła siatka milionów małych komórek neuronowych. Jakie zadanie ma neuron i co ma wspólnego z sztuczną inteligencją? Jak można się domyśleć - bardzo dużo. Neuron to podstawowa jednostka systemów sztucznej inteligencji, jest zbudowana w taki sposób, aby odtwarzać funkcjonalności jakie ma nasza naturalna komórka neuronowa.

Neuron zbudowany jest z trzech części: ciała komórki, dendrytów oraz aksonu. Impuls elektryczny przechodzi przez dendryty, wchodzi do ciała komórki, która decyduje o wysłaniu sygnału dalej, jego opóźnieniu, albo zupełnym braku. Komórka wysyła aksonem impuls do kolejnych neuronów. Upraszczając dostaje wiele wejść, przetwarza sygnał i zostawia na wyjściu jeden określony sygnał. Jednak takie uproszczenie na potrzeby sztucznej inteligencji jest zbyt wielkie, więc neuron przedstawię książkowo.

Powyższy schemat w zupełności wystarczy do opisania działania pojedynczego neuronu. Jak widać, nasz neuron uprościłem do dwóch części. Pierwszym z nich jest sumator - odpowiada on za zsumowanie wszystkich wejść. Sumator przechowuje tak zwaną wagę każdego z wejść. Mnoży wejście razy wagę dla tego wejścia i wszystkie te iloczyny sumuje w jedną wartość którą przekazuje do akceptora. Akceptor jest niczym innym jak funkcją ciągłą w zakresie od -1 do 1. Używa się zazwyczaj jakiejś funkcji sinusoidalnej, dzięki temu pochodna wynosi 1/x (co przyda się potem przy uczeniu neuronu pewnych zachowań). Początkowo wszystkie wagi są wybrane losowo, ich jednolitość, albo ciągłość uniemożliwia uczenie się systemu reakcji na bodźce.

Tak skonstruowany neuron wykonuje zadanie dokładnie takie jak w naszym mózgu. Otrzymuje sygnał, odpowiednio go sumuje. Następnie ciało komórki decyduje, czy sygnał jest wystarczająco mocny aby przekazywać go dalej i ewentualnie przekazuje go na wyjście (akson).

No niby wszystko jasne, ale jak taki neuron może wykonywać tak złożone zadania jak nasz mózg? Pojedynczy neuron oczywiście nie, ale cała ich siatka potrafi naprawdę wiele. W naszym mózgu siatka jest nieskończenie zawiła i nie będę tutaj omawiał jak biolodzy ją klasyfikują. Dla nas najważniejsze jest to w jaki sposób odtwarzamy tę rzeczywistość w naszym wirtualnym modelu. Używa się kilku sposobów tworzenia takich siatek, ale my zajmiemy się tym najbardziej popularnym 3 warstwowym.

Neurony ustawiamy w 3 kolejne rzędy. Zazwyczaj konstruuje się systemy które mają więcej wejść niż wyjść (na odwrót jeszcze się osobiście nie spotkałem). W naszym przykładzie użyłem systemu 4-3-2.

Pierwsza warstwa nazywana warstwą wejściową składa się zazwyczaj z największej ilości neuronów. Każdy z nich posiada tylko jedno wejście i jest to wejście na którym otrzymuje dane z zewnątrz. Dane zewnętrzne zazwyczaj są podane w firmie bitowej, to jest 1 i 0, ale spotkałem się już np. przy analizie wykresów z wartościami zmiennoprzecinkowymi z zakresu -1 do 1.

Warstwa ukryta posiada ilość neuronów mniejszą niż warstwa wejściowa. Dla uproszczenia liczymy ją podobnie jak we wzorze Pitagorasa. Pierwiastek z sumy kwadratów ilości neuronów warstwy wejściowej i wyjściowej. Informacja ta nie jest zawsze trafiona, ale ilustruje mniej więcej w jaki sposób dobierać ją wstępnie. Zależnie od różnorodności zadania jakie ma wykonać dany "mózg" ilość ta się zwiększa albo zmniejsza. Każdy neuron z warstwy ukrytej łączy się z każdym neuronem warstwy wejściowej.

Ostatnią warstwą jest warstwa wyjściowa, która na zakończeniu akceptorów podaje wynik danej operacji. Warstwa wyjściowa jest krytyczną warstwą podczas procesu uczenia i podlega innym prawom w tym procesie. Podobnie jak warstwa ukryta, neurony w tej warstwie łączą się z każdym neuronem warstwy poprzedniej.

Cały proces "myślenia" takiego wirtualnego mózgu, a dokładniej ujmując, wykonania pojedynczej operacji przebiega bardzo prosto. Podajemy na wejściu do każdego neuronu dane, czekamy na wynik. Kiedy obliczymy wartość dla każdego neuronu w danej warstwie, przechodzimy do warstwy kolejnej. W taki sposób otrzymujemy wynik na wyjściu siatki.

Pytanie najczęściej padające w tym momencie to: jak to działa? Tak jak pisałem na początku tego artykułu trudno debugować taki algorytm. Trudno słowami opisać jak taki mózg przelicza wartości podając poprawne dane na swoich zakończeniu. Mówiąc oględnie, siatka neuronowa przelicza na podstawie wag impulsy. Takie impulsy łączą się w kolejnych warstwach składających się z coraz mniejszej ilości neuronów, aż dojdą do warstwy wyjściowej, gdzie reprezentują dane.

Ok, ale jak takie cudo nauczyć czegokolwiek? Również bardzo prosto. Uczenie przebiega zazwyczaj z nauczycielem. Korzystamy z uczenia z nauczycielem z tego względu, że najprościej je zaimplementować i w stosunku do innych uzyskujemy poprawne wyniki bardzo szybko.

Uczenie przebiega w następujący sposób. Podajemy wzór na wejściu siatki, czekamy na obliczenia. Cały "trick" pojawia się właśnie w tym momencie. Otóż poprawną odpowiedź podajemy systemowi na - wyjściu. System neuronów otrzymując coś na wyjściu robi następującą rzecz: Liczy deltę (szczegóły omówimy w następnych artykułów), następnie dodaje ją do wszystkich wag danego neuronu zmniejszając tym samym błąd całej sieci. Obliczony neuron podaje informację dalej wstecz. Takie uczenie nazywa się profesjonalnie "Uczenie metodą wstecznej propagacji błędów".

Nauka nie kończy się na jednym przebiegu. Uczymy system podając mu ten sam wzór i oczekując jednej odpowiedzi, aż uzyskamy określony procent poprawnych odpowiedzi. Okres ten nazywany epoką trwa określoną ilość razy np. 1000 prób i oczekujemy 99,9% poprawnych odpowiedzi. Kiedy kolejna epoka z rzędu przyniesie błąd mniejszy niż oczekiwany przechodzimy do uczenia kolejnych wzorców.

W taki sposób w ciągu kilku tysięcy przebiegów nasz mózg tak zmodyfikuje swoje losowo wybrane początkowe wagi, że będzie rozpoznawać powierzone mu wzorce praktycznie bezbłędnie. Wagi po pierwszym uczeniu już bardzo mocno modyfikują swoje wartości. Z każdą kolejną epoką coraz bardziej się stabilizując.

Czym więc różni się sieć neuronowa od zwykłego prostego algorytmu? Podstawową różnicą jest fakt, że część zadań nie da się opisać drogą algorytmiczną jak np. analizowanie wykresów giełd, czy rozpoznawanie liter. Drugi przykład jest bardzo ciekawym przykładem zastosowania sztucznej inteligencji. Rozpoznawanie nawet bardzo uszkodzonych tekstów będziemy omawiać w kolejnej części tej serii artykułów o sztucznej inteligencji.

Podsumowując, sieci neuronowe, którymi już niedługo będziemy się zajmować algorytmicznie, składa się z pojedynczych neuronów połączonych ze sobą w 3 warstwy i wykonujących określone zadanie: sumowanie danych z zewnątrz i przeliczanie mocy sygnału wyjściowego. Sieci takie potrafią nauczyć się bardzo różnych rzeczy bez względu na to, czy proste rozwiązanie algorytmiczne istnieje czy też nie.

Zakres tematyczny: Programowanie Dodaj komentarz
Komentarze (0) Trackbacks (0)

Brak komentarzy.


Leave a comment

Brak trackbacków.