Action Science
      Action Mag / Action Science / Biologia / Sieci neuronowe
Poprzedni artykuł | str. 13 | Następny artykuł


Sieci neuronowe

Na pewno każdy oglądał taki film co się Terminator nazywał. I taki T800 to jest w sumie to do czego dążę podczas moich badań (ale ja nie będę pracował dla wojska). No dobra żarty na bok bo to poważna sprawa.
To że ludzki umysł wygrywa z komputerem w prawie wszystkich dziedzinach nie jest chyba dla nikogo nowością. Oczywiście żaden z nas nie podtrafi udzielić odpowiedzi na pytanie ile jest 8934.12*34.45/(cos(45.12)+2), komputer zrobi to bez problemu. Ale np. jeśli się nie określi dokładnie np. operatora + (to znaczy dodawanie) to się komputer wyłoży. A nam nikt nie implementował operatora +. My na podstawie wzorców uczących wyłapaliśmy, że jak mamy przed oczami 2+2=4 albo 1+5=6 albo wiele innych to taki plusik coś może oznaczać i nasz mózg się go zaczął uczyć. Ze wszystkich wzorców jakie mu zapodaliśmy na wejście wyłapał regułę z jaką działa taki plusik i teraz nasz mózg potrafi dodawać wszystkie liczby, a nie tylko te które pojawiły się w zbiorze uczącym. Sztuczne sieci neuronowe próbóją robić to co nasz mózg. To znaczy nie mają dokadnie określonego algorytmu działania... Najpierw dostają na wejście jakieś wzorce (tzw. zbiór uczący), a póżniej w czasie normalnej pracy dostają na wejście sygnał który nie był w zbiorze uczącym. I jeśli sieć jest dobrze nauczona to go poprawnie zklasyfikuje (to znaczy zrobi z nim to co powinna-tak jak my pięknie potrafimy dodawać).
Powyższe wyjaśnienie jest trochę zagmatwane, więc pozwolę sobie na drobny przykładzik.
Oto on:
Acha nie napisałem jeszcze jak wygląda sztuczna sieć neurnonowa.
Na razie przyjmijmy dla uproszczenia, że jest to czarna skrzynka do której dochodzą jakieś sygnały wejściowe i wychodzą jakieś wyjściowe.
No więc nasza sieć ma zrealizować coś takiego:
we: 0 -> wy 1
we: 2 -> wy 1
we: 3 -> wy 1
we: 5 -> wy 1
we: 6 -> wy 1
we: 7 -> wy 0
we: 8 -> wy 0
we: 9 -> wy 0
we: 12 -> wy 0
we: 18 -> wy 0

