Blog firmowy

Sieci neuronowe – brain.js

Post z dnia 09.09.2019
0 Komentarze

Czym jest sieć neuronowa?

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.

Warstwy sieci neuronowej:

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.

Rodzaje sieci neuronowych

Sieci neuronowe możemy podzielić pod względem architektury sieci. Najpopularniejsze typy:

  • Warstwowe sieci jednokierunkowe
    Sieci jednokierunkowe mogą być jednowarstwowe oraz wielowarstwowe. W sieciach jednokierunkowych nie występuje sprzężenie zwrotne. Sygnał przechodzi przez każdy neuron dokładnie raz w swoim cyklu. Do uczenia wielowarstwowych sieci stosuje się algorytm propagacji wstecznej.
  • Sieci rekurencyjne
    W sieciach rekurencyjnych połączenia między neuronami stanowią graf z cyklami. W tym rodzaju sieci występuje sprzężenie zwrotne między wyjściem a wejściem. W rekurencyjnych sieciach – w przeciwieństwie do jednokierunkowych – sygnały przechodzą w obu kierunkach.

Uczenie sieci neuronowej

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:

  • Nadzorowane – występuje, jeśli dane, które zostaną przekazane do nauczenia sieci, zawierają oczekiwaną odpowiedź. W tym przypadku dla danych wejściowych podane są dane wyjściowe;
  • Nienadzorowane – występuje, jeśli dane, które zostaną przekazane do nauczenia sieci, nie zawierają odpowiedzi. Sieć sama powinna sklasyfikować dane wejściowe.

Czym jest brain.js?

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.

Instalacja brain.js

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>

Przykład wykorzystania

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.
WEJŚCIE (INPUT)
WYJŚCIE (OUTPUT)
1.
000
0
2.
001
0
3.
011
0
4.
101
1
5.
111
1
6.
100
?

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.
WEJŚCIE (INPUT)
WYJŚCIE (OUTPUT)
3
011
0

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:

  • Tenser flow – https://www.tensorflow.org/js
  • Synaptic- http://caza.la/synaptic/#/

Filmy na youtube, w których dokładnie wyjaśnione jest, w jaki sposób działają sieć neuronowe:

  • But what is a Neural Network? – https://www.youtube.com/watch?v=aircAruvnKk&t
  • How Deep Neural Networks Work – https://www.youtube.com/watch?v=ILsA4nyG7I0

Źródła zdjęć:

  • https://en.wikipedia.org/wiki/File:Colored_neural_network.svg

Inne źródła:

  • https://en.wikipedia.org/wiki/Artificial_neural_network
  • https://github.com/BrainJS/brain.js
  • http://www.neurosoft.edu.pl/media/pdf/jbartman/sztuczna_inteligencja/NTI4.pdf

Problem rozwiązywany w przykładzie –

  • https://coderoncode.com/machine/learning/2016/06/06/machine-learning-a-simple-neural-network.html

Komentarze (0)

Brak komentarzy

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Wszystkie artykuły

Masz pytanie?
Napisz do nas.