Uczenie Maszynowe – warstwowe sieci neuronowe, zagadnienia zaawansowane

Cel Wykorzystanie zbioru walidującego (weryfikującego). Interpretacja stanów wyjść sieci. Badanie odporności sieci na uszkodzenia
Zagadnienia
Zbiór weryfikujący, pre- i post-processing danych, odporność sieci na uszkodzenia, dobór parametrów sieci i algorytmu uczenia pod kątem maksymalizacji trafności klasyfikowania
Narzędzia
sklearn.neural_network.MLPClassifier
Zbiory danych
IRIS, PIMA, BUPA


Zadanie 7. Sterowanie rozmiarem obszaru niepewnych odpowiedzi (braku odpowiedzi) sieci na granicach klas decyzyjnych (podczas testowania sieci)

  1. Utwórz i naucz sieć ('logistic') na 90% zbioru PIMA (architektura 8-4-1); 10% tego zbioru przeznacz do testowania.
  2. Przeprowadź klasyfikowanie przykładów ze zbioru testującego. Wyświetl metrics.confusion_matrix().
  3. Przeprowadź klasyfikowanie, ale z bezpośrednim użyciem metody predict_proba(), gdzie sam(a) zadecydujesz, czy przypadek należy przydzielić do jakiejś klasy, czy uznać za "nierozpoznany" (niezaklasyfikowany). Przyjmij dwa parametry-progi: K1 (przewidujemy klasę 1 jeśli output>=K1) i K0 (przewidujemy klasę 0 jeśli output<=K0). Progi te określą, jakie wartości muszą wysłać neurony w warstwie wyjściowej, aby móc zinterpretować ich stan jako decyzję o przypisaniu przykładu do odpowiedniej klasy decyzyjnej. Powinno zachodzić K1>K0. "output" to prawdopodobieństwo klasy 1 wedle sieci.
  4. Sporządź wykres (trzy przebiegi na jednym wykresie) zależności procentu przypadków z jednego ze zbiorów (uczącego lub testującego):
    – poprawnie zaklasyfikowanych (do wszystkich klas decyzyjnych razem),
    – niepoprawnie zaklasyfikowanych,
    – niezaklasyfikowanych
    w funkcji progu K1, dla następujących wartości K1 i K0:
  5. K1

    K0

    0.50001

    0.49999

    0.6

    0.4

    0.7

    0.3

    0.8

    0.2

    0.9

    0.1

    1.0

    0.0

  6. Czy na podstawie otrzymanego wykresu można zasugerować jakąś optymalną wartość obu progów dla tego zbioru przykładów i tej sieci?

Zadanie 8. Badanie odporności sieci na uszkodzenia

  1. Skonstruuj sieć dwuwarstwową ('logistic') o architekturze 4-3-3 dla problemu IRIS i naucz ją na 90% zbioru.
  2. Przeprowadź testowanie na pozostałych 10% i zapisz trafność klasyfikowania.
  3. Wyszukaj (zbiorczo w obu warstwach: ukrytej i wyjściowej) i usuń z sieci (tj. wyzeruj) wagę najmniejszą co do wartości bezwzględnej; pomiń wagi zawierające progi ("bias") neuronów. Przeprowadź ponownie testowanie sieci i zapisz wynik.
  4. Kroki z punku 3 powtórz około 15 razy, kolejno usuwając coraz większe wagi i notując trafność klasyfikowania. Sporządź wykres zależności trafności klasyfikowania w funkcji liczby usuniętych (najmniejszych) wag.
  5. Czy odporność sieci na uszkodzenia (usunięcia wag) jest wysoka?
  6. Czy jesteś w stanie na podstawie tak “zredukowanej” sieci powiedzieć coś o ważności poszczególnych atrybutów opisujących przykłady?
  7. Czy w konsekwencji takiego “przerzedzenia” sieci jakiego dokonałeś/aś powyżej można usunąć niektóre neurony? Jeśli tak, to jak należy to zrobić? (przemyśl dokładnie).

Zadanie 9. Eksperymentalny dobór rozmiaru zbioru walidującego

