Politechnika Rzeszowska Wydział Elektrotechniki i Informatyki Mateusz Błażej Nr albumu: 130366 Zrealizować sieć neuronową (learnbpm) uczącą się odwzorowania z = x 2 + y 2 dla x i y zmieniających się od -1 do 1. Projekt zaliczeniowy z przedmiotu: Sztuczna Inteligencja Praca wykonana pod kierunkiem dr. inż. Romana Zajdla z Katedry Informatyki i Automatyki WEiI PRz Rzeszów, kwiecień 2014
SPIS TREŚCI WSTĘP... 2 ROZDZIAŁ I. Opis teoretyczny... 3 1.1. Model neuronu... 3 1.2. Sieć jednokierunkowa wielowarstwowa... 4 1.3. Metoda momentum... 7 ROZDZIAŁ II. Rozwiązanie problemu... 9 2.1. Wybór funkcji... 9 2.2. Korekta kodu i wybór parametrów... 10 ROZDZIAŁ III. Eksperymenty i rezultaty... 13 3.1. Wstępny eksperyment... 13 3.2. Rezultaty i dodatkowe eksperymenty... 13 ZAKOŃCZENIE... 25 BIBLIOGRAFIA... 26 ZESTAWIENIE SPISÓW... 27 1
WSTĘP Celem projektu jest słowny opis działań, jakie zostały wykonane w celu zbudowania sieci aproksymującej funkcję dwóch zmiennych, tj. zrealizowania zagadnienia z przedmiotu Sztuczna Inteligencja pt.: Zrealizować sieć neuronową (learnbpm) uczącą się odwzorowania z = x 2 + y 2 dla x i y zmieniających się od -1 do 1. Do wykonania tego projektu został użyty program firmy MathSoft MATLAB w wersji: 7.0.1. Z racji prac przeprowadzonych na systemie operacyjnym Windows 8.1 x64 konieczne było ustawienie trybu zgodności z Windows Vista (Service Pack 2). Maszyna wykorzystana do obliczeń miała parametry: procesor Intel T9500 2x 2,6GHz oraz pamięć ram Kingston HyperX 4GB 667MHz CL4. Wykonanie skryptów zajęło około 50 godzin. Rys. 1. Aproksymowana funkcja z = x 2 + y 2 dla x i y zmieniających się od -1 do 1 Źródło: Opracowanie własne przy użyciu oprogramowania MATLAB. 2
ROZDZIAŁ I Opis teoretyczny 1.1. Model neuronu Rys. 2. Model neuronu Źródło: Opracowanie własne na podstawie: PRz, KIiA, Sztuczna inteligencja, Laboratorium, Ćw6 Model neuronu, Roman Zajdel [online] [dostęp: 2 kwietnia 2014 r.]. Dostępne w Internecie: http://materialy.prz-rzeszow.pl/pracownik/pliki/34/sztuczna-inteligencja-cw6-model-neuronu.pdf. Sygnał wyjściowy neuronu y określony jest zależnością: gdzie xj jest j tym (j = 1, 2,, L) sygnałem wejściowym, a wj współczynnikiem wagowym (wagą). Ze względu na skrócenie zapisu wygodnie będzie stosować zapis macierzowy do opisu, 3
działania neuronu. Niech x = [x1, x2,, xl] T będzie wektorem sygnałów wejściowych, w = [w1, w2,, wl] - macierzą wierszową wag, a y i b skalarami. Wówczas y = f (wx + b). Ważona suma wejść wraz z przesunięciem często bywa nazywana łącznym pobudzeniem neuronu i w dalszych rozważaniach oznaczana będzie symbolem z 1 :. 1.2. Sieć jednokierunkowa wielowarstwowa Sieć jednokierunkowa wielowarstwowa ma zwykle jedną warstwę neuronów ukrytych między warstwą wejściową a wyjściową. Rys. 3. Sieć jednokierunkowa wielowarstwowa Źródło: PRz, KIiA, Sztuczna inteligencja, Laboratorium, Ćw9 Sieć jednokierunkowa wielowarstwowa, Roman Zajdel [online] [dostęp: 2 kwietnia 2014 r.]. Dostępne w Internecie: http://materialy.prz-rzeszow.pl/pracownik/pliki/34/sztuczna-inteligencja-cw9-siec-wielowarstw.pdf. 1 PRz, KIiA, Sztuczna inteligencja, Laboratorium, Ćw6 Model neuronu, Roman Zajdel [online] [dostęp: 2 kwietnia 2014 r.]. Dostępne w Internecie: http://materialy.prz-rzeszow.pl/pracownik/pliki/34/sztuczna-inteligencja-cw6-model-neuronu.pdf. 4
Taką sieć nazywa się trójwarstwową. Występują tu połączenia pomiędzy warstwami neuronów typu każdy z każdym. Sygnały wejściowe podawane są do warstwy wejściowej neuronów, których wyjścia stanowią sygnały źródłowe dla kolejnej warstwy. Można wykazać, że sieć trójwarstwowa nieliniowa jest w stanie odwzorować praktycznie dowolne odwzorowanie nieliniowe. Każda warstwa neuronów posiada swoją macierz wag w, wektor przesunięć b, funkcje aktywacji f i wektor sygnałów wyjściowych y. Działanie poszczególnych warstw dane jest przez: Działanie całej sieci można więc opisać jako:. W przypadku sieci trójwarstwowej, błąd średniokwadratowy wyliczany jest następująco:. gdzie: j = 1,, L oznacza numer wejścia warstwy pierwszej, i1 = 1,, K1, i2 = 1,, K2, i3 = 1,, K3 oznaczają odpowiednio numer wyjścia warstwy pierwszej, drugiej i trzeciej., 5
Obliczanie wag neuronów rozpoczyna się od warstwy wyjściowej, dla której mamy: gdzie:, jest łącznym pobudzeniem i3 tego neuronu warstwy wyjściowej. Stosując podstawienie: zależność przyjmuje postać: Podobnie wyznacza się elementy gradientu względem wag warstw ukrytej i wejściowej 2 :. 2 PRz, KIiA, Sztuczna inteligencja, Laboratorium, Ćw9 Sieć jednokierunkowa wielowarstwowa, Roman Zajdel [online] [dostęp: 2 kwietnia 2014 r.]. Dostępne w Internecie: http://materialy.prz-rzeszow.pl/pracownik/pliki/34/sztuczna-inteligencja-cw9-siec-wielowarstw.pdf. 6
. 1.3. Metoda momentum Z praktycznego punktu widzenia istotne znaczenie ma szybkość uczenia. Metoda wstecznej propagacji błędu jest bardzo czasochłonna. W literaturze poświęconej sieciom neuronowym spotyka się szereg metod pozwalających na znaczne przyśpieszenie procesu uczenia. Można wyróżnić dwa podejścia. Jedno z nich polega na wprowadzeniu do wzoru na korektę wag dodatkowego składnika będącego miarą bezwładności zmiany wag, zwanego momentum. W przypadku uczenia pod nadzorem pojedynczej warstwy sieci reguła uczenia z momentum może wyglądać następująco: gdzie momentum M(k)ij jest wyliczane z zależności, η ɛ [0,1] jest współczynnikiem uczenia momentum. Jeżeli η = 1, to nowa waga jest równa ostatniej zmianie wagi. Jeżeli η = 0, to zmiana wagi oparta jest tylko na składowej gradientowej. 7
Najczęściej przyjmuje się η = 0.95. Wprowadzenie składnika momentum zdecydowanie wpływa na zwiększenie szybkości uczenia. 3 3 PRz, KIiA, Sztuczna inteligencja, Laboratorium, Ćw10 Przyśpieszanie procesu uczenia, Roman Zajdel [online] [dostęp: 2 kwietnia 2014 r.]. Dostępne w Internecie: http://materialy.prz-rzeszow.pl/pracownik/pliki/34/sztuczna-inteligencja-cw10-przysp-uczenia.pdf. 8
ROZDZIAŁ II Rozwiązanie problemu 2.1. Wybór funkcji Funkcja odpowiadająca nauczaniu wielowarstwowej sieci neuronowej ze wsteczną propagacją błędu przyspieszoną metodą momentum w programie MATLAB nosi nazwę learnbpm. Wywołanie: [dw,db] = learnbpm (P,D,LR,MC,dW,dB) Argumenty: P - macierz wektorów wejściowych (wymiar R*Q, R - liczba wejść warstwy, Q - ilość wektorów), D - macierz pochodnych błędów warstwy (wymiar S*Q, S - liczba neuronów w warstwie), LR - współczynnik prędkości uczenia, MC - wartość stałej momentum, dw - macierz przyrostów współczynników wagowych warstwy w poprzednim kroku (wymiar S*R), db - wektor przyrostów współczynników progowych warstwy w poprzednim kroku (wymiar S*1). Wielkości zwracane: dw - nowa macierz przyrostów współczynników wagowych warstwy (wymiar S*R), db - nowa macierz przyrostów współczynników progowych warstwy (wymiar S*1). 4 4 Sztuczne sieci neuronowe [online] [dostęp: 3 kwietnia 2014 r.]. Dostępne w Internecie: http://ssn.elektrotechnika.ip.pwsz.edu.pl/nnt/nnt1.php. 9
2.2. Korekta kodu i wybór parametrów W celu zrealizowania zadania konieczna była korekta wstępnie napisanego kodu oraz ustalenie idealnych wartości parametrów S1, S2, lr (współczynnik uczący) i mc (współczynnik momentum). Dobór dokonywany jest na podstawie SSE (błędu średniokwadratowego) - pożądana jest wartość minimalna. Kod wstępny wygląda następująco (istotne zmiany zostały opisane w dalszej części projektu): clear all; nntwarn off; X=-1:.1:1; Y=-1:.1:1; Z=zeros(length(X), length(y)); XX = []; YY = []; ZZ = []; SSES =[]; EEE=[]; for i = 1 : length(x), for j = 1 : length(y), XX = [XX X(i)]; YY = [YY Y(j)]; Z(i, j) = ((X(i)^2 + Y(j)^2)); ZZ = [ZZ Z(i, j)]; ; P = [XX; YY]; [R, Q] = size(p); max_epoch = 20000; disp_freq = 100; for S1 = 1:10, for S2 = 1:S1, for lr=[1e-5 1e-4 1e-3 1e-2] for mc=[.001.01.1:.1:.9.95.99], [S3, Q] = size(zz); 10
error = []; [W1, B1] = nwtan (S1, R); [W2, B2] = nwtan (S2, S1); [W3, B3] = rands (S3, S2); dw1 = zeros (size (W1)); db1 = zeros (size (B1)); dw2 = zeros (size (W2)); db2 = zeros (size (B2)); dw3 = zeros (size (W3)); db3 = zeros (size (B3)); A1 = tansig (W1*P, B1); A2 = tansig (W2*A1, B2); A3 = purelin (W3*A2, B3); E = ZZ - A3; SSE = sumsqr (E); for epoch = 1 : max_epoch, if isnan(sse) break; D3 = deltalin (A3, E); D2 = deltatan (A2, D3, W3); D1 = deltatan (A1, D2, W2); [dw1, db1] = learnbpm (P, D1, lr, mc, dw1, db1); [dw2, db2] = learnbpm (A1, D2, lr, mc, dw2, db2); [dw3, db3] = learnbpm (A2, D3, lr, mc, dw3, db3); W1 = W1 + dw1; B1 = B1 + db1; W2 = W2 + dw2; B2 = B2 + db2; W3 = W3 + dw3; B3 = B3 + db3; A1 = tansig (W1*P, B1); A2 = tansig (W2*A1, B2); A3 = purelin (W3*A2, B3); E = ZZ - A3; 11
SSE = sumsqr(e); error = [error, SSE]; if (rem (epoch, disp_freq) == 0), epoch SSE S1 S2 lr mc SSES=[SSES ; SSE S1 S2 lr mc]; Główne modyfikacje polegały na wprowadzeniu czterech dodatkowych pętli for: - S1 od 1 do 10, - S2 od 1 do S1, - lr dla wartości 1e-5, 1e-4, 1e-3, 1e-2, - mc dla wartości 0.001, 0.01 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.95, 0.99, skutkiem czego znacznie wydłużył się czas wykonywania skryptu. Dla parametrów komputera przedstawionych we wstępie wyniósł on blisko 25 godzin. Dodatkowo usunięto przerwanie wykonywania pętli po osiągnięciu żądanego błędu średniokwadratowego. Kolejną modyfikacją było wprowadzenie macierzy, do których zapisywanie były pożądane wyniki: - SSES błąd średniokwadratowy dla każdej kombinacji parametrów S1, S2, lr i mc, Ostatnią ciekawą korektą było dodanie warunku if isnan(sse) powodującego przy spełnieniu przerwanie wykonywania pętli. Zaobserwowano, że dalsze zwiększanie współczynnika epoch przy pojawieniu się parametru SSE=NaN powoduje znaczne spowolnienie wykonywania pętli, a co za tym idzie bardzo duży wzrostu czasu realizacji całego skryptu. Dodatnie tego warunku wyeliminowuje ten problem. 12
ROZDZIAŁ III Eksperymenty i rezultaty 3.1. Wstępny eksperyment Pierwszym z przeprowadzonych eksperymentów było zapisanie błędów średniokwadratowych dla każdej kombinacji: - S1 od 1 do 10, - S2 od 1 do S1, - lr dla wartości 1e-5, 1e-4, 1e-3, 1e-2, - mc dla wartości 0.001, 0.01 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.95, 0.99. Powyższy eksperyment wygenerował 55 kombinacji S1 i S2. Po włączeniu możliwych kombinacji lr i mc liczba obserwacji wzrosła do 2860. Dalsze eksperymenty opierały się na wynikach otrzymanych we wcześniej wygenerowanej próbie. 3.2. Rezultaty i dodatkowe eksperymenty Dla żadnej z wygenerowanych sieci błąd średniokwadratowy nie spadł poniżej 0.05. Posortowano otrzymane rezultaty rosnąco według SSE (błędu średniokwadratowego). Poniżej przedstawiono 20 pierwszych wyników: SSE S1 S2 lr mc 0.0014 10.0000 9.0000 0.0100 0.9500 0.0016 8.0000 5.0000 0.0100 0.9500 0.0017 7.0000 3.0000 0.0100 0.9500 0.0019 8.0000 3.0000 0.0100 0.9500 0.0019 8.0000 7.0000 0.0100 0.9500 0.0020 9.0000 8.0000 0.0100 0.9900 0.0020 10.0000 6.0000 0.0100 0.9900 0.0020 7.0000 3.0000 0.0100 0.9000 0.0021 10.0000 7.0000 0.0100 0.9900 0.0021 7.0000 7.0000 0.0100 0.9500 0.0022 7.0000 7.0000 0.0100 0.9900 0.0024 6.0000 6.0000 0.0100 0.9500 0.0024 10.0000 5.0000 0.0100 0.9000 0.0025 7.0000 7.0000 0.0100 0.9000 13
0.0025 10.0000 10.0000 0.0100 0.9000 0.0026 10.0000 9.0000 0.0100 0.9900 0.0026 6.0000 5.0000 0.0100 0.9500 0.0026 9.0000 8.0000 0.0100 0.9500 0.0026 8.0000 3.0000 0.0100 0.9000 0.0026 8.0000 5.0000 0.0100 0.9000 Zauważono, że dla każdej z 89 pierwszych obserwacji lr (współczynnik uczenia) wyniósł 0.01. Dalszą aproksymację postanowiono ograniczyć do lr równego 0.01, gdyż wydaje się on wpływać najkorzystniej na efektywność sieci. Dodatkowo zwiększono ilości neuronów S1 i S2 w warstwach. Ostatecznie otrzymano następujące kombinacje: - S1 od 1 do 20, - S2 od 1 do S1, - lr dla wartości 0.01, - mc dla wartości 0.001, 0.01 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.95, 0.99. Po wprowadzeniu zmian, kod ma postać: clear all; nntwarn off; X=-1:.1:1; Y=-1:.1:1; Z=zeros(length(X), length(y)); XX = []; YY = []; ZZ = []; SSES =[]; EEE=[]; for i = 1 : length(x), for j = 1 : length(y), XX = [XX X(i)]; YY = [YY Y(j)]; Z(i, j) = ((X(i)^2 + Y(j)^2)); ZZ = [ZZ Z(i, j)]; ; P = [XX; YY]; [R, Q] = size(p); 14
max_epoch = 20000; err_goal =.002; disp_freq = 100; lr=.01; for S1 = 1:20, for S2 = 1:S1, for mc=[.001.01.1:.1:.9.95.99], [S3, Q] = size(zz); error = []; [W1, B1] = nwtan (S1, R); [W2, B2] = nwtan (S2, S1); [W3, B3] = rands (S3, S2); dw1 = zeros (size (W1)); db1 = zeros (size (B1)); dw2 = zeros (size (W2)); db2 = zeros (size (B2)); dw3 = zeros (size (W3)); db3 = zeros (size (B3)); A1 = tansig (W1*P, B1); A2 = tansig (W2*A1, B2); A3 = purelin (W3*A2, B3); E = ZZ - A3; SSE = sumsqr (E); for epoch = 1 : max_epoch, if SSE < err_goal, epoch = epoch - 1; EEE=[EEE ; SSE S1 S2 mc epoch/10000]; break; if isnan(sse) break; D3 = deltalin (A3, E); D2 = deltatan (A2, D3, W3); D1 = deltatan (A1, D2, W2); 15
[dw1, db1] = learnbpm (P, D1, lr, mc, dw1, db1); [dw2, db2] = learnbpm (A1, D2, lr, mc, dw2, db2); [dw3, db3] = learnbpm (A2, D3, lr, mc, dw3, db3); W1 = W1 + dw1; B1 = B1 + db1; W2 = W2 + dw2; B2 = B2 + db2; W3 = W3 + dw3; B3 = B3 + db3; A1 = tansig (W1*P, B1); A2 = tansig (W2*A1, B2); A3 = purelin (W3*A2, B3); E = ZZ - A3; SSE = sumsqr(e); error = [error, SSE]; if (rem (epoch, disp_freq) == 0), epoch SSE S1 S2 mc EEE SSES=[SSES ; SSE S1 S2 mc]; Powyższy eksperyment wygenerował 210 kombinacji S1 i S2. Po włączeniu możliwych kombinacji mc liczba obserwacji wzrosła do 2730. Dodatkowo wprowadzono przerwanie wykonywania pętli po osiągnięciu żądanego błędu średniokwadratowego. Kolejną modyfikacją było wprowadzenie macierzy EEE, do której zapisywanie były pożądane wyniki: - EEE błąd średniokwadratowy i parametry SSES + parametr epoch, dla którego można przyjąć, że sieć została nauczona, tj. błąd średniokwadratowy był mniejszy od err_goal = 0.002. 16
Po wykonaniu skryptu, macierz EEE zawierała następujące wyniki: SSE S1 S2 mc epoch 0.0020 8.0000 7.0000 0.9500 11674 0.0020 20.0000 9.0000 0.9000 13523 0.0020 9.0000 9.0000 0.9000 14298 0.0020 17.0000 16.0000 0.9500 14837 0.0020 18.0000 11.0000 0.9500 15161 0.0020 10.0000 7.0000 0.9000 16054 0.0020 12.0000 4.0000 0.9500 16290 0.0020 15.0000 15.0000 0.9500 16540 0.0020 6.0000 5.0000 0.9500 16643 0.0020 14.0000 5.0000 0.9000 16839 0.0020 12.0000 9.0000 0.9500 17384 0.0020 8.0000 4.0000 0.9500 17412 0.0020 18.0000 15.0000 0.9500 17934 0.0020 10.0000 8.0000 0.9500 17992 0.0020 5.0000 5.0000 0.9500 18033 0.0020 15.0000 10.0000 0.9000 18088 0.0020 20.0000 11.0000 0.9500 18411 0.0020 16.0000 12.0000 0.9900 19464 0.0020 15.0000 12.0000 0.9500 19504 Pożądany SSE (błąd średniokwadratowy) osiągnięty został tylko dla parametrów mc (momentum) równych 0.9, 0.95 oraz 0.99. Tabela 1 obrazuje rozkład osiągniętych rezultatów wg. parametru mc: Tabela 1. Rozkład rezultatów wg. parametru mc Lp. mc Ilość 1. 0.9 5 2. 0.95 13 3. 0.95 1 Źródło: Opracowanie własne na podstawie wygenerowanej macierzy EEE przy użyciu programu MATLAB. Podana w tabeli 1 ilość rezultatów wg. parametru mc sugeruje ograniczenie wykonywania pętli dla parametru mc równego 0.95., gdyż blisko 70% pożądanych rezultatów zostało osiągniętych dla tego parametru. Co więcej najmniej epok (11674) do osiągnięcia SSE równego 0.002 zostało wykonanych również dla tego parametru. Również najmniejszy rozmiar S1 (warstwy wyjściowej) (5) dotyczył parametru mc równego 0.95. 17
Biorąc pod uwagę powyższe eksperymenty, ostatecznie kod obejmuje następujące parametry: - S1 od 1 do 20, - S2 od 1 do S1, - lr dla wartości 0.01, - mc dla wartości 0.95. Po wprowadzeniu zmian, kod finalny ma postać: clear all; nntwarn off; X=-1:.1:1; Y=-1:.1:1; Z=zeros(length(X), length(y)); XX = []; YY = []; ZZ = []; SSES =[]; EEE=[]; for i = 1 : length(x), for j = 1 : length(y), XX = [XX X(i)]; YY = [YY Y(j)]; Z(i, j) = ((X(i)^2 + Y(j)^2)); ZZ = [ZZ Z(i, j)]; ; P = [XX; YY]; [R, Q] = size(p); max_epoch = 20000; err_goal =.002; disp_freq = 100; lr=.01; mc=.95; for S1 = 1:20, for S2 = 1:S1, [S3, Q] = size(zz); 18
error = []; [W1, B1] = nwtan (S1, R); [W2, B2] = nwtan (S2, S1); [W3, B3] = rands (S3, S2); dw1 = zeros (size (W1)); db1 = zeros (size (B1)); dw2 = zeros (size (W2)); db2 = zeros (size (B2)); dw3 = zeros (size (W3)); db3 = zeros (size (B3)); A1 = tansig (W1*P, B1); A2 = tansig (W2*A1, B2); A3 = purelin (W3*A2, B3); E = ZZ - A3; SSE = sumsqr (E); for epoch = 1 : max_epoch, if SSE < err_goal, epoch = epoch - 1; EEE=[EEE ; SSE S1 S2 epoch/10000]; break; if isnan(sse) break; D3 = deltalin (A3, E); D2 = deltatan (A2, D3, W3); D1 = deltatan (A1, D2, W2); [dw1, db1] = learnbpm (P, D1, lr, mc, dw1, db1); [dw2, db2] = learnbpm (A1, D2, lr, mc, dw2, db2); [dw3, db3] = learnbpm (A2, D3, lr, mc, dw3, db3); W1 = W1 + dw1; B1 = B1 + db1; W2 = W2 + dw2; B2 = B2 + db2; W3 = W3 + dw3; B3 = B3 + db3; 19
A1 = tansig (W1*P, B1); A2 = tansig (W2*A1, B2); A3 = purelin (W3*A2, B3); E = ZZ - A3; SSE = sumsqr(e); error = [error, SSE]; if (rem (epoch, disp_freq) == 0), epoch SSE S1 S2 EEE A3_ = zeros (size (Z)); error_ = zeros (size (Z)); for i = 1 : length(x), for j = 1 : length(y), A1_ = tansig(w1*[x(i); Y(j)], B1); A2_ = tansig(w2*a1_, B2); A3_(i, j) = purelin(w3*a2_,b3); error_(i,j)=z(i,j)-a3_(i,j); figure (1) subplot (1, 2, 1), mesh (X, Y, Z); subplot (1, 2, 2), mesh (X, Y, A3_); figure (2) mesh (X, Y, error_); pause (1e-200); SSES=[SSES ; SSE S1 S2]; 20
Powyższy eksperyment wygenerował jedynie 210 kombinacji, co pozwoliło znacznie skrócić czas generowania pożądanych sieci neuronowych. Najszybciej ucząca się sieć miała następujące parametry: - S1 równe 8, - S2 równe 7, - lr równe 0.01, - mc równe 0.95. Poniżej przedstawiono grafikę porównującą aproksymowaną funkcję z wygenerowaną dla parametrów podanych powyżej. Rys. 4. Porównanie aproksymowanej funkcji z wygenerowaną 2 2 1.8 1.8 1.6 1.6 1.4 1.4 1.2 1.2 1 1 0.8 0.8 0.6 0.6 0.4 0.4 0.2 0.2 0 1 0.8 0.6 0.4 0.2 0-0.2-0.4-0.6-0.8-1 -1-0.5 0 0.5 1 0 1 0.8 0.6 0.4 0.2 0-0.2-0.4-0.6-0.8-1 -1-0.5 0 0.5 1 Źródło: Opracowanie własne przy użyciu oprogramowania MATLAB. Wykres obrazujący błąd średniokwadratowy przedstawiono poniżej. 21
Rys. 5. Błąd średniokwadratowy 8 x 10-3 6 4 2 0-2 -4-6 -8 1 0.8 0.6 0.4 0.2 0-0.2-0.4-0.6-0.8-1 -1-0.8-0.6-0.4-0.2 0 0.2 0.4 0.6 0.8 1 Źródło: Opracowanie własne przy użyciu oprogramowania MATLAB. Dla parametrów lr i mc uznanych za idealne (0.01 i 0.95 kolejno) wygenerowano wykres obrazujący zmianę SSE w zależności od S1 i S2 w przedziale S1 od 1 do 10 i S2 od 1 do S1. Skorzystano ze stworzonej macierzy pomocniczej o wymiarach 10x10: 80.5439 0 0 0 0 0 0 0 0 0 76.9831 30.1446 0 0 0 0 0 0 0 0 94.2172 0.0947 0.0211 0 0 0 0 0 0 0 94.2173 0.1756 0.0211 0.0085 0 0 0 0 0 0 0.0353 0.0148 0.2234 0.0202 0.0048 0 0 0 0 0 0.0411 0.0567 0.0051 0.0109 0.0026 0.0024 0 0 0 0 0.0510 0.0230 0.0017 0.0082 0.0032 0.0086 0.0021 0 0 0 0.0951 0.0077 0.0019 0.0078 0.0016 0.0133 0.0019 0.3216 0 0 0.0244 0.0062 0.0046 0.0027 0.8184 0.0079 0.0030 0.0026 0.0037 0 0.0176 0.0315 0.0092 0.0067 0.0028 0.0027 0.0049 0.0028 0.0014 0.0036 Grafika została przedstawiona poniżej. 22
Rys. 6. Zależność SSE od S1 i S2 100 90 80 70 60 50 40 30 20 10 0 10 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 10 Źródło: Opracowanie własne przy użyciu oprogramowania MATLAB. Rysunek 6 obrazuje, że przy wzroście S1 powyżej 4, SSE gwałtownie maleje. W celu zobrazowania dokładniejszej zależności, przeskalowano współrzędne, korzystając z polecenia: axis([1,10,1,10,0,0.3217]) Wynik przekształcenia przedstawiony został na rysunku 7. 23
Rys. 7. Zależność SSE od S1 i S2 po przeskalowaniu współrzędnych 0.3 0.25 0.2 0.15 0.1 0.05 0 1 2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9 10 101 Źródło: Opracowanie własne przy użyciu oprogramowania MATLAB. Wykres 7 potwierdza, że przy wzroście S1 powyżej 4, SSE gwałtownie maleje. Jedynie dla kilku kombinacji S1 i S2 następuje wzrost SSE, np. S1 = 9 i S2 = 5. 24
ZAKOŃCZENIE Celem projektu było zbudowanie jak najdokładniejszej sieci aproksymującej funkcję dwóch zmiennych z = x 2 + y 2 dla x i y zmieniających się od -1 do 1. Zadanie zostało zrealizowane i otrzymano kilkanaście kombinacji parametrów S1, S2, lr i mc, dla których SSE (błąd średniokwadratowy) był zadowalająco niski. Głównym utrudnieniem technicznym był długi czas realizacji skryptów obciążonych głównie przez 4 pętle, co skutkowało realizacją trwającą około 50 godzin. 25
BIBLIOGRAFIA PRz, KIiA, Sztuczna inteligencja, Laboratorium, Ćw6 Model neuronu, Roman Zajdel [online] [dostęp: 2 kwietnia 2014 r.]. Dostępne w Internecie: http://materialy.przrzeszow.pl/pracownik/pliki/34/sztuczna-inteligencja-cw6-model-neuronu.pdf PRz, KIiA, Sztuczna inteligencja, Laboratorium, Ćw9 Sieć jednokierunkowa wielowarstwowa, Roman Zajdel [online] [dostęp: 2 kwietnia 2014 r.]. Dostępne w Internecie: http://materialy.prz-rzeszow.pl/pracownik/pliki/34/sztuczna-inteligencja-cw9-siecwielowarstw.pdf PRz, KIiA, Sztuczna inteligencja, Laboratorium, Ćw10 Przyśpieszanie procesu uczenia, Roman Zajdel [online] [dostęp: 2 kwietnia 2014 r.]. Dostępne w Internecie: http://materialy.prz-rzeszow.pl/pracownik/pliki/34/sztuczna-inteligencja-cw10-przyspuczenia.pdf Sztuczne sieci neuronowe [online] [dostęp: 3 kwietnia 2014 r.]. Dostępne w Internecie: http://ssn.elektrotechnika.ip.pwsz.edu.pl/nnt/nnt1.php 26
ZESTAWIENIE SPISÓW Spis tabel Tabela 1. Rozkład rezultatów wg. parametru mc... 17 Spis rysunków Rys. 1. Aproksymowana funkcja z = x 2 + y 2 dla x i y zmieniających się od -1 do 1. 2 Rys. 2. Model neuronu... 3 Rys. 3. Sieć jednokierunkowa wielowarstwowa... 4 Rys. 4. Porównanie aproksymowanej funkcji z wygenerowaną... 21 Rys. 5. Błąd średniokwadratowy... 23 Rys. 6. Bezrobocie zróżnicowane sezonowo... 24 27