Laboratorium 01
Transkrypt
Laboratorium 01
Wprowadzenie do Sieci Neuronowych — lista zadań 1 Maja Czoków, Jarosław Piersa 2010-10-04 1 Zasady zaliczania 1.1 Oceny Zaliczenie laboratoriów na podstawie implementowania omawianych algorytmów. Każde zadanie jest punktowane za 1 punkt. Dopuszczane są oceny wymierne (czyt. ułamkowe za brzydko napisane zadania) oraz powyżej jednego punktu za wybitnie napisane zadania. • dst — 3p. • db — 4p. • bdb — 5p. • bdb+ — 6p lub więcej. Dodatkowo na ocenę bdb+ wymagane jest oddanie zadań z pięciu 1 działów: – perceptrony proste i maszyny liniow, – algorytmy konstrukcyjne dla sieci skierowanych, – wsteczna propagacja błędu – uczenie bez nauczyciela, samoorganizacja, PCA, – sieci Hopfielda, maszyny Boltzmanna, symulowane wyżarzanie. Oraz należy oddać 2 : – przynajmniej jeden program do końca października, – przynajmniej dwa programy do końca listopada, – przynajmniej trzy programy do końca stycznia. Zwolnienie z egzaminu za wybitną pracę na zajęciach jest możliwe do dnia 2011-02-16. 1.2 Wskazówki Na co należy zwrócić uwagę pisząc progamy: • Zadania będą sprawdzane z autorem siedzącym obok, zaoczne sprawdzanie zadań dopuszczane będzie tylko w wyjątkowych sytuacjach. • Zadania powinny być napisane tak by 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. Prosimy upewnić się, że mają Państwo pod ręką wszystkie wymagane środowiska lub/i biblioteki (dotnet framework, jdk, interpreter pythona, ...). • Podczas sprawdzania należy mieć pod ręką kod źródłowy programu (oraz edytor podświetlający składnię). 1 Zmiana 2 Zmiana w porównaniu do poprzedniego roku. w porównaniu do poprzedniego roku. 1 • Optymalnie zadania powinny być oddawane w trakcie zajęć. • Fragmentem zaliczenia może być dodatkowe pytanie o algorytm, sposób implementacji, zagadnienia teoretyczne powiązane z zadaniem. Podobnie może być to dopisanie dodatkowej funkcjonalniści w trakcie sprawdzania. Im później oddawane zadanie tym większe szanse na „dodatkowe” pytania i wyższy poziom trudności. • Progamy korzystające z gotowych bibliotek do sieci neuronowych nie będą akceptowane. • Teoretycznie dopuszczane są programy z tekstowym interfejsem użytkownika. Teoretycznie. Jeżeli jednak autor nie jest mistrzem ascii-artu, to gorąco rekomendujemy zrobić interfejs graficzny. • 21 września 2011 USOS sam wstawi oceny niedostateczne studentom, którzy nie uzyskali zaliczenia. 2 Powtórzenie 2.1 Model Preceptronu Perceptronem nazywamy następujący model składający się z: • określonej liczby wejść n, • wagi stowarzyszonej z każdym wejściem wi , i = 1..n • funkcji aktywującej f Dynamika perceptronu. Mając n wejść x1 ...xn liczbowych perceptron zwraca wartość n X xi wi ) out = f ( (1) i=1 Zakładając progową postać funkcji, perceptron działa jako klasyfikator, dla danych x1 , .., xn zwraca całkowitą liczbę będącą klasą, do której dane należą. 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 1 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. −1 s<p f (s) = +1 s≥p Funkcja podobna do poprzedniej z tą różnicą, że wartość −1 nie jest elementem neutralnym dodawania i „odpowiedź negatywna” może mieć pewien wpływ. • Sigmoida f (s) = σ(s) = 1 1 + exp(−s) Funkcja sigmoidalna może tu dziwić. Wymaga dzielenia i potęgowania, czyli więcej obliczeń, co nie powinno być wskazane przy wielokrotnym wykonywaniu. Jednakże jest ciągła i różniczkowalna co ma zasadnicze znaczenie przy algorytmach uczenia i przybliża funkcją bipolarną. Ponadto zachodzi σ ′ (s) = σ(s) · (1 − σ(s)) 2 1.5 1 0.5 0 -0.5 -1 -1.5 -4 -2 0 2 4 Rysunek 1: Funkcja sigmoidalna z parametrami β = 1, β = 3, β = 10. out Rysunek 2: Schemat działania perceptronu 2.3 Uczenie preceptronu (i) (i) Dany niech będzie zestaw k przykładów E = E (1) ...E (k) , gdzie E (i) = (e1 , ..., eN ) ∈ RN i odpowia(1) (k) dające im poprawne wyniki T ...T . 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 eji > 0 to zwiększenie wagi wi zwiększy O, jeżeli eji < 0 to zmniejszenie wi zwiększy O. Jeżeli błąd ERR jest ujemny to musimy zmniejszyć O. Podobnie rozumując musimy zmniejszyć wagi wi jeśli wejście eji > 0 i zwiększyć wi w przeciwnym wypadku tj. eji < 0. Podsumowując te rozważania otrzymujemy algorytm: • Wylosuj wagi wi małe, blisko 0. • Wybierz przykład E j i odpowiadającą mu poprawną odpowiedź T j , • Oblicz O — wynik działania sieci na E j • Oblicz ERR = T j − O • Uaktualnij wszystkie wagi zgodnie ze wzorem wi = wi + η · ERR · eji η > 0 jest stałą uczenia. • Jeżeli sieć klasyfikuje poprawnie wszystkie (większość) przykłady to zakończ, wpw wróć do 2. UWAGA: Powyższego algorytmu nie należy stosować w implementacjach! UWAGA: W 1969 matematycy Minsky oraz Papert udowodnili, że pojedynczy perceptron jest w stanie poprawnie klasyfikować wyłącznie problemy linowo separowalne. 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. 3 Rysunek 3: Problem liniowo separowalny (po lewej) i nieseparowalny (po prawej) 2.4 Algorytm Uczenia Kieszonkowego / Pocket Learning Algorithm Dane: Perceptron o n wejsciach, 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ć polarną. W tej sytuacji dodatkowym parametram 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 wartosci wokół 0, przypisujemy takiemu układowi wag zerowy czas życia, 2. Przebiegamy przykłady losując z listy, 3. Dla wybranego przykładu E j sprawdzamy, czy E j jest dobrze klasyfikowany, • Jesli tak, zwiekszamy mu czas życia o jeden. Jezeli 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. • Jesli nie, to wi := wi + T j · Eij p := p − T j 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. 2.5 Algorytm Uczenia z Zapadką / Ratchet Learning Algorithm Dane i wyjście jak wyżej. 1. jak powyżej, 2. jak powyżej, 3. jak powyżej, • Jesli tak, zwiekszamy mu czas życia o jeden. Jezeli jest to wynik lepszy niż u dotychczasowego rekordzisty i dodatkowo nowy zestaw wag poprawnie klasyfikuje więcej przykładów uczących niż poprzedni, to zapominamy go (dotychczasowego rekordzistę) i zapisujemy bieżący układ wag jako nowego rekordzistę. Wracamy do 2. • Jesli nie, to jak powyżej 4. jak powyżej, 4 2.6 Maszyny Liniowe Maszyna liniowa składa się z n wejść, l „perceptronów”. Perceptrony mają swoje kolejne indeksy i te same wejścia. Oznacza to, że ML ma łącznie nl wag (po n dla każdego z l perceptronów). Będziemy je oznaczać poprzez wij , gdzie i = 1..n jest indeksem wejścia, natomaist j = 1..l jest indeksem perceptronu. Uznajemy ponadto, że we wszystkich perceptronach funkcja aktywująca jest identycznością f (x) = x To jest każdy z perceptronów zwraca wyłącznie sumę ważoną outj = n X wij xi (2) i=1 Odpowiedzą całej maszyny liniowej jest indeks perceptronu, który zwrócił największą wartość outj . OU T = {j : ∀k=1..l outk ≤ outj } (3) Maszyna linowa zwraca kategorię danych wejściowych x1 ..xn , ale kategoryzacja nie musi być binarna. 2.7 Algorytm Uczenia Maszyny Lionowej Dane: zestaw przykładów uczących E j , j = 1..k oraz poprawnych odpowiedzi T j , j = 1..k. Wynik: wagi wij , dla których sieć daje poprawne klasyfikacje. 1. Przypisujemy wagom małe losowe wartosci wokół 0, 2. Przebiegamy przykłady losując z listy, 3. Dla wybranego przykładu E j sprawdzamy, czy E j jest dobrze klasyfikowany, • Jesli tak, wracamy do 2. • Jesli nie (np jest kategoria p zamiast q), to wip + = Eij wiq − = Eij Wracamy do 2. 4. Algorytm kończymy po przebiegnięciu odpowiedniej liczby iteracji. Dodajemy modyfikację kieszeni i zapadki (tj. zapamiętywanie najbardziej żywotnych zestawów wag). 3 Zadania 3.1 Zadanie 1 Napisz program, który wykorzystuje maszynę liniową lub kilka (naście) perceptronów do rozpoznawania cyfr (lub liter — uwaga na liczbę mnogą! program powinien rozpoznawać kilka cyfr). Cyfry powinny być wyświetlane jako układy pikseli na matrycy o niewielkich wymiarach (max. 100 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ś cyfropodobnego) i automatycznej klasyfikacji. Pomysły na rozbudowanie programu: • Weścia uczące można zaburzać (tj. odwracać piksel z niewielkim prawdopodobieństwem niezależnie dla danego piksela). Można w ten sposób uzyskać częściową odporność na szumy, • Rozpoznawanie cyfr w systemie szesnastkowym, • Rozpoznawanie liter (wymaga większej matrycy!), • Rozpoznawanie kształtów (okrąg, kwadrat, linia, domek itd), • Rozpoznawanie symboliczne http://en.akinator.com/ • Rozpoznawanie tekstu pisanego (np. całych liczb) za pomocą myszki na matrycy w programie. 5 3.2 Zadanie 2 Dany będzie plik (kilka plików) z listą punktów na płaszczyźnie oraz poprawną klasyfikacją punktu. Klasyfikacja jest binarna: 0 lub 1 (+1, -1). # komentarze, informacje o pliku, itp # (ewentualnie wymiar przestrzeni i liczba przykładów uczących) x1 y1 o1 x2 y2 o2 ... Należy napisać program, który nauczy perceptron klasyfikacji na zadanej liście przykładów. Dodatkowo program powinien mieć możliwość wczytać parametry innych punktów (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. Pomysły na rozbudowanie programu: zadanie dla punktów w wyżej-wymiarowych przestrzeniach (R3 , 4 R , ...), klasyfikacja, która nie jest binarna (3 klasy, 4 klasy...), statystyki na danych wejściowych oraz wynikach uczenia, automatyczny zapis wyników do pliku. 6