530 likes | 738 Views
Systemy Wspomagania Decyzji. Zagadnienia omawiane na kursie. Sieci neuronowe (wykład 1 i 2) Algorytmy genetyczne i ewolucyjne (wykład 3 i 4) Systemy ekspertowe (wykład 5). Sieci neuronowe.
E N D
Zagadnienia omawiane na kursie • Sieci neuronowe (wykład 1 i 2) • Algorytmy genetyczne i ewolucyjne (wykład 3 i 4) • Systemy ekspertowe (wykład 5)
Sieci neuronowe Sztuczne sieci neuronowe (SSN) to matematyczne i obliczeniowe modele, których budowa została zainspirowana strukturą i funkcjonowaniem biologicznych sieci neuronowych. Zbudowane są z połączonych grup sztucznych neuronów. W większości przypadków są układami adaptacyjnymi, które potrafią zmieniać swoje parametry lub strukturę w oparciu o zewnętrzne lub wewnętrzne informacje, które przepływają przez sieć w fazie uczenia. Podstawowym elementem obliczeniowym takiej sieci jest sztuczny neuron. Podobnie do innych metod uczenia maszynowego układów uczących się z danych sieci neuronowe mogą być wykorzystywane do rozwiązywania rozmaitych problemów, które są trudne do rozwiązania metodami programowania opartymi na regułach. Do tej grupy należą np. rozpoznawanie obrazów czy rozpoznawanie mowy.
Schemat sztucznego neuron bez funkcji aktywacji x1 w1 Sumator wyjście, y x2 w2 x3 w3
Przykład 0,7 0,5 Sumator 2,89 1,2 -0,2 2,3 1,0 Jest to przykład neuronu liniowego. Można pominąć funkcję aktywacji.
Ogólny neuron nieliniowy x1 w1 gdzie f to dowolna nieliniowa funkcja aktywacji Funkcja aktywacjif Sumator s Wyjście, y x2 w2 x3 w3
Zauważmy, że w przypadku gdy funkcja aktywacji ma postać to neuron nieliniowy staje się liniowym, gdyż
Neuron z funkcją progową 1 -1 (Inna nazwa to funkcja Heaviside’a)
Przykłady funkcji aktywacji Funkcja bipolarna (dwie niezerowe wartości) Funkcja unipolarna
Funkcja sigmoidalna Wykres dla b=1.
Poniżej jest przedstawiony schemat perceptronu x0=1 w0 x1 wejście w1 x2 w2 wyjście 1 S -1 xn wn
Oznaczenia Wektory Dla wektorów zdefiniowane są dwie pierwotne operacje: dodawanie wektorów Oraz mnożenie wektora przez skalar (liczbę – na ogół R lub C): gdzie v, u to wektory, a to skalar (liczba). Ważne jest, że operacje te spełniają szereg praw (przemienność, łączność, rozdzielność itd.) Macierze (prostokątne tablice liczb) Macierz n x m
Oznaczenia Wektory: Dodawanie wektorów (wierszowych) i mnożenie przez skalar (liczbę): Czasami wektor wierszowy zapisujemy uzywając nawiasów kwadratowych: Iloczyn skalarny:
Funkcja aktywacji perceptronu Rysunkowy schemat perceptronu sugeruje następującą funkcję aktywacji W literaturze spotyka się także (może nawet częściej) inną definicję W gruncie rzeczy nie ma tu zasadniczej różnicy, gdyż perceptron służy do klasyfikacji: czy sygnał wejściowy (reprezentowany przez punkt lub wektor) należy do jednej klasy czy do drugiej.
Cześć liniowa perceptronu (sumator, S) Dla danych wag perceptronu w1, …, wn oraz progu -b, gdy impulsy wejściowe są równe x1, …, xn, to pobudzenie neuronu jest równe Używając symbolu iloczynu skalarnego możemy to zapisać też tak gdzie
Istota działania perceptronu Funkcja aktywacji rozróżnia dwa przypadki: (i) s > 0, (ii) s ≤ 0, zatem to co jest kluczowe w działaniu perceptronu sprowadza się do klasyfikacji punktów (wektorów) x=(x1,…,xn) wg poniższych nierówności: Oznacza to, że punkty x spełniające nierówność (i) będą klasyfikowane do jednej kategorii, a punkty spełniające nierówność (ii) do drugiej.
Algorytm uczenia perceptronu Uczenie sieci polega na dobieraniu wag tak, aby dla zadanych impulsów wejściowych otrzymywać oczekiwane wartości wyjściowe z neuronów. Za chwilę zajmiemy się prostym przypadkiem (mamy tylko jeden neuron) poszukiwania wag wi oraz progu b dla perceptronu. Dany mamy ciąg uczący, który składa się z dowolnej skończonej liczby wektorów oraz dodatkowych informacji mówiących do której z dwóch klas te wektory należą. Tę dodatkową informację będziemy reprezentować symbolem d (d=+1 (pierwsza klasa) lub d=-1 (druga klasa)). Przy numeracji kolejnych wektorów uczących użyjemy indeksów górnych, np. x(2), aby odróżniać się od numerowania składowych wektora (indeksy dolne). Mamy więc ciąg uczący Liczba elementów ciągu uczącego (długość ciągu) oznaczamy przez T: T=liczba par uczących w epoce
Algorytm uczenia perceptronu Losujemy wagi początkowe w1, …,wn oraz próg b. Dla t=1 do t=T wykonujemy 3., 4., 5. Na wejście podajemy kolejny wektor uczące x=x(t) i obliczamy y=f(s(x)). Porównujemy wartość wyjściową y z oczekiwaną wartością d=dtz ciągu uczącego. Dokonujemy modyfikacji wag: 5.1 Jeżeli y≠d, to w := w + d·x, b=b+d. 5.2 Jeżeli y=d, to wagi pozostają bez zmian. 6. Jeżeli w 4. była choć jedna modyfikacja, to wracamy do 2. 7. Koniec. Uwagi: 1) Zauważmy, że w p. 5.1) operacja w:=w+d·x oznacza tak naprawdę w:=w+x, b=b+1 lub w:=w-x, b=b-1. 2) Tak naprawdę to nie musimy obliczać wartości y=f(s) w p. 2. Wystarczy sprawdzać warunek: s=w○x+b > 0.
Start Losowy dobór wag t=1 Podaj wektor x(t) na wejście neuronu i pobierz d(t) Oblicz wyjście y z neuronu y(t)=d(t) ? Wagi bez zmian: w(t+1) = w(t) Modyfikacja wag: w(t+1) ← w(t)+d(t)x(t) t=t+1 t > T Czy była jakaś modyfikacja wag? Stop
Przykładowy plik z danymi, n=2 perceptron-input.txt 3 2 1 2 2 0 6 4 -2 8 -2 0 0 0 4 -20 Dla początkowych wag w1=2 w2=2 b=-4, wynik uczenia perceptronu daje: w1=8 w2=3 b=-17. Zastosowano 10 epok uczenia.
Uwagi do implementacji Zbiór danych do nauki (samples) ma liczność T=numOfSamples. Zbiór tych wektorów, czyli ciąg jest przechowywany w tablicy dwuwymiarowej double test[LIMIT][N], gdzie N=n (czyli liczba wejść perceptronu). Należy więc sprawdzać warunek Wektory uczące są przechowywane wierszami: i-ty wiersz w tablicy test to i-ty wektor uczący (w C indeksowanie jednak zaczynamy od zera, czyli t=0,…,T-1): Pierwszy wektor, t=0. Ostatni wektor, t=T-1.
Wczytywanie danych (uproszczona funkcja, n=NUM=2) void get_data() { char* fileName = "perceptron-input.txt"; FILE *fp; int i, posnum, negnum; double x, y; if ((fp = fopen(fileName,"r")) == NULL) { printf ("Could not open file. Quitting ..."); exit(1);} /* Total number of learning vectors */ numOfSamples = 0; /* read the first group */ fscanf(fp, "%d", &posnum); for (i = 0; i < posnum; i++) { fscanf(fp, "%lf %lf", &x, &y); test[numOfSamples][0] = x; test[numOfSamples][1] = y; d[numOfSamples++] = 1; /* 1 for first group */ } /* read the second group */ fscanf(fp, "%d", &negnum); for (i = 0; i < negnum; i++) { fscanf(fp, "%lf %lf", &x, &y); test[numOfSamples][0] = x; test[numOfSamples][1] = y; d[numOfSamples++] = -1; /* -1 for second group */ } }
Neuron typu adaline x0=1 w0 x1 w1 x2 w2 1 S y -1 xn wn d=delta. Pojawia się tu tzw. „reguła delta”. S w(t+1)=w(t)+hdx(t) d
Neuron typu adaline Model neuronu typu adaline (ang. AdapitiveLinearNeuron) został zaproponowany przez Bernarda Widrowa. Schemat ogólny jest pokazany na rysunku. Funkcja aktywacji przyjmowana jest zazwyczaj jako bipolarna (zwana też signum od słowa znak): gdzie Wyrażenie na s czasami zapisujemy w sposób zwarty wprowadzając rozszerzony wektor wag tak, aby zawierał próg b oraz rozszerzony wektor wejściowy zawierający dodatkowo jeden impuls x0=1: Wtedy
Budowa tego neuronu jest bardzo podobna do modelu perceptronu, a jedyna różnica dotyczy algorytmu uczenia. Sposób obliczania sygnału wyjściowego jest taki sam jak w klasycznym perceptronie, natomiast przy uczeniu neuronu adaline porównuje się sygnał wzorcowy d z sygnałem s na wyjściu części liniowej neuronu, co daje następujący błąd Uczenie (dobór wag) sprowadza się do minimalizacji funkcji błędu zdefiniowanej następującym wzorem (średni błąd kwadratowy):
Zgodnie z algorytmem – zaproponowanym przez Widrowa – do minimalizacji funkcji błędu stosuje się metodę największego spadku (podobnie jest dla neuronu sigmoidalnego). Tak więc wagi w neuronie typu adaline modyfikujemy następująco w którym h 0 jest tzw. współczynnikiem uczenia, E(w) to zdefiniowana poprzednio funkcja błędu. Współczynnik h na ogół dobiera się eksperymentalnie. Pamiętajmy, że w powyższym wzorze występuje rozszerzony wektor wag, a zatem mamy w0=b.
Obliczamy pochodną Zatem wzór na modyfikację wag przybiera postać Powyższa reguła jest szczególnym przypadkiem tzw. reguły delta (w tym przypadku nie uwzględniamy funkcji aktywacji neuronu).
Do uczenia neuronu będziemy potrzebowali ciągu uczącego gdzie x(t) to wektor sygnałów wejściowych, dt to oczekiwane wartość wyjście (1). Podstawowy krok modyfikacji wag, tj. przejście od wektora uczącego t do t+1, ma postać (w zapisie wektorowym) W zapisie dla poszczególnych składowych mamy (pamiętajmy, że w0=b, x0=1)
Przykład. Zastosować procedurę uczenia neuronu typu adaline o trzech wejściach (n=3). Posłużyć się danymi z poniższej tabeli. Optymalny dobór wag w1, w2, w3 i progu b=w0 jest następujący: -0,25; -0,25; 0,75; 0,25. Wypisywać wartości po każdej epoce. Przetestować współczynnik uczenia h=0,1 oraz h=0,001.
Model adaline (podsumowanie) Dany jest ciąg uczący W ciągu tym xt oznacza wektor sygnałów wejściowych, a dt oznacza żądaną wartość wyjścia z neuronu. Algorytm uczenia (wersja reguły delta) ma postać
Wpływ współczynnika uczenia h na jakość wag W obu przypadkach wagi początkowe były zerowe (wi=0, b=0). Wynik działania metody adaline: liczba epok=1000, h=0,1: Wynik działania metody adaline: liczba epok=1000, h=0,01:
Model neuronu sigmoidalnego x0=1 w0 x1 w1 x2 w2 s f(s) S S xn wn w ← w + h(d-f(s))f’(s)x d
Neuron sigmoidalny Funkcja aktywacji jest następująca gdzie jest zadanym parametrem. Zatem wartość sygnału wyjściowego jest dana wzorem
Wyrażenie na s możemy zapisać w sposób bardziej zwarty wprowadzając rozszerzony wektor wag tak, aby zawierał próg b (czasami oznaczany też literką theta, q) oraz rozszerzony wektor wejściowy zawierający dodatkowo jeden impuls x0=1: Wtedy
Miarę błędu E(w) definiujemy jako kwadrat różnicy wartości wzorcowej i wartości otrzymanej na wyjściu przy aktualnych wagach Do uczenia używa się reguły największego spadku. Ale teraz – w odróżnieniu od modelu adaline – uwzględniamy także funkcję aktywacji. Wagi uaktualniamy zgodnie ze wzorem metody największego spadku gdzie to gradient funkcji wielu zmiennych E(w)=E(w0,…,wn).
Rozpisując wzór na modyfikacje wag na poszczególne składowe otrzymujemy w którym h jest współczynnikiem uczenia, E(w) to zdefiniowana poprzednio funkcja błędu. Współczynnik h na ogół dobiera się eksperymentalnie. Pamiętajmy, że w powyższym wzorze występuje rozszerzony wektor wag, a zatem mamy w0=b (czasami oznaczany przez q).
Obliczamy pochodną Pochodna funkcji sigmoidalnej f’(s) wyraża się przez samą funkcję f (s) następujacym wzorem:
Ostatecznie wzór na modyfikację wag przybiera postać Powyższa reguła jest szczególnym przypadkiem tzw. reguły delta (w tym przypadku uwzględniamy funkcję aktywacji neuronu).
Podsumowanie (uczenie neuronu sigmoidalnego) Do uczenia neuronu dany jest ciąg uczący gdzie x(t) to wektor sygnałów wejściowych, dt to oczekiwana wartość wyjścia dla wektora wejściowego x(t). Podstawowy krok modyfikacji wag, tj. wykorzystanie wektora uczącego t, ma postać (w zapisie wektorowym) W zapisie dla poszczególnych składowych mamy (pamiętajmy, że w0=b, x0=1)
Model neuronu Hebba x0=1 w0 x1 w1 x2 w2 y S S xn wn w(t) ← w(t)+hyx(t) d
Budowa neuronu Hebba jest podobna jak w przypadku adaline czy sigmoidalnego, ale charakteryzuje się specyficzną metodą uczenia, znaną jako reguła Hebba. Reguła ta występuje w wersji z nauczycielem i bez nauczyciela. Donald O. Hebb badając działanie komórek nerwowych zauważył, że powiązanie dwóch komórek jest wzmacniane, jeśli obie są pobudzane w tym samym czasie. Sformułował to tak: Jeżeli akson komórki A bierze systematycznie udział w pobudzaniu komórki B powodującym jej aktywację, to wywołuje to zmianę metaboliczną w jednej lub obu tych komórkach, która prowadzi do wzrostu skuteczności pobudzania komórki B przez komórkę A. Szczególnie interesująca jest wersja uczenia bez nauczyciela (czasami mówi się „bez nadzoru” od ang. unsupervised). Oznacza to, że na wejście neuronu podawane są tylko „zadania” – bez wskazówek dotyczących rozwiązania.
Zgodnie z regułą Hebba modyfikacja wagi wi— czyli Dwi— jest proporcjonalna do iloczynu sygnału wejściowego xi propagującego się wzdłuż tego połączenia oraz sygnału wyjściowego y: Tak więc podstawowy krok procedury uczenia metodą Hebba bez nauczyciela ma postać We wzorach jak zwykle dodatni parametr h oznaczą stałą uczenia wpływającą na szybkość jak i dokładność procesu uczenia.
Przykład Współczynnik uczenie przyjmujemy h=1, a funkcję aktywacji bipolarną, f(s)=sgn(s). W tym przykładzie nie uwzględniamy progu b (bias), tak więc nie ma wagi w0=b oraz wejścia x0=1.
Wykonując kolejne kroki algorytmu Hebba otrzymujemy w pierwszej epoce następujące wektory (kolumny) wag: Po wykonaniu powyższego przykładu widzimy, że w przypadku bipolarnej funkcji aktywacji i współczynnika uczenia h=1 reguła Hebba sprowadza się do dodawania lub odejmowania wektora sygnałów wejściowych od aktualnie obowiązujących wag. Wykonać analogiczny trening ale z sigmoidalną funkcją aktywacji (przyjąć b=1).
Pewnym problemem w podstawowej metodzie Hebba jest to, że wagi mają tendencję do przyjmowania dużych wartości, gdyż w każdym cyklu uczącym dodajemy przyrosty Dw: Jedną z metod poprawy tej reguły jest użycie tzw. współczynnika zapominania 0≤g ≤ 1, który zmniejsza znaczenie aktualnych wag. Zmodyfikowana reguła Hebba ma postać: Współczynnik zapominania g stanowi najczęściej niewielki procent stałej uczenia h>0. Typowe wartości to g<0,1.