Przekładając to na konkretne działania, sieci neuronowe możemy wykorzystać do systemów kontroli produkcji, prognozowania sprzedaży oraz cen, identyfikacji wartościowych segmentów klientów, syntezy mowy, rozpoznawania pisma, a nawet profilowania kryminalnego czy wykrywania niebezpiecznych ładunków na lotniskach.
Algorytmy o których tu mowa to, precyzyjnie rzecz ujmując, sztuczne sieci neuronowe (ANN, ang. Artificial Neural Networks). Ich działanie inspirowane jest naturalnymi sieciami neuronowymi, czyli po prostu układem nerwowym. Jest on zbudowany z miliardów neuronów, które tworzą ogromne sieci połączeń z innymi komórkami nerwowymi. Poprzez te połączenia, tzw. synapsy, neurony przekazują sobie sygnały, umożliwiając tym samym przetwarzanie informacji oraz generowanie odpowiednich reakcji. Najbardziej aktywne połączenia są wzmacniane, „uczą się” wykonywać określone zadania i tym samym tworzą w obrębie układu nerwowego wyspecjalizowane sieci.
Funkcjonowanie mózgu jest póki co niedoścignionym modelem dla działania komputerów, jednak rozwój sztucznych sieci neuronowych pozwala na coraz szersze ich wykorzystanie. Choć w niektórych zadaniach np. matematycznych mogą one być nawet bardziej efektywne od ludzkiego mózgu, takie zadania jak odróżnianie rodzajów zwierząt czy faktur materiałów może okazać się bardzo obciążające obliczeniowo, a uzyskiwane wyniki nie zawsze będą poprawne.
Budowa sztucznej sieci neuronowej
Podstawową jednostką sztucznych sieci neuronowych są neurony. Tworzą one w sieci co najmniej trzy warstwy:
- warstwa wejściowa – każda zmienna użyta w danej sieci neuronowej będzie miała odpowiadający jej neuron w tej warstwie; neurony warstwy wejściowej przejmują jedynie wartości pojedynczej zmiennej (lub pojedynczej kategorii w przypadku zmiennych jakościowych) i nie modyfikując ich, przekazują do kolejnej warstwy,
- warstwa ukryta – odpowiada za odebranie wartości z poprzedniej warstwy, przetworzenie ich i przekazanie do warstwy kolejnej; warstw ukrytych może być wiele, a ilość ich neuronów zależy od użytkownika – im ich więcej, tym większa moc obliczeniowa i elastyczność sieci, ale rośnie też ryzyko przeuczenia się sieci,
- warstwa wyjściowa (wynikowa) – łączy wszystkie wartości z ostatniej warstwy ukrytej i przekazuje finalną wartość w formie jednego neuronu dla zmiennej ilościowej lub tylu neuronów, ile kategorii posiada zmienna jakościowa.
Jak jednak dokładnie tworzone są sieci w obrębie tych warstw i neuronów ich tworzących? Każdy neuron z danej warstwy połączony jest ze wszystkimi neuronami warstwy następnej. W sieciach jednokierunkowych, na których skupimy się w tym artykule, nie występują połączenia między neuronami w ramach jednej warstwy oraz nie ma możliwości wystąpienia połączenia omijającego kolejną warstwę (np. bezpośrednie połączenie między neuronami warstwy wejściowej i wyjściowej). Istnieją jednak sieci neuronowe o bardziej skomplikowanej strukturze np. sieci rekurencyjne dopuszczające możliwość połączeń o charakterze sprzężeń zwrotnych.
Rysunek 1. Przykład jednokierunkowej sieci neuronowej z jedną warstwą ukrytą
Działanie neuronu
Zasady działania pojedynczego neuronu zależą od jego roli w sieci neuronowej. Jak już wiemy, neurony warstwy wejściowej mają proste zadanie – przekazać wartość danej zmiennej do neuronów warstwy ukrytej. Jeśli zmienna jest ilościowa, w sieci obecny będzie jeden neuron jej odpowiadający i przyjmować będzie odpowiednią wartość liczbową np. liczbę lat współpracy z klientem. W przypadku zmiennej jakościowej, każdej jej kategorii przypisany będzie jeden neuron, przekazujący wartość zero-jedynkowo – np. jeśli mamy klientów z trzech różnych miast (1=Kraków, 2=Warszawa, 3=Wrocław), a sieć analizować będzie przypadek klienta z Krakowa, to neuron w którym Miasto=1 przyjmować będzie wartość 1, natomiast neurony gdzie Miasto=2 oraz Miasto=3 przyjmować będą wartość 0.
W kolejnych warstwach, czyli ukrytych oraz wyjściowej, zasady działania neuronów są nieco bardziej skomplikowane. Większość neuronów w tych warstwach łączy ze sobą wartości wejściowe z neuronów warstwy poprzedzającej oraz stosuje tzw. funkcję aktywacyjną do połączonych wartości wejściowych. Dodatkowo, każdemu połączeniu między neuronami przypisywana waga – im większa, tym wartość danego neuronu bardziej wpływa na efekt końcowy, czyli finalną wartość warstwy wynikowej (rys. 2). W naszym przykładzie, może okazać się, że największą wagę dla neuronów warstwy ukrytej będzie miało nie to, ile lat trwa współpraca z klientem, lecz z jakiego jest miasta lub nawet jeszcze bardziej szczegółowo – czy klient jest z Warszawy, czy nie.
Rysunek 2. Przykładowy diagram sieci z wagami synaptycznymi
Łączenie wartości wejściowych w ramach pojedynczego neuronu odbywa się za pomocą tzw. funkcji łączącej. Jest to zazwyczaj suma wartości neuronów poprzedniej warstwy przemnożona przez odpowiadające im wagi synaptyczne.
Wartość, którą neuron przyjmie (i przekaże dalej, jeśli nie jest to jeszcze warstwa wynikowa) zależy od funkcji aktywacyjnej. W tym artykule nie będziemy zagłębiać się w jej zawiłości, ale warto nadmienić, że najpopularniejszymi funkcjami aktywacji są np. funkcja logistyczna oraz tangens hiperboliczny.
Działanie funkcji aktywacji przedstawione jest na rysunku 3. Niebieskie koło to funkcja łącząca, wyliczana na podstawie wartości neuronów poprzedniej warstwy – x, z uwzględnieniem ich poszczególnych wag – w. Wynikiem tej funkcji jest wartość neuronu – y, która dla neuronów z kolejnej warstwy będzie stanowić jedną z wartości x.
Jeśli jednak byłby to diagram neuronu z warstwy wyjściowej, y będzie wynikiem działania całej sieci neuronowej, który otrzyma analityk.
Rysunek 3. Diagram funkcji aktywacji
Na rysunkach 1 i 2 można zauważyć pewien dodatkowy typ neuronu tzw. błąd obciążony, który reprezentuje możliwość popełnienia błędu. Te neurony pojawiają się w warstwie wejściowej oraz warstwach ukrytych. Dzięki uwzględnieniu takiego obciążenia, nawet jeśli do neuronu wpłynęły informacje o sumie zerowej, przekaże on dalej pewną wartość – w tym przypadku, będzie ona równa wartości neuronu błędu poprzedniej warstwy.
Uczenie się sieci
Wróćmy zatem do naszego przykładu z rysunku 1 i zastanówmy się, w jaki sposób sieć neuronowa może przewidywać przychód z umowy z różnymi klientami na podstawie lat współpracy oraz ich lokalizacji (Kraków, Warszawa, Wrocław). Już intuicyjnie można się domyślać, że oprócz posiadania danych dla zmiennych wejściowych, dobrze również mieć pewne dane dla zmiennej celu (z warstwy wyjściowej). Sieć neuronowa, na podstawie posiadanych informacji dotyczących charakterystyki klienta oraz tego, jaki przychód generuje współpraca z nim, będzie mogła przewidywać na jakie przychody można liczyć z danym profilem klienta. Może to pomóc w określeniu strategii rozwoju firmy, np. może okazać się, że bardziej lukratywne będzie zadbanie o długoletnich klientów ze stolicy, lub w przewidywaniu przychodów w kolejnych latach, w zależności od tego, z jakimi klientami udało nam się nawiązać i kontynuować współpracę.
Uczenie się sieci dokonuje się poprzez korektę wag. Na początku procesu, wagi wybierane są losowo, a następnie sieć, w kolejnych krokach uczenia, koryguje wartości poszczególnych wag synaptycznych, aby zwiększyć prawdopodobieństwo poprawnego oszacowania zmiennej wynikowej (czyli zmniejszyć błąd prognozy). Proces ten może być bardzo czasochłonny, szczególnie w przypadku dużych zbiorów. Aby jak najlepiej wykorzystać posiadane zasoby zarówno ilości posiadanych danych, jak i mocy obliczeniowej, zastosować można następujące typy uczenia się:
- całym zbiorem – wagi aktualizowane są na podstawie całego zbioru danych; najlepiej minimalizuje błąd całkowity, ale wymaga wielokrotnych powtórzeń, stąd najlepiej sprawdza się dla małych zbiorów danych,
- jednostkowo – wagi aktualizowane są na podstawie rekord po rekordzie, czyli dla każdej obserwacji po kolei; ten sposób najlepiej sprawdzi się w przypadku dużych zbiorów danych,
- podzbiorem – zbiór dzielony jest na równej wielkości podzbiory, a wagi aktualizowane są aktualizowane są po przejściu algorytmu przez jedną grupę; ten kompromis między pierwszym a drugim typem uczenia się zalecany jest dla zbiorów średniej wielkości.
Równie ważne jak zoptymalizowanie uczenia się sieci, jest kontrolowanie tego, czy nie dochodzi do jej przeuczenia. Jest to sytuacja, w której sieć neuronowa tak „skupia się” na wykorzystywanym zbiorze danych, że przestaje być uniwersalna. Taka przeuczona sieć nauczy się „na pamięć” swojego pierwszego zbioru danych i w jego obrębie, wyniki będzie przewidywać perfekcyjnie. Jeśli natomiast dodalibyśmy do niej nowe rekordy (w praktyce wiemy, że niekoniecznie muszą one być w pełni spójne z dotychczasowymi danymi), to przewidywanie ich wartości zmiennej celu mogłoby być zupełnie nietrafione.
Aby zapobiec takiej sytuacji, przed rozpoczęciem procesu uczenia się, dokonywany jest podział na podzbiory. Głównym zbiorem jest zbiór uczący – na jego podstawie określona zostanie ilość neuronów oraz wagi ich połączeń. Równocześnie, na podstawie zbioru testującego, weryfikowana jest ilość błędnych wyników. Z założenia, każda korekta wag po ich losowym przypisaniu, powinna skutkować mniejszą ilością popełnianych błędów, niezależnie od zbioru danych. Jeśli w którymś momencie, spadek liczby błędów zauważalny będzie tylko w zbiorze uczącym, to znaczy, że sieć zaczyna się przeuczać, zamiast uczyć się uogólniać występujące zależności. Otrzymany model zweryfikować można na ostatnim podzbiorze – zbiorze walidacyjnym. Porównywane są tutaj przewidywane wartości z wartościami rzeczywistymi – z wykorzystaniem rekordów, które nie były wcześniej w ogóle zaangażowane w proces uczenia. W ten sposób zweryfikować można dokładność modelu. Z walidacyjnego zbioru danych można w niektórych przypadkach zrezygnować, gdyż ogranicza on liczbę danych, na których sieć może się uczyć.
Podsumowanie
Sztuczne sieci neuronowe są systemami przetwarzania informacji, które sprawdzą się w takich zadaniach jak predykacja, klasyfikacja czy grupowanie. Na podstawie dostarczonego zbioru danych uczą się wykonywać określone zadanie, a otrzymany w ten sposób model można później generalizować, czyli wykorzystywać na innych zbiorach z danymi zmiennymi. Istotną zaletą sieci neuronowych jest ich niewielka restrykcyjność jeśli chodzi o charakter wykorzystywanych danych. Większa ilość danych do uczenia się jest oczywiście przez sieć preferowana, jednak można ją wykorzystać nawet do mniejszych zbiorów danych.
Zakres nadzoru nad budowaniem modelu i procesem uczenia się sieci neuronowej w dużej mierze zależy od użytkownika. Może on zdefiniować jedynie zmienne niezależne (czynniki i współzmienne) oraz zmienne zależne (celu), ale w razie potrzeby można modyfikować takie aspekty jak podział na podzbiory, architektura sieci (ilość warstw, liczba neuronów, rodzaj funkcji aktywacji itp.), typ uczenia się, czy nawet kryteria zatrzymania (np. czas czy maksymalna liczba kroków bez zmniejszenia błędu).
Tak duża elastyczność sztucznych sieci neuronowych powoduje, że ich zastosowanie jest naprawdę szerokie, co aktualny dynamiczny rozwój np. sztucznej inteligencji dobitnie potwierdza.