Politechnika Rzeszowska
Wydział Elektrotechniki i Informatyki
Katedra Informatyki i Automatyki
Sztuczna inteligencja
Temat projektu:
Zrealizować sieć neuronową uczoną algorytmem wstecznej propagacji błędu z przyśpieszeniem metodą adaptacyjnego współczynnika uczenia i metodą momentum ucząca się oceny ryzyka kredytowego (trainbpx).
Wykonał:
Adrian Muszański
II EF-DI
Rzeszów 2011
Opis problemu.
Banki od zawszę interesowały się opłacalnością przyznawanych kredytów. Współcześnie na podstawie danych o zawodzie, wieku, posiadanych oszczędności, spłacaniu poprzednich kredytów itp. określa się zdolność kredytową potencjalnych klientów. Istotą takiego podejścia jest przewidzenie czy dana osoba ma predyspozycje do spłacenia danego kredytu czy nie.
Celem projektu jest stworzenie sieci neuronowej, która na podstawie danych osoby ubiegającej się o kredyt będzie potrafiła poprawnie ocenić czy opłaca się przyznać kredyt tej osobie czy nie.
Dane do projektu zostały pobrane ze strony http://www.statistik.lmu.de/service/datenarchiv/kredit/kredit_e.html. dotyczą one banków niemieckich. Dla każdego klienta zostało określone czy opłaca się przyznać mu kredyt (wartość 1) czy nie (wartość 0). Na ryzyko kredytowe każdego klienta składa się 20 cech indywidualnie określanych dla każdej osoby.
Przygotowanie danych.
Atrybuty rekordów zawarte w repozytorium
|
---|
Przygotowanie danych oraz normalizacja
Przed przygotowaniem danych, w pierwszej kolejności należy odpowiednio przygotować środowisko.
Pierwszym etapem było pobranie danych z wcześniej wymienionej strony. Następnie dane zostały otworzone programie Microsoft Office Excel. Usunąłem niepotrzebne nazwy kolumn a następnie zapisałem plik pod nazwą kredit.
Po wczytaniu danych otrzymujemy macierz posiadająca 21 kolumn oraz 1000 wierszy. Pierwsza kolumna zawiera dane wyjściowe ( określa czy ryzyko kredytowe jest wystarczająco niskie aby przyznać kredyt ) pozostałe kolumny są to dane cząstkowe składające się na określenie ryzyka kredytowego.
Należy oddzielić od siebie te 2 grupy. Dane wyjściowe zostaną przypisane do macierzy T zaś dane wejściowe do macierzy P.
Wczytane dane są posortowane można więc przystąpić do ich normalizacji, aby sieć mogła je odpowiednio przetworzyć i się nauczyć. Normalizacja będzie polegała na zwróceniu nam danych z przedziału <-1,1> które będą mogły zostać odpowiednio przetworzone. Proces ten realizowany jest przez powyższy skrypt.
Na końcu przetworzone dane zostają zapisane do pliku kredit.mat.
Opis algorytmu.
Sieć neuronowa
Sieci neuronowe są to bardzo uproszczone modele rzeczywistego układu nerwowego, które powstały na podstawie wiedzy o działaniu biologicznego systemu nerwowego (mózgu) istot żywych. Są one zdolne do przewidywania nowych zdarzeń (np. określonych zmiennych) na podstawie wcześniejszych bądź innych obserwacji (dokonanych na tych samych lub innych zmiennych) po przeprowadzeniu procesu - tzw. uczenia w oparciu o istniejące dane.
Sieć neuronowa jest to sieć składająca się z tzw. sztucznych neuronów, które są odpowiednikami czy modelami rzeczywistego neuronu. Najważniejszą cechą owych sieci jest możliwość uczenia się - czyli dostosowanie określonych zmiennych w taki sposób, by zwiększyć efektywność sieci przy rozwiązywaniu zadań określonego typu.
Struktura sieci neuronowych w znacznej części składa się z dużej (od kilkuset od kilkudziesięciu tysięcy) liczby elementów przetwarzających informacje. Elementy te to sztuczne neurony, które są bardzo uproszczonymi odpowiednikami rzeczywistych komórek nerwowych. Neurony te tworzą sieć za pomocą połączeń o parametrach (wagach) modyfikowanych w trakcie tzw. procesu uczenia. Najczęściej tworzą one sieci, o budowie warstwowej.
Neuron sumuje za pomocą wag sygnały wejściowe pochodzące z innych neuronów, przetwarza je w jądrze i przekazuje tę wartość do innych neuronów powiązanych z nim. Model sztucznego neuronu składa się z dokładnie tych samych elementów z jakich zbudowana jest rzeczywista komórka, które wykonują również te same funkcje co biologiczny jego odpowiednik.
Wejścia są odpowiednikami dendrytów i tak jak w komórce nerwowej dostarczają one informacji (sygnałów) od innych neuronów. Wagi zachowały swoją nazwę, jak i funkcje. Ich rolą jest dostosowanie sygnałów wejściowych. Blok sumujący odpowiada za przetwarzanie sygnałów i jest odpowiednikiem jądra. Blok aktywujący odpowiada za kształtowanie informacji wyjściowej, która zostanie podana do wyjścia - aksonu.
Matematyczny opis neuronu przedstawili jako pierwsi McColluch-Pits, w którym jako neuron przyjęto jednostkę binarną (sygnał wyjściowy 0 lub 1), gdzie wartość 1 odpowiada pobudzeniu neuronu większemu niż próg zadziałania, a wartość 0 - pobudzeniu mniejszemu niż ten próg. Jest to model, na którym wzorowały się późniejsze modele. Schematycznie możemy przedstawić ten model w poniższy sposób.
Sygnały wejściowe xi (i=1,2,...,N) sumowane są z odpowiednimi wagami wi w sumatorze, a następnie przetwarzane w jądrze i porównywane z progiem zadziałania wi0. Gdy obliczona wartość sumy przekroczy pewną wartość progową wi0, następuje jego zapłon, inaczej mówiąc neuron ten znajdzie się w stanie pobudzenia. Matematycznie stan pobudzenia neuronu wyraża się dwiema wartościami: 0, gdy pobudzenie neuronu nie przekroczyło jego specyficznej wartości progowej, i 1, gdy jest przeciwnie. Matematycznie prezentuje się to w następujący sposób. Sygnał wyjściowy y możemy wówczas wyrazić za pomocą następującej zależności
Funkcje , gdzie
nazywamy funkcja aktywacji (wio oznacza przesunięcie). W modelu tym jest to funkcja skokowa (funkcja Heaviside'a)
Współczynniki wij reprezentują wagi połączeń synaptycznych. Możemy teraz zobaczyć jak ważny jest ten parametr - jeśli przyjmie on wartość dodatnią to synapsa przechodzi w stan pobudzenia, ujemna - hamującą, natomiast współczynnik wij = 0 świadczy o braku połączeń między i-tym a j-tym neuronem. Model ten określa przyszły stan (t+1) na podstawie stanu sygnałów wejściowych neuronów w chwili poprzedniej (t). Funkcja aktywacji to pojęcie używane w sztucznej inteligencji do określenia funkcji, według której obliczana jest wartość wyjścia neuronów sieci neuronowej.
Ogólnie algorytm wstecznej propagacji wymaga dla każdego wzorca uczącego wykonania następujących działań:
Podaj wektor uczący uµ na wejście sieci.
Wyznacz wartości wyjść ujmµ każdego elementu dla kolejnych warstw przetwarzania neuronowego, od pierwszej warstwy ukrytej do warstwy wyjściowej.
ujmµ oczanacza aktywność j-tego elementu przetwarzającego m-tej warstwyuimµ oznacza wartość wyjścia i-tego elementu m-tej warstwy
f(ϕjmµ) oznacza funkcje aktywacji względem sumy przy prezentacji j-tego elementu m-tej warstwy .
Oblicz wartości błędów δjMµ dla warstwy wyjściowej.
yjzµ oznacza oczekiwane wartości wyjścia j-tego elementu
yjµ oznacza aktualne wartości wyjścia j-tego elementu
ϕjMµ oznacza ważoną sumę wejść w warstwie wyjściowej przy prezentacji µ-tego wzorca
δju oznacza błąd powstały w j-tym elemencie
Oblicz wartość sumy kwadratów błędów ξµ.
gdzie:
n oznacza liczbę elementów w warstwie wyjściowej
ϕjµ ważoną sumę wejść wyznaczoną w sumatorze przy prezentacji µ-tego wzorca
ξµ oznacza sumę po wzorcach błędów powstałych przy prezentacji µ-tego wzorca
Dokonaj propagacji wstecznej błędu wyjściowego δjMµdo poszczególnych elementów warstw ukrytych wyznaczając δjmµ według wzoru:
ϕjmµ oznacza ważoną sumę wejść w warstwie m-tej przy prezentacji µ-tego wzorca
Dokonaj aktualizacji wag kolejno pomiędzy warstwą wyjściową i ukrytą, a następnie pomiędzy warstwami ukrytymi przesuwając się w kierunku warstwy wejściowej.
Przyspieszanie uczenia – 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. Przedstawię tutaj 2 metody używane podczas moich eksperymentów.
Metoda adaptacyjnego zmiany adaptacyjnego współczynnika uczenia – polega na odpowiednim doborze współczynnika uczenia η.
Metodą zwiększającą szybkość uczenia jest metoda adaptacyjnej korekty współczynnika uczenia η. W metodzie tej na podstawie porównania sumarycznego błędu kwadratowego (SSE)
w chwili uczenia t z jej poprzednią wartością SSE (t −1 ).sposób zmiany współczynnika uczenia η definiuje się jako:
gdzie ξd, ξ i są odpowiednio współczynnikami zmniejszania i zwiększania wartości η , a er dopuszczalną krotnością przyrostu błędu.
Metoda momentum – polega na wprowadzeniudo 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 Mij (k) jest wyliczane z zależności
η ∈[0, 1] jest współczynnikiem uczenia momentum. Jeżeli η = 1 to nowa waga jest równa ostatniej zmianie wag. Jeżeli η=0, to zmiana wagi oparta jest tylko na składowej gradientowej. Najczęściej przyjmuje się η = 0.95. Wprowadzenie składnika momentum zdecydowanie wpływa na zwiększenie szybkości uczenia.
Opis metody
Powyższy fragment skryptu odpowiada za właściwy trening sieci. Funkcja trainbpx przeprowadza trening nieliniowej sieci jednokierunkowej z zastosowaniem techniki adaptacyjnej zmiany współczynnika prędkości uczenia oraz członu techniki momentu. W efekcie uczenie sieci trwa znacznie krócej, a prawdopodobieństwo utknięcia w lokalnym minimum funkcji błędu sieci zostaje zmniejszone.
Działanie funkcji sprowadza się do wielokrotnego powtarzania sekwencji złożonej z wywołania odpowiedniej funkcji uczenia, modyfikacji współczynników wagowych oraz wywołania funkcji symulacji sieci w celu obliczenia osiąganego przez nią błędu średniokwadratowego. Sekwencja taka nosi nazwę cyklu treningowego.
Argumentami wejściowymi funkcji są: początkowe wartości współczynników wagowych i progowych, macierze wektorów wejściowych. Działanie funkcji kończy się w momencie osiągnięcia przez siec zadanego błędu średniokwadratowego bądź w przypadku przekroczenia zadanej liczby cykli treningowych.
Funkcje zwracają nowe (wyuczone) wartości współczynników wagowych oraz współczynników progowych, a także liczbę przebytych cykli treningowych i osiągnięty błąd średniokwadratowy sieci.
Initff - inicjalizacja współczynników wagowych sieci jednokierunkowej. W zależności od postaci funkcji aktywacji poszczególnych warstw inicjalizacja współczynników wagowych przeprowadzana jest w oparciu o różne przedziały liczbowe. Dla liniowych, progowych i radialnych funkcji aktywacji wstępne wartości współczynników wagowych losowane są z przedziału [-1,1]
Argumenty:
P - macierz wektorów wejściowych (wymiar R*Q, R - liczba wejść sieci, Q - ilość wektorów)
Si - ilość neuronów w i-tej warstwie
Fi - funkcja aktywacji i-tej warstwy (np. 'tansig')
T - macierz wektorów wyjściowych (wymiar Sn*Q, Sn - ilość wyjść sieci)
Wielkości zwracane:
Wi - macierz współczynników wagowych i-tej warstwy
Bi - kolumnowy wektor współczynników progowych i-tej warstwy.
Trainbpx ma postać [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 (w cyklach, domyślnie =25)
TP(2) - maksymalna liczba cykli treningowych (domyślnie 100)
TP(3) - graniczny błąd średniokwadratowy) sieci (domyślnie = 0.02)
TP(4) - współczynnik prędkości uczenia (domyślnie = 0.01)
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
Simuff - symulacja sieci jednokierunkowej. Ma postać A=simuff( P ,W,B,'F')
Argumenty:
P - macierz wektorów wejściowych (wymiar R*Q, R - liczba wejść sieci, Q - ilość wektorów wejściowych)
Wi - macierz współczynników wagowych i-tej warstwy (wymiar Si*T, Si - ilość neuronów w i-tej warstwie, T - ilość wejść warstwy)
Bi - wektor współczynników progowych i-tej warstwy (wymiar Si*l)
Fi - funkcja aktywacji i-tej warstwy, np. 'logsig'
Wielkości zwracane:
A - wektor sygnałów wyjściowych i-tej warstwy (wymiar Si*l)
Skrypt realizujący sieć neuronową
Komendy przygotowujące do obliczeń. Wyczyszczenie zmiennych istniejących w przestrzeni roboczej. Wyłączenie ostrzeżeń. Ustawienie formatu danych. Załadowanie wcześniej przygotowanych danych.
Tutaj następują właściwe eksperymenty. W pętli for zmieniana jest wartość S1, a warunek w pętli while odpowiada za właściwą wartość S2. Eksperymenty dla odpowiednich parametrów wykonywane są 5-krotnie, a średnia z nich zapisywana jest do odpowiedniej macierzy.
Zapisanie macierzy z wynikami do plików.
S1 – liczba neuronów w warstwie pierwszej
S2 – liczba neuronów w warstwie drugiej
lr – współczynnik prędkości uczenia
disp_freq – częstotliwość wyświetlania
epoch – cykl treningowy
max_epoch – maksymalna liczba cykli po których zakończy się liczenie ( o ile wcześniej błąd SSE nie zajdzie poniżej ustalonej wartości err_goal)
err_goal – wartość graniczna której osiągnięcie przez sieć uznajemy za 100% nauczenie się sieci.
4.Przeprowadzone eksperymenty.
4.1 Wyniki pomiarów:
Dla każdej wartości S1 i odpowiadającej jej wartości S2 wykonano 5 prób pomiarowych. Średnia wszystkich pomiarów prezentuje poniższa tabelka ( na czerwono zaznaczyłem 3 najlepsze wyniki):
S1/S2 | Procentowa wartość | SSE |
---|---|---|
nauczenia się sieci | ||
49/25 | 93,66 | 62,03 |
99/25 | 94,78 | 55,38 |
149/25 | 95,70 | 46,32 |
149/75 | 95,50 | 50,60 |
199/25 | 96,38 | 42,69 |
199/75 | 96,08 | 46,92 |
199/125 | 95,26 | 51,36 |
249/25 | 96,44 | 32,38 |
249/75 | 96,04 | 46,00 |
249/125 | 95,64 | 47,18 |
349/25 | 97,24 | 34,99 |
349/75 | 96,44 | 41,74 |
349/125 | 95,80 | 46,75 |
349/175 | 95,40 | 50,44 |
349/225 | 95,78 | 48,53 |
449/25 | 97,72 | 32,23 |
449/75 | 96,78 | 39,75 |
449/125 | 95,82 | 45,17 |
449/175 | 96,12 | 46,09 |
449/225 | 95,24 | 50,46 |
449/275 | 95,64 | 48,77 |
549/25 | 98,02 | 29,31 |
549/75 | 96,94 | 38,05 |
549/125 | 96,16 | 43,91 |
549/175 | 96,26 | 43,66 |
549/225 | 96,04 | 45,95 |
549/275 | 95,48 | 48,62 |
549/325 | 95,54 | 48,37 |
649/25 | 97,76 | 30,72 |
649/75 | 96,96 | 37,71 |
649/125 | 96,92 | 40,92 |
649/175 | 96,20 | 43,36 |
649/225 | 96,32 | 44,14 |
649/275 | 95,92 | 45,15 |
649/325 | 95,76 | 45,69 |
659/375 | 95,44 | 45,85 |
749/25 | 97,91 | 28,22 |
749/75 | 97,3 | 36,30 |
749/125 | 96,9 | 39,11 |
749/175 | 96,7 | 40,49 |
749/225 | 96,4 | 44,69 |
749/275 | 95,8 | 45,36 |
749/325 | 95,7 | 45,74 |
759/375 | 95,6 | 45,80 |
749/425 | 95,5 | 45,89 |
749/475 | 95,3 | 45,95 |
Sieć nie nauczył się w pełni ani razu, więc nie podaje wartość liczby epoch po których zakończyła się nauka, gdyż wynosi ona dla każdego pomiaru max_epoch=20 000.
4.2 Rozkład wyników pomiarów.
Uwaga do wykresów:
dane oznaczone na wykresach na ciemno niebiesko oznaczają brak pomiaru wykonanego dla tej kombinacji S1 i S2.
SSE(Sum Square of Errors – suma kwadratów błędów):
Wartość procentowa nauczenia się sieci:
4.3 Eksperymenty dodatkowe
Dla sprawdzenie czy sieć zdoła się nauczyć na 100% przeprowadziłem 2 dodatkowe eksperymenty dla S1=249,549 oraz S2=25 oraz max_epoch=200 000. Parametry S1=549 został wybrany ze względu na najlepszą wartość procentową nauczenia się sieci, zaś parametr S1=249 ze względu na znacznie krótszy czas uczenia się. Oto otrzymane wyniki:
S1/S2 | % nauczenia się sieci | SSE |
---|---|---|
249/25 | 100 | 3,0577 |
549/25 | 100 | 1,4425 |
W obydwu przypadkach uczenie zakończyło się dopiero gdy liczba epoch osiągnęła 200 000, czyli nie została osiągnięta wartość err_goal =0.25.
Niestety w poprzednim eksperymencie nie udało się osiągnąć założonego błędu SSE mniejszego niż 0.25 przeprowadziłem jeszcze jedne eksperyment. Użyłem się sieci o następujących parametrach: S1 = 749, S2= 25 max_epoch=500 000, współczynnik prędkości uczenia pozostał bez zmian. Oto otrzymane wyniki:
S1/S2 | SSE | % wartość nauczenia się sieci | liczba cykli |
---|---|---|---|
749/25 | 0.249998 | 100% | 268023 |
5.Wnioski i podsumowanie
Pomiary były wykonywane dla następujących wartości:
S1 w przedziale od 49 do 749 ( z krokiem początkowo 50 od 249 a następnie z krokiem 100 )
S2 w przedziale od 25 do 475 (z krokiem 25 dopóki S2 było mniejsze od S1 )
lr = 10^-4
max_epoch = 20 000
error_goal = 0.25
Dla każdej pary wartości S1 i S2 wykonano 5 powtórzeń. Liczba powtórzeń została zmniejszona z 10 do 5 ze względu na czas uczenia, który dla całego projektu wyniósł około 3 tygodnie. Zmniejszenie liczby powtórzeń nie wpłynęło znacznie na otrzymane wyniki, gdyż otrzymane wyniki jednostkowe dla tych samych parametrów różniły się między sobą średnio o wartość 1,07% dla procentowej wartości nauczenia siec i 6,34 dla błędu SSE.
Otrzymane wynik oscylują w granicach od 93,66% procent nauczenia się sieci do 98,02%, a błędu od 28,22 do 60,03.
Otrzymany błąd jest odwrotnie proporcjonalny do wartości nauczenia się sieci. Jednak nie jest to odwzorowanie liniowe, ponieważ dla wartości S1=549 S2=25 poprawność wynosi = 98.02%, a błąd 29,31 zaś dla S1=749 i S2=25 poprawność wynosi 97,91% błąd wynosi 28,22. Gdyby odwzorowanie było liniowe błąd dla S1=549 i S2=25 powinien być mniejszy. Różnica ta może być spowodowana jest przyjmowaniem przez algorytm losowych wartości początkowych.
Najlepszą wynik otrzymano dla S1=549 i S2=25. Można zauważyć że poprawność sieci zwiększa się wraz z zwiększeniem liczby neuronów w warstwie pierwszej oraz zmniejszeniem liczby neuronów w warstwie drugiej ( graniczna wartością było 25 ).
Sieć ani razu nie zdołała się nauczyć dla wypróbowanych współczynników. Prawdopodobnie znaczne zwiększenie współczynnik max_epoch spowodowałoby, że sieć nauczyłaby się w 100%.
Po wykonaniu dodatkowych obliczeń udało się osiągnąć wartość nauczenia sieci równą 100% po 200 tys. cykli dla parametrów S1=549 S2=25 oraz S1=249 S2=25. Jednak dalej nie udało się osiągnąć zadanego błędu SSE co oznacza że pomimo 100% wartości nauczenia się sieci nie ma pewności, że otrzymane wyniki będą poprawne.
Po wykonaniu kolejnego eksperymentu dla S1=749 i S2=25 lr=10^-4 udało się osiągnąć błąd SSE<0.25 po 268 023 cyklach. Wartość tą należy jednak brać z przybliżeniem ponieważ (ze względu na czas obliczeń, około doba) wykonałem jedynie jeden eksperyment.
Nowoczesne technologie pozwalają coraz częściej wprowadzać sieci neuronowe w dziedzinach dotyczących codziennego życia. Odpowiednio zaprojektowana sieć mogłaby stanowić bardzo przydatną pomoc dla placówek przyznających kredyty. Co więcej w razie zbyt dużego ryzyka kredytowego potencjalny klient mógłby być informowany od razu o możliwości przyznania kredytu na zaostrzonych warunkach. Innym przydatnym zastosowaniem sieci byłaby możliwość wypełniania przez Internet specjalnych formularzy, które przysłane byłyby do sieci, a ta analizowałaby je oraz określałaby przybliżone warunki przyznania kredytu. Jedynym wymogiem jest dobranie odpowiedniej sieci neuronowej oraz nauczenie jej przy pomocy możliwie jak największego zbioru danych uczących.
6. Bibliografia: