Projekt pn. Wzmocnienie potencjału dydaktycznego UMK w Toruniu w dziedzinach matematyczno-przyrodniczych realizowany w ramach Poddziałania 4.1.1 Programu Operacyjnego Kapitał Ludzki Wprowadzenie do Sieci Neuronowych Laboratorium 02 Perceptron prosty cd Maja Czoków, Jarosław Piersa 2012-10-10 1 Powtórzenie 1.1 Algorytm uczenia perceptronu Dane: Perceptron o n wejściach, k przykładów uczących E 1...E k wraz z poprawnymi odpowiedziami T 1...T k. Zakładamy, że funkcja aktywująca ma postać znakową. W tej sytuacji dodatkowym parametrem uczącym jest wartość progu p. Wynik: Wartości wag wi oraz progu p które dają optymalną klasyfikację. 1. Przypisujemy wagom i progowi małe losowe wartości wokół 0, przypisujemy takiemu układowi wag zerowy czas życia, startowy zestaw zapamiętujemy jako rekordzistę, 2. Przebiegamy przykłady losując z listy 3. Dla wybranego przykładu E j sprawdzamy, czy E j jest dobrze klasyfikowany, Jeśli tak, zwiększamy mu czas życia o jeden. Jeżeli jest to wynik lepszy niż u dotychczasowego rekordzisty, zapominamy go (dotychczasowego rekordzistę) i zapisujemy bieżący układ wag jako nowego rekordzistę. Wracamy do 2. Jeśli nie, to wi := wi + η ERR Eij θ := θ ERR Nowo-powstałemu układowi wag przypisujemy zerowy czas życia. Wracamy do 2. 4. Algorytm kończymy po przebiegnięciu odpowiedniej liczby iteracji. Zwracamy najbardziej żywotny zestaw wag (tj. rekordzistę). 1.2 Uzasadnianie wnioskowania Dane: Nauczony perceptron prosty z funkcją progową, próg p, wejście u = (u1,..., un ). Wynik: Uzasadnienie klasyfikacji zwróconej na przykładzie u tj. najmniej liczna lista cech, które charakteryzują u i mają największy wpływ na klasyfikację. Uwaga: Algorytm jest mutacyjny, tj. modyfikuje próg neuronu. Sugerowane jest operowanie na kopii parametrów. 1. Obliczamy odpowiedź perceptronu o na przykładzie u. 2. Przypisujemy p := θ (kopia progu, p := x0 w0 w wypadku biasu). 3. Przypisujemy uzasadnienie = (pusty napis). 4. Oznaczamy wszystkie cechy jako niewykorzystane. 5. Znajdujemy czynnik kluczowy tj. ui takie, że ui wi o > 0 tj. cecha wspiera wynikową odpowiedź, wi ma największą wartość spośród wszystkich ui, które wspierają odpowiedź o, Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego Wyrażam zgodę na wydruk dokumentu do celów dydaktycznych 1
u i jeszcze nie był użyty jako fragment uzasadnienia w poprzednich krokach (niewykorzystana). 6. Sprawdź czy w i > w l + p, niewykorzystany l i i u l jeżeli tak, to dodaj u i do uzasadnienia i zwróć gotowy zestaw cech: uzasadnienie+ = bo u i = (..). jeżeli nie, to dodaj u i do uzasadnienia: uzasadnienie+ = bo u i = (..) oraz p = p u i w i Po czym oznaczamy jednostkę u i jako wykorzystaną i wracamy do 5. 7. UWAGA: Jeżeli i w iu i = p to uzasadnienie nie będzie możliwe. Rysunek 1: Uzasadnianie wnioskowania wybór najcięższych argumentów. 1.3 Maszyny liniowe (Multiclass linear classifier) Maszyna liniowa składa się z n wejść, l perceptronów,każdy przypisany do swojej kategorii. Perceptrony mają swoje kolejne indeksy i te same wejścia. Oznacza to,to że ML ma łącznie nl wag (z progami: (n+1)l wag), po n dla każdego z l perceptronów (z progami: po n + 1). Będziemy je oznaczać poprzez w ij, gdzie i = 0, 1..n jest indeksem wejścia, natomiast j = 1..l jest indeksem perceptronu. Uznajemy ponadto, że we wszystkich perceptronach funkcja aktywująca jest identycznością To jest każdy z perceptronów zwraca wyłącznie sumę ważoną out j = f(x) = x n w ij x i (1) Odpowiedzą całej maszyny liniowej jest indeks perceptronu, który zwrócił największą wartość out j. i=0 O = {j : k=1..l out k out j } (2) Maszyna linowa zwraca kategorię danych wejściowych x 1..x n, ale kategoryzacja nie musi być binarna. 2
out Rysunek 2: Schemat maszyny liniowej 1.4 Algorytm Uczenia Maszyny Liniowej Dane: zestaw przykładów uczących E j, j = 1..k oraz poprawnych odpowiedzi T j, j = 1..k. Wynik: wagi w ij, dla których sieć daje poprawne klasyfikacje. 1. Przypisujemy wagom małe losowe wartości wokół 0, 2. Przebiegamy przykłady losując z listy, 3. Dla wybranego przykładu E j sprawdzamy, czy E j jest dobrze klasyfikowany, Jeśli tak, wracamy do 2. Jeśli nie (tzn. jest kategoria p a miała być q), to korygujemy wagi neurony p-tego i q-tego w ip + = E j i Wracamy do 2. w iq = E j i 4. Algorytm kończymy po przebiegnięciu odpowiedniej liczby iteracji. Dodajemy modyfikację kieszeni i zapadki (tj. zapamiętywanie najbardziej żywotnych zestawów wag). 2 Zadania 2.1 Zadanie 1. Klasyfikacja punktów na R 2 Napisz (zmodyfikuj z poprzednich zajęć) w Octavie / Matlabie funkcję implementującą działanie perceptronu. Funkcja za argument powinna przyjmować wektor dwóch danych wejściowych oraz wektor wag w tym w 0 (oraz ewentualnie próg, jeżeli nie jest on zawarty w wagach). x = [1, 2]; w = [1, 2, 3]; a = perc (x, w); Wygeneruj dwie chmury punktów na R 2 z różnymi kategoriami N = 20; x1 = randn (1, N )+2; x2 = randn (1, N) -2; y1 = randn (1, N )+3; y2 = randn (1, N) -1; C1 = ones (1, N); C2 = - ones (1, N); 3
Wyświetl wygenerowane dane hold off ; plot (x1, y1, r+ ); hold on; plot (x2, y2, bo ); EX = [x1, x2 ]; EY = [y1, y2 ]; C = [C1, C2 ]; Zaimplementuj SPLA (plik spla.m). Uwaga! Jeżeli nie wiadomo czy dane są separowalne, to należy korzystać z wersji pocket algorytmu. function wagi = spla ( EX, EY, C, T = 10000) % wagi losowe w = randn (1,3); for i =1: T % losujemy przyklad j = floor ( rand ()* length (C ))+1; % obliczamy aktywacje out = perc ([ EX(j), EY(j)], w); if out == C(j) % nastepny przyklad else % korekcja wag err = C(j) - out ; w += err.* [1, EX(j), EY(j )]; end % if end % for wagi = w; end % function Oblicz klasyfikację nauczonego perceptronu na danych EX, EY Out = []; for i =1: length (EX) E = [EX(i), EY(i )]; Out = [Out, perc (E, wagi ) ]; end Wydrukuj nauczoną klasyfikację % wybieramy te, ktore maja odpowiedz dodatnia IPos = find (Out >0); % te, ktore maja odpowiedz ujemna INeg = find (Out <=0); hold off ; plot (EX( IPos ), EY( IPos ), r+ ); hold on; plot (EX( INeg ), EY( INeg ), bo ); Na podstawie nauczonych wag oblicz postać i wyświetl prostą separującą. Przydatne funkcjetext(), sprintf(), legend(). Zmodyfikuj dane uczące, aby obie klasy nieco na siebie nachodziły (zjawisko nazywane jest overlapping). Uruchom algorytm SPLA na nich. Wyciągnij wnioski. Wygeneruj cztery chmury punktów uczących. uczenie na takich danych, np. Połącz je w klasy wg funkcji logicznych AND, OR, XOR. Wykonaj problem AND (x 1 = 1, x 2 = 1, E = 1), ( 1, 1, 1), (1, 1, 1), (1, 1, 1) 4
problem OR ( 1, 1, 1), ( 1, 1, 1), (1, 1, 1), (1, 1, 1) problem XOR ( 1, 1, 1), ( 1, 1, 1), (1, 1, 1), (1, 1, 1) Wyciągnij wnioski. Dodaj modyfikację kieszonki i zapadki, naucz perceptron zmodyfikowanym algorytmem na różnych zestawach. 2.2 Zadanie 3*. SPLA cd. (* dla chętnych) Napisz program, który wyświetla zmieniającą się klasyfikację na fragmencie płaszczyzny podczas uczenia perceptronu. Pomocne funkcje: axis(), sleep(), print(). 2.3 Zadanie 4. Maszyna liniowa Zaimplementuj maszynę liniową (linear multi-classifier) Wygeneruj chmurę przykładów uczących podzielonych na trzy kategorie (wsk. zmodyfikuj punkt 2.1) Wczytaj przygotowane dane z pliku (kolejno: x, y, odpowiedź) A = load (./ zad2-7-- multiclass. txt ); EX = A(:, 1); EY = A(:, 2); C = A(:, 3) +1; % zmieniamy z 0,1,2 na 1,2,3 plot (EX, EY, b+ ) Zaimplementuj maszynę liniową (wsk. wagi będą tablicą o wymiarze ilosc kategorii ilosc wejsc). function ret = ml( x, wagi ) s = wagi * x ; m = max (s); ret = find (s >= m); end zmodyfikuj kod tak aby uwzględniał również bias w 0, przetestuj maszynę: wagi = randn (3,2); j = 1; x = [EX(j), EY(j )]; ml(x, wagi ) zaimplementuj algorytm uczenia: function wagi = uczenie_ ml ( EX, EY, C) T = 10000; % wagi losowe wagi = randn (3,2); for i =1: T % wylosuj przyklad j = floor ( rand ()* length (EX )+1); x = [EX(j), EY(j )]; o = ml(x, wagi ); if (o==c(j)) % ok, nic nie robimy else % wzmacniamy te, ktore byc powinny wagi (C(j),:) += x; % oslabiamy te, ktore sa wagi (o,:) -= x; 5
end % if end % for end % function Dopisz do algorytmu kieszonkę i / lub zapadkę. Oblicz klasy na naucznych wagach: Out = []; for i =1: length (EX) x = [EX(i), EY(i )]; Out = [ Out ; ml(x, wagi )]; end Wyświetl nauczoną kategoryzację I1 = find ( Out == 1); I2 = find ( Out == 2); I3 = find ( Out == 3); hold off ; plot (EX(I1), EY(I1), 1o ); hold on; plot (EX(I2), EY(I2), 2+ ); plot (EX(I3), EY(I3), 3^ ); Dostosuj algorytm aby działał dla wersji z biasem, naucz ponownie taki system i porównaj wyniki. 3 Zadania programistyczne (do wyboru) 3.1 Zadanie 1. Autoasocjator graficzny Zadanie polega na zastosowaniu perceptronów i algorytmów uczenia do konstrukcji autoasocjatora graficznego tj. układu, który jest w stanie nauczyć się obrazów oraz usunąć szumy jeżeli takie pojawią się na wejściu. W efekcie dając na wejściu obraz, który nie jest żadnym z wzorców uczących, program powinien wygenerować ten, który zna i jest najbardziej podobny do wejścia. Działanie: na wejściu dany jest zaszumiony obraz (wcześniej nauczony) układ ma tyle perceptronów ile pikseli na obrazie każdy perceptron czyta wszystkie piksele z obrazu wejściowego i zwraca wartość kontrolowanego piksela wyjściowego (zapalony lub nie) wynikowy obraz powstaje z odpowiedzi wszystkich perceptronów, poprawnie naucozna sieć powinna odzyskać oryginalny obraz usuwając szum Uczenie: dla każdego perceptronu / piksela: wejściem są wszystkie wzorcowe obrazy, poprawną odpowiedzą wartość czy piksel przy danym obrazie powinien być zapalony czy zgaszony dodatkowo wskazane jest uczyć na zaszumionych kopiach wzorcowych obrazów Ciekawe rozszerzenia i alternatywy: Autoasocjator symboliczny / wektorowy: zamiast na pikselach operuje na fragmentach obrazu, np kresce poziomej, pionowej, skośnej, półkolu, kropce itp. Na przykład litera T jest połączeniem kreski pionowej wycentrowanej oraz kreski poziomej na górze obrazu (i wszystko inne wyłączone), Litera L kreska pionowa z lewej i pozioma na dole, O półkola z lewej i prawej oraz z góry i dołu, D półkole z prawej i kreska pionowa wycentrowana, X dwie kreski skośne etc. Autoasocjator działający na trzech kanałach (RGB) 6
Rysunek 3: Konstrukcja autoasocjatora graficznego. 3.2 Zadanie 2. Automatyczny oceniacz programów Czasami obiektom nie można przypisać cech numerycznych, a jedynie symboliczne, które są kodowane na wartości numeryczne (np. +1 cecha obecna, 1 cecha nieobecna). Rozważmy opis programu zaliczeniowego z sieci neuronowych. Jego lista cech może obejmować np: Czy program w ogóle działa? Czy program daje wyniki wyglądające na poprawne? Czy program ma interfejs graficzny? Czy program został oddany w trakcie zajęć? Czy program sam siebie klasyfikuje jako zaliczony? Czy program zawiera wyczerpujące komentarze w kodzie? Czy grafy / sieci / ilości wejść są ustalone na sztywno i trudne do zmiany (zauważmy, że jest to cecha charakterystyczna dla źle napisanych programów, waga odpowiadająca temu wejściu powinna być ujemna)? Czy program wyświetla tylko klasyfikację pomijając uzasadnienie (patrz uwaga wyżej)? Czy program został napisany w normalnym języku programowania (co to jest normalny język pozostawiamy gestii sprawdzającego lub... innego klasyfikatora symbolicznego)? Czy program sam jest w stanie wygenerować listę programów uczących i nauczyć się na niej poprawnej klasyfikacji? Czy autor programu ma więcej pomysłów niż autor zadania i dodał coś od siebie? Napisz program, który na wejściu otrzymuje listę cech programu i dokonuje binarnej oceny (zaliczony lub niezaliczony) oraz wyświetla uzasadnienie, tzn. które z cech mają największy wpływ na końcową ocenę. Głównym punktem ocenianym w tym zadaniu jest nie klasyfikacja, ale jej uzasadnienie. Lista powyższa została wymyślona na potrzeby zadania i po kilku kawach, ale zdradza jakie pytania mogą paść podczas sprawdzania programów. (dla ambitnych) Rozważ jak można dostosować program aby dokonywał i uzasadniał kategoryzację na trzy oceny: niezaliczony, zaliczony, wybitnie zaliczony. Zamiast oceniacza programów można napisać program oceniający: książki, samochody, inne programy oceniające, wykładowców, komputery, jakość kawy z ekspresu... Wszelkie przejawy kreatywności mile widziane. 7