Dla zbioru IRIS, PIMA lub BUPA przeprowadź eksperyment uczenia i testowania, zmieniając proporcje pomiędzy zbiorem uczącym i walidującym.

  1. Wydziel (na stałe) zbiór testowy będący 10% całych danych.
  2. W pozostałej części zacznij od proporcji zbioru walidującego (parametr validation_fraction) wynoszącej 0.05.
  3. Przeprowadź uczenie (liczba epok >=300) wybierając algorytm i warunki stopu, które wykorzystują zbiór walidujący (przeczytaj opis parametru early_stopping). Przetestuj sieć, zapisz trafność klasyfikowania i wartość funkcji straty.
  4. Sukcesywnie zwiększaj rozmiar zbioru walidującego co 0.05 do proporcji 0.95 włącznie.
  5. Sporządź wykres zależności trafności klasyfikowania i wartości funkcji straty w funkcji proporcji rozmiaru zbioru walidującego (od 0.05 do 0.95). Czy można znaleźć jakąś najkorzystniejszą wartość?

Zadanie 10. Porównanie różnych algorytmów uczenia nadzorowanego sieci warstwowych

Opcjonalnie do przeczytania/przypomnienia: podstawowe algorytmy, pomysły na ulepszenia, krajobrazy.

Dla zbioru PIMA lub BUPA przeprowadź eksperyment uczenia (90%) i testowania (10%), używając:

  • 'sgd', learning_rate=‘constant’, learning_rate_init=0.001
  • 'sgd', learning_rate=‘constant’, learning_rate_init=0.01
  • 'sgd', learning_rate=‘constant’, learning_rate_init=0.1
  • 'adam', learning_rate_init=0.001
  • 'adam', learning_rate_init=0.01
  • 'adam', learning_rate_init=0.1
  • 'lbfgs'
  • jeśli chcesz/czujesz że to uzasadnione lub ciekawe, możesz przetestować inne parametryzacje (i np. wpływ regularyzacji).

W miarę możliwości uśrednij wyniki z kilku przebiegów dla każdego algorytmu. Czy któryś z algorytmów jest wyraźnie lepszy? Porównaj też liczbę epok uczenia.

Zadanie 11. Dla chętnych: inne sieci warstwowe – sieci z jednostkami o symetrii kołowej (RBF) [yt1, yt2]

  1. Użyj prostej implementacji RBF NN, tej albo tej.
  2. Zwróć uwagę na różniącą się funkcję aktywacji i funkcję PSP w porównaniu z tradycyjnymi sieciami.
  3. Zbuduj sieć RBF dla problemu IRIS.
  4. Naucz sieć. Uczenie składa się z trzech etapów: ustalania centrów poszczególnych neuronów, ustalenia promieni (deviation), które decydują o stopniu “spłaszczenia” funkcji Gaussowskich, oraz obliczenia wag neuronu wyjściowego. Zwróć uwagę na czas uczenia.
  5. Obejrzyj funkcję odpowiedzi wybranych neuronów w warstwie ukrytej i neuronów w warstwie wyjściowej (używając własnego kodu napisanego wcześniej). Zauważ różnice w stosunku do sieci z jednostkami logistycznymi.
  6. Zastanów się, jakie konsekwencje ma niewłaściwy dobór promieni. Co będzie się działo, gdy promienie będą za duże? Co, gdy za małe? (związek z generalizacją).
  7. Porównaj sieć RBF z tradycyjną siecią wielowarstwową na trudniejszym zbiorze przykładów (PIMA lub BUPA).

Zadanie 12. Uzyskiwanie jak najwyższej trafności

Manipulując:

  • architekturą sieci,
  • funkcjami aktywacji,
  • rodzajem algorytmu uczenia,
  • prędkością uczenia (może też się zmieniać adaptacyjnie),
  • regularyzacją (parametr alpha),
  • warunkami stopu (statycznymi i/lub dynamicznymi),

spróbuj uzyskać jak największą trafność klasyfikowania na zbiorze testującym (10% całości) dla zbioru PIMA lub BUPA.

Aby zapewnić porównywalność wyników i powtarzalność eksperymentu, używaj ciągle tego samego zbioru testującego.

Porównaj uzyskany wynik z trafnością otrzymaną przy użyciu (z domyślnymi parametrami) drzew decyzyjnych tree.DecisionTreeClassifier() i przy użyciu lasu losowego ensemble.RandomForestClassifier() z ustawionym oob_score=True.