Action Science

Neuron idzie do szkoły

Chciałbym przedstawić drogim czytelnikom prosty sposób nauki neuronu sprowadzający się w zasadzie do dodawania (i odejmowania). Nauka będzie przeprowadzana dla neuronu którego funkcja aktywacji wygląda następująco:
y=-1 gdy z<0
y=1 gdy z>=0
Jest to czwarta z przedstawianych powyżej.
Przyjmijmy dla uproszczenia, że chcemy klasyfikować obszary mające tylko jeden wymiar. Dzięki temu wszystkie modyfikacje wag i ich przyczyny będzie można zobrazować na płaskim (2D) wykresie. Jeśli chcielibyśmy to samo rysować dla obrazów posiadających dwa wymiary (atrybuty) to potrzebne by nam były wykresy 3D (dla 3 wymiarów 4D - ja takich nie umiem rysować :). Należy również pamiętać o fakcie, że dla udanej nauki potrzeba do neuronu doprowadzić jakiś stały sygnał (dlatego liczba analizowanych wymiarów jest zawsze o jeden większa niż liczba atrybutów obiektów). Nasz neuronik będzie wyglądał następująco:

Funkcja realizowana przez taki neuron wygląda następująco:
z=w1*x+w2
Widać wyraźnie, że wzór ten powstaje z ogólego wzoru na prostą przechodzącą przez punkt (0,0):
0=A*x+B*y
W naszym przypadku y=1. Nauka neuronu sprowadza się do znalezienia takiego A i B, żeby wszystkie wzorce, które mają być przez neuron interpretowane jako 1 znajdowały się po dodatniej (wskazywanej przez wektor prostopadły) stronie tej prostej, natomiast te które mają zwracać -1, były po przeciwnej. Wektorem prostopadłym do tej prostej jest wektor mający współżędne równe współczynnikom przy x i y, czyli A i B, a przekładając to na neuronik są to wagi w1 i w2.
I może od razu mały przykładzik. Mamy następujący zbiór uczący:
Wejście:Wyjście
-4-1
-11
11
31

Przyjmijmy, że na początku wektor wag jest równy=[3,1]. Graficzna interpretacja jest następująca (na czerwono zostały zaznaczone punkty które mają zwrócić 1, na niebiesko te które zwracają -1):


Dzięki temu, że wszystkie współżędne y są równe 1 jest możliwe znalezienie prostej przechodzącej przez początek układu współrzędnych rozdzelejącej wszystkie punkty.
Z powyższego rysunku widać, że punkty 1,3 i 4 są przez neuron dobrze klasyfikowane. Niestety dla drugiegp punktu siec zwraca -1 zamiast 1. Aby to naprawić należy zmodyfikować wektor wag dodając do niego wektor wzorca przemnożony przez pewną stałą. Stała ta powinna być równa 2*ni (źródło: [I]), gdzie ni jest współczynnikiem określającym szybkość uczenia. Do dalszych rozważań przyjmijmy ni równe 1.
Nowy wektor wag będzie więc równy:
[w]=[3,1]+[-1,1]*2=[1,3]
A tak to wygląda graficznie:


Okazuje się, że tak otrzymana linia decyzyjna (zaznaczona grubą krechą) zapewnia nam poprawne klasyfikowanie wszystkich wzorców.
A co zrobić w przeciwnym przypadku, gdy dla jakiegoś wzorca sieć zwraca 1 zamiast -1. Odpowiedź jest bardzo prosta: jeżeli jakiś wzorzec znalazł się po dodatniej stronie wykresu, choć nie powinien to jego symetryczne odbicie (względem początku układu współrzędnych) powinno się tam znaleźć. Z tego wynika, że w takim przypadku też trzeba do wektora wag dodać podwojony wektor wzorca, ale z przeciwnym znakiem. Obrazuje to przykład:
Przed modyfikacja mamy następującą sytuację (punkt niebieski: 1,1; punkt czerwony 2,1; początkowy wektor wag: [4,-1]):


Nowy wektor wag będzie więc równy:
[w]=[4,-1]-[1,1]*2=[2,-3]
Graficzna interpretacja:


W ten sposób otrzymaliśmy linię decyzyjną, która poprawnie rozpoznaje nam wzrorce.
Podsumowując: celem nauczenia neuronu dowolnych wzorców (oczywiście muszą być liniowo separowalne) należy na wejście neuronu podawać po kolei wszystkie wzorce i sprawdzać, czy oczekiwane wyjście jest równe od otrzymanego. Gdy warunek ten nie jest spełniony należy skorygować wagi:
[w1,w2]nowe=[w1,w2]stare+2*[x,y], gdy otrzymano -1 dla 'dodatniego' wzorca
lub
[w1,w2]nowe=[w1,w2]stare-2*[x,y], gdy otrzymano 1 dla 'ujemnego' wzorca
Można to uogólnić:
[w1,w2]nowe=[w1,w2]stare+2*{oczekiwane wyjście}*[x,y]
Gdy po n iteracjach okarze się, że wszystkie wzorce zwracają to co powinny możemy zakończyć naukę neuronu.

