SIECI NEURONOWE Przedmiotem laboratorium jest stworzenie algorytmu rozpoznawania zwierząt z zastosowaniem sieci neuronowych w oparciu o 5 kryteriów: ile zwierzę ma nóg, czy żyje w wodzie, czy umie latać, czy ma pióra, czy jest jajorodne, Sieć powinna rozpoznawać czy jest to ptak, ssak, czy ryba, Sieć będzie składała się z 5 wejść i 3 neuronów. Zadaniem każdego neuronu jest rozpoznawanie innej grupy zwierząt: I- ssaki, II-ptaki, III-ryby. Cechy grup zwierząt uwzględnione w toku uczenia: ssak ma 4 nogi; czasem żyje w wodzie, ale nie jest to dla niego typowe (foka, delfin), czasem umie latać (nietoperz), ale również nie jest to dla niego typowe; nie ma piór; jest żyworodny i jest to dość ważne; ptak ma 2 nogi; nie żyje w wodzie (co najwyżej na wodzie); zwykle umie latać i jest to bardzo ważna jego cecha; jak również ta, że ma pióra; oraz że jest jajorodny; ryba nie ma nóg (płetwy się nie liczą); żyje w wodzie i jest to jej najważniejsza cecha; nie umie latać (choć niektóre próbują); nie jest pokryta piórami; jest zwykle jajorodna, ale nie jest to aż tak ważne, jak u ptaków 1. Sieć jednowarstwowa: Rysunek 1 Działanie sieci neuronowej dla k-ego neuronu (np. w3,2 oznacza wagę neuronu 3 do wejścia 2) Zadanie 1 Inicjalizacja sieci: Napisz funkcję, która utworzy macierz wag jednowarstwowej sieci o S wejściach i K wyjściach (neuronach w warstwie), wypełnioną liczbami losowymi z przedziału [- 0.1;0.1], stanowiącymi początkowe wagi sieci.
Wektor wejść:: x 1 X = [ ] x S Sx1 Wektor wag wejściowych dla wybranego i-go neuronu: w 1 W i = [ w S ]Sx1 Macierz wag sieci jednowarstwowej o wymiarach SxK W toku nauki funkcja celu (średnia kwadratów błędów na wyjściach sieci) powinna przyjmować najmniejszą wartość. >>function [ W ] = init1 ( S, K ) >>W=rand( S, K ) * 0.2-0.1 Wywołaj funkcję w głównym oknie Matlaba z parametrami 5 i 3. Zadanie 2. Symulacja działania sieci Napisz funkcję symulującą działanie sieci jednowarstwowej, która obliczy wyjście Y jednowarstwowej sieci o macierzy wag W jako odpowiedź na wektor sygnałów wejściowych X podany na jej wejście. Funkcja aktywacji ma kształt sigmoidalny: >> function [ Y ] = oblicz ( W, X ) >> beta = 5 ; >> U = W * X ; >> Y = 1./ ( 1 + exp ( -beta * U ) ) ; Zadanie 3 Uczenie sieci Na wstępie należy napisać skrypt definiujący ciąg uczący: wejścia i wyjścia sieci. %% CIĄG UCZĄCY:%%
Ciąg uczący składa się z dwóch macierzy: P - zestawy wejść kolejnych przykładów uczących się T - odpowiadające przykładom wartości wyjść Jeden przykład stanowi para kolumn o tych samych indeksach z macierzy P i T. Pierwsze wejście jest typu ilościowego (nogi), kolejne są typu logicznego w praktyce najczęściej przyjmują wartości boolean (prawda/fałsz), tu wyjście poza zakres ma podkreślić znaczenie poszczególnych cech. % przykłady: 1------2-----3 % wejścia sieci: P = [ 4 2-1 ; % we 1 - ile ma nóg 0.01-1 3.5 ; % we 2 - czy żyje w wodzie 0.01 2 0.01 ; % we 3 - czy umie latać -1 2.5-2 ; % we 4 - czy ma pióra -1.5 2 1.5 ] % we 5 - czy jest jajorodne Za rozpoznaną klasę można uznać tę przypisaną do neuronu, który najsilniej zareagował na sygnał wejściowy (typ kodowania 1 z N, rzeczywiste wartości będą zbliżone do poniższych) % przykłady: 1------2-----3 % żądane wyjścia sieci: T = [ 1 0 0 ; % ssak 0 1 0 ; % ptak 0 0 1 ] % ryba %%Wykorzystanie uprzednio napisanych funkcji%% %inicjacja sieci losowymi wagami Wprzed = init1 ( 5, 3 ) %porównanie odowiedzi sieci przed i po uczeniu Yprzed = oblicz( Wprzed, P ) Ypo = oblicz( Wpo, P ) %%UCZENIE SIECI%% Wpo = ucz1 ( Wprzed, P, T, 100 ) Uruchom powyższy skrypt test1, oznacz 2 ostanie linijki jako komentarz Na wejście podawana jest cała macierz P (wszystkie przykłady są sprawdzane równocześnie). Wynikiem działania funkcji oblicz jest macierz, której kolumny zawierają odpowiedzi sieci na wszystkie trzy przykłady i którą można porównać z macierzą żądanych odpowiedzi T (wykorzystanie właściwości sieci jednowarstwowej bez progu wejściowego).
Zadanie 3 Uczenie sieci Napisz funkcję, która będzie uczyć sieć jednowarstwową o danej macierzy wag W przez zadaną liczbę epok n na ciągu uczącym podanym w postaci macierzy przykładów P (wejścia) i T (żądane wyjścia). Sieć zbudowana jest z neuronów o sigmoidalnej funkcji aktywacji. Wynikiem działania funkcji powinna być macierz wag nauczonej sieci. N Uczenie sieci polega na wielokrotnym pokazywaniu jej kolejnych przykładów z ciągu uczącego; w 1 cyklu wyznaczana jest odpowiedź sieci, porównywana następnie z żądaną odpowiedzią dla danego przykładu (zamieszczoną w ciągu uczącym). Różnica (błąd sieci) wykorzystywana jest by ustalić poprawki wszystkich wag sieci (algorytm uczenia), które dodaje się do wag (w następnych krokach, gdy sieci zostanie przedstawiony ten sam przykład, jej odpowiedź będzie bliższa żądanej odpowiedzi z ciągu uczącego) Pojedynczy krok uczenia, przedstawiony obejmuje: wylosowanie numeru przykładu do pokazania w danym kroku,podanie przykładu na wejścia sieci i obliczenie jej wyjść czyli wybranie odpowiedniej kolumny z macierzy P zbioru uczącego i obliczenie wartości wyjść sieci, porównanie wyjść sieci z żądanymi wyjściami dla danego przykładu czyli z odpowiednią kolumną macierzy T, obliczenie macierzy poprawek wag, zgodnie z wybranym algorytmem uczenia, dodanie macierzy poprawek do macierzy wag sieci. Zasady korekcji wag: Wagi zmieniane są tym silniej, im większy błąd został popełniony na danym neuronie. (wagi tych neuronów, które nie popełniły błędów na danym przykładzie, nie są poprawiane). Sieć sama przerywa uczenie, gdy jest już dobrze wytrenowana Im większy sygnał pojawił się na wejściu, do którego prowadzi dana waga, tym bardziej jest ona poprawiana. Jeśli sygnał wyjściowy był poprawny, to i poprawka danej wagi będzie niewielka. Jeśli zaś był błędny, to ten sygnał wejściowy, który był większy od innych, miał większy wpływ na powstanie tego błędu. Stąd waga prowadząca do wejścia, na którym ten sygnał się pojawił, powinna być bardziej skorygowana. Korekcja wagi w k,s: dw k,s = wspucz d k k s wspucz-współczynnik uczenia (wspucz<0, łagodzenie wpływu korekcji wagi) function [ Wpo ] = ucz1 ( Wprzed, P, T, n ) liczbaprzykladow = size ( P, 2 ) ; W = Wprzed ; wspucz = 0.1 ; for i = 1 : n,
% losuj numer przykładu nrprzykladu = ceil ( rand(1) * liczbaprzykladow ) ; % lub: los = randperm ( liczbaprzykladow ) ; % nrprzykladu = los ( 1 ) ; % podaj przykład na wejścia i oblicz wyjścia X = P ( :, nrprzykladu ) ; Y = oblicz( W, X ) ; % oblicz błędy na wyjściach D = T ( :, nrprzykladu ) - Y ; % oblicz poprawki wag dw = wspucz * X * D ; % dodaj poprawki do wag W = W + dw ; end % i to wszystko n razy Wpo = W ; Ponownie uruchom skrypt test1, odznaczając komentarz w 2 ostatnich linijkach Wyniki: Analizując uzyskane wyniki odpowiedz jak sprawdzić czy sieć nauczyła się rozpoznawać zwierzęta?
Zadanie 4 Testowanie sieci O jakości sieci świadczy zdolność uogólniania zdobytej wiedzy na nowe przypadki danych wejściowych, nie widziane przez sieć podczas uczenia. 4.1 Sprawdź czy sieć rozpozna Ciebie jako ssaka? Przykładowa implementacja ja = [ 2 ; % mam dwie nogi 0 ; % słabo pływam 0 ; % rzadko latam 0 ; % brak piór 0 ] ; % jajorodność odp = oblicz ( Wpo, ja ) odp = 0.8039 0.1825 0.0335 4.2 Człowiek nietypowy czlowiek = [ 2 ; % ile ma nóg 0.2 ; % czy żyje w wodzie - M. Phelps 0.2 ; % czy umie latać - A. Małysz 0.1 ; % czy ma pióra - Winnetou 0 ] ; % czy jest jajorodne odp = oblicz( Wpo, czlowiek ) odp = 0.7215 0.1772 0.0372 4.3 Oceń krytycznie rezultaty (jakość rozpoznania) uzyskane w punktach 4.1 i 4.2 Przeprowadź analogicznie test dla strusia, nietoperza, delfina i dziobaka.