Sieć neuronowa – system przeznaczony do przetwarzania informacji, którego budowa i zasada działania pierwotnie wzorowane były na uproszczonym modelu funkcjonowania fragmentów rzeczywistego (biologicznego) systemu nerwowego. Na przesłankach biologicznych oparte są schematy sztucznych neuronów wchodzących w skład sieci oraz (w pewnym stopniu) jej struktura. Jednak schematy połączeń neuronów w sieci neuronowej są wybierane arbitralnie, a nie stanowią modelu rzeczywistych struktur nerwowych. Najbardziej znamienną cechą sieci neuronowej jest jej zdolność uczenia się na podstawie przykładów oraz “poprawnego” działania na niewidzianych wcześniej danych, o ile są wystarczająco podobne. Tak właśnie dzieje się w przypadku naszej sieci - na podstawie przykładów zapisu poszczególnych cyfr, dostarczanych za pośrednictwem tej strony i odpowiednio klasyfikowanych przez moderatorów, tworzona jest baza danych ręcznie pisanych cyfr. Dane te są następnie dzielone na trzy zbiory:
Rozdział pomiędzy danymi treningowymi, walidacyjnymi i testowymi zapobiega zjawisku tzw. “overfittingu” (zbytniego dopasowaniem modelu) - czyli sytuacji w której sieć świetnie klasyfikuje przykłady za pomocą których była trenowana, ale nie radzi sobie najlepiej z niewidzianymi wcześniej wariantami.
Nasza sieć jest trenowana periodycznie - co pewien czas nowe cyferki, wprowadzane przez użytkowników, dodawane są do zbioru treningowego a sieć aktualizowana poprzez uruchomienie procesu treningu od początku z uwzględnieniem wszystkich zebranych do tej pory danych.
Ważnym elementem procesu, pozwalającym na ograniczenie złożoności sieci a zatem jej czytelności oraz mniejsze obciążenie karty graficznej / procesora przy jej wyświetlaniu w przeglądarce jest tzw. pruning...
Sieć trenowana jest za pomocą algorytmu propagacji wstecznej błędu. W wielkim uproszczeniu polega on na tym, iż po dokonaniu decyzji parametry modelu modyfikowane są “od końca”, tj. od ostatniej warstwy sieci i tym mocniej, im bardziej przyczyniły się do “popełnienia błędu”.
Aby niejako przygotować sieć na czekające ją perturbacje i nie dopuścić do nadmiernego dopasowania do danych treningowych, podczas treningu losowo wyłączamy całe neurony. Powoduje to m.in redundancję w funkcji neuronów i “rozproszenie” funkcjonalności po parametrach, dzięki czemu “łatwiej” jest później przycinać połączenia w celu zmniejszania rozmiaru sieci.
Ważnym elementem procesu, pozwalającym na ograniczenie złożoności sieci a zatem jej czytelności oraz mniejsze obciążenie karty graficznej / procesora przy jej wyświetlaniu w przeglądarce jest jej przycinanie (ang. pruning).
Pruning (przycinanie) sztucznej sieci neuronowej to proces polegający na usuwaniu połączeń pomiędzy neuronami lub całych neuronów w celu zmniejszenia ilości elementów składowych sieci przy zachowaniu jej efektywności. Dzięki przycinaniu sieci możliwa jest optymalizacja szybkości jej działania oraz ilości pamięci potrzebnej do jej przeliczenia, co ma niebagatelne znaczenie w kontekście sieci działających na urządzeniach mobilnych lub niewielkich energooszczędnych chipach wykorzystywanych w urządzeniach IOT (internet of things).Typowa procedura pruningu składa się z sekwencji następujących kroków:
Na koniec warto jeszcze dodać iż metafora połączonych ze sobą neuronów, zainspirowana budową układu nerwowego jest niedoskonała i obecnie badacze pracujący nad rozwojem sztucznej inteligencji od niej odchodzą. Niemniej postanowiliśmy się jej trzymać w ramach niniejszego projektu ze względu na niewielką złożoność sieci oraz walory edukacyjne.