I mały przykładzik:
Mamy następujące wzorce:
- punkty niebieskie: [-1,1][1,1], dla których sieć ma zwracać -1
- punkt czerwony: [3,1] ,dla którego sieć ma zwracać 1
Początkowe wartości wag: w1=3,w2=1.
Na wykresie wygląda to następująco:


Krok 1
Sieć niepoprawnie klasyfikuje punkt 2 - oczekiwane wyjście: -1, otrzymane: 1
Modyfikacja wektora wag: [w]=[3,1]-2*[1,1]=[1,-1]
Wykres

Krok 2
Proszę zauważyć (patrz poprzedni wykres), że punkt 2 leży na lini decyzyjnej. Gdybyśmy mieli trochę inną funkcję aktywacji, która dla sumy ważonej równej 0 zwracałaby -1 to na tym kroku moglibyśmy zakończyć naukę. Nasza funkcja aktywacji wymaga jednak wartości sumy ważonej ostro mniejszej od zera.
Modyfikacja wektora wag: [w]=[1,-1]-2*[1,1]=[-1,-3]
Wykres

Krok 3
Sieć niepoprawnie klasyfikuje punkt 3 - oczekiwane wyjście: 1, otrzymane: -1
Modyfikacja wektora wag: [w]=[-1,-3]+2*[3,1]=[5,-1]
Wykres

Krok 4
Sieć niepoprawnie klasyfikuje punkt 2 - oczekiwane wyjście: -1, otrzymane: 1
Modyfikacja wektora wag: [w]=[5,-1]-2*[1,1]=[3,-3]
Wykres

Krok 5
Podobna sytuacja jak w kroku 2. Linia decyzyjna przechodzi przez punkt 2.
Modyfikacja wektora wag: [w]=[3,-3]-2*[1,1]=[1,-5]
Wykres

Krok 6
Sieć niepoprawnie klasyfikuje punkt 3 - oczekiwane wyjście: 1, otrzymane: -1
Modyfikacja wektora wag: [w]=[1,-5]+2*[3,1]=[7,-3]
Wykres

Krok 7
Sieć niepoprawnie klasyfikuje punkt 2 - oczekiwane wyjście: -1, otrzymane: 1
Modyfikacja wektora wag: [w]=[7,-3]-2*[1,1]=[5,-5]
Wykres

Krok 8
I znowu powtarza się sytuacja z kroków 2 i 5
Modyfikacja wektora wag: [w]=[5,-5]-2*[1,1]=[3,-7]
Wykres

Krok 9
Tym oto sposobem otrzymaliśmy prostą, która rozdziela nam punkty niebieskie od czerwonych. W sumie były tylko trzy wzorce, a musieliśmy wykonać, aż osiem iteracji... Proszę zauważyć, że z liczbą iteracji maleje kąt o jaki zmienia się linia decyzyjna. Dzięki czemu może ona coraz dokładniej wpasowywać się pomiędzy wzorce. Dzieje się to dzięki stopniowemu wydłużaniu się wektora prostopadłego (dlatego do wag był dodawany wektor wzorca przemnożony przez współczynnik, gdyby tego współczynnika nie było zmiany wektora w kolejnych iteracjach znosiłyby się).

Aby rozszerzyć możliwości neuronika o rozpoznawanie obrazów mających więcej wymiarów (atrybutów) należy dodać do niego kilka dodatkowych wejść (po jednym na każdy atrybut). Procedura nauki wogóle nie ulegnie zmianie. Należy tylko pamiętać o modyfikacji wszystkich wag neuronika.
Na koniec chciałbym jeszcze opowiedzieć jak wykorzystać neuroniki do klasyfikacji obrazów należących do kilku różnych klas. Aby to było możliwe należy wykorzystać kilka neuroników połączonych równolegle:



Na obrazku przedstawiony jest system, który klasyfikuje obrazki na płaszczyźnie (wejścia x i y) do trzech różnych klas (y1,y2,y3). Podobnie jak w przypadku pojedynczego neuronu poszczególne klasy muszą być liniowo separowalne (z tym ograniczeniem zrywają dopiero sieci warstwowe). Np:



Proszę zauważyć, że każdy z tych neuronów możemy analizować osobno (wyjście jednego neuronu nie zależy od zachowania się pozostałych - ważny jest tylko poziom sygnału wejściowego). Dlatego proces nauki możemy przeprowadzić osobno dla każdego z nich w ten sam sposób w jaki robiliśmy to powyżej. Poprawnie nauczony neuron jest aktywny (ma wartość 1) gdy na wejściu pojawia się sygnał należący do klasy którą ten neuron rozpoznaje i jest nieaktywny (wartość -1) gdy na wejściu jest coś innego.

I w ten sposób dobrnęliśmy do końca. W razie jakichkolwiek niejasności proszę pytać: kopper@box43.gnet.pl

ps. A tutaj mamy program przedstawiający naukę neuronu ze skokową funkcją aktywacji: Siec.rar - 45291 bajtów


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


  Poprzedni artykułNastępny artykuł  

  Menu Kontakt  



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


Action Science