SI/L/z5

From WikiZMSI

< SI | L

Na zajęciach

Napisz w języku Python program realizujący sieć neuronową MLP przeznaczoną do zadania aproksymacji (estymacji regresji).

  • Zgodnie ze wskazówkami prowadzącego przygotuj zbiór danych przeznaczony do aproksymacji funkcji y = cos(x_1 * x_2) * cos(2 * x_1), gdzie x_1 i x_2 są z przedziału [0, pi]. Na potrzeby laboratorium przygotuj próbę uczącą o rozmiarze m = 1000 punktów zaczerpniętych z powierzchni powyższej funkcji. Zwizualizuj dane za pomocą polecenia scatter (z pyplot).
  • Zaimplementuj sieć MLP z jedną warstwą nieliniową jako klasę (zgodnie ze schematem biblioteki scikit-learn, dziedziczenie po BaseEstimator oraz RegressorMixin). Argumenty konstruktora: liczba neuronów (K), liczba kroków uczenia (T), współczynnik uczenia (eta), wartość zalążka losowania (seed). Wagi sieci przechowaj w formie macierzy K x (n + 1) dla warstwy nielinowej oraz wektora 1 x (K + 1) dla warstwy liniowej.
  • W ramach funkcji fit zaimplementuj algorytm uczenia backpropagation w trybie on-line, przyjmując dla poprawek gradientowych uproszczone wzory odpowiednie dla jednej warstwy ukrytej (uwaga: początkowe wagi warstwy nieliniowej wylosuj z przedziału [-0.001, 0.001]).
  • Zaimplementuj funkcję predict.
  • Wykonaj eksperyment uczenia dla nastaw: K = 16, T = 10^6, eta = 0.05. Wypisz końcowy średni błąd kwadratowy popełniany przez sieć na zbiorze uczącym. Sprawdź, jaki wpływ na wynik końcowy mają wagi początkowe, zmieniając zalążek losowości (sprawdź seedy 0 oraz 1). Wykreśl funkcję aproksymowaną oraz aproksymator tj. otrzymaną sieć neuronową, z użyciem poleceń meshgrid i plot_surface (uwaga: tworząc wykres należy go zadeklarować z ustawieniem projection='3d').
  • Wprowadź modyfikację funkcji fit (oraz konstruktora) pozwalającą na uczenie w trybie wsadowym, dodając parametr decydujący o rozmiarze wsadu (np. batch_size). Każda poprawka wykonywana będzie dopiero po skumulowaniu gradientów, wynikających z "obejrzenia" przez sieć większej liczby przykładów (równej zadanemu batch_size).
  • Wykonaj dodatkowe eksperymenty uczenia dla par: T = 10^4, batch_size = 100 oraz T = 10^5, batch_size = 10.

Do domu

  • Zgodnie z informacjami z wykładu dodaj do stworzonej klasy trzy dodatkowe metody uczenia: uczenie z rozpędem (momentum + EMA), algorytm RPROP oraz algorytm Adam. Wyboru metody użytkownik powinien dokonywać poprzez dodatkowy parametr konstruktora. Dla metody momentum przyjmij współczynnik rozpędu równy 0.9. Dla metody RPROP przyjmij stałe: eta_0 = 0.05, eta_min = 10^(-3), eta_max = 50, eta_increase = 1.2, eta_decrease = 0.5.
  • Wykonaj porównanie wszystkich czterech metod uczenia poprzez eksperymenty dla nastaw: T = 10^4, batch_size = 100; T = 10^5, batch_size = 10; T = 10^6, batch_size = 1; oraz T = 2 * 10^4, batch_size = 100; T = 2 * 10^5, batch_size = 10; T = 2 * 10^6, batch_size = 1, czyli po 6 uruchomień dla każdej metody. Wyniki zachowaj w pliku tekstowym (odpowiednio opisane) dla późniejszego sprawdzenia (uwaga: w każdym eksperymencie zastosuj seed = 1). Na życzenie prowadzącego przedstaw wykres najlepszej i najgorszej otrzymanej sieci neuronowej pod względem dokładności.