Uczenie Maszynowe – uczenie nadzorowane warstwowych sieci neuronowych

Cel Wpływ parametrów i architektury sieci na przebieg uczenia
Zagadnienia Liniowe i nieliniowe warstwowe sieci neuronowe, zagadnienie separowalności liniowej, algorytm wstecznej propagacji błędu, prędkość uczenia, warunki stopu
Narzędzia
sklearn.neural_network.MLPClassifier, Weka (omówienie Weki)
Zbiory danych
AND, XOR, PIMA, BUPA, IRIS

Zadanie 1: Obliczenia

  1. Wyprowadź wzór na regułę delta.
  2. Wykonaj kilka kroków uczenia neuronu liniowego tą regułą (ucz jedno wybrane wejście dwuwejściowego neuronu, załóż jakiś konkretny stały sygnał wejściowy i jakąś oczekiwaną wartość na wyjściu).
  3. Przemyśl i uzasadnij czy trzeba, oraz jak, ulepszyć ten algorytm dla przypadku gdy sygnał wejściowy = 0.
  4. Przypomnij sobie, ile minimalnie warstw i z jakimi funkcjami aktywacji jest niezbędnych dla odwzorowania zależności liniowych/wypukłych/wklęsłych (por. uniwersalna teoria aproksymacji oraz ten rozdział książki). To da Ci wiedzę o tym, co potrafi a czego nie potrafi jedno- i dwu-warstwowa sieć neuronowa, oraz co stanowi użyteczną warstwę neuronów w sieci.
  5. Jeśli już samodzielnie odpowiedziałeś/aś na powyższe pytania wedle własnej wiedzy, możesz podstawowe informacje o sieciach neuronowych znaleźć na tej liście (filmy od 35 do 45). Film 39 zawiera wyprowadzenie reguły delta (Zadanie 1.1).

Zadanie 2: Dostępne środowiska UM z wykorzystaniem sieci neuronowych

Istnieje bardzo wiele środowisk NN o otwartym kodzie i zaimplementowanych w różnych językach.

Są środowiska bardzo popularne, duże, i silnie wspierane przez wielu badaczy i programistów - takie jak TensorFlow, Keras, PyTorch czy Theano.

Z drugiej strony szybko powstają liczne środowiska "średniej wielkości". Jest to spowodowane prostotą implementacji – osoba znająca dobrze bibliotekę NumPy, rozumiejąca dobrze teorię NN, doświadczona w programowaniu i wiedząca, co chce osiągnąć, może stworzyć własne, całkiem funkcjonalne środowisko w ciągu jednego dnia.

Wśród dosyć popularnych środowisk znajduje się stosunkowo prosty, wbudowany w scikit-learn, moduł sklearn.neural_network, którego będziemy używali do podstawowych zadań. Bardziej zaawansowane tematy związane z NN i głębokim uczeniem będą treścią specjalnego przedmiotu na kolejnym semestrze.

Zwróć uwagę na klasyki – darmowe środowiska JNNS i neuroph oraz poeksperymentuj z TensorFlow playground.

Zadanie 3: Różnice funkcjonalne pomiędzy sieciami jedno- i wielowarstwowymi oraz pomiędzy sieciami liniowymi a nieliniowymi (uczenie sieci warstwowych funkcji logicznej AND i funkcji różnicy symetrycznej XOR)

  1. Zapoznaj się z wszystkimi przykładami w notebooku pythona, NN_cwiczenia.ipynb, oraz z używanym przez niego plikiem z funkcjami pomocniczymi, NN_helpers.py.
  2. Skonstruuj zbiór przykładów definiujący dwuargumentową funkcję ("bramkę") AND. Wszystkie 4 przykłady mają stanowić zbiór uczący. Jakie są klasy decyzyjne w tym zbiorze przykładów i jakie są ich liczności?
  3. Wyobraź sobie i narysuj (→ sprawozdanie) pożądaną funkcję odpowiedzi sieci (trójwymiarowy wykres zależności wyjścia od dwóch wejść).
  4. Skonstruuj liniową sieć jednowarstwową (podając liczbę warstw mowa o warstwach ukrytych) o architekturze 2-1 (neurony ukryte 'identity'-neuron wyjściowy 'logistic'). Nie jest to pełna sieć liniowa, ale na potrzeby tych eksperymentów przyjmijmy takie nazewnictwo. Naucz tę sieć na problemie AND. Narysuj wykres funkcji straty. Narysuj funkcję odpowiedzi sieci i zobacz, jakie są błędy dla poszczególnych przypadków.
  5. Spróbuj utworzyć i nauczyć sieć liniową dla problemu AND o liczbie warstw większej niż 2, i zobacz czy daje mniejszy błąd.
  6. Przerób sieć na nieliniową sieć jednowarstwową (neurony ukryte 'logistic') i naucz ją na tym samym problemie.
  7. Przypatrz się wagom neuronu wyjściowego. Wykreśl w przestrzeni wejść prostą, którą definiuje neuron wyjściowy i oceń, czy i jak realizuje ona separację klas decyzyjnych.

  8. Skonstruuj zbiór przykładów definiujący dwuargumentową funkcję XOR. Wszystkie 4 przykłady mają stanowić zbiór uczący.
  9. Wyobraź sobie i narysuj (→ sprawozdanie) pożądaną funkcję odpowiedzi sieci.
  10. Skonstruuj liniową sieć jednowarstwową o architekturze 2-1 i naucz ją na problemie XOR. Jak wygląda funkcja odpowiedzi sieci i błędy dla poszczególnych przypadków?
  11. Przerób sieć na nieliniową sieć jednowarstwową i naucz ją na tym samym problemie. Narysuj wykres błędu w czasie uczenia, powtarzając uczenie 10 razy (niedeterministycznie). Narysuj wartości wszystkich wag w sieci na kilku etapach uczenia (od początku do końca). Fajnym rozwiązaniem jest zrobienie z czasu uczenia trzeciego wymiaru tego wykresu. Czy rozkład się zmienia? Uważaj na kopiowanie macierzy wag numpy (żeby na różnych etapach uczenia nie kopiować referencji do tej samej macierzy, tylko wartości w niej).
  12. Skonstruuj nieliniową ('logistic') sieć dwuwarstwową o architekturze 2-2-1 i naucz ją na problemie XOR. Jak teraz wygląda funkcja odpowiedzi sieci? Jeśli uczenie nie daje zadowalających rezultatów, poeksperymentuj z innym algorytmem, np. 'adam', lub z innymi wartościami parametrów (np. dostrój prędkość uczenia). Czy trudno jest nauczyć taką sieć problemu XOR i o czym to świadczy?
  13. Powtórz uczenie kilka razy zaczynając od losowych początkowych wag. Czy zawsze widzisz po zakończeniu uczenia taką samą funkcję odpowiedzi sieci?
  14. Sprawdź jakie są wagi sieci. Jakie proste definiują neurony w warstwie ukrytej? (spróbuj je narysować w przestrzeni wejść). Jak można interpretować działanie neuronu wyjściowego?
  15. Narysuj, jak zmieniają się wagi podczas procesu uczenia.

