Oczywiście Scilab

Transkrypt

Oczywiście Scilab
W0
Uczenie się pojedynczego neuronu
X0=1
W1
x1
s
W2
f
y
x2
Wp
xp
𝑝
𝑥𝑖 𝑤𝑖=𝑥 ′ 𝑤 +𝑤𝑜
𝑖=0
Jeśli zastosowana zostanie funkcja bipolarna sy:
y=-1
y=1
gdy
gdy
z<0
z>=0
Wówczas:
W1x1 + w2x2 +  = 0
Algorytm uczenia perceptronu:
1.
2.
3.
4.
5.
Wybierz losowe początkowe wagi neuronu.
Ucz perceptron, wykorzystując kolejne elementy xi zbioru uczącego Z.
Oblicz wartośd wyjściową yi perceptornu zgodnie z formułą:
y = f(x’w + )
Jeżeli wartośd yi różni się od wartości wzorcowej d(xi), dokonaj modyfikacji wag według formuły:
W(t+1) = w(t) + d(xi)*xi
Wród do punktu 2.
Algorytm powtarza się tak długo, aż dla wszystkich obserwacji błąd na wyjściu będzie mniejszy od założonej
tolerancji. Dany zbiór uczący może zostad użyty wielokrotnie.
Przykład:
Przypuśdmy, że chcemy zbudowad SN, która klasyfikuje punkty na punkty ujemne i dodatnie.
Jeśli mamy 3 punkty:
X1 = (1,2) oraz x3=(0,-1) które mają byd klasyfikowane jako dodatnie, oraz punkt x2=(-1,2) klasyfikowany jako
ujemny. To ich reprezentacja będzie następująca, jeśli założymy też ze początkowo wektor wag wynosi w=(1,0.8)
Y = 1 x -0.8
A więc wykres funkcji prostopadłej do tej będzie
Y = -x -0.8
Wówczas powiemy, że d(x1)=1, d(x3)=1, zaś d(x2)=-1.
Wówczas klasyfikacja jednoznaczna tych punktów będzie następująca:
3
2
1
0
-10
-5
-1 0
5
10
-2
dodatnie
ujemne
w
Liniowy (w)
I jak widad, nie będzie możliwe jednoznaczne klasyfikowanie punktów…linią i wektorem wag bowiem punkty x1
i x3 (dodatnie, niebieskie kwadraty) nie są w jednej osi.
Zatem trzeba zmodyfikowad wektor wag.
Y = f(x’w + )
Zatem y1 = sgn(x1’w(0)) = sgn (1,2)(1,-0.8)=sgn(1*1 + 2 * (-0.8)) = sgn(1 – 1.6) = sgn(-0.6) = -1
W(1) = w(0) + d(x1) *x1 = (1,-0.8) + 1*(1,2) = (2,1.2)
Teraz mam klasyfikację taką:
3
2
1
0
-10
-5
-1 0
5
10
-2
dodatnie
ujemne
w
Liniowy (w)
Nadal nie mamy dobrej klasyfikacji dla punktów.
Zatem musimy ponownie liczyd wagi.
Zatem
Y2 = sgn(x2’w(1)) = sgn (-1,2)(2,1.2)= sgn(-2 +2.4) = sgn(0.4) = 1
W(2) = w(1) + d(x2) *x2 = (2,1.2) + (-1)*(1,-2) = (3,-0.8)
Teraz mam klasyfikację taką:
2.5
2
1.5
1
0.5
0
-10
-5
-0.5 0
5
10
-1
-1.5
dodatnie
ujemne
w
Liniowy (w)
Nadal nie mamy dobrej klasyfikacji dla punktów.
Zatem musimy ponownie liczyd wagi.
Zatem
Y3 = sgn(x3’w(2)) = sgn (0,-1)(3,-0.8)= sgn(0-0.8) = sgn(-0.8) = -1
W(3) = w(2) + d(x3) *x3 = (3,-0.8) + (-1)*(0,-1) = (3,0.2)
Teraz mam klasyfikację taką:
2.5
2
1.5
1
0.5
0
-10
-5
-0.5 0
5
10
-1
-1.5
dodatnie
ujemne
w
Liniowy (w)
Zadanie dla studentów:
Nasz neuron będzie wyglądał następująco:
Funkcja
realizowana
przez
taki
neuron
wygląda
następująco:
z=w1*x+w2
Widad wyraźnie, że wzór ten powstaje z ogólnego 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ą byd przez neuron interpretowane jako 1 znajdowały się po dodatniej (wskazywanej przez wektor
prostopadły) stronie tej prostej, natomiast te, które mają zwracad -1, były po przeciwnej. Wektorem
prostopadłym do tej prostej jest wektor mający współrzędne równe współczynnikom przy x i y, czyli A i B, a
przekładając to na neuron są to wagi w1 i w2.
I może od razu mały przykład. Mamy następujący zbiór uczący:
Wejście:
Wyjście
-4
-1
-1
1
1
1
3
1
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ócid 1, na
niebiesko te które zwracają -1):
Dzięki temu, że wszystkie współrzędne y są równe 1 jest możliwe znalezienie prostej przechodzącej przez
początek
układu
współrzędnych
rozdzielającej
wszystkie
punkty.
Dla punktu P1: jeśli x=-4 to y = w1 * x + w2 = -4 * 3 + 1 = -11
Dla punktu P2: jeśli x=-1 to y = w1 * x + w2 = -1 * 3 + 1 = -2
Dla punktu P3: jeśli x=1 to y = w1 * x + w2 = 1 * 3 + 1 = 4
Dla punktu P4: jeśli x=3 to y = w1 * x + w2 = 3 * 3 + 1 = 10
Wiadomo, że neuron działa tak, że jeśli dostanie wartośd mniejszą od 0 to y = -1 a jeśli większą od zera to y = 1.
W takim razie:
Skoro punkt 1: sgn(y) = sgn(-11) = -1
Skoro punkt 2: sgn(y) = sgn(-2) = -1
Skoro punkt 3: sgn(y) = sgn(4) = 1
Skoro punkt 4: sgn(y) = sgn(10) =1
Z powyższego rysunku widad, że punkty 1,3 i 4 są przez neuron dobrze klasyfikowane. Niestety dla drugiego
punktu siec zwraca -1 zamiast 1. Aby to naprawid należy zmodyfikowad wektor wag dodając do niego wektor
wzorca przemnożony przez pewną stałą. Stała ta powinna byd równa 2*ni (źródło: *I+), gdzie ni jest
współczynnikiem określającym szybkośd uczenia. Do dalszych rozważao przyjmijmy ni równe 1.
Nowy wektor wag będzie więc równy:
[w]=[3,1]+[-1,1]*2=[1,3]
Dla punktu P1: jeśli x=-4 to y = w1 * x + w2 = -4 * 1 + 3 = -1
Dla punktu P2: jeśli x=-1 to y = w1 * x + w2 = -1 * 1 + 3 = 2
Dla punktu P3: jeśli x=1 to y = w1 * x + w2 = 1 * 1 + 3 = 4
Dla punktu P4: jeśli x=3 to y = w1 * x + w2 = 3 * 1 + 3 = 6
Skoro punkt 1: sgn(y) = sgn(-1) = -1
Skoro punkt 2: sgn(y) = sgn(2) = 1
Skoro punkt 3: sgn(y) = sgn(4) = 1
Skoro punkt 4: sgn(y) = sgn(6) =1
Jeśli w2 = [1,3] to prosta o równaniu: y = 1 * x + 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 zrobid w przeciwnym przypadku, gdy dla jakiegoś wzorca sied zwraca 1 zamiast -1. Odpowiedź jest bardzo
prosta: jeżeli jakiś wzorzec znalazł się po dodatniej stronie wykresu, chod nie powinien to jego symetryczne
odbicie (względem początku układu współrzędnych) powinno się tam znaleźd. Z tego wynika, że w takim
przypadku też trzeba do wektora wag dodad 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ą byd liniowo separowalne)
należy na wejście neuronu podawad po kolei wszystkie wzorce i sprawdzad, czy oczekiwane wyjście jest równe
od otrzymanego. Gdy warunek ten nie jest spełniony należy skorygowad wagi:
[w1,w2]nowe=[w1,w2]stare+2*[x,y],
lub
[w1,w2]nowe=[w1,w2]stare-2*[x,y],
Można to uogólnid:
gdy
otrzymano
-1
dla
'dodatniego'
wzorca
gdy
otrzymano
1
dla
'ujemnego'
wzorca
*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 zakooczyd naukę neuronu.
I mały przykład:
Mamy następujące wzorce:
- punkty niebieskie: [-1,1+*1,1+, dla których sied ma zwracad -1
- punkt czerwony: *3,1+ ,dla którego sied ma zwracad 1
Początkowe wartości wag: w1=3,w2=1.
Na wykresie wygląda to następująco:
Krok 1
Sied niepoprawnie klasyfikuje punkt 2 - oczekiwane wyjście: -1, otrzymane: 1
Modyfikacja wektora wag: [w]=[3,1]-2*[1,1]=[1,-1]
Wstaw wykres
Krok 2
Proszę zauważyd (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 zakooczyd
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]
Wstaw wykres
Krok 3
Sied niepoprawnie klasyfikuje punkt 3 - oczekiwane wyjście: 1, otrzymane: -1
Modyfikacja wektora wag: [w]=[-1,-3]+2*[3,1]=[5,-1]
Wstaw wykres
Krok 4
Sied niepoprawnie klasyfikuje punkt 2 - oczekiwane wyjście: -1, otrzymane: 1
Modyfikacja wektora wag: [w]=[5,-1]-2*[1,1]=[3,-3]
Wstaw 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]
Wstaw wykres
Krok 6
Sied niepoprawnie klasyfikuje punkt 3 - oczekiwane wyjście: 1, otrzymane: -1
Modyfikacja wektora wag: [w]=[1,-5]+2*[3,1]=[7,-3]
Wstaw wykres
Krok 7
Sied niepoprawnie klasyfikuje punkt 2 - oczekiwane wyjście: -1, otrzymane: 1
Modyfikacja wektora wag: [w]=[7,-3]-2*[1,1]=[5,-5]
Wstaw 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]
Wstaw wykres
Krok 9
Tym oto sposobem otrzymaliśmy prostą, która rozdziela nam punkty niebieskie od czerwonych.