Wprowadzenie do Sieci Neuronowych — Laboratorium 01 — Organizacja zajęć. Perceptron.
Jarosław Piersa 2012-10-03
1 Organizacja zajęć
1.1 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.
1.2 Zaliczenie
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. Bonus za oddawanie zadań w ciągu jednego tygodnia oraz za prezentowanie na forum grupy. Punktacja
ocena punkty
dst 3p.
db 4p.
bdb 5p.
bdb+ 6p. lub więcej
Dodatkowo na ocenę bdb+ wymagane jest oddanie zadań z różnych działów:
• modele pojedynczych neuronów (perceptrony, maszyny liniowe, adaline),
• wsteczna propagacja błędu,
• uczenie bez nauczyciela (samoorganizacja topologiczna, PCA),
• sieci rekurencyjne (autoasocjator Hopfielda, optymalizacja grafowa, maszyny Boltzmanna).
Wymagana jest terminowość:
• przynajmniej jeden program (z działu perceptron) do końca października,
• przynajmniej dwa programy do końca listopada,
• przynajmniej trzy programy do końca stycznia,
• wszystkie programy przed egzaminem.
1.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 wyko- rzystania projektor w sali laboratoryjnej. Prezentacja powinna trwać 5 do 10 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. Bonus do oceny za prezentowanie programu: +0.1 do +0.2 p.
• (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. Prosimy 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 gorąco rekomendowane jest zrobienie interfejsu graficzny.
1.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
[1] R. Rojas Neural Networks, A Systematic Introduction, Springer 1996,
[2] P. Peretto, Introduction to Modeling Neural Networks, Cambridge University Press 1994, [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 1995.
2 Powtórzenie
2.1 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 wi, i = 1..n
• funkcji aktywującej f
Dynamika perceptronu. Mając n wejść x1...xn liczbowych perceptron zwraca wartość
O = f (
n
X
i=1
xiwi) (1)
Zakładając progową postać funkcji, perceptron działa jak klasyfikator, dla danych x1, .., xn zwraca cał- kowitą liczbę będącą klasą, do której dane należą.
out
Rysunek 1: 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 1 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.
f (s) =
−1 s < p +1 s ≥ p
Funkcja podobna do poprzedniej z tą różnicą, że wartość −1 nie jest elementem neutralnym doda- wania i „odpowiedź negatywna” może mieć pewien wpływ.
• Sigmoida
f (s) = σ(s) = 1 1 + exp(−s)
-0.5 0 0.5 1 1.5
-3 -2 -1 0 1 2 3
=1
=2
=5
=10
Rysunek 2: Funkcja sigmoidalna z parametrami β = 1, β = 3, β = 10.
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
σ0(s) = σ(s) · (1 − σ(s))
• Symetryczna sigmoida (tangens hiperboliczny)
f (s) = 2σ(s) − 1 = 1 − exp(−s) 1 + exp(−s)
= tanh(s 2)
-1.5 -1 -0.5 0 0.5 1 1.5
-4 -2 0 2 4
y
x
beta = 1 beta = 3 beta = 10
Rysunek 3: Symetryczna sigmoidalna.
2.3 Perceptron progowy
W praktyce będziemy korzystać z jednostki z polarną funkcją aktywacji. Tj. neuron ma wagi w1, .., wn, próg θ oraz zwraca:
O(x) =
−1 P
iwixi< θ
+1 P
iwixi≥ θ
2.4 Perceptron z obciążeniem (biasem)
Alternatywnie będziemy korzystać z modelu składającego się z: n + 1 wag w0, w1, ..., wn. Waga w0 jest stowarzyszona ze sztucznym n + 1szym wejściem x0, które zawsze jest równe +1. Perceptron zwraca wartość
O(x) =
−1 Pn
i=0wixi< 0
+1 Pn
i=0wixi≥ 0
2.5 Uczenie perceptronu
Dany niech będzie zestaw k przykładów E =E(1)...E(k) , gdzie E(i)= (e(i)1 , ..., e(i)N ) ∈ RN i odpowia- dające im poprawne wyniki T(1)...T(k). Dany też mamy perceptron o N wejściach i jednym wyjściu.
Rozważmy przykład Eji odpowiadającą mu poprawną odpowiedź Tj, niech sieć z bieżącym zestawem wag zwróci wartość O. Rozważmy błąd:
ERR = Tj− 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:
1. Losujemy wagi wi małe, blisko 0.
2. Wybieramy kolejny (lub losowy — zalecane) przykład Eji odpowiadającą mu poprawną odpowiedź Tj,
3. Obliczamy O — wynik działania sieci na Ej 4. Obliczamy ERR = Tj− O
5. Jeżeli ERR = 0 (klasyfikacja jest poprawna), to wróć do 2,
6. W przeciwnym wypadku uaktualniamy wszystkie wagi zgodnie ze wzorem wi:= wi+ η · ERR · Eij
θ := θ − ERR η > 0 jest stałą uczenia.
7. Jeżeli sieć klasyfikuje poprawnie wszystkie (większość) przykłady to kończymy, wpw wracamy do kroku 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 liniowo separowalne.
-6 -4 -2 0 2 4 6
-6 -4 -2 0 2 4 6
(a) Problem separowalny liniowo.
-1.5 -1 -0.5 0 0.5 1 1.5
-1.5 -1 -0.5 0 0.5 1 1.5
(b) Problem nieseparowalny.
Rysunek 4: 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 E1...Ek wraz z poprawnymi odpowiedziami T1...Tk. Zakładamy, że funkcja aktywująca ma postać polarną. 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. 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 Ej sprawdzamy, czy Ej 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:
wi := wi+ η · ERR · Eij θ := θ − 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.
1. 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 Ej, 3. Sprawdzamy czy Ej jest dobrze klasyfikowany (ERR = Tj− O = 0),
• 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:
wi := wi+ η · ERR · Eij θ := θ − 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.1 Zadanie 1
Zaimplementuj pojedynczy perceptron progowy. Tj. dane są wagi (w0, w1, w2) i niech x0 = +1. Dla zadanego wejścia (x1, x2) zwraca klasyfikację +1 jeżeliP
ixiwi≥ 0 i −1 w przeciwnym wypadku.
Język programowania dowolny, zalecany z szybkimi bibliotekami / frontendem do generowania wy- kresów: Matlab, Octave, Maple, R.
3.2 Zadanie 2
Napisz program, który dla zadanych wag perceptronu wyświetli klasyfikację na fragmencie płaszczyzny {x0, x0+ d, x0+ 2d, ..., x1} × {y0, y0+ d, y0+ 2d, ..., y1}.
3.3 Zadanie 3
Wyznacz kanoniczną postać prostej separującej dane dla perceptronu z zadania 1 (lub napisz program, który ją wyznacza). Wyświetl ją na wykresie w programie 2.
Postać kanoniczna prostej: y = ax + b gdzie a, b ∈ R.
3.4 Zadanie 4 (Rachunkowe)
Pokaż, że definicje perceptronu progowego i z biasem są równoważne.
3.5 Zadanie 5 (Rachunkowe)
σ(s) = 1
1 + exp(−s) Pokaż, że
2σ(s) − 1 = 1 − exp(−s) 1 + exp(−s)
4 Zadania programistyczne (do wyboru)
4.1 Zadanie 1. Uczenie klasyfikacji punktów
Dany jest plik (kilka plików) z listą punktów na płaszczyźnie oraz poprawną klasyfikacją punktu. Klasy- fikacja 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 ...
Napisz program, który nauczy perceptron klasyfikacji na zadanej liście przykładów. Dodatkowo pro- gram 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 R3,
• 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 R4,
4.2 Zadanie 2. Rozpoznawanie cyfr / liter / obrazów
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ś cyfro-podobnego) i automatycznej klasyfikacji.
Pomysły na rozbudowanie programu:
• Wejś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,
• 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 percep- tronu,
• Rozpoznawanie liczb 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.
4.3 Zadanie 3*. Neuron Hodgkina-Huxleya
(dla chętnych) Zapoznaj się z modelem komórki neuronowej opisanym w terminach układów dynamicz- nych. Zaimplementuj model Hodgkina-Huxleya. Informacje o modelu można znaleźć w rozdziale drugim książki — E. Izhikevich Dynamical Systems in Neuroscience, 2007 MIT Press.