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