To znaczy że jak na wejściu pojawi się np. 3 to na wyjściu chcemy 1. Łatwo wywnioskować, że sieć dla sygnałów mniejszych od 7 ma dać na wyjściu 1 a dla większych 0. Oznacza to że jak powyższy zbiór uczący dobrze nauczy sieć to jak jej póżniej zapodamy na wejście np 11 to dostaniemy 0.
Oczywiście funkcję realizowaną przez tą sieć można bardzo łatwo zaimplementować jako zwykłą procedurkę jakiegoś bylejakiego języka (np.:
int xxx(int l){return(l<7);}//przykładzik w c, bo lubie ten język).
I to by było dobre, ale do czasu. Bo np. możemy wpaść na pomysł, żeby zmienić zbiór uczący (np. chcemy przesunąć próg np. na 17-tke). W przypadku sieci wystarczy powtórzych proces nauki (nie ingerujemy w kod programu). Poza tym sieć neuronowa może uczyć się w trakcie pracy (program jest w tym wypadku sztywny). Dodatkową zaletą sieci jest to że potrafi wyłapać cechy charakterystyczne bardzo zawiłej funkcji (to co podałem powyżej to tylko trywialny przykład) (Przydaje się to podczas aproksymacji jakiejś funkcji, gdy mamy tylko kilka jej punktów charakterystycznych).
Mam nadzieję, że powyższe opowieści przynajmniej po części wyjaśniły o co chodzi w sieciach... (jak nie to proszę o zapytania...)
A teraz zajmijmy się tym "czarnym pudełkiem"...
No więc najprostrza sieć neuronowa to... pojedynczy neuron... A czym jest taki neuron... No więc jest to coś co ma wiele wejść i jedno wyjście. Każde wejście ma jakąś wagę.. I neuronik na wyjściu daje sygnał opisany wzorem:
z=w1*x1+w2*x2+w3*x3+......+wn*xn-w0
gdzie: - n oznacza liczbę wejść,
- x(1-n) to poszczególne wejści,
- w(1-n) to wagi poszczególnych wejść.
Drobnego wytłumaczenia wymaga ostatni składnik powyższej sumy. Mianowicie w0 to waga sztucznie stworzonego wejścia, które ma zawsze wartość -1. To wejście jest po coś potrzebne (mądre książki tak mówią...).
Ale takie 'z' to sobie może mieć w sumie bardzo różne wartości (w zależności od wag i sygnałów wejściowych). No i trzeba wyjście neuronika trochę znormalizować... Więc tak obliczone z przepuszczamy jeszcze przez tzw. funkcję aktywacji. W najprostrzym przypadku jest to funkcja progowa opisana wzorem:
y=(z<0)?0:1; //znowu C (jak ktoś nie rozumie to objaśniam: jeśli z jest mniejsze od 0 to y jest równe 0 jak jest większe to y jest równe 1)
Proces nauki polega na zapodawaniu na wejście neuronu wzorców (zbioru uczącego) i odpowiedniej korekcji wag aż do otrzymania zerowego błędu dla wszystkich wzorców.
Wydawać by się mogło, że taki biedny neuronik co to umie tylko dodawać i mnożyć nie jest w stanie zaszaleć... Nic bardziej błędnego. Otóż pojednyczy neuron potrafi klasyfikować obrazy liniowo separowalne. Takie jak np. ten przykład powyższy... W przykładnie powyższym mieliśmy tylko jedno wejście. Oczywiście można liczbę wejść zwiększać w nieskończoność. Oznacza to, że klasyfikować można punkty na płaszczyźnie, czy przestrzeni...itd... Robi wrażenie... nie...
Kiedy do mnie dotarła idea/istota działania pojedynczego neuronu z progową funkcją aktywacji to ochoczo zabrałem się do sieci od strony praktycznej. No i wygenerowałem programik który obrazuje klasyfikację pojedynczego neuronu. Rysujemy na płaszczyźnie punkty należące do dwóch różnych klas (to jest nasz zbiór uczący) i uczymy neuronik (dwa wejścia jedno wyjście). Po nauce programik pokazuje jak się neuronik nauczył (pokazana jest linia decyzyjna która oddziela od siebie obszary z obu klas). Gdybyśmy na wejście tak nauczonego neuronu zapodali jakiś punkt który nie był w zbiorze uczącym to neuronik by go poprawnie sklasyfikował. Programik ten jest w dziale: 'Trochę mojego kodu'.
A teraz wyjaśnię znaczenie zwrotu "liniowo separowalne". Oznacza to że jeśli chcemy klasyfikować np. punkty na płaszczyźnie to musi istnieć linia prosta, która dzieli cały obszar na dwa półobszary. W jednym będą znajdować się obrazy z jednej klasy a w drugiej z drugiej (nauczanie neuronu to właśnie szukanie tej lini decyzyjnej). Jeśli obrazy nie będą liniowo separowalne to pojedynczy neuronik się tego nie nauczy...:(... (Jeśli byśmy sobie do poprzedniego przykładu dodali następującą parę uczącą: we: 13 -> wy 1 to pojedynczy neuronik by sobie nie dał rady...) . Innym przykładem jest funkcja XOR:
we1:0 we2:0 -> wy:0
we1:0 we2:1 -> wy:1
we1:1 we2:0 -> wy:1
we1:1 we2:1 -> wy:0
No dobra to chyba wszystko co można ogólnie powiedzieć o neuronach (oczywiście jest to tylko szczycik góry lodowej). Jeśli ktoś ma ochotę na więcej to proszę pytać...


Autor: Kopper
E-mail: kopper@box43.gnet.pl




Poprzedni artykuł | str. 13 | Następny artykuł




Przedruk artykułów tylko za zgodą redakcji.
Copyright 2000 - 2001 Action Science. Wszelkie prawa zastrzeżone.