Uczenie maszynowe i sztuczne sieci neuronowe/Ćwiczenia 4: Różnice pomiędzy wersjami
Z Brain-wiki
(→XOR) |
|||
Linia 60: | Linia 60: | ||
** uaktualniamy wagi proporcjonalnie do poprawek (z przeciwnym znakiem) | ** uaktualniamy wagi proporcjonalnie do poprawek (z przeciwnym znakiem) | ||
** wypisujemy info o błędzie | ** 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: | ||
+ | <source lang = python> | ||
+ | import matplotlib | ||
+ | matplotlib.use('TkAgg') | ||
+ | import pylab as py | ||
+ | py.ion() | ||
+ | </source> | ||
+ | Następnie animację robimy analogicznie jak [[TI/Matplotlib#Prosta_animacja| 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ą. | ||
+ | |||
+ | |||
<!-- | <!-- | ||
Wersja z 15:06, 18 mar 2016
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:
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
- propaguj sygnały od wejścia:
- 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ą.