Uczenie maszynowe i sztuczne sieci neuronowe/Ćwiczenia 4: Różnice pomiędzy wersjami

Z Brain-wiki
Linia 1: Linia 1:
[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe]]/Wsteczna propagacja błędu
+
[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe_cw]]/Wsteczna propagacja błędu
 
=Algorytm wstecznej propagacji błędu=
 
=Algorytm wstecznej propagacji błędu=
 
W tym ćwiczeniu zapoznamy się z algorytmem wstecznej propagacji błędu. Zbudujemy sieć złożoną z 3 warstw: wejściowej, ukrytej i wyjściowej.
 
W tym ćwiczeniu zapoznamy się z algorytmem wstecznej propagacji błędu. Zbudujemy sieć złożoną z 3 warstw: wejściowej, ukrytej i wyjściowej.
Linia 322: Linia 322:
 
-->
 
-->
  
[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe]]/Wsteczna propagacja błędu
+
[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe_cw]]/Wsteczna propagacja błędu

Wersja z 15:18, 18 mar 2016

Uczenie_maszynowe_i_sztuczne_sieci_neuronowe_cw/Wsteczna propagacja błędu

Algorytm wstecznej propagacji błędu

W tym ćwiczeniu zapoznamy się z algorytmem wstecznej propagacji błędu. Zbudujemy sieć złożoną z 3 warstw: wejściowej, ukrytej i wyjściowej. Schemat obliczeń wykonywanych przez tą sieć przedstawiony jest na poniższych rysunkach:


Schemat obliczeń w propagacji wstecznej
Schemat obliczeń w propagacji wstecznej

Warstwy ukryta i wyjściowa będą miały nieliniową funkcję aktywacji w postaci funkcji logistycznej. Dla przypomnienia funkcja logistyczna:

[math]g(x) = \frac{1}{1+exp(-x)}[/math]

zaś jej pochoną to:

[math]g'(x) =g(x)*(1-g(x)) [/math]

Niech nasza sieć uczy się odwzorowania zadanego tabelką:

X Y
[0,0] [0,1]
[0,1] [1,0]
[1,0] [1,0]
[1,1] [0,1]

Proszę napisać kod implementujący obliczenia przedstawione na rysunkach i w poniższym opisie:

  • zdefiniuj funkcję g(x)
  • zdefiniuj funkcję pochodną g_prim(y), zakładając, że jako argument y podawać będziemy wartość g(x)
  • przygotuj zbiór uczący zgodnie z powyższą tabelą. Niech przykłady będą ułożone w wierszach tablic X i Y
  • zdefiniuj rozmiary sieci:
    • N_wej
    • N_hid
    • N_wyj
  • przygotuj tablicę do przechowywania wag w_1, niech w kolejnych wierszach znajdują się wagi kolejnych neuronów, a w konkretnym wierszu w kolumnach kolejne wagi od konkretnego neuronu
    • jakie rozmiary muszą mieć te tablice?
    • zainicjuj je wartościami losowymi z przedziału -1,1
  • podobnie przygotuj tablicę dla wag w_2
  • w pętli wykonuj kolejne cykle uczenia
    • zainicjuj do zera: licznik błędu wyjściowego bl, oraz tablice akumulujące delty do zmiany wag D_1 i D_2
    • w pętli pobieraj kolejno przykłady. Pobierając przykłady formuj je jako wektory kolumnowe
      • propaguj sygnały od wejścia:
        • uzupełnij wektor wejściowy o "1" na szczycie, wsk. np.vstack)
        • oblicz pobudzenia neuronów z_1,
        • oblicz wartości wyjściowe z warstwy ukrytej
        • uzupełnij wektor wartości wyjściowych warstwy ukrytej o "1"
        • oblicz pobudzenia w warstwie wyjściowej
        • oblicz wartości wyjściowe z tej warstwy
      • propaguj błędy "wstecz"
        • oblicz błąd warstwy wyjściowej ważony przez pochodną funkcji g (im bardziej funkcja g była stroma w miejscu pobudzenia przy propagacji wprzód, tym bardziej błąd pobudzenia przekładał się na błąd wyjścia)
        • zrzutuj ten błąd wstecz poprzez wagi w_2 i pochodną funkcji g
        • akumulujemy poprawki D_1 i D_2 oraz błąd dla tego przykładu
    • uaktualniamy wagi proporcjonalnie do poprawek (z przeciwnym znakiem)
    • wypisujemy info o błędzie

Po zakodowaniu uczenia

  • Proszę wykreślić ewolucje wag i błędu. Ewolucję można zilustrować animacją. W tym celu na początku programu należy ustawić backend dla biblioteki matplotlib przed innymi importami i przełączyć grafikę w tryb interaktywny:
import matplotlib
matplotlib.use('TkAgg')
import pylab as py
py.ion()

Następnie animację robimy analogicznie jak w tym przykładzie.

  • Proszę zbadać co dzieje się z wagami wraz ze wzrostem ilości jednostek w warstwie ukrytej.
  • Proszę powtórzyć analizę dla sieci, której warstwa wyjściowa ma jednostkę liniową.



Uczenie_maszynowe_i_sztuczne_sieci_neuronowe_cw/Wsteczna propagacja błędu