Sieć neuronowa jest zbiorem sztucznych neuronów połączonych w całość. Działanie sieci neuronowej wzorowane jest na procesach zachodzących w ludzkim mózgu. Każdy neuron w sztucznej sieci neuronowej zawiera wagi oraz błędy. Neuron jest funkcją, która po otrzymaniu danych wykonuje obliczenia, a następnie za pomocą funkcji aktywacyjnej przesyła dane dalej, do kolejnego neuronu. Sieć neuronowa składa się z warstw, czyli połączonych ze sobą neuronów. Do poprawnego działania sieć muszą być wykorzystane minimum trzy warstwy.
Warstwa wejścia (ang. input layer) czerwone okręgi na grafice – zbiera dane wejściowe i przesyła je do warstwy ukrytej;
Warstwy ukryte (ang. hidden layer) niebieskie okręgi na grafice – za ich pomocą szukane są powiązania między neuronami, ukrytych warstw może być nieskończenie wiele;
Warstwa wyjścia (ang. output layer) zielone okręgi na grafice – zwraca wynik wyuczonej sieci.
Sieci neuronowe możemy podzielić pod względem architektury sieci. Najpopularniejsze typy:
Uczenie sieci jest to automatyczne dopasowanie (na podstawie właściwego algorytmu) wartości wag tak, aby sieć wykonywała swoje zadanie najlepiej, jak to możliwe. Rozróżniamy dwa typy uczenia sieci:
Brain.js jest biblioteką do sieci neuronowych napisaną w języku javascript. Biblioteka może być użyta zarówno po stronie serwera, jak i po stronie klienta, czyli przeglądarki internetowej. Biblioteka ma zaprogramowane sieci jednokierunkowe i rekurencyjne. Dodatkowo sieć jednokierunkową można uruchomić w trybie GPU. W tym artykule skupimy się na działaniu biblioteki po stronie klienta. Zaletą korzystania z sieci neuronowej napisanej w javascript jest możliwość uruchomienia jej w przeglądarce internetowej.
Najprostszym sposobem skorzystania z biblioteki brain.js jest zaimportowanie skryptu z źródłem w tagu head w pliku html:
<script src="https://cdn.jsdelivr.net/npm/[email protected]/browser.js"></script>
W tym celu tworzymy nowy plik html, a następnie dodajemy skrypt do tagu head:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="https://cdn.rawgit.com/BrainJS/brain.js/45ce6ffc/browser.js"></script>
<script>
// Tu znajdzie się nasz przykładowy kod.
</script>
</head>
<body>
</body>
</html>
W przykładzie zdefiniujemy prostą sieć neuronową jednokierunkową, w której zastosowany jest algorytm propagacji wstecznej. Zadaniem naszej sieci będzie odgadnięcie wyniku (wyjścia) dla ostatniego przykładu w tabeli poniżej. Sieć zostanie wyuczona danymi wejściowymi i wyjściowymi z przykładów od 1 do 5. Wytrenowana sieć zwróci wynik wyjściowy dla danych wejściowych [1, 0, 1] z przykładu nr 6. Dla prostej sieci neuronowej dane treningowe muszą być przedstawione w postaci tablicy, w której znajdują się obiekty typu json, posiadające atrybuty input i output. Input oraz output mogą być tablicą składającą się z liczb lub hashem, którego wartości kluczy są liczbami.
LP. | ||
1. | ||
2. | ||
3. | ||
4. | ||
5. | ||
6. |
Poniżej przedstawiona jest implementacja kodu. W komentarzach w kodzie javascript krok po kroku opisane są działania, które wykonujemy:
document.addEventListener("DOMContentLoaded", function() {
// 1. Tworzymy dane treningowe na podstawie przykładów od 1-5, dla których znamy dane wejściowe i dane wyjściowe:
const trainingData = [
{ input: [0, 0, 0], output: [0] },
{ input: [0, 0, 1], output: [0] },
{ input: [0, 1, 1], output: [0] },
{ input: [1, 0, 1], output: [1] },
{ input: [1, 1, 1], output: [1] }
];
// 2. Następnie tworzymy najprostszą sieć neuronową jednokierunkową z mechanizmem propagacji wstecznej:
const network = new brain.NeuralNetwork();
// 3. Uczymy sieć wywołując funkcję train() na obiekcie network:
// (Jako pierwszy parametr funkcji train() przekazujemy wcześniej przygotowane dane treningowe)
network.train(trainingData);
// 4. Za pomocą funkcji run() możemy odpytać wytrenowaną sieć:
// (Jako pierwszy parametr funkcji run() przekazujemy dane wejściowe, dla których chcemy poznać rozwiązanie)
const result = network.run([1, 0, 0]);
// 5. Wyświetlamy wynik działania naszej sieci na ekranie:
document.body.innerHTML += result;
});
Otworzenie pliku index.html w przeglądarce internetowej spowoduje wywołanie skryptu. Jako wynik dla danych wejściowych [1, 0, 0] otrzymujemy wynik wyjściowy 0.9080509543418884 lub bardzo podobny. Na podstawie tego wyniku można stwierdzić, że rozwiązaniem dla ostatniego przykładu z tabeli jest 1. Sieć zwróciła liczbę bliższą 1 niż 0. Dla sprawdzenia poprawności działania sieci możemy wykonać operacje ponownie dla innych danych wejściowych takich jak: [0, 1, 1]. W tym celu modyfikujemy funkcje run() i jako parametr przekazujemy: [0, 1, 1]:
const result = network.run([0, 1, 1]);
Po ponownym uruchomieniu otrzymamy wynik 0.05815340578556061 lub bardzo podobny. Rozwiązaniem kolejnego testu jest 0, ponieważ sieć zwróciła liczbę bliższą 0 niż 1. Jest to poprawny wynik, który możemy zweryfikować w tabeli powyżej w przykładzie 3.
LP. | ||
… | ||
3 | ||
… |
Podsumowanie
W tym artykule zaprezentowałem bardzo ogólny opis sieci neuronowej oraz prostą implementację biblioteki brain.js. W kolejnym – zdefiniowany zostanie algorytm propagacji wstecznej, który wykorzystywany jest w sieciach neuronowych, przedstawiona zostanie instalacja biblioteki brain.js przy pomocy managera paczek npm oraz yarn. Nauczymy sieć neuronową rozpoznawać cyfry od 0 do 9 oraz omówimy podstawowe parametry, które możemy skonfigurować podczas definiowania sieci.
Autor: Marcin Mąsior
Linki i źródła:
Alternatywy dla brain.js:
Filmy na youtube, w których dokładnie wyjaśnione jest, w jaki sposób działają sieć neuronowe:
Źródła zdjęć:
Inne źródła:
Problem rozwiązywany w przykładzie –
Komentarze (0)