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) na podstawie szablonowych kodów źródłowych: templates_mlp.zip.

Zgodnie ze wskazówkami prowadzącego wykonaj następuje czynności na szkieletowej klasie MLPApproximator.

  • Dostarcz implementacje dla sigmoidalnej funkcji aktywacji (sigmoid) i jej pochodnej (sigmoid_d).
  • Dostarcz implementacje dla liniowej (tożsamościowej) funkcji aktywacji (linear) i jej pochodnej (linear_d).
  • Dostarcz implementacja dla kwadratowej funkcji straty (squared_loss) i jej pochodnej (squared_loss_d).
  • Uzupełnij rozpoczęte implementacje dla metod wykonujących przebieg obliczeń sieci w przód (forward) i wstecz (backward). Wykorzystaj wzory macierzowe z wykładu uwzględniające tzw. wsad - czyli więcej niż jeden przykład uczący przesłany w formie: X_b, y_b.
  • Dostarcz implementację poprawek wag zgodnie z podejściem "gradientu prostego" (algo_sgd_simple).

Następnie, z wykorzystaniem skryptu template_mlp_main.py przeprowadź kilka wstępnych eksperymentów uczenia sieci neuronowej dla zbioru danych wygenerowanego za pomocą funkcji fake_data oraz dla kilku wybranych wg uznania struktur sieci (argument konstruktora o nazwie structure, domyślnie: structure=[32, 16, 8]).

Do domu

  • RELU. Dostarcz implementacje dla funkcji aktywacji ReLU (relu) i jej pochodnej (relu_d).
  • ALGORYTMY UCZĄCE. Wyposaż klasę MLPApproximator w 3 dodatkowe algorytmy uczące (warianty SGD) oparte na wykładniczych średnich kroczących (EMA): algorytm momentum, algorytm RMSProp i algorytm Adam. Na ocenę 4.0 wystarczą wybrane 2 z 3 algorytmów. Zasadnicze wzory na poprawki wag umieść w odpowiednich metodach o prefiksach algo_, a ewentualne operacje przygotowawcze umieść w metodach o prefiksach pre_algo_.
  • EKSPERYMENTY. Wykonaj duży zestaw eksperymentów uczenia sieci neuronowej, zapisując wyniki do plików tj: wykresy, błędy lub całe logi konsolowe, wynikowe sieci neuronowe (wskazówka: można wykorzystać pakiet pickle do serializacji obiektów w Pythonie). Przed przystąpieniem do eksperymentów zmień w pliku template_mlp_main.py rozmiar dziedziny dla danych nastawiając domain = 1.5 * np.pi. Dodatkowo ustal seed randomizacyjny w konstruktorze sieci neuronowej na równy Twojemu numerowi albumu (indeksowi studenta). Uwaga - podczas wszystkich eksperymentów stosuj 1000 epok uczących i wsady o rozmiarze 10. Parametry do eksperymentowania to:
    • trzy współczynniki uczenia: 1e-2, 1e-3, 1e-4;
    • dwie funkcje aktywacji dla warstw ukrytych: sigmoid, relu;
    • cztery (lub trzy, jeżeli któryś pominięty) algorytmy uczące: gradient prosty, momentum, RMSProp, Adam;
    • trzy struktury sieci: [128, 64, 32], [128, 128, 64, 64, 32, 32], [64] * 5 + [32] * 5 + [16] * 5 + [8] * 5 (ta ostatnia z 20 warstwami ukrytymi).
  • WYKRES PORÓWNAWCZY ALGORYTMÓW SGD. Dla nastaw: structure=[128, 128, 64, 64, 32, 32], learning_rate=1e-3, activation_name="relu" przygotuj wykres przedstawiający krzywe uczenia z błędami uczącymi i testowymi dla wszystkich algorytmów uczących (4 lub 3 pary wykresów na jednej figurze). Wskazówka: wykorzystaj zapisane do plików obiekty sieci neuronowych (np. spicklowane) oraz funkcję loss_during_fit (możesz ją zmodyfikować lub stworzyć nową podobną).