SI/L/z5
From WikiZMSI
[edytuj]
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]).
[edytuj]
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ą).