ESI 4 - Instytut Sterowania i Systemów Informatycznych

Transkrypt

ESI 4 - Instytut Sterowania i Systemów Informatycznych
Uniwersytet Zielonogórski
Wydział Elektrotechniki, Informatyki i
Telekomunikacji
Instytut Sterowania i Systemów Informatycznych
ELEMENTY SZTUCZNEJ INTELIGENCJI
Semestr letni 2010
Laboratorium nr 4
LINIOWE SIECI NEURONOWE
Prowadzący: …………………………………………………..
Cele ćwiczeń:
1. Celem ćwiczenia jest poznanie struktur sieci neuronowych zbudowanych przy użyciu
neuronów liniowych jak również poznanie metod ich uczenia oraz zbadanie zalet oraz
ograniczeń niniejszych struktur.
Struktura liniowych sieci neuronowych pod wieloma względami przypomina sieci
perceptronowe, jedyna różnica polega na wykorzystaniu w liniowych neuronach liniowej
funkcji aktywacji w zamian za funkcję skokową (Rys. 1). Dzięki liniowej funkcji aktywacji
neurony są w stanie generować sygnały wyjściowe o dowolnej wartości jednakże nie są
wolne od ograniczenia znanego dla perceptronów a mianowicie mogą rozwiązywać jedynie
problemy, które są liniowo separowalne.
u
1
w
Blok
aktywa
w
y
ϕ
w
u
∑
w
u
n
ϕ=
∑u w
i
i
y = aϕ
i=0
Rys. 1 Struktura neuronu z liniową funkcją aktywacji gdzie u1, u2, ..., un - sygnały wejściowe,
w1, w2, ..., wn - wartości wag, y - sygnał wyjściowy
Rys. 2 Granica decyzyjne neuronu z liniową funkcją aktywacji
Neuron o strukturze przedstawionej na rysunku 1 może być tak uczony, aby realizował
funkcje liniowe lub by aproksymował za pomocą funkcji liniowych funkcje nieliniowe
jednakże neuron liniowy w żadnym wypadku nie jest w stanie realizować odwzorowań
nieliniowych. Podobnie jak dla perceptronu można w przestrzeni zmiennych wejściowych
wyznaczyć dla liniowego neuronu granicę decyzyjną, dla której neuron generuje sygnał o
wartości 0 na wyjściu.
Sygnałom wejściowym znajdującym się na rysunku w jego górnej ciemniejszej części
odpowiada na wyjściu neuronu sygnał większy od zera dla wartości wejść z obszaru
jaśniejszego uzyskujemy na wyjściu neuronu sygnał ujemny. Takie działanie neuronu może
zostać wykorzystane w celu klasyfikacji danych do dwóch zbiorów, przy czym należy
pamiętać, że zbiory te muszą być liniowo separowalne.
Proces uczenia liniowej sieci neuronowej przebiega podobnie jak sieci perceptronowej, a
mianowicie na wstępie należy przygotować zbiór uczący składający się z par wektorów
reprezentujących wejścia p oraz oczekiwane dla nich sygnały wyjściowe t
{p1,t1}, {p2,t2}, ...,{pq,tq}
Następnie kolejne elementy zbioru uczącego podawane są na wejścia sieci i wyznaczana jest
odpowiedź sieci a. W kolejnym kroku odpowiedź sieci a porównywana jest z wartością, jaka
była oczekiwana na wyjściu sieci t i wyznaczana jest wartość błędu e=t-a. Następnie wagi
neuronów modyfikowane są tak, aby wartość błędu średniokwadratowego (ang. mean
squared error) była jak najmniejsza.
mse =
1 q
1 q
2
e
(
k
)
=
(t (k ) − a(k ))2
∑
∑
q k =1
q k =1
Ponieważ funkcja błędu średniokwadratowego dla sieci z liniowymi neuronami jest funkcją
kwadratową względem wag, więc posiada tylko jedno minimum globalne lub nie posiada
minimum albo posiada minimum tzw. słabe, opcja z jaką mamy do czynienia zależy od
konkretnych danych uczących. Zadanie wyznaczenia wag w takiej sytuacji sprowadza się do
znalezienia wartości wag, dla których funkcja błędu przyjmuje najmniejszą wartość.
Sprowadza się to do rozwiązania odpowiedniego układu równań, co oznacza, że
odpowiednie wagi wyznaczane są bezpośrednio w jednym kroku algorytmu uczącego.
Jednakże nie zawsze takie rozwiązanie jest możliwe do zastosowania ze względu na
pojawiające się przy nim problemy numeryczne. W takiej sytuacji z pomocą przychodzi
algorytm uczenia Widrowa-Hoffa, który bazuje na procedurze największego spadku. W
niniejszym podejściu błąd średniokwadratowy jest zastępowany przez błąd kwadratowy,
który jest liczony w kolejnych iteracjach algorytmu a modyfikacje wag liczone są jako
pochodne cząstkowe z funkcji błędu względem odpowiednich wag. Po wyznaczeniu
odpowiednich pochodnych wzór na modyfikację wag przyjmuje następującą postać:
w(k+1)=w(k)+2α
αe(k)p(k),
gdzie k to numer iteracji , w to wagi, e to błędy uczenia, p wzorce uczące, α krok uczenia.
Jeżeli krok uczenia jest odpowiednio duży to proces uczenia przebiega szybko jednak zbyt
duża wartość tego parametru może powodować destabilizowanie procesu uczenia i
zwiększenie błędu w kolejnych iteracjach zamiast zmniejszenia. Liniowe sieci neuronowe
posiadają najczęściej tylko jedną warstwę neuronów, ponieważ dowolna wielowarstwowa
sieć z neuronami liniowymi może zostać przekształcona do sieci jednowarstwowej bez
modyfikacji jej działania.
Praktyczne wskazówki odnośnie symulacji liniowych sieci neuronowych w programie
Matlab
Tworzenie liniowej sieci neuronowej
W celu stworzenia liniowej sieci neuronowej należy posłużyć się funkcją newlin, która
posiada następującą strukturę
net=newlin(PR,S,lr),
gdzie net to obiekt opisujący stworzoną sieć, PR macierz z wartościami minimalnymi I
maksymalnymi dla kolejnych wejść, S liczba neuronów, lr krok uczenia.
Przykład:
net = newlin([-1 1],1)
Dostęp do wag i biasów sieci odbywa się identycznie jak w sieci perceptronowej.
Projektowanie sieci poprzez bezpośrednie wyznaczanie jej wag za pomocą funkcji newlind,
która posiada następującą strukturę
net=newlind(P,T)
gdzie P i T to dane uczące.
Przykład
P = [1 2 3];
T = [2.0 4.1 5.9];
net = newlind(P,T);
Uczenie metodą Widrowa-Hoffa za pomocą funkcji train lub adapt, których struktura
przedstawia się następująco:
net=train(P,T),
net=adapt(P,T),
gdzie P i T to dane uczące, różnica w działaniu obu funkcji jest taka sam jak dla sieci
perceptronowych.
Przykład:
net = newlin([-1 1],1);
P= {0 -1 1 1 0 -1 1 0 0 1};
T = {0 -1 0 2 1 -1 0 1 0 1};
net = adapt(net,P,T);
P = [P];
T = [T];
net.trainParam.epochs = 200;
net.trainParam.goal = 0.1;
net = train(net,P,T);
Symulacja liniowych sieci neuronowych odbywa się identycznie jak sieci perceptronowych za
pomocą funkcji sim.
Aby wyznaczyć maksymalny dopuszczalny krok uczenia należy użyć funkcji maxlinlr, której
struktura przedstawia się następująco
lr = maxlinlr(P,'bias')
gdzie P to wejściowe wzorce uczące:
Przykład
P = [1 2 -4 7; 0.1 3 10 6];
lr = maxlinlr(P,'bias')
Przedstawienie wykresu funkcji błędu w funkcji wag (tylko dla przypadków gdy dany jest
jeden neuron z tylko jednym wejściem) można zrealizować za pomocą następującej
sekwencji instrukcji
Przykład
P = [1 –1.2]
T = [0.5 1]
w_range=-1:0.1:1;
b_range=-1:0.1:1;
ES=errsurf(P,T,w_range,b_range,’purelin’)
plotes(w_range,b_range,ES)
Symulacja liniowych sieci neuronowych z opóźnieniami (czyli z wejściami zdefiniowanymi
jako opóźnione wartości wejść już istniejących, Rys. 3) wymaga następującej sekwencji
instrukcji
1
u(k)
u(k-1)
w1
ϕ
w2
∑
wn
Blok
aktywacji
w0
y
Rys. 3 Liniowy neuron z opóźnionymi sygnałami wejściowymi, gdzie k numer próbki sygnału
wejściowego
Przykład
P={3 4 5 6}
net=newline([1 10],1)
net.inputWeights{1,1}.delays=[0 1 2] <- definicja opóźnionych wejść 0 - u(k), 1 – u(k-1), 2 –
u(k-2)
pi={1 2} <– startowe wartości dla wejść u(k-1) i u(k-2)
A=sim(net,P,pi) <-symulacja sieci z opóźnieniami
Zadania
(Przed rozpoczęciem rozwiązywania zadań można obejrzeć przykładowe problemy
rozwiązane za pomocą liniowych sieci neuronowych uruchamiając skrypty demolin1,
demolin2, demolin4, demolin5, demolin6, demolin,7 demolin8 i demolin9)
Przeprowadzić uczenie neuronu z liniową funkcją aktywacji z jednym wejściem dla danych
przedstawionych poniżej. Porównać wagi nauczonego neuronu przy użyciu reguły WidrowaHoffa (za pomocą funkcji train) z wagami wyliczonymi bezpośrednio, zbadać czy nauczony
neuron dobrze działa dla danych, które służyły jako wzorce uczące (wykorzystać instrukcje
sim)
P=[1 –1.2] T=[1 0.5]
P=[-3.2 4.5 5.6 3] T=[-4 5 6.1 3.9]
P=[1 2 3 4 5 6 7] T=[3 5 7 9 11 13 15]
Przeprowadzić uczenie liniowej sieci jednowarstwowej przy użyciu funkcji adapt oraz train
dla następujących danych, zbadać czy nauczony neuron dobrze działa dla danych, które
służyły jako wzorce uczące).
1.0000 1.5000 1.2000 -0.3000
P= -1.0000 2.0000 3.0000 -0.5000
2.0000 1.0000 -1.6000 0.9000
T=
0.5000 3.0000 -2.2000 1.4000
1.1000 -1.2000 1.7000 -0.4000
3.0000 0.2000 -1.8000 -0.4000
Dla zadań z punktu pierwszego wyznaczyć wykresy funkcji błędu wraz z zaznaczonym
punktem określającym wartości nauczonych wag oraz błędu jaki został osiągnięty dla tych
wag. (Wskazówka: sprawdzić jak jest to zrealizowane w pliku demolin1)
Dane są następujące funkcje
y=2x-3
y=2x^2-5
dokonać ich aproksymacji w przedziale (–10;10) przy użyciu liniowego neuronu. (Wybrać
dane uczące dla każdej z funkcji i na ich podstawie przeprowadzić uczenie neuronu,
następnie porównać wartości wyjściowe z neuronu i wartości aproksymowanej funkcji
przedstawiając je na jednym wykresie dla każdej z funkcji) Zbadać właściwości uogólniające
neuronu.
Zbadać czy liniowy neuron ma takie same ograniczenia jak perceptron (Znaleźć zadanie
klasyfikacji, które liniowy neuron nie potrafi rozwiązać)
Zbadać jak liniowy neuron uczy się dla różnych wielkości kroku ucznia dla następujących
danych P = [1.0 -1.2] T = [0.5 1.0], zbadać uczenie się dla następujących wielkości kroku
uczenia 0.01, 0.1, 5, 10, 50. Porównać otrzymane wyniki z uczeniem przy użyciu kroku
uczenia wyznaczonego przez funkcję maxlinlr.
Identyfikacja systemu liniowego za pomocą funkcji adaptwh
%Ustalenie czasu symulacji ze zmianą cech identyfikowanego systemu liniowego w 4
sekundzie
time1=0:0.005:4;
time2=4.005:0.005:6;
time=[time1 time2];
%zadany sygnał wejściowy dla systemu liniowego w celu przygotowania próbek do
adaptacyjnej identyfikacji systemu
X=sin(sin(time*4).*time*8);
%liczba próbek dla systemu liniowego do 4 sekundy eksperymentu
steps1=length(time1);
% system liniowy zdefiniowany jako filtr liniowy o skończonej odpowiedzi impulsowej
[T1,state] = filter([1 -0.5],1,X(1:steps1));
% od 4 sekundy właściwości filtru zmieniają się sprawdzamy czy sieć zadoptuje się do
zmienionych warunków
steps2 = length(time2);
T2 = filter([0.9 -0.6],1,X((1:steps2) + steps1),state);
T = [T1 T2];
plot(time,X)
alabel('Czas','Sygnał wejsciowy','Sygnal wejsciowy dla filtra')
plot(time,T)
alabel('Czas','Sygnal wyjsciowy','Sygnal wyjsciowy z filtra')
%Przygotowanie danych dla sieci neuronowej z opóźnionymi próbkami sygnału
wejściowego
P = delaysig(X,0,1);
% konstrukcja sieci
[w,b] = initlin(P,T);
lr = 0.5;
%adaptacja sieci
[a,e,w,b] = adaptwh(w,b,P,T,lr);
% porównanie sygnału wyjściowego z filtra z odpowiedzią liniowej sieci neuronowej
plot(time,a,time,T,'--')
alabel('Czas','Siec \_\_\_ Filter \_ \_','Odpowiedz liniowej sieci neuronowej i filtra')
Literatura:
1. Korbicz J., Obuchowicz A., Uciński D., „Sztuczne sieci neuronowe. Podstawy i
zastosowanie”, Warszawa 1994.