Politechnika Rzeszowska
Wydział Elektrotechniki i Informatyki
Katedra Informatyki i Automatyki
Sztuczna Inteligencja
PROJEKT
Wykonał:
Charchut Artur
Rzeszów 2010
SPIS TREŚCI
1. Wstęp
Tematem projektu było zrealizować sieć neuronową (trainbpx) uczącą się odwzorowania funkcji z = sin(x*y*pi) dla x i y zmieniających się od -1 do 1.
Niniejsza dokumentacja jest słownym opisem działań, jakie zostały wykonane w celu zrealizowania wyżej wymienionego zagadnienia. Do wykonania tego projektu został użyty program firmy MathSoft - Matlab w wersji: 7.1.0.246 (R14).
2. Opis teoretyczny
2.1 Definicja i opis sieci neuronowej
Sieć neuronowa (sztuczna sieć neuronowa) - ogólna nazwa struktur matematycznych
i ich programowych lub sprzętowych modeli, realizujących obliczenia lub przetwarzanie sygnałów poprzez rzędy elementów, zwanych sztucznymi neuronami, wykonujących pewną podstawową operację na swoim wejściu. Oryginalną inspiracją takiej struktury była budowa naturalnych neuronów oraz układów nerwowych, w szczególności mózgu.
(Źródło: pl.wikipedia.org/wiki/Sieć_neuronowa)
Czasem nazwą sztuczne sieci neuronowe określa się interdyscyplinarną dziedzinę wiedzy zajmującą się konstrukcją, trenowaniem i badaniem możliwości tego rodzaju sieci.
Podstawową cechą różniącą SSN od programów realizujących algorytmiczne przetwarzanie informacji jest zdolność generalizacji czyli uogólniania wiedzy dla nowych danych nieznanych wcześniej, czyli nie prezentowanych w trakcie nauki. Określa się to także jako zdolność SSN do aproksymacji wartości funkcji wielu zmiennych w przeciwieństwie do interpolacji możliwej do otrzymania przy przetwarzaniu algorytmicznym.
(Źródło: http://sites.google.com/site/darekwsb/darcco-wsb)
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 . Wartość wyjścia reprezentuje wzór:
y = f(w*x+b)
(Źródło: PRz, KIiA, Sztuczna inteligencja, Laboratorium,
Ćw9 Sieć jednokierunkowa wielowarstwowa, Roman Zajdel)
2.2 Podstawowe funkcje aktywacji neuronu
Funkcja przejścia określa zależność wyjścia neuronu od jego wejścia. Może być funkcją liniową lub nieliniową. Szczegółowo funkcja ta jest dobierana w zależności od charakteru problemu jaki ma rozwiązywać projektowana sieć. Trzy podstawowe funkcje przejścia przedstawione zostały na rys. 2.
Rys. 2. Trzy podstawowe funkcje aktywacji neuronu:
(Źródło: http://sites.google.com/site/darekwsb/darcco-wsb)
Funkcja skoku jednostkowego jest szczególnie przydatna, gdy rozwiązywany problem ma charakter dwustanowy. Funkcja skokowa ograniczająca wartość wyjścia do dwu wartości
0 i 1.
Funkcja sigmoidalna może mieć jako argument wartości od -∞do +∞, a oddaje jako wartość wyjściową liczby z zakresu 0 do 1.
Funkcja liniowa - wyjściowy a jest proporcjonalny do sygnału otrzymanego na wejście. Funkcja ta nie ma ograniczeń wartości wyjścia jak funkcja sigmoidalna i skoku jednostkowego.
Najczęściej stosuje się sieci dwu lub trzywarstwowe zawierające sigmoidalne funkcje przejścia w warstwie pierwszej i drugiej oraz liniowe lub skokowe w warstwie ostatniej (wyjściowej). Sieci o większej ilości warstw są stosowane bardzo rzadko do szczególnych zastosowań.
2.3 Trainbpx - opis i wywołanie
Trainbpx - trening sieci jednokierunkowej (do 3 warstw) z tzw. szybka propagacja wsteczna błędu. Funkcja przeprowadza trening nieliniowej sieci jednokierunkowej z zastosowaniem technik: adaptacyjnej zmiany współczynnika prędkości uczenia oraz członu momentum. W efekcie uczenie sieci trwa znacznie krócej, a prawdopodobieństwo utknięcia w lokalnym minimum funkcji błędu sieci zostaje zmniejszone. (http://ssn.elektrotechnika.ip.pwsz.edu.pl/nnt/nnt2.php)
Algorytm wstecznej propagacji błędu - Jest to podstawowy algorytm uczenia nadzorowanego wielowarstwowych jednokierunkowych sieci neuronowych. Podaje on przepis na zmianę wag wij dowolnych połączeń elementów przetwarzających rozmieszczonych w sąsiednich warstwach sieci. Nazwa wywodzi się od kolejności warstw w jakiej liczony jest błąd. Aby usprawnić uczenie stosuje się mechanizm zmiany współczynnika uczenia, oraz mechanizm zmiany współczynnika momentu w każdej iteracji. (http://www.neuron.kylos.pl/pliki/jednokier/jednokier4.html)
Wywołanie:
[W, B, TE, TR] = trainbpx (W, B, 'F', P, T, TP)
Argumenty:
Wi - macierz współczynników wagowych i-tej warstwy (wymiar Si*R, Si - ilość neuronów w i-tej warstwie, R - ilość wejść warstwy)
Bi - wektor współczynników progowych i-tej warstw (wymiar Si*l)
Fi - funkcja aktywacji i-tej warstwy
P - macierz wektorów wejściowych (wymiar R*Q, R - liczba wejść sieci, Q - ilość wektorów)
T - macierz zadanych wektorów wyjściowych (wymiar S*Q, S - liczba wyjść sieci)
TP - wektor parametrów (opcjonalny):
TP(1) - częstotliwość aktualizacji wykresu błędu sieci
TP(2) - maksymalna liczba cykli treningowych
TP(3) - graniczny błąd średniokwadratowy) sieci
TP(4) - współczynnik prędkości uczenia
Dodatkowe elementy wektora parametrów:
TP(5) - współczynnik wzrostu prędkości uczenia
TP(6) - współczynnik redukcji prędkości uczenia
TP(7) - stała momentum
TP(8) - maksymalna wartość współczynnika błędu
Wielkości zwracane:
Wi - macierz nowych współczynników wagowych i-tej warstwy (wymiar Si * R)
Bi - wektor nowych współczynników progowych warstwy (wymiar Si*l)
TE - liczba przebytych cykli treningowych
TR - średniokwadratowy błąd sieci.
(http://ssn.elektrotechnika.ip.pwsz.edu.pl/nnt/nnt2.php)
3. Rozwiązanie problemu
3.1 Skrypt programu Matlab
3.2 Tabela wyników
Tabele przedstawiają niektóre wyniki nauki sieci neuronowej. Największy wpływ na wartość błędu ma liczba kroków (błąd jest odwrotnie proporcjonalny do współczynnika ep). Wpływ na błąd mają także pozostałe współczynniki, jednak ich wybór bywa kłopotliwy. Najlepszym sposobem jest przeprowadzenie dużej ilości eksperymentów i na ich podstawie można otrzymać najlepszy wynik.
S1 |
S2 |
lr |
ep |
SSE |
10 |
5 |
0,1 |
1000 |
3,15 |
10 |
8 |
0,1 |
1000 |
5,8 |
15 |
7 |
0,1 |
1000 |
1,69 |
15 |
10 |
0,1 |
1000 |
1,69 |
20 |
10 |
0,1 |
1000 |
0,32 |
20 |
15 |
0,1 |
1000 |
0,32 |
20 |
18 |
0,1 |
1000 |
0,31 |
20 |
18 |
0,01 |
1000 |
0,89 |
30 |
10 |
0,1 |
1000 |
0,18 |
30 |
15 |
0,1 |
1000 |
0,089 |
30 |
15 |
0,01 |
1000 |
0,25 |
30 |
15 |
0,001 |
1000 |
0,51 |
30 |
20 |
0,1 |
1000 |
0,24 |
30 |
25 |
0,1 |
1000 |
0,52 |
40 |
15 |
0,1 |
1000 |
0,16 |
40 |
15 |
0,01 |
1000 |
0,13 |
40 |
15 |
0,001 |
1000 |
0,29 |
40 |
20 |
0,1 |
1000 |
0,75 |
40 |
25 |
0,1 |
1000 |
0,24 |
40 |
30 |
0,1 |
1000 |
0,99 |
40 |
35 |
0,1 |
1000 |
0,8 |
50 |
20 |
0,1 |
1000 |
0,86 |
50 |
25 |
0,01 |
1000 |
0,41 |
50 |
25 |
0,001 |
1000 |
0,19 |
50 |
25 |
0,1 |
1000 |
0,34 |
50 |
30 |
0,1 |
1000 |
0,75 |
50 |
35 |
0,1 |
1000 |
1,44 |
50 |
40 |
0,1 |
1000 |
0,88 |
50 |
45 |
0,1 |
1000 |
1,1 |
60 |
20 |
0,1 |
1000 |
0,52 |
60 |
25 |
0,1 |
1000 |
0,56 |
60 |
30 |
0,1 |
1000 |
0,81 |
S1 |
S2 |
lr |
ep |
SSE |
60 |
35 |
0,1 |
1000 |
0,67 |
60 |
40 |
0,1 |
1000 |
0,84 |
60 |
45 |
0,1 |
1000 |
0,59 |
60 |
50 |
0,1 |
1000 |
1 |
60 |
25 |
0,01 |
1000 |
0,37 |
60 |
25 |
0,001 |
1000 |
0,24 |
70 |
30 |
0,001 |
1000 |
0,19 |
70 |
40 |
0,001 |
1000 |
0,59 |
70 |
50 |
0,001 |
1000 |
1,03 |
70 |
60 |
0,001 |
1000 |
0,98 |
80 |
50 |
0,001 |
1000 |
0,68 |
80 |
60 |
0,001 |
1000 |
0,89 |
80 |
70 |
0,001 |
1000 |
1,12 |
80 |
50 |
0,0001 |
1000 |
0,72 |
90 |
60 |
0,001 |
1000 |
0,85 |
90 |
70 |
0,001 |
1000 |
1,13 |
90 |
80 |
0,001 |
1000 |
1,02 |
90 |
60 |
0,0001 |
1000 |
0,69 |
100 |
60 |
0,001 |
1000 |
0,81 |
100 |
70 |
0,001 |
1000 |
0,82 |
100 |
80 |
0,001 |
1000 |
1,06 |
100 |
90 |
0,001 |
1000 |
1,63 |
100 |
60 |
0,0001 |
1000 |
0,96 |
100 |
60 |
0,01 |
1000 |
1,52 |
120 |
50 |
0,001 |
1000 |
0,74 |
120 |
70 |
0,001 |
1000 |
0,57 |
120 |
90 |
0,001 |
1000 |
0,99 |
120 |
100 |
0,001 |
1000 |
1,95 |
120 |
70 |
0,0001 |
1000 |
0,55 |
40 |
15 |
0,01 |
3000 |
0,025 |
40 |
15 |
0,01 |
6000 |
0,013 |
40 |
15 |
0,01 |
10000 |
0,0079 |
3.3 Wykresy
Wykres funkcji z = sin(x * y * pi)
Wykres wyniku nauki sieci dla S1 = 40, S2 = 15, lr = 0.01 i ep = 10 000
Wykres błędu
Wykres przebiegu nauki sieci
4. Podsumowanie
Wyznaczanie odpowiednich parametrów i nauka sieci neuronowej to zajęcie bardzo czasochłonne. W szczególności trenowanie sieci opiera się na doborze najodpowiedniejszej ilości neuronów w poszczególnych warstwach, a także współczynnika uczenia. Wybór ilości kroków nauki sieci jest kompromisem posiedzi wielkością błędu, a czasem uczenia sieci. Im więcej kroków, tym trenowanie sieci jest dłuższe lecz dokładniejsze i bliższe oczekiwanym wynikom.
W praktyce tworzy się sieci do rozwiązywania bardziej złożonych problemów niż w niniejszym projekcie. Sieci takie składają się z setek lub tysięcy neuronów i uczone są bardzo dużymi ilościami danych. Nauka takiej sieci trwa bardzo długo, wiec potrzebne są szybkie komputery z dużymi ilościami pamięci, a tworzenie takich sieci wymaga dużo wiedzy i doświadczenia.
11
clear all
nntwarn off;
X = -1:.1:1;
Y = -1:.1:1;
Z = zeros(length(X), length(Y));
XX = [];
YY = [];
ZZ = [];
for i = 1:length(X),
for j = 1:length(Y),
XX = [XX X(i)];
YY = [YY Y(j)];
Z(i,j) = sin(X(i)*Y(i)*pi);
ZZ = [ZZ, Z(i,j)];
end
end;
P = [XX; YY];
S1 = 30;
S2 = 15;
[S3, Q] = size(ZZ);
[W1,B1,W2,B2,W3,B3] = initff (P,S1,'tansig',S2,'tansig',S3,'purelin');
df = 25; %czestotliwość aktualizacji wykresu
me = 10000; %max liczba cykli
eg = 1e-4; %graniczny błąd
lr = 0.1; %współczynnik prędkości uczenia
lrinc = 1.01; %mnożnik do wzrostu lr
lrdec = 0.95; %mnożnik do zmniejszenia lr
mom = 0.99; %współczynnik momentum
err = 1.2; %maksymalny stosunek do starego błędu
TP=[df me eg lr lrinc lrdec mom err];
[W1,B1,W2,B2,W3,B3,TE,TR] = TRAINBPX(W1,B1,'tansig',W2,B2,'tansig',W3,B3,'purelin',P,ZZ,TP);
wyn_nauki = zeros(size(Z)); %macierz wartości
error = zeros(size(Z));
for i = 1:length(X),
for j = 1:length(Y),
a_(i,j) = simuff([X(i) Y(j)]', W1,B1,'tansig',W2,B2,'tansig',W3,B3,
'purelin');
error(i,j) = Z(i,j) - wyn_nauki(i,j);
end
end
figure(1)
mesh(X,Y,Z);
figure(2)
mesh(X,Y,wyn_nauki);
figure(3)
mesh(X,Y,error);