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)
- Utwórz i naucz sieć ('logistic') na 90% zbioru PIMA (architektura 8-4-1); 10% tego zbioru przeznacz do testowania.
- Przeprowadź klasyfikowanie przykładów ze zbioru testującego. Wyświetl
metrics.confusion_matrix()
. - 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. - 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:
- Czy na podstawie otrzymanego wykresu można zasugerować jakąś optymalną wartość obu progów dla tego zbioru przykładów i tej sieci?
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 |
Zadanie 8. Badanie odporności sieci na uszkodzenia
- Skonstruuj sieć dwuwarstwową ('logistic') o architekturze 4-3-3 dla problemu IRIS i naucz ją na 90% zbioru.
- Przeprowadź testowanie na pozostałych 10% i zapisz trafność klasyfikowania.
- 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.
- 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.
- Czy odporność sieci na uszkodzenia (usunięcia wag) jest wysoka?
- Czy jesteś w stanie na podstawie tak “zredukowanej” sieci powiedzieć coś o ważności poszczególnych atrybutów opisujących przykłady?
- 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.
- Wydziel (na stałe) zbiór testowy będący 10% całych danych.
- W pozostałej części zacznij od proporcji zbioru walidującego (parametr
validation_fraction
) wynoszącej 0.05. - 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. - Sukcesywnie zwiększaj rozmiar zbioru walidującego co 0.05 do proporcji 0.95 włącznie.
- 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]
- Użyj prostej implementacji RBF NN, tej albo tej.
- Zwróć uwagę na różniącą się funkcję aktywacji i funkcję PSP w porównaniu z tradycyjnymi sieciami.
- Zbuduj sieć RBF dla problemu IRIS.
- 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.
- 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.
- 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ą).
- 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
.