WsdSI/LS/z4

From WikiZMSI

< WsdSI | LS

Perceptron wielowarstwowy (aproksymacja)

  • Napisać skrypt generujący zbiór danych (zbiór próbek) pochodzących z funkcji dwóch zmiennych y(x1, x2) = cos(x1 * x2) * cos(2 * x1) zdefiniowanej na dziedzinie: x1, x2 należą do przedziału [0, pi]. Przyjąć rozmiar zbioru danych I = 1000. Zbiór danych przechować w macierzy o wymiarach I x 3, gdzie kolejne kolumny będą odpowiadały zmiennym x1, x2, y.
  • Za pomocą funkcji MATLABa scatter3 i surf sporządzić wykresy odpowiednio: zbioru próbek, funkcji aproksymowanej.
  • Napisać skrypt realizujący uczenie sieci neuronowej typu perceptron wielowarstwowy (Multi-Layer Perceptron) zgodnie z wiadomościami z wykładu. Skrypt powinien przyjmować na wejście następujące argumenty: zbiór danych, zadaną liczbę neuronów, zadaną liczbę kroków uczenia, współczynnik uczenia. Skrypt powinien zwracać na wyjściu macierz z nauczonymi wartościami wag V i wektor nauczonych wag W.
  • Przeprowadzić uczenie i odebrać wyniki. Sugerowane ustawienia (rzędy wielkości): liczba kroków uczenia T ~ {10^5, ..., 10^6}, liczba neuronów K ~ {10, 20, ..., 100}, współczynnik uczenia eta ~ {10^-3, ..., 10^-1}. Początkowe wartości wylosowanych macierzy V, W powinny być bardzo małe ~[-10^-3, 10^-3] (lub jeszcze mniejszy rząd wielkości).
  • Napisać skrypt rysujący (surf) wykres powierzchni sieci neuronowej reprezentowanej przez V, W jako funkcji x1, x2. Ustalić zakres osi odpowiadający zakresom funkcji aproksymowanej.
  • Wyświetlić oba wykresy powierzchni: funkcji aproksymowanej i sieci neuronowej (funkcji aproksymującej) i porównać podobieństwo wizualnie - "na oko".

Do domu

Przeprowadzić następujący eksperyment.

  • Zaczerpnąć z aproksymowanej funkcji nowy zbiór uczący o rozmiarze I = 200, przy czym wartości y należy obciążyć pewnym losowym błędem, tj. y = y(x1, x2) + epsilon, gdzie epsilon ~ N(0, 0.2) - błąd losowy o rozkładzie normalnym o średniej zero i odchyleniu standardowym 0.2. W MATLABie jest funkcja randn() losująca liczbę (lub macierz liczb) losową z rozkładu normalnego.
  • Powyższy zbiór należy podzielić losowo na część uczącą i część testową w proporcji 70 : 30.
  • W pętli (wielokrotnie) przeprowadzić proces uczenia sieci zadając coraz większą liczbę neuronów: K = 10, 20, ..., 100 (10 iteracji). Sieć ma być uczona tylko na zbiorze uczącym. Za każdym razem początkowe wartości wag V i W mają być wylosowane na nowo. W każdej z 10 iteracji, po nauczeniu sieci należy obliczyć błąd popełniany przez nią na zbiorze uczącym i na zbiorze testowym (nie widzianym podczas uczenia) jako średnią różnicę bezwzględną pomiędzy oczekiwanymi wartościami y a odpowiedziami sieci neuronowej. Obie wartości zapamiętać dla każdej iteracji pętli.
  • Po zakończeniu pętli narysować wykres obu wielkości - błędów uczących i testowych dla kolejnych wartości K. Wskazać jaka liczba neuronów jest optymalna dla danego zbioru danych, tj. przy jakiej liczbie neuronów błąd na części testowej jest najmniejszy.
  • Nauczyć ostatecznie sieć nauronową już na całym zbiorze danych (a nie tylko na części uczącej) podając optymalną liczbę neuronów K.
  • Aby wyznaczyć w sposób dokładny błąd popełniany przez finalną nauczoną sieć względem aproksymowanej funkcji na całej dziedzinie należałoby np. wyliczyć całkę z bezwzględnej różnicy obu funkcji (lub kwadratu różnicy) i podzielić wynik przez miarę dziedziny (tu: pi^2). Nie będzie trzeba tego robić, natomiast trzeba oszacować ten błąd poprzez przybliżenie w/w całki sumą o odpowiednio dużej liczbie składników. Należy pobrać z funkcji dodatkowy duży zbiór próbek (np. o rozmiarze rzędu 10^4) i na jego podstawie należy policzyć średni błąd bezwzględny pomiędy oczekiwanymi wartościami y a odpowiedziami dostarczanymi przez sieć neuronową dla testowych punktów (x1, x2).