Projekt pn. Wzmocnienie potencjału dydaktycznego UMK w Toruniu w dziedzinach matematyczno-przyrodniczych realizowany w ramach Poddziałania 4.. Programu Operacyjnego Kapitał Ludzki Wprowadzenie do Sieci Neuronowych Laboratorium 0 Organizacja zajęć. Perceptron. Jarosław Piersa 203-0-02 Organizacja zajęć. Co będzie Dużo programowania (pisanie programów), Trochę matematyki, Małe zadania do zaimplementowania na zajęciach (język dowolny, ściągawki będą w Matlabie / Octavie), Programy zaliczeniowe pisane głównie w domu, prezentowane na zajęciach, Obecność wymagana..2 Zaliczenie Zaliczenie laboratoriów na podstawie implementowania omawianych algorytmów. Punktacja ocena dst db bdb bdb+ programy 3 programy 4 programy 5 programów 6 lub więcej programów / 5 wybitnych programów Na ocenę bdb+ wymagana jest terminowość: przynajmniej jeden program w październiku, przynajmniej jeden program w listopadzie, przynajmniej jeden program w grudniu, przynajmniej jeden program w styczniu, wszystkie programy przed egzaminem..3 Wskazówki Na co należy zwrócić uwagę pisząc programy: (Zależnie od autora) zadania mogą być prezentowane na forum grupy ćwiczeniowej. Do wykorzystania projektor w sali laboratoryjnej. Prezentacja powinna trwać 5 do 0 minut. W trakcie prezentacji należy przedstawić funkcjonalności programu, zastosowane rozwiązanie, wykorzystaną technologię, zaakcentować rzeczy, którymi autor chciałby się pochwalić. Prezentację może kończyć krótka dyskusja. Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego Wyrażam zgodę na wydruk dokumentu do celów dydaktycznych
(Jeżeli autor nie chce prezentować publicznie) Zadania będą sprawdzane z autorem siedzącym obok, w trakcie laboratorium lub na konsultacjach. Zadania nie będą sprawdzane zaocznie. Zadania powinny być napisane tak, aby umożliwić prostą i szybką ocenę poprawności działania po efektach (ocena poprawności poprzez wypisanie -nastu stron liczb na stdout nie jest ani prosta ani szybka!) Program w zależności od autora będzie uruchamiany na laptopie (może być to laptop autora) bądź komputerze w sali laboratoryjnej. Proszę upewnić się, że mają Państwo pod ręką wszystkie wymagane środowiska lub/i biblioteki (dotnet framework, jdk, interpreter pythona, karta graficzna obsługująca Cuda etc). Podczas sprawdzania należy mieć kod źródłowy programu (oraz edytor podświetlający składnię). Fragmentem zaliczenia może być dodatkowe pytanie o algorytm, sposób implementacji, zagadnienia teoretyczne powiązane z zadaniem. Może być to dopisanie dodatkowej funkcjonalności w trakcie sprawdzania. Im później oddawane zadanie tym większa liczba dodatkowych pytań. Programy korzystające z gotowych bibliotek do sieci neuronowych nie będą akceptowane. Teoretycznie dopuszczane są programy z tekstowym interfejsem użytkownika. Jeżeli jednak autor nie jest mistrzem ascii-artu, to lepiej jest zrobić interfejs graficzny..4 Program zajęć Pojedynczy neuron, model perceptronu prostego, maszyny liniowej, Adaline, Sieci skierowane, Algorytm wstecznej propagacji błędu (BEP), Uczenie bez nauczyciela, samoorganizacja topologiczna, analiza składowych głównych (PCA), Sieci rekurencyjne, sieć Hopfielda, maszyny Boltzmanna i symulowane wyżarzanie, (*) Wielowartościowe sieci neuronowe, sieci zespolone, (*) Algorytmy genetyczne. Literatura [] R. Rojas Neural Networks, A Systematic Introduction, Springer 996, [2] P. Peretto, Introduction to Modeling Neural Networks, Cambridge University Press 994, [3] T. Schreiber, Notatki do wykładu WSN, [4] E. Izhikevich, Dynamical Systems in Neuroscience, 2007 Massachusetts Institute of Technology [5] C. Bishop, Neural Networks for Pattern Recognition, Oxford University Press 995. 2
2 Powtórzenie 2. Model Perceptronu Perceptronem nazywamy następujący model składający się z: określonej liczby wejść n, wagi stowarzyszonej z każdym wejściem w i, i =..n funkcji aktywującej f Dynamika perceptronu. Mając n wejść x...x n liczbowych perceptron zwraca wartość O = f( n x i w i ) () i= Zakładając progową postać funkcji, perceptron działa jak klasyfikator, dla danych x,.., x n zwraca całkowitą liczbę będącą klasą, do której dane należą. out Rysunek : Schemat działania perceptronu 2.2 Postacie funkcji aktywującej Identyczność f(s) = s taka jednostka liczy po prostu sumę ważoną wejść, Funkcja progowa (bipolarna) f(s) = { 0 s < p s p Wartość p może być dodatkowym parametrem opisującym perceptron. Ten typ funkcji modeluje wysyłanie impulsu po przekroczeniu pewnego progu, które to zachowanie z pewnym przybliżeniem charakteryzuje komórki neuronowe. funkcja polarna. Jest to funkcja zalecana do używania w implementacji. { s < p f(s) = + s p Funkcja podobna do poprzedniej z tą różnicą, że wartość nie jest elementem neutralnym dodawania i odpowiedź negatywna może mieć pewien wpływ. Sigmoida f(s) = σ(s) = + exp( s) Wymaga dzielenia i potęgowania, czyli więcej obliczeń, co nie powinno być wskazane przy wielokrotnym wykonywaniu. Z drugiej strony jest ciągła i różniczkowalna, co będzie miało znaczenie przy algorytmach uczenia (za kilka zajęć) i przybliża funkcją bipolarną. Ponadto zachodzi σ (s) = σ(s) ( σ(s)) Symetryczna sigmoida (tangens hiperboliczny) 2σ(s) = exp( s) + exp( s) (= tanh( s 2 ) ) 3
-0.5 y.5 = =2 =5 =0.5 beta = beta = 3 beta = 0 0.5 0.5 0-0.5 0 - -3-2 - 0 2 3 (a) Funkcja sigmoidalna z parametrami β =, β = 3, β = 0. -.5-4 -2 0 2 4 (b) Symetryczna sigmoidalna (tangens hiperbiliczny). x Rysunek 2: Funkcje sigmoidale. 2.3 Perceptron prosty (progowy) Będziemy korzystać z jednostki z polarną funkcją aktywacji. Tj. neuron ma wagi w,.., w n, próg θ oraz zwraca: { O(x) = i w ix i < θ + i w ix i θ 2.4 Perceptron z obciążeniem (biasem) Alternatywnie będziemy korzystać z modelu składającego się z: n + wag w 0, w,..., w n. Waga w 0 jest stowarzyszona ze sztucznym n + -szym wejściem x 0, które zawsze jest równe +. Perceptron zwraca wartość { n O(x) = i=0 w ix i < 0 n + i=0 w ix i 0 2.5 Uczenie perceptronu Dany niech będzie zestaw k przykładów E = { E ()...E (k)}, gdzie E (i) = (e (i),..., e(i) N ) RN i odpowiadające im poprawne wyniki T ()...T (k). Dany też mamy perceptron o N wejściach i jednym wyjściu. Rozważmy przykład E j i odpowiadającą mu poprawną odpowiedź T j, niech sieć z bieżącym zestawem wag zwróci wartość O. Rozważmy błąd: ERR = T j O Jeżeli jest dodatni to musimy zwiększyć O, jeżeli wejście e j i > 0, to zwiększenie wagi w i zwiększy O, jeżeli e j i < 0 to zmniejszenie w i zwiększy O. Jeżeli błąd ERR jest ujemny to musimy zmniejszyć O. Podobnie rozumując musimy zmniejszyć wagi w i jeśli wejście e j i > 0 i zwiększyć w i w przeciwnym wypadku tj. e j i < 0. Podsumowując te rozważania otrzymujemy algorytm (SPLA, Simple Perceptron Learning Algorithm):. Losujemy wagi w i małe, blisko 0. 2. Wybieramy kolejny (lub losowy zalecane) przykład E j i odpowiadającą mu poprawną odpowiedź T j, 3. Obliczamy O wynik działania sieci na E j 4. Obliczamy ERR = T j O 5. Jeżeli ERR = 0 (klasyfikacja jest poprawna), to wróć do 2, 6. W przeciwnym wypadku uaktualniamy wszystkie wagi zgodnie ze wzorem w i := w i + η ERR E j i η > 0 jest stałą uczenia. θ := θ ERR 7. Jeżeli sieć klasyfikuje poprawnie wszystkie (większość) przykłady to kończymy, wpw wracamy do kroku 2. 4
UWAGA: Powyższego algorytmu nie należy stosować w implementacjach! UWAGA: W 969 matematycy Minsky oraz Papert udowodnili, że pojedynczy perceptron jest w stanie poprawnie klasyfikować wyłącznie problemy liniowo separowalne. 6.5 4 2 0.5 0 0-2 -0.5-4 - -6-6 -4-2 0 2 4 6 (a) Problem separowalny liniowo. -.5 -.5 - -0.5 0 0.5.5 (b) Problem nieseparowalny. Rysunek 3: Problem liniowo separowalny (po lewej) i nieseparowalny (po prawej) Algorytm sformułowany powyżej nie zatrzyma się, jeżeli nie istnieją wagi, dla których przykłady uczące są poprawnie klasyfikowane. A nawet jeżeli (zostanie to wymuszone ograniczeniem ilości iteracji), to nie gwarantuje, że zwrócone wagi będą optymalne. 2.6 Algorytm Uczenia Kieszonkowego / Pocket Learning Algorithm Dane: Perceptron o n wejściach, k przykładów uczących E...E k wraz z poprawnymi odpowiedziami T...T k. Zakładamy, że funkcja aktywująca ma postać polarną. W tej sytuacji dodatkowym parametrem uczącym jest wartość progu p. Wynik: Wartości wag w i oraz progu p które dają optymalną klasyfikację.. Losujemy wagi i próg wokół 0, 2. Przypisujemy układowi wag zerowy czas życia i zapisujemy go w kieszonce jako rekordzistę, 3. Przebiegamy przykłady losując z listy, 4. 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 rekordzisty, zapominamy starego rekordzistę i zapisujemy w kieszonce nowy układ wag. Wracamy do 3. Jeśli nie, to korygujemy wagi i próg: w i := w i + η ERR E j i θ := θ ERR Nowemu układowi wag przypisujemy zerowy czas życia. Wracamy do 3. 5. Algorytm kończymy po przebiegnięciu odpowiedniej liczby iteracji. Zwracamy najbardziej żywotny zestaw wag. 2.7 Algorytm Uczenia z Zapadką / Ratchet Learning Algorithm Dane i wyjście jak wyżej.. Losujemy wagi i próg wokół 0, przypisujemy układowi wag zerowy czas życia i zapisujemy go jako rekordzistę, 2. Przebiegamy przykłady losując z listy, oznaczmy wylosowany przykład jako E j, 3. Sprawdzamy czy E j jest dobrze klasyfikowany (ERR = T j O = 0), 5
Jeśli tak, to zwiększamy mu czas życia o jeden. Jeżeli jest to wynik lepszy niż u rekordzisty i klasyfikuje on więcej przykładów niż rekordzista, to zapominamy starego rekordzistę i zapisujemy nowy układ wag. Wracamy do 2. Jeśli nie, to korygujemy wagi i próg: w i := w i + η ERR E j i θ := θ ERR Nowemu 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. 3 Zadania na zajęcia Zadania przeznaczone na laboratoria. 3. Zadanie (Rachunkowe) Pokaż, że definicje perceptronu progowego i z biasem są równoważne. 3.2 Zadanie 2 (Rachunkowe) σ(s) = + exp( s) Pokaż, że 2σ(s) = exp( s) + exp( s) 3.3 Zadanie 3 Zaimplementuj pojedynczy perceptron progowy rozpoznający cyfrę zero na małym obrazku. Bryk dla Octave pod Linuxami, z małymi zmianami powinien działać również dla Matlaba. Z moodle pobieramy przykładowe pliki graficzne z cyframi, lub wygeneruj własne. (tylko Octave) dodajemy bibliotekę do pracy z obrazami pkg prefix "./ katalog /" pkg install - forge - auto image ; Wczytujemy plik graficzny z zerem. Plik zostanie zapisany jako tablica dwuwymiarowa wartości pikseli (Matlab: jako trzy tablice: RGB). cd katalog /z/ obrazami I = imread (./ c0.png ) Wyświetl wczytany plik graficzny. imshow (I) (tylko Matlab) Matlab wczytuje obraz jako trzy tablice (RGB), wyciągamy jedną z nich I = I(:, :, ) Wygenerujmy losowe wagi dla sieci r = size (I); wagi = randn (r(),r (2)); prog = randn (,); 6
Liczymy sumę ważoną s = 0; for i =:8 for j =:6 s += w(i,j) * I(i,j); Jeżeli suma jest większa od progu, to zwracamy, wpw. zwracamy -. if s >= prog odp = ; else odp = -; Łączymy kod w funkcję obliczającą aktywację mając dane wagi, próg i wejścia Plik: perceptron.m function odp = perceptron ( I, wagi, prog ) S = 0; r = size (I) for i =: r () for j =: r (2) S += I(i,j) * wagi (i,j); odp = sign ( S - prog ); Uwaga! Nazwa pliku i nazwa funkcji muszą się zgadzać! Jeżeli plik leży na katalogu bieżącym sesji Octave / Matlab, to można z funkcji skorzystać: odp = perceptron ( I, wagi, prog ); odp 3.4 Zadamie 4 Główny problem perceptronu (i ogólnie sieci neuronowych) to znalezienie właściwych wag, dla których perceptron będzie dokonywał poprawnych klasyfikacji. Przetestuj klasyfikacje w oparciu o ręcznie dobrane wagi oraz próg 0 0 0 0 0 0 0 0 0 0 0 0 wagi = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 % wersja copy - paste - frily : wagi = [0 0 - - 0 0; 0-0 0-0; - 0 0 0 0 -;]; wagi = [ wagi ; - 0 0 - - -; - - - 0 0 -]; wagi = [ wagi ; - 0 0 0 0 -; 0-0 0-0; 0 0 - - 0 0 ]; prog = -; Zaimplementuj algorytm SPLA do uczenia perceptronu. Przykładowy prototyp funkcji: 7
function [ wagi, prog ] = spla ( przyklady, odpowiedzi, ileiteracji ) Gdzie przykłady uczące są zebrane w trójwymiarową tablicę np: % przypisujemy cala podtablice przyklady (:, :, ) = imread ("c0.png "); przyklady (:, :, 2) = imread ("c.png "); (...) przyklady (:, :, 0) = imread ("c9.png "); % perceptron rozpoznaje cyfre " " odpowiedzi = [-, +, -,..., -]; 3.5 Zadanie 5 Napisz program (lub dostosuj powyższy) aby klasyfikował punkty na R 2 perceptronem z biasem. Tj. dane są wagi (w 0, w, w 2 ) i niech x 0 = +. Dla zadanego wejścia (x, x 2 ) zwraca klasyfikację + jeżeli i x iw i 0 i w przeciwnym wypadku. % klasa x = randn (, 00) - 2; y = randn (, 00) + 2; % klasa 2 x2 = randn (, 00) + 3; y2 = randn (, 00) - 2; plot (x,y, "bo"); hold on; plot (x2,y2, "r+"); 3.6 Zadanie 6 Napisz program, który dla zadanych wag perceptronu wyświetli klasyfikację na fragmencie płaszczyzny {x 0, x 0 + d, x 0 + 2d,..., x } {y 0, y 0 + d, y 0 + 2d,..., y }. 3.7 Zadanie 7 Wyznacz kanoniczną postać prostej separującej dane dla perceptronu z zadania (lub napisz program, który ją wyznacza). Wyświetl ją na wykresie w programie 6. Postać kanoniczna prostej: y = ax + b gdzie a, b R. 4 Zadania programistyczne (do wyboru) 4. Zadanie. Uczenie klasyfikacji punktów Dany jest plik (kilka plików) z listą punktów na płaszczyźnie oraz poprawną klasyfikacją punktu. Klasyfikacja jest binarna: 0 lub (+, -). # komentarze, informacje o pliku, itp # (ewentualnie wymiar przestrzeni i liczba przykładów uczących) x y o x2 y2 o2... Napisz program, który nauczy perceptron klasyfikacji na zadanej liście przykładów. Dodatkowo program powinien mieć możliwość wczytać (lub odczytać z kliknięcia myszką) parametry innych punktów (tj. z poza listy uczącej) i wyświetlić je na płaszczyźnie wraz z oznaczeniem klasy. Ponadto dla przykładów z listy uczącej powinno być oznaczenie zarówno o oczekiwanej (z listy) jak i faktycznej (tj. zwróconej przez perceptron) klasyfikacji, np. oczekiwana klasyfikacja poprzez kształt, faktyczna poprzez kolor. Program powinien wyświetlić przynajmniej odsetek poprawnie klasyfikowanych przykładów oraz prostą / płaszczyznę separującą. Pomysły na rozbudowanie programu: analogiczne zadanie dla punktów w R 3, 8
własne pliki uczące, możliwość wyklikania danych uczących w programie, klasyfikacja, która nie jest binarna (3 klasy, 4 klasy...), statystyki dla danych wejściowych oraz wyników uczenia (moda, mediana, odchylenie standardowe), automatyczny zapis wyników do pliku, zapis wykresu do pliku ps, pdf, svg, png... (*) analogiczne zadanie dla R 4, 4.2 Zadanie 2. Rozpoznawanie cyfr / liter / obrazów Napisz program, który wykorzystuje maszynę liniową lub kilkanaście perceptronów do rozpoznawania cyfr lub/i liter. Cyfry powinny być wyświetlane jako układy pikseli na matrycy o niewielkich wymiarach (max. 00 pikseli, oczywiście mowa tu o pikselach na cyfrę, wyświetlanie może być z dużym powiększeniem). Program dodatkowo powinien mieć możliwość wyklikania cyfry (lub czegoś cyfro-podobnego) i automatycznej klasyfikacji. Wejścia uczące należy zaburzać (tj. odwracać piksel z niewielkim prawdopodobieństwem niezależnie dla danego piksela). W ten sposób program uzyska częściową odporność na szumy, Pomysły na rozbudowanie programu: Aby uzyskać rozpoznawanie niezmiennicze ze względu na przesunięcia można wykorzystać dyskretną transformatę Fouriera. Wartości transformaty są traktowane jako dodatkowe wejścia do perceptronu, Rozpoznawanie liter (wymaga większej matrycy!), Rozpoznawanie kształtów (koło, kwadrat, linia, domek itd), Rozpoznawanie symboliczne http://en.akinator.com/ OCR rozpoznawanie tekstu poprzez przesuwanie małego okna (perceptron) po większym obrazie (sliding window) 4.3 Zadanie 3*. Neuron Hodgkina-Huxleya (dla ambitnych, tego zagadnienia nie będzie na egzaminie) Zapoznaj się z modelem komórki neuronowej opisanym w terminach układów dynamicznych. Zaimplementuj model Hodgkina-Huxleya. Informacje o modelu można znaleźć w rozdziale drugim książki E. Izhikevich Dynamical Systems in Neuroscience, 2007 MIT Press. 9