Algorytmy wstecznej propagacji sieci neuronowych Mateusz Nowicki, Krzysztof Jabłoński 1 Wydział Inżynierii Mechanicznej i Informatyki Politechnika Częstochowska Kierunek Informatyka, Rok III 1 krzysztof.jablonski@hotmail.com Streszczenie Tematem ninejszego artykułu jest analiza działania sieci neuronowych budowanych w oparciu o koncepcję propagacji wstecznej, przez którą to rozumiany jest pewien algorytm służący do procesu uczenia sieci oparty na propagacji wstecznej błędu uzyskanego dla zadanego zestawu danych uczących. Algorytm ten jest jednym z najczęściej wybieranych przy budowie sieci neuronowych ze względu na względną prostotę jego implementacji oraz szereg czynników, które pozwalają dopasować utworzoną sieć do swoich potrzeb. Sieci budowane w oparciu o algorytm propagacji wstecznej są budowane najczęściej na podstawie wielowarstwowej architekturzy sieci bez dowiązań wstecznych. W artykule pozostanie przyjęte, iż właśnie taka architketura pozostanie użyta. 1 Wstęp Sieci neuronowe oparte na algorytmie propagacji wstecznej błędu zbudowane są z co najmniej trzech warstw: wejściowej, wyjściowej oraz pozostałych ukrytych. Każda warstwa złożona jest z przynajmniej jednego neuronu - podstawowego nośnika informacji w sieci. Poszczególne warstwy są połączone są ze sobą dowiązaniami, które to łączą wszystkie neurony warstwy wyższej ze wszystkimi neuronami warstwy niższej. Każde dowiązanie posiada przypisaną wagę; w momencie, gdy próbka wyrażona jako liczba rzeczywista przechodzi przez dane powiązanie, wartość próbki jest przemnażana przez współczynnik równy wadze. Dodatkowo, każdy neuron charakteryzuje przypisana mu funkcja aktywacyjna, której zastosowanie powoduje zmniejszenie liniowości otrzymywanych wyników. Każdy neuron może posiadać przypisaną inną funkcję aktywacyjną niż pozostałe neurony - nie jest to jednak praktyka polecana: praktycznie zawsze wybrana funkcja aktywacyjna charakteryzuje wszystkie neurony składające się na sieć. Funkcję aktywacyjną posiadają wszytkie neurony oprócz neuronów wejściowych oraz tak zwanych bias neuronów, które to mają za zadanie zmienić wartość zwracaną przez neurony tak, aby odpowiadało to preferencjom konstruktora sieci. Bias neurony działają jak neurony wejściowe z tą różnicą, iż mają przypisaną wartość stałą oraz mogą być obecne zarówno w warstwie wejściowej, jak i warstwach ukrytych. W praktyce nie ma potrzeby 1
dodawania więcej niż jednego bias neuronu na warstwę. Posiadając informację o danych wejściowych, można wyliczyć wartości neuronów dla warstw pośrednich oraz wyjściowej. Wzór służący do tego celu posiada przedstawioną poniżej postać: n j = actv( i max i=1 n i w i j ) Aplikując ten wzór dla wszystkich neuronów kolejnych warstw, neurony warstwy wyjściowej będą przechowywać rezultat końcowy. Jeżeli znana jest próbka danych wyjściowych przyporządkowanych do danej próbki wejściowej, można porównać ją z wynikami uzyskanymi w wartwie wyjściowej. Różnica między tymi wartościami zwana jest błędem (lokalnym). Algorytm propagacji wstecznej błędu wykorzystuje informację o tak uzyskanym błędzie w celu znielowania jego wartości do progu ustalonego przez konstruktora sieci, który powinien być możliwie bliski zeru. Najczęściej dobiera się wartości mieszczące się w zakresie (0, 1] punktów procentowych dla wskaźnika błędu globalnego jako błędu średniokwadratowego. 2 Algorytm propagacji wstecznej Algorytm propagacji wstecznej jest często używaną metodą uczenia wielowarstwowych sieci jednokierunkowych. Może być on użyty w każdej takiej sieci, która posiada rożniczkowalną funkcję aktywacyjną. Pochodna tej funkcji będzie użyta podczas uczenia. Aby nauczyć sieć neuronową, trzeba wyznaczyć metodę obliczania błędu globalnego, który jest jednocześnie wskaźnikiem poprawności działania takowej (im mniejszy, tym lepiej). Błąd globalny obliczany jest na podstawie błędów lokalnych - odchyleń między wartościami oczekiwanymi a wartościami otrzymanymi w wartwie wyjściowej sieci neuronwej. Istnieje kilka metod obliczania błędu globalnego. Najczęściej używany jest błąd średniokwadratowy. Inne metody, jak wyciąganie średniej kwadratowej, stosowane są w bardziej wyspecjalizowanych dziedzinach, jak analiza fali [1]. W celu nauczenia sieci neuronowej musimy zminimalizować ten błąd. By to zrobić trzeba zmodyfikować wagi połączeń neuronów. Musimy wyznaczyć funkcję która obliczy nam stopień błędu, przy czym funkcja ta musi być matematycznie różniczkowalna. Ponieważ sieć używa różniczkowalnej funkcji aktywacyjnej, aktywacje neuronów wyjściowych mogą być uznane jako rożniczkowalne funkcje wejścia i wag. Jeżeli funkcja błędu również jest różniczkowalną funkcją to jest ona różniczkowalną funkcją tych wag. To pozwala nam wyznaczyć pochodną błędu używając tych wag. Następnie uzywając tych pochodnych obliczane są współczynnki, o jakie modyfikowane są wartości wag. Dzięki takiemu zabiegowi następuje minimalizacja występujących błędów. Jest kilka sposobów odnajdywania wag minimalizujących funkcję błędu. Najczęściej używanym podejściem jest metoda gradientu prostego. Gradientem oznaczamy współczynnik nachylenia stycznej funkcji błędu w punkcie określonym jako aktualna wartość wagi. Dla każdej iteracji uczenia wartość delty aplikowanej do każdej wagi obliczana jest za pomocą następującego wzoru: w i j = α δe δw i j + β w 1 i j 2
δe gdzie w i j oznacza wartość zmiany wagi, α - wartość współczynnika uczenia, δw i j - wartość gradientu, β - wartość momentum, oraz w 1 i j oznacza wartość zmiany wagi w poprzedniej iteracji uczenia. Współczynnik uczenia posiada największy wpływ na szybkość, a zarazem efektywność uczenia sieci. Skaluje on stosunek aplikowania gradientu w stosunku do delty wagi. Ustalenie zbyt wysokiego współczynnika uczenia może powodować utratę zbieżności do oczekiwanego wyniku, natomiast dobór zbyt niskiego współczynnika powoduje znaczne spowolnienie samego procesu uczenia bez znacznej poprawy jego jakości. Momentum jest współczynnikem, który pozostał dodany w celu rozwiązania problemu tendencji wchodzenia w minima, które nie są minimami najbardziej optymalnymi. Zastosowanie momentum pozwala zapobiec temu zjawisku. Stosowanie momentum wiąże się również z wymuszeniem kierunku zmiany delty wagi; dobranie ujemnego momentum może spowodować spowolnienie zbieżności do minimum [5]. Użycie tego współczynnika nie jest obowiązkowe. 3 Obliczanie gradientów Wyznaczenie wartości gradientów dla poszczególnych wag w iteracji uczenia jest procesem składającym się z kilku kroków [1] : Wyznaczenia wartości błędu; Wyznaczenia wartości delty warstwy dla neuronów wyjściowych; Wyznaczenia wartości delty warstwy dla neuronów ukrytych/wewnętrznych; Wyznaczenia wartości indywidualnych gradientów. Wyznaczenie wartości błędu jest operacją trywialną i nie pozostanie tutaj poruszona. Delta warstwy jest wartością stałą dla każdej iteracji uczenia, mającą bezpośrednie przełożenie na wartość gradientu. Do obliczenia wartości delty warstwy dla neuronów wyjściowych służy wzór: δ i = E i actv(n i ) Z kolei wartość delty warstwy dla neuronów warstw ukrytych określona jest wzorem: δ i = actv(n i ) j (w i j δ j ) Warto zauważyć, iż nie są liczone wartości delty warstwy dla neuronów wejściowych oraz bias neuronów warstw ukrytych. Wynika to z bardzo prostej przyczyny - neurony te nie posiadają bezpośrednich wiązań wchodzących, zatem liczenie dla nich delty warstw jest zabiegiem zbytecznym, ponieważ delty takiej nie można nigdzie zaaplikować. Znając wartości delty warstwy dla wszystkich neuronów uczestniczących podczas przetwarzania algorytmu, można przystąpić do obliczenia wartości gradientów wag. Wartość gradientu dla wagi między neuronem warstwy wyższej (i) a neuronem warstwy niższej (j) wyznaczana jest w następujący sposób: 3
δe δw i j = δ k n i Tak odnalezione wartości gradientów można wykorzystać do wprowadzenia zmian wartości wag zgodnie ze wzorem podanym w punkcie 3) artykułu. 4 Metody aplikowania zebranych zmian Zebrane w procesie propagacji wstecznej błędu gradienty można zaaplikować do wag dowiązań na dwa różne sposoby, znane w literaturze angielskiej jako batch oraz online. Istnieją sprzeczności co do tego, która metoda powinna być stosowana przy konstrukcji sieci [2,3] pod względem uzyskiwanej szybkości uczenia sieci (liczby epok potrzebnych do poprawienia współczynnika błędu do oczekiwanej wartości) oraz rozwiązania problemu wejścia w minimum lokalne, które może spowodować spowolnienie uczenia sieci, bądź nawet doprowadzić do niepoprawnego jej nauczenia. Zasadnicza różnica między metodami polega na częstotliwości aplikowania gradientów do wag. Metoda batch zakłada zbieranie próbek gradientów dla wszystkich próbek danych uczących w postaci ich sumy przed ich zaaplikowaniem. W myśl metody online zmiany gradientów aplikowane są dla każdej próbki z zestawu uczącego. Każda zmiana aplikowana do wartości wag sieci neuronowej wiąże się ze zmianą położenia danej sieci na tak zwanej przestrzeni wagowej sieci neuronowej, która to jest indywidualna dla każdej tworzonej sieci. Jej kształt zależy od indywidualnych parametrów sieci oraz zestawu uczącego - dla różnych zestawów różne wartości wag stanowią możliwie najlepsze optimum pod kątem minimalizacji błędu. Na każdej tak zdefiniowanej powierzchni znajdują się punkty zwane minimami lokalnymi - proces uczenia sieci powinien dążyć do tego, aby znaleźć minimum o najmniejszej wartości błędu. Przedstawiającym się tutaj problemem jest wejście uczonej sieci w minimum, które nie jest tym najbardziej optymalnym. Stąd przedstawia się problem z metodą typu batch. Przełożenie sposobu aplikowania gradientów na powierzchnię błędu powoduje przesuwanie się po niej w postaci wektora, który jest sumą wektorów od wszystkich obliczonych gradientów. Może być to przyczyną wielu niepożądanych skutków, takich jak potencjalne ominięcie poszukiwanego minimum. Problem ten nasila się zwłaszcza przy dużym zbiorze danych uczących, gdzie suma wektorowa tak zebranych danych może znacząco opóźnić proces znalezienia optymalnego minimum. Rozwiązaniem tego problemu może być zmniejszenie współczynnika uczenia, co może zwiększyć dokładność takiej metody kosztem spowolnienia procesu uczenia. Zaletą tej metody jest natomiast możliwość efektywnej implementacji wielowątkowej, co pomaga lepiej wykorzystać zasoby procesora. Można spotkać się z przypadkami, gdzie stosowane jest rozwiązanie hybrydowe, które jako pierwsze stosuje metodę online do naprowadzenia sieci do pozycji możliwie bliskiej minimum optymalnemu, po czym to stosowana jest metoda batch. Innym znanym podejściem jest tak zwany mini-batch, który do zliczenia sumy gradientów używa tylko części próbek z zestawu uczącego. Metoda ta nie jest jednak często stosowana. 4
5 Metodyki obliczania błędów W ramach artykułu pozostaną poruszone trzy metody obliczania błędów wraz z ich krótką charakterystyką. 5.1 Bład średniokwadratowy Najczęściej wykorzystywanym błędem jest błąd średniokwadratowy. Pojęcie to może być dobrze znane ze statystyki. Wzór służący do obliczenia takiego błędu prezentuje się następująco: MSE = 1 n n i=1 E i 2 Błąd średniokwadratowy określany jest w stosunku procentowym. Podczas uczenia, wartości te zbiegają się szybko do 1-2 punktów procentowych, aby następnie szybko zniwelować różnice między kolejnymi epokami. 5.2 Bład sumy kwadratów Odmianą błędu średniokwadratowego jest błąd sumy kwadratów, w którym stosunek sumy kwadratów błędów nie definiuje się jako liczby zliczanych błędów, a jako połowa tej sumy. MSE = 1 2 n i=1 E i 2 Błąd ten wyrażany jest jako liczba rzeczywista. Metoda to nie jest wykorzystywana często - z przypadkami jej użycia można się spotkać w przypadku bardziej wyspecjalizowanych algorytmów uczących, jak chociażby algorytm Levenberga-Marquardta [1]. 5.3 Bład średniej kwadratowej Kolejny z rzadziej wybieranych błędów, określany, podobnie jak błąd średniokwadratowy, za pomocą punktów procentowych. W porównaniu do błędu średniokwadratowego, jego wartości zbiegają się szybko do wartości ok. 2-5 punktów procentowych. 1 MSE = n n i=1 E i 2 6 Funkcje aktywacyjne Jednym z najważniejszych elementów sieci neuronowych są funkcje aktywacyjne. Każdy neuron sieci przetwarza swoje dane wejściowe na podstawie przypisanej mu funkcji aktywacyjnej. Jako że wyniki zwracane przez poszczególne neurony mają charakter binarny tzn. przyjmują jedną z dwóch wartości (lub bardzo im bliskie), funkcje aktywacjne mają na celu zmniejszenie amplitudy wyników wyjściowych neuronów do pewnej skończonej 5
wartości. Kilka najczęściej używanych funkcji aktywacyjnych to: funkcja unipolarna sigmoidalna, funkcja bipolarna sigmoidalna oraz tangens hiperboliczny. 6.1 Funkcja sigmoidalna unipolarna Unipolarna funkcja sigmoidala wyraża się następującym wzorem: f (x) = 1 1+e x Funkcja ta jest szczególnie przydatna w sieciach uczonych propagacją wsteczną, ponieważ jest łatwa do rozróżnienia co minimalizuje złożoność obliczeniową procesu uczenia. Poniżej wykres: 6.2 Funkcja sigmoidalna bipolarna Bipolarna funkcja sigmodialna wyraża się następującym wzorem: f (x) = 1 e x 1+e x Funkcja ta jest podobna do funkcji sigmoidalnej i przydaje się w sieciach których wartości wyściowe znajdują się w zakresie [ 1,1]. 6
6.3 Tangens hiperboliczny Tangens hiperboliczny może być łatwo zdefiniowany jako stosunek pomiędzy hiperbolicznm sinuesem i cosinusem lub stosunkiem różnicy do sumy funkcji eksponencjalnych w punktach x i -x tghx = sinhx coshx = ex e x e x +e x Tangens hiperboliczny zachowuje się podobnie jak funkcja sigmoidalna. Zbiór wartości funkcji mieści się w zakresie od -1 do 1. 7
7 Podsumowanie Jako dziedzina rozwijana od lat siedemdziesiątych XX wieku, sieci neuronowe oparte na propagacji wstecznej dorobiły się szerokiej analizy, zwłaszcza pod kątem optymalizacyjnym. Algorytmy są cały czas rozwijane - między innymi powstało wiele wariantów dokonujących zmiany współczynników uczenia oraz momentum w trakcie uczenia. Mnogość możliwości konfiguracyjnych z pewnością przemawia do implementacji takich algorytmów w tworzonych sieciach. Kwestie poruszone w tym artykule to jednak zaledwie czubek góry lodowej - jednakże dobra znajomość teoretyczna tematu nie wystarczy do tworzenia dobrych jakościowo sieci. Aby dobrze zapoznać się z dziedziną, warto samemu podjąć się próbie utworzenia takowej w zastosowaniu do różnych dziedzin, w tym nie tylko inżynieryjnych. Optymalizacja zmiennych takich jak stosunek neuronów wejściowych do wyjściowych, liczba oraz rozmiar warstw ukrytych sieci czy stopień optymalizacji interpretacji sygnałów wyjściowych względem sygnałów wejściowych [6] wymaga dużego doświadczenia praktycznego w poruszonej w tym artykule dziedzinie. Literatura [1] J. Heaton, Introduction to the Math of Neural Networks, Heaton Research, 2011 [2] J. Heaton, Introduction to Neural Networks in C#, Second Edition, Heaton Research, 2008 [3] D. R. Wilson, T. R. Martinez, The general inefficiency of batch training for gradient descent learning, 2003 [4] B. Karlik, A. V. Olgac, Performance Analysis of Various Activation Functions in Generalized MLP Architectures of Neural Networks [5] V. V. Phansalkar, P. S. Sastry, Analysis of the Back- Propagation Algorithm with Monumentum, 1994 [6] D. C. Plaut, S. J. Nowlan, G. E. hinton Experiments on Learning by Back Propagation, 1986 8