Zadanie 4: Obserwacja zjawiska przeuczenia na przykładzie zbioru PIMA.

  1. Zapoznaj się z pochodzeniem zbiorów PIMA i BUPA – wyszukaj: "PIMA dataset" (Indians diabetes), "BUPA dataset" (liver disorders).
  2. Wczytaj zbiór PIMA i skonstruuj dla niego dwuwarstwową sieć nieliniową ('logistic') o architekturze 8-4-1.
  3. Wydziel osobny zbiór testowy jako 10% całości; ucz sieć na pozostałych 90%.
  4. Pamiętaj o odpowiedniej normalizacji atrybutów.
  5. Wyłącz wszelkie "inkrementacyjne" warunki stopu, żeby uczenie trwało dokładnie tyle epok, ile ustawisz.
  6. Przeprowadź uczenie algorytmem wstecznej propagacji błędu (może być bardzo długie, np. 20 000 epok); pokaż na jednym wykresie przebieg błędu dla zbioru uczącego i testowego.

Zadanie 5: Dobór liczby neuronów w warstwie ukrytej na przykładzie zbioru IRIS.

  1. Dla zbioru IRIS przeprowadź eksperymenty uczenia nieliniowych ('logistic') sieci dwuwarstwowych o architekturach 4-n-3, dla n zmieniającego się w przedziale [2,14], przy stałej założonej liczbie epok uczenia.
  2. Przedstaw na jednym wykresie przebieg błędu uczenia dla kolejnych wartości n.
  3. Czy istnieje jednoznaczna zależność pomiędzy n a przebiegiem błędu? Czy biorąc pod uwagę tylko przebieg błędu dla zbioru uczącego można ustalić optymalną liczbę neuronów w warstwie ukrytej? Jeśli tak, to ile ona wynosi dla tego zbioru przykładów?

Zadanie 6: Sieci neuronowe w Wece.

  1. Otworz zbiór IRIS.
  2. Wybierz klasyfikator MultilayerPerceptron i przeczytaj opis jego działania i parametrów.
  3. Uruchom uczenie sieci neuronowej. Jak mają się wyniki SN w porównaniu do innych, poznanych wcześniej klasyfikatorów?
  4. Zmień liczbę foldów na 4 i ustaw GUI na True.
  5. Uruchom klasyfikator i zaakceptuj 4x sieć bez uczenia; obejrzyj macierz pomyłek.
  6. Ustaw tryb testowania na zbiór uczący.
  7. Uruchom klasyfikator i dodaj dwa dodatkowe neurony w warstwie ukrytej, odpowiednio je łącząc (opis wyjaśnia jak zaznaczać, odznaczać i łączyć neurony).
  8. Sprawdź – wykonując odpowiednią liczbę powtórzeń – czy miało to wpływ na osiąganą trafność.
  9. Usuń neurony z warstwy ukrytej zostawiając tylko jeden. Jak teraz zmieniła się trafność klasyfikowania? Co można powiedzieć – na podstawnie uzyskanych wyników – o wykorzystywanym w tym eksperymencie zbiorze danych?


W sprawozdaniu pomiń zadania 1, 2 i 6.