POLITECHNIKA RZESZOWSKA
Wydział Elektrotechniki i Informatyki
Katedra Informatyki i Automatyki
SZTUCZNA INTELIGENCJA
PROJEKT
Temat: Zrealizować sieć neuronową uczoną algorytmem wstecznej propagacji błędu z przyśpieszeniem metodą momentum (learnbpm) uczącą się diagnozowania chorób nerek.
Piotr Galbas
II EFDI
P03
Celem projektu było sklasyfikowanie na podstawie serii danych 120 pacjentów, posiadających objawy chorób zapalenia pęcherza moczowego oraz ostrego zapalenia nerek. Została w tym celu stworzona sieć neuronowa, uczona algorytmem wstecznej propagacji błędu, z użyciem metody momentum.
Przykładowe dane oraz opis problemu przedstawiony został na stronie http://archive.ics.uci.edu/ml/datasets/Acute+Inflammations przez pana doktora Jacka Czerniaka, z Polskiej Akademii Nauk.
Wykorzystane w projekcie dane charakteryzowały się wielkowymiarowością. Każdy pacjent charakteryzował się sześcioma atrybutami, przyjmujących wartości logiki boolowskiej lub liczby zmiennoprzecinkowej. Dane były pełne, nie brakowało żadnych wartości, każdy wiersz danych przedstawiał potencjalnego chorego.
Przykładowa linia danych wraz z opisem:
35,9 no no yes yes yes yes no
35,9 - temperatura pacjenta. Wartość ta mogła należeć do przedziału 35-42°C
Kolejne atrybuty mogły przyjąć wartości prawda/fałsz (yes/no).
no - występowanie nudności
no - ból lędźwi
yes - ciągła potrzeba oddawania moczu
yes - występowanie bólu podczas oddawania moczu
yes - zapalenie cewki moczowej, świąd lub obrzęk wylotu cewki moczowej
Ostatnie dwie wartości były odpowiedzią eksperta z dziedziny badanych chorób:
yes - wystąpienie zapalenie pęcherza moczowego
no - wystąpienie ostrego zapalenia nerek
W celu przeprowadzenia doświadczenia z użyciem sieci neuronowej wielowarstwowej, należało znormalizować dane do właściwego zakresu.
Wartości yes/no, przekształcone zostały w liczby 1/0, natomiast temperatura została znormalizowana wg wzoru:
$$N_{i} = \ \frac{D_{i} - D_{\min}}{D_{\max} - D_{\min}}$$ |
|
---|
Dane wyjściowe sprowadzone zostały do wartości z przedziału <1,4> przedstawiających następujące możliwości:
Zapalenie pęcherza moczowego | Zapalenie nerek | Otrzymana kombinacja |
---|---|---|
No | No | 1 |
Yes | No | 2 |
No | Yes | 3 |
Yes | Yes | 4 |
Sieci neuronowe są modelami matematycznymi stworzonymi na wzór połączeń nerwowych ludzkiego mózgu. Charakteryzują się możliwością przetwarzania informacji, generalizacji wyników oraz posiadają możliwość samodzielnej nauki. Dzięki temu są w stanie pracować na niepełnych zbiorach danych oraz potrafią zwrócić prawidłowy wynik nawet dla nieznanych wcześniej danych. Są więc szczególnie przydatne podczas rozwiązywania problemów, niemożliwych do rozwiązania tradycyjnymi metodami.
W celu rozwiązania problemu klasyfikacji pacjentów, stworzona została trójwarstwowa sieć neuronowa, przyjmująca różną liczebność neuronów w warstwach pierwszej oraz drugiej. Trzecia warstwą była warstwą wyjścia, posiadającą jeden neuron, ze względu na występowanie tylko jednej wartości wyjścia.
Neuron
Podstawą istnienia sieci neuronowych, także w mózgu człowieka, jest neuron. Jego budowę oraz sposób jego działania przedstawia poniższy schemat:
X1,…Xn są wejściami neuronu. Neuron posiada ich skończoną liczbę, przy czym źródło, z jakiego pochodzą dane są znane. Mogą pochodzić one albo z wejścia systemu, albo są to wyjścia innych neuronów.
Każde z wejść posiada pewną wagę, określającą istotność informacji otrzymywanej z danego źródła. Wszystkie wejścia są sumowane w sumatorze i przekazywane dalej. Występuje tutaj dodatkowa wartość, jaką jest wektor przesunięcia w0 – bias. Wzór sumatora wygląda więc następująco:
$$s = \sum_{i = 1}^{n}{(x_{i}w_{i})} + w_{0}$$
Otrzymana wartość wprowadzona zostaje do elementu nieliniowego, jakim jest funkcja aktywująca. Decyduje ona, czy otrzymana przez neuron informacja jest na tyle istotna, żeby przesłać ją dalej. W projekcie wykorzystywane zostały funkcja liniowa oraz tangensa hiperbolicznego. Przyjęło się, że wartością progową jaką musi przekroczyć s jest wartość 0. Wartość wyjścia neuronu wyraża się wzorem:
y = f(s)
Sieć jednokierunkowa wielowarstwowa
Posiadając wiele neuronów, możliwe jest skonstruowanie wielu rodzajów sieci, posiadających zwartą strukturę. W utworzonej sieci wielowarstwowej, uwzględniony został jednostronny przepływ informacji. Połączenia między kolejnymi warstwami neuronów konstruuje się na zasadzie każdy z każdym, co przedstawia poniższy diagram.
Można wyróżnić tutaj model warstwowy sieci, przy czym poszczególne warstwy nazywane są wejściową, ukrytymi oraz wyjściową. Do działania sieci wykorzystuje się budowę neuronu, a więc każda ze strzałek przedstawia kierunek przepływu informacji, a także posiada swoją wagę. Wykorzystany zostaje również wektor przesunięcia. Wyjście neuronu z poprzedniej warstwy, staje się wejściem wszystkich neuronów warstwy następnej, przy czym do wszystkich rozsyłana jest ta sama informacja. Neuron otrzymujący informację określa jej istotność.
Sieci neuronowe potrafią przyjąć pewne dane, przetworzyć je i zwrócić wynik, jednak ich przydatność jest niewielka, jeśli wynik ten będzie niepoprawny. Dlatego też, sieci zostają poddane procesowi uczenia, mającemu na celu poprawę ich skuteczności.
Metoda wstecznej propagacji błędu
Jedną z podstawowych metod uczenia się sieci jest metoda wstecznej propagacji błędu. Poniżej zostały przedstawione wszystkie wzory użyte do tej metody wraz z komentarzami.
Wyjścia każdego z neuronów oznaczone zostaną jako yik. Wzór na wyjście neuronu brzmi:
$$y_{i}^{(k)}\left( t \right) = f\left( s_{i}^{(k)}\left( t \right) \right),\ \ gdzie\ s_{i}^{(k)}\left( t \right) = \sum_{j = 0}^{N_{k}}{w_{\text{ij}}^{(k)}(t)x_{j}^{(k)}(t)}$$
We wzorach jest mowa o i-tym neuronie, znajdującym się w k-tej warstwie, natomiast j jest indeksem sygnału wejściowego. Każdy neuron posiada swoje wagi, stąd wij(k), natomiast sygnały wejściowe występują te same dla całej warstwy, stąd xj(k). Nk oznacza tutaj ilość neuronów warstwy k-tej.
Błąd całej sieci obliczony zostaje wzorem na błąd średniokwadratowy wyrażony wzorem:
$$Q\left( t \right) = \sum_{j = 1}^{P}{\sum_{i = 0}^{N_{L}}{(d_{i}^{(L)} - y_{i}^{(L)})}^{2}}$$
gdzie:
P – ilość wszystkich rekordów danych wejściowych
NL – ilość wszystkich neuronów z warstwy wyjściowej L
Natomiast dla wyznaczenia wartości błędu każdego z neuronów stosuje się jeden z następujących wzorów.
$$Q_{i}^{\left( k \right)}\left( t \right) = \left\{ \begin{matrix}
d_{i}^{\left( L \right)}\left( t \right) - y_{i}^{\left( L \right)}\left( t \right),\ \ dla\ k = L \\
\sum_{m = 0}^{N_{k + 1}}{\delta_{m}^{\left( k + 1 \right)}\left( t \right)w_{\text{mi}}^{\left( k + 1 \right)}\left( t \right),\ \ dla\ k = 1,\ldots,L - 1} \\
\end{matrix} \right.\ $$
Warto zauważyć, że w celu obliczenia błędu warstwy poprzedniej, brane są pod uwagę wagi oraz delta δ warstwy następnej. Wzór ten pozwala określić zależność pomiędzy otrzymanym błędem od użytej wagi.
δi(k)(t) = Qi(k)(t)f′(si(k)(t))
Dla każdej oprócz ostatniej warstwy neuronów, następuje w tym wzorze rekurencyjne wywołanie błędu Qi(k) dla warstw następnych.
Pochodna bipolarnej funkcji aktywacyjnej tangensa hiperbolicznego przedstawia się następująco:
f′(x) = β(1−f2(x))
gdzie β jest współczynnikiem nachylenia funkcji. Im jego wartość jest większa, tym kształt funkcji ma bardziej strome zbocze.
W celu obliczenia nowych wartości wag dla i-tego neuronu, j-tego wejścia, k-tej warstwy, stosuje się następujący wzór:
wij(k)(t+1) = wij(k)(t) + 2ηδi(k)(t)xj(k)(t)
gdzie η jest tutaj współczynnikiem uczenia się sieci.
Należy wspomnieć, iż to właśnie wartości wag są wiedzą jaka została zawarta w danej sieci, dlatego są one tak istotne.
Proces uczenia przebiega według następującego algorytmu:
Na wejście sieci zostają podane wartości rekordu wejściowego. Neurony przetwarzają otrzymane informacje i przekazują dalej do kolejnej warstwy. Procedura trwa, aż wszystkie rekordy danych zostaną przetworzone i na wyjście zostanie zwrócony wektor wyjściowy y.
Obliczony zostaje błąd QiL(t), dla warstwy wyjściowej L.
Korzystając ze wzoru na błąd warstw poprzednich, błąd QiL(t) jest propagowany do tyłu zgodnie z połączeniami neuronów i z uwzględnieniem ich funkcji aktywacji. Czynność trwa, aż zostanie on policzony dla wszystkich neuronów.
Następuje uaktualnienie wag dla wszystkich neuronów.
Algorytm powtarzany jest, aż błąd całej sieci osiągnie ustalony na początku poziom.
Metoda momentum
Z uwagi na fakt, iż metoda wstecznej propagacji błędu jest mało dokładna i trudna do ustabilizowania. W celu zachowania większej stabilności wzbogaca się ją o tzw. momentum. Jest to miara bezwładności zmian opisana wzorem:
ηm(wmn(t) − wmn(t−1))
Przy czym ηm jest tutaj współczynnikiem uczenia momentum, przyjmującym wartości z przedziału [0,1]. Wzór ten dodaje do wzoru na nową wagę w’mn różnicę między wagą obecną a poprzednią, pomnożoną przez ηm. Jeżeli w kolejnych iteracjach kierunek zmiany wagi był ten sam, zmiana zostanie przyśpieszona. Natomiast w przypadku odwrotnym składnik momentum spowoduje zahamowanie gwałtownych zmian. Sieć zyskuje na stabilności i dla pewnych przypadków pozwala szybciej osiągnąć zamierzony rezultat. Składnik ten jest szczególnie zauważalny, gdy podczas procesu nauki błąd zbliża się do minimum lokalnego gradientu funkcji. Jego wartość jest wówczas tak niska, że człon ten staje się dominującym. Pozwala to na wyjście z minimum i kontynuowanie procesu uczenia.
W różnych źródłach przyjęło się, że współczynnik ηm powinien przyjmować wartość 0,95 lub 1-ηlr. Podczas doświadczenia jednak, w celach eksperymentalnych przyjmuje on różne wartości.
%wyczyszczenie środowiska, wyłączenie ostrzeżeń oraz uruchomienie skróconego zapisu liczb
clear all
nntwarn off
format compact
%wczytanie danych, zapis do zmiennych P danych wejściowych, T danych wyjściowych
file = dlmread ('dane4.txt');
P = file(:,1:6)';
T = file(:,7)';
%zapis do zmiennej R ilości wejść na podstawie ilości wierszy w macierzy P
[R,Q] = size(P);
%zapis do zmiennej S3 ilości neuronów warstwy wyjściowej na podstawie ilości wierszy w macierzy T
[S3,Z] = size(T);
%zadeklarowanie maksymalnej liczby epok, oraz błędu docelowego
max_epoch=10000;
err_goal=.25;
%zapis w pętlach wartości dla poszczególnych zmiennych lr,S1,S2,mc
for lr=[0.1 0.01 0.001 0.0001],
for S1=10:10:120,
for S2=10:10:S1,
for mc=[0.01 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 0.99],
%zainicjowanie poszczególnych warstw neuronów oraz macierzy ich wag i biasów
[W1,B1] = nwtan(S1,R);
[W2,B2] = nwtan(S2,S1);
[W3,B3] = rands(S3,S2);
%stworzenie i wyzerowanie macierzy zmian wag i biasów dla poszczególnych warstw
dW1=zeros(size(W1)); dB1=zeros(size(B1));
dW2=zeros(size(W2)); dB2=zeros(size(B2));
dW3=zeros(size(W3)); dB3=zeros(size(B3));
%główna pętla ucząca
for epoch=1:max_epoch,
%obliczenie odpowiedzi neuronów kolejnych warstw
A1 = tansig(W1*P,B1);
A2 = tansig(W2*A1,B2);
A3 = purelin(W3*A2,B3);
%obliczenie różnicy błędu oczekiwanego od otrzymanego
E = T -A3;
%obliczenie delty dla wszystkich neuronów kolejnych warstw
D3 = deltalin(A3,E);
D2 = deltatan(A2,D3,W3);
D1 = deltatan(A1,D2,W2);
%wyliczenie nowych różnic wag i biasów dla neuronów warstwy pierwszej
[dW1,dB1] = learnbpm(P,D1,lr,mc,dW1,dB1);
%uaktualnienie wag i biasów
W1 = W1 + dW1;
B1 = B1 + dB1;
%wyliczenie nowych różnic wag i biasów dla neuronów warstwy drugiej
[dW2,dB2] = learnbpm(A1,D2,lr,mc,dW2,dB2);
%uaktualnienie wag i biasów
W2 = W2 + dW2;
B2 = B2 + dB2;
%wyliczenie nowych różnic wag i biasów dla neuronów warstwy trzeciej
[dW3,dB3] = learnbpm(A2,D3,lr,mc,dW3,dB3);
%uaktualnienie wag i biasów
W3 = W3 + dW3;
B3 = B3 + dB3;
%obliczenie sumy kwadratów błędów
SSE = sumsqr(E);
%sprawdzenie warunku zakończenia procesu uczenia
if SSE < err_goal,
epoch = epoch - 1;
break,
end,
end
%obliczenie procentowej wartości uczenia się sieci
ans = 100*(1-sum((abs(T-A3)>.5)')/length(T));
%zapis do zmiennej vars wszystkich zmiennych potrzebnych oraz uzyskanych podczas
%procesu uczenia
vars = [S1 S2 lr mc epoch SSE ans];
%wypisanie powyższych zmiennych na ekran, zapis do pliku
[S1 S2 lr mc epoch SSE ans]
dlmwrite('WynikiEkspZnormalizowane.txt', vars, '-append', 'delimiter', '\t', ...
'precision', 4);
end
end
end
end
Opis użytych funkcji:
nwtan – wygenerowanie macierzy losowych wartości przy użyciu metody Nguyen-Widrowa, stosując funkcję tangensa hiperbolicznego.
[W1,B1] = nwtan(S1,R);
Zwraca dwie macierze: W1 o wymiarze S1xR, oraz B1 o wymiarze S1x1
rands – wygenerowanie macierzy losowych wartości o jednorodnym rozkładzie z zakresu [-1,1]
[W3,B3] = rands(S3,S2);
Zwraca dwie macierze: W3 o wymiarze S3xS2, oraz B3 o wymiarze S3x1
purelin – funkcja liniowa stosowana jako f. aktywacji neuronów warstwy wyjściowej
tansig – funkcja tangensa hiperbolicznego stosowana jako f. aktywacji neuronów warstw ukrytych
A2 = tansig(W2*A1,B2);
A3 = purelin(W3*A2,B3);
gdzie:
A – macierze wartości wyjściowych poszczególnych warstw neuronów
W – macierze wag
B – wektor biasu
deltalin – liniowa funkcja delta
deltatan – funkcja delta dla funkcji tangensa hiperbolicznego
D3 = deltalin(A3,E);
D2 = deltatan(A2,D3,W3);
gdzie:
A – macierze wartości wyjściowych poszczególnych warstw neuronów
D – macierze pochodnych błędów poszczególnych warstw
E – macierz błędu sieci
W3 – macierz wag warstwy trzeciej
learnbpm – funkcja ucząca metodą wstecznej propagacji błędu z metodą momentum
[dW1,dB1] = learnbpm(P,D1,lr,mc,dW1,dB1);
gdzie,
P – macierz wartości wejściowych sieci
D1 – macierz pochodnych błędów dla warstwy pierwszej neuronów
lr – współczynnik uczenia się sieci
mc – współczynnik momentum
dW1 – macierz przyrostów wag dla warstwy pierwszej neuronów
dB1 – macierz biasu dla warstwy pierwszej neuronów
Z uwagi na stosunkowo niewielką liczbę rekordów danych wejściowych, sprawdzone zostało całe możliwe spektrum zmian zmiennych S1,S2,lr,mc. Miało to na celu łatwiejszą zauważalność zależności pomiędzy ich wartościami, a wynikiem.
Pomiary przeprowadzone zostały dla poniższych założeń:
S1 – ilość neuronów warstwy wejściowej wybierana z zakresu <10,20,…,120>
S2 – ilość neuronów warstwy ukrytej wybierana z zakresu <10,20,…,S1>
lr – współczynnik uczenia przyjmował jedną z czterech wartości: 0.1, 0.01, 0.001, 0.0001
mc – współczynnik momentum przyjmował wartości 0.01, 0.1, 0.2, … , 0.8, 0.9, 0.99
Ważnym założeniem było, aby ilość neuronów w. ukrytej była nie większa od ilości w warstwie wejściowej. Poniżej przedstawione zostały dane statystyczne zgromadzone podczas analizy zgromadzonych informacji, a po nich prezentacja wyników na wykresach.
Ilość uzyskanych wyników: 4576 (1144 rekordy na każdy ze współczynników uczenia lr).
Skutecznością nazwana została liczba prób, które zwróciły wynik, dzieloną przez ilość prób.
Średnia liczba epok jest to suma liczby epok dla każdej próby przez ilość prób.
lr 0,1 | lr 0,01 | lr 0,001 | lr 0,0001 | |
---|---|---|---|---|
najmniejszy błąd | 54,099 | 0,0516 | 0,1344 | 0,1777 |
najmniejsza liczba epok | 10000 | 29 | 24 | 26 |
skuteczność [w %] | 5,7692308 | 19,75524 | 68,26923 | 98,3391608 |
średni wynik [w %] | 2,443042 | 17,30834 | 67,34701 | 97,989493 |
średnia liczba epok | 10000 | 8600,507 | 3587,298 | 1545,14161 |
10 najmniejszych błędów |
lr |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
10 najmniejszych epok |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
Najlepsze kombinacje:
S1 | S2 | lr | mc | epoki | SSE | wynik |
---|---|---|---|---|---|---|
80 | 20 | 0,1 | 0,99 | 10000 | 54,099 | 50,83 % |
90 | 10 | 0,01 | 0,9 | 71 | 0,208 | 100 % |
50 | 40 | 0,001 | 0,6 | 24 | 0,1557 | 100 % |
120 | 60 | 0,0001 | 0,7 | 26 | 0,2072 | 100 % |
Wykres przedstawiających 100% nauczenie się danych przez sieć wygląda następująco:
S1 = 120, S2 = 120, lr = 0,001, mc = 0,9
Na wykresach przedstawiających wartość błędu w czasie trwania doświadczenia, można wyraźnie zauważyć jaki wpływ na jego zmianę ma współczynnik momentum. Liczba epok podana na górze przedstawia długość trwania symulacji do momentu osiągnięcia założonego błędu.
S1=90,S2=10,lr=0,001, mc = 0,1 S1=90,S2=10,lr=0,001, mc = 0,4
S1=60,S2=60,lr=0,001, mc = 0,6 S1=60,S2=60,lr=0,001, mc = 0,8
S1=120,S2=120,lr=0,001, mc = 0,9 S1=60,S2=60,lr=0,001, mc = 0,99
Lr 0,1, podane wartości są maksymalnymi z pośród znalezionych:
Lr 0,01, podane wartości są maksymalnymi z pośród znalezionych:
Lr 0,001, podane wartości są średnią z pośród znalezionych:
Lr 0,0001, podane wartości są średnią z pośród znalezionych:
Wnioski:
Ze względu na bardzo niską skuteczność oraz średni wynik dla pierwszych dwóch serii, ich wykresy narysowane zostały w oparciu o najwyższą znalezioną wartość. Na podstawie powyższych danych zauważyć można, że pomimo iż próby zawierające najmniejszy błąd oraz najmniejszą ilość epok występują dla współczynnika uczenia lr=0,001, to dla lr=0,0001 uzyskana została dużo większa skuteczność, zaś średnia ilość potrzebnych epok jest ponad dwukrotnie mniejsza.
Inną obserwacją jaką można zaobserwować jest fakt, iż dla większego współczynnika uczenia, sieci odzyskiwała stabilność dopiero dla momentum równego 0,99. Poziom ten zmniejszał się, gdy malała liczba neuronów warstwy ukrytej. Dla lr=0,1, powyżej 30 neuronów na pierwszej warstwie niemożliwe było uzyskanie wyniku dla mc=0,99 jeżeli ilość neuronów w warstwie ukrytej była większa niż 30.
Dla lr=0,01 tylko w niektórych przypadkach współczynnik mc=0,99 nie zwrócił żadnego rezultatu. Natomiast dla odpowiednio niskiej liczby neuronów warstwy ukrytej także niższe wartości momentum dają rezultat.
Dla lr=0,001 występuje warte dostrzeżenia zjawisko. Otóż, wraz ze wzrostem liczby neuronów na warstwie wejściowej, poziom momentum dla którego sieć uzyskuje stabilność rośnie. Przykładowo dla (S1/S2) 100/30 sieć odzyskuje stabilność dla mc=0,3, natomiast dla 100/100 dopiero dla mc=0,8.
Kolejnym przeprowadzonym eksperymentem było zbadanie procesu uczenia się sieci dla małej ilości neuronów: z zakresu 1-5, a także 5-25. Celem tego doświadczenia było sprawdzenie, czy sieć neuronowa potrzebuje dużej ilości neuronów, aby poprawnie rozwiązywać postawiony przed nią problem klasyfikacji. Większa ilość neuronów zwiększa bowiem ilość potrzebnych do wykonania obliczeń oraz wydłuża się czas oczekiwania na odpowiedź.
lr 0,1 | lr 0,01 | lr 0,001 | lr 0,0001 | |
---|---|---|---|---|
najmniejszy błąd | 0,0827 | 0,0999 | 0,2245 | 0,1777 |
najmniejsza liczba epok | 172 | 29 | 31 | 45 |
skuteczność [w %] | 11,912226 | 43,88715 | 84,95298 | 94,0438871 |
średni wynik [w %] | 5,67116 | 39,39897 | 82,97539 | 92,789906 |
średnia liczba epok | 9908,0251 | 6699,197 | 2327,708 | 4113,84326 |
lr = 0,1, dla najwyższych wyników w serii:
lr = 0,01, dla średnich, a następnie najwyższych i zarazem jedynych wartości:
lr = 0,001, dla średnich wartości prób:
lr = 0,0001, dla średnich wartości prób:
Najlepsze kombinacje dla 1-5:
S1 | S2 | Lr | mc | epoki | SSE | wynik |
---|---|---|---|---|---|---|
3 | 3 | 0,1 | 0,99 | 10000 | 6,552 | 91,6699 % |
4 | 3 | 0,01 | 0,5 | 29 | 0,2101 | 100 % |
4 | 4 | 0,001 | 0,9 | 122 | 0,25 | 100 % |
5 | 3 | 0,0001 | 0,8 | 45 | 0,2112 | 100 % |
Najlepsze kombinacje dla 5-25:
S1 | S2 | lr | mc | epoki | SSE | wynik |
---|---|---|---|---|---|---|
20 | 15 | 0,1 | 0,99 | 172 | 0,0971 | 100 % |
10 | 10 | 0,01 | 0,8 | 39 | 0,2335 | 100 % |
15 | 15 | 0,001 | 0,1 | 31 | 0,2462 | 100 % |
5 | 5 | 0,0001 | 0,6 | 75 | 0,2462 | 100 % |
Wnioski:
Przyglądając się wynikom można zauważyć, że kilka z pośród najlepszych wyników z eksperymentu podstawowego mieści się w badanym powyżej przedziale. Znajdują się one jednak w górnej części badanego przedziału i w porównaniu z pozostałymi wynikami z tej serii są to wyjątki. Można przypuszczać, że przedział dla którego sieć pracuje na wysokim poziomie znajduje się powyżej zakresu 25 neuronów na warstwę.
Dodatkową obserwacją jest trudność w uzyskaniu stabilności sieci dla małych ilości neuronów. Bardzo łatwo można ją natomiast stracić, toteż współczynnik uczenia dla tego typu sieci musi być stosunkowo mały. Przyglądając się wysokim wynikom statystycznym należy pamiętać, że na każdy z badanych współczynników uczenia przypada tylko 319 rekordów, a więc prawie czterokrotnie mniej niż w eksperymencie podstawowym.
Trzeci eksperyment polegał na zaprezentowaniu efektów zastosowania większej ilości neuronów na warstwie ukrytej w stosunku do warstwy wejściowej. Symulacja została przeprowadzona dla ilości neuronów z zakresu 1-25 na warstwę, ponieważ wraz ze zbliżaniem się do końca badanego zakresu można zauważyć w jakim kierunku będzie podążać dalszy rozwój sieci.
lr 0,1 | lr 0,01 | lr 0,001 | lr 0,0001 | |
---|---|---|---|---|
najmniejszy błąd | 0,07219 | 0,08878 | 0,1961 | 0,2478 |
najmniejsza liczba epok | 201 | 40 | 50 | 299 |
skuteczność [w %] | 10,03135 | 39,4984326 | 100 | 100 |
średni wynik [w %] | 5,684263 | 32,9020376 | 98,82699 | 99,75705 |
średnia liczba epok | 9817,781 | 7399,95298 | 1442,906 | 4777,361 |
10 najlepszych błędów |
---|
lr |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
10 najlepszych epok |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
lr = 0,1, dla najwyższych wyników w serii:
lr = 0,01, dla średnich wartości prób:
lr = 0,001, dla średnich wartości prób:
lr = 0,0001, dla średnich wartości prób:
Najlepsze kombinacje dla 1-5:
S1 | S2 | Lr | mc | epoki | SSE | wynik |
---|---|---|---|---|---|---|
3 | 3 | 0,1 | 0,99 | 387 | 0,133 | 100 |
4 | 4 | 0,01 | 0,8 | 40 | 0,2368 | 100 |
3 | 5 | 0,001 | 0,2 | 92 | 0,2315 | 100 |
4 | 4 | 0,0001 | 0,1 | 938 | 0,2498 | 100 |
Najlepsze kombinacje dla 5-25:
S1 | S2 | lr | mc | epoki | SSE | wynik |
---|---|---|---|---|---|---|
5 | 20 | 0,1 | 0,99 | 201 | 0,1913 | 100 |
10 | 10 | 0,01 | 0,8 | 44 | 0,2232 | 100 |
20 | 25 | 0,001 | 0,7 | 52 | 0,2415 | 100 |
20 | 25 | 0,0001 | 0,2 | 299 | 0,2491 | 100 |
Wnioski:
Porównując powyższe dane z poprzednim eksperymentem, otrzymane zostały zaskakujące wnioski. O ile dla liczby neuronów 1-5 i lr= 0,1-0,01 wyniki są podobne, to dla lr= 0,001-0,0001 oraz tej samej liczby neuronów duże lepsze wyniki osiąga eksperyment w którym S2≥S1.
Najlepsze kombinacje wyłonione podczas próby wykazują tendencję do równej bądź niewiele większej liczby neuronów na warstwie ukrytej. Chociaż dla mniejszych wartości lr wyniki są lepsze, to ilość epok potrzebna do sukcesu bywa bardzo zróżnicowana, średnia wynosi bowiem 6610 epok. W porównaniu z wynikami uzyskanymi dla większego zakresu liczba ta jest duża.
Podczas gdy dla lr=0,001, S1=5 i zależności S1≥S2 sieć ma trudności z odzyskaniem stabilności, sieć o S2=5 i zależności S2≥S1 radzi sobie wzorcowo. Nie występują w nim żadne problemy ze stabilnością. Dodatkowo średnia liczba epok w przedziale 1-5 wynosi 4158 dla S1≥S2, oraz 2474 dla S2≥S1. Uzyskanie mniejszego błędu dla eksperymentu S2≥S1 wiąże się zaś ze zjawiskiem interpolacji pośród neuronów, bowiem nadmiarowe neurony warstwy ukrytej wspomagają proces uczenia się neuronów warstwy poprzedniej.
Podsumowując, dla małej liczby neuronów eksperyment w którym S2≥S1 uzyskuje dużo lepsze wyniki. Dla pełnego przedziału 1-25 neuronów na warstwę następuje natomiast podział: lepszą skuteczność oraz wyniki uzyskuje S2≥S1, natomiast mniejszą liczbę epok (nawet o 85% dla lr=0,0001) i mniejszy błąd S1≥S2. Przy większej ilości neuronów i danych mniejsza liczba epok przekłada się na krótszy czas uzyskania odpowiedzi, toteż w celu otrzymania dokładniejszych wyników w krótszym czasie autor polecałby zastosowanie zależności S1≥S2. Pełne porównanie obu eksperymentów przedstawione zostało poniżej:
Przedział 1-25 neuronów | lr 0,1 | lr 0,01 | lr 0,001 | lr 0,0001 |
---|---|---|---|---|
S1≥S2 | S2≥S1 | S1≥S2 | S2≥S1 | |
najmniejszy błąd | 0,0827 | 0,07219 | 0,0999 | 0,08878 |
najmniejsza liczba epok | 172 | 201 | 29 | 40 |
skuteczność | 11,912 | 10,031 | 43,887 | 39,498 |
średni wynik | 5,671 | 5,684 | 39,399 | 32,902 |
średnia liczba epok | 9908,025 | 9817,781 | 6699,197 | 7399,953 |
Wszystkie powyższe eksperymenty zostały wykonane dla danych znormalizowanych. Następny etap polegał na sprawdzeniu odpowiedzi sieci dla danych nieznormalizowanych. Miał on na celu podkreślić jak dużą wagę na poprawność wyników mają prawidłowo znormalizowane dane wejściowe. Zwiększona została również górna granica liczby epok do 20000.
lr 0,1 | lr 0,01 | lr 0,001 | lr 0,0001 | |
---|---|---|---|---|
najmniejszy błąd | 29,99 | 0,2497 | 0,2079 | 0,2496 |
najmniejsza liczba epok | 20000 | 20000 | 668 | 5289 |
skuteczność [w %] | 10,03135 | 46,39498 | 99,37304 | 93,73041 |
średni wynik [w %] | 5,098934 | 23,89605 | 53,88931 | 69,03959 |
średnia liczba epok | 20000 | 20000 | 19184,98 | 19104,27 |
10 najlepszych błędów |
---|
lr |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
10 najlepszych epok |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
Wnioski:
Na podstawie danych statystycznych można zauważyć, iż wymagany jest tutaj bardzo ostrożny proces uczenia, bowiem dla zbyt dużego współczynnika uczenia praktycznie niemożliwe jest uzyskanie przez sieć poprawnej odpowiedzi. Większość z nich znajduje się na granicy stabilności sieci. Dodatkowo w przeważającej liczbie przypadków sieć potrzebowała kilku do kilkunastu tysięcy epok, aby nauczyć się danych.
W eksperymencie tym można bardzo wyraźnie zauważyć, że każdy kto przeprowadza doświadczenia z użyciem sieci neuronowych, powinien w pierwszej kolejności zwrócić uwagę na format danych wejściowych, bowiem brak normalizacji lub ich błędna normalizacja potrafi zwiększyć potrzebną ilość epok wielokrotnie, a także łatwo całkowicie zdestabilizować cały układ.
Podczas przeprowadzania doświadczenia pojawiły się duże problemy z uzyskaniem stabilności obliczeń sieci. Bardzo dużo prób dla lr=0,1-0,01 dawało wynik negatywny, ponieważ błąd SSE przyjmował wartość NaN. Uznane zostało to za brak stabilności sieci dla zastosowanych konfiguracji. Główną przyczyną tej sytuacji była nieadekwatna wartość momentum do zastosowanego współczynnika nauczania lr. Dla wielu przypadków poprawna jest zależność mc = 1-lr. Odniesiono również wrażenie, iż współczynnik momentum pomimo iż służy do uzyskania większej stabilności sieci, w wielu przypadkach przysparzał również wielu trudności z otrzymaniem pozytywnych rezultatów. Dodatkowo, znacznie zwiększał ilość możliwych kombinacji, ponieważ każda z kombinacji S1,S2 i lr wymagała sprawdzenia aż 11 przypadków. Dało to w sumie 7128 prób które należało skatalogować, sformatować i wykonać na nich operacji.
Liczba ta powstała w wyniku redukcji rozpatrywanych przypadków, ponieważ początkowo krok zmiany ilości neuronów wynosił 5, co w rezultacie dałoby 13200 rekordów jedynie dla głównego doświadczenia. Chcąc przeprowadzić również pozostałe doświadczenia liczbę tą należy szacować na około 20 tysięcy rekordów. Biorąc pod uwagę ograniczony czas na wykonanie projektu, bowiem uzyskanie obecnych wyników zajęło około 14 dni całodniowych obliczeń, autor był zmuszony zwiększyć wartość kroku zmiany liczby neuronów.
Analizując otrzymane wyniki, można dojść do wniosku, iż liczba 120 neuronów na warstwę była wystarczająca, ponieważ dla ostatnich badanych kombinacji można było zauważyć rosnącą liczbę epok potrzebną do nauczenia sieci.
Podsumowując, eksperyment ten miał za zadanie poprawnie sklasyfikować otrzymane w ciągu uczącym dane pacjentów, u których występowało podejrzenie jednej z chorób nerek. Po przeprowadzeniu dokładnych i wyczerpujących badań stwierdza się zrealizowanie postawionego zadania. Dodatkowo zostały zbadane wszelkie możliwości alternatywnego podejścia do przedstawionego problemu. Uzasadniony został powód ich niestosowania podczas rozwiązywania podobnych do przedstawionego wyżej problemu. Należy jednak pamiętać, że nauka o sieciach neuronowych rozwija się bardzo szybko, stąd też nie istnieją jak dotąd sformułowane zasady dotyczące ich budowy oraz zależności zachodzących między poszczególnymi elementami. Każdy problem należy rozpatrywać indywidualnie, ponieważ w niektórych przypadkach niezalecane metody mogą okazać się skuteczniejsze od powszechnie stosowanych.
Leszek Rutkowski, „Metody i techniki sztucznej inteligencji”, wydawnictwo PWN
http://sztuczna-inteligencja.co-za.info.pl/Sieci%20neuronowe.html