Ebben a cikkben megmutatom, hogyan lehet neuronhálózatot létrehozni és betanítani a Synaptic.js használatával, amely lehetővé teszi a Node.js és a böngésző mély tanulását.
A lehető legegyszerűbb neurális hálózatot fogjuk létrehozni: olyat, amely képes megoldani az XOR egyenletet.
Hozzon létre egy interaktív Scrimba oktatóanyagot is ehhez a példához, ezért ellenőrizze ezt is:

Vagy ha érdekel egy teljes kurzus a neurális hálózatokról JavaScriptben, kérjük, olvassa el a Brain.js ingyenes tanfolyamunkat a Scrimba-nál.

Mielőtt azonban megnéznénk a kódot, nézzük át a neurális hálózatok alapjait.
Neuronok és szinapszisok
Az ideghálózat első építőköve az idegsejtek.
A neuron olyan, mint egy funkció, néhány bemenetre van szükség, és kimenetet ad vissza.
Sokféle neuron létezik. A hálózat fogja használni sigma neuronok, amelyek figyelembe tetszőleges számú és összenyomják közötti értékre 0
és 1
.
Az alábbi kör egy sigmoid idegsejtet mutat be. A bemenete 5
és a kimenete az 1
. A nyilakat szinapszisoknak nevezzük, amelyek összekapcsolják az idegsejtet a hálózat más rétegeivel.

Akkor miért van a piros szám 5
? Mert a három szinapszis összege kapcsolódik az idegsejthez, amint azt a bal oldali három nyíl mutatja. Csomagoljuk ki.
A bal szélen két értéket látunk, plusz egy úgynevezett torzítási értéket. Az értékek 1
és 0
amelyek a zöld számok. A torzítás értéke -2
a barna szám.
Először is, a két bemenet megszorozzuk a súlyokat , amelyek 7
és 3
amint azt a kék számok.
Végül összeadjuk az elfogultsággal és a 5
vagy a piros számmal végzünk . Ez a mesterséges neuronunk bemenete.

Mivel ez egy sigmoid idegsejt, amely bármely értéket 0 és 1 közé szorít, a kimenet lenyomódik 1
.
Ha összekapcsolja ezen neuronok hálózatát, akkor neurális hálózata van. Ez a bemenetről a kimenetre terjed tovább neuronokon keresztül, amelyek szinapszisokon keresztül kapcsolódnak egymáshoz. Mint az alábbi képen:

A neurális hálózat célja általánosítások megtanítása, például kézírásos számok vagy e-mail spam felismerésére. Az általánosításban való részvétel pedig a megfelelő súlyok és elfogultsági értékek kérdése a hálózaton keresztül. Mint a fenti példánkban szereplő kék és barna számokkal.
A hálózat kiképzésénél egyszerűen csak rengeteg példát mutat be, például kézzel írott számjegyeket, és rábírja a hálózatot, hogy megjósolja a helyes választ.
Minden jóslat után kiszámítja, mennyire téves volt az előrejelzés, és úgy állítsa be a súlyokat és az előfeszítési értékeket, hogy a hálózat a következő alkalommal kicsit korrektebbet találjon ki. Ezt a tanulási folyamatot backpropagation-nak nevezzük. Tegye ezt több ezer alkalommal, és a hálózata hamarosan jó lesz általánosítani.
A backpropagation technikai működése kívül esik az oktatóanyag hatókörén, de itt van a három legjobb forrás, amelyet megtaláltam annak megértéséhez:
- Példa lépésről lépésre - Matt Mazur
- Hackerek útmutatója az ideghálókhoz - Andrej Karpathy
- NeuralNetworksAndDeepLarning - Michael Nielsen
A kód
Most, hogy megkapta az alapvető bevezetőt, ugorjunk bele a kódba. Az első dolog, amit meg kell tennünk, a rétegek létrehozása. Ezt new Layer()
a szinaptikus függvénnyel tesszük . A függvénynek átadott szám határozza meg, hogy az egyes rétegeknek hány neuronjuk legyen.
Ha zavart abban, hogy mi a réteg , nézze meg a fenti képernyőt.
const {Réteg, Hálózat} = window.synaptic;
var inputLayer = new Layer (2);
var hiddenLayer = új réteg (3);
var outputLayer = új réteg (1);
Ezután ezeket a rétegeket fogjuk összekapcsolni és egy új hálózatot létrehozni, például:
inputLayer.project (hiddenLayer);
hiddenLayer.project (outputLayer);
var myNetwork = new Network ({
input: inputLayer,
rejtett: [hiddenLayer],
output: outputLayer
});
Tehát ez egy 2-3 hálózat, amely így vizualizálható:

Most képezzük ki a hálózatot:
// train the network - learn XOR var learningRate = .3; for (var i = 0; i 0 myNetwork.activate([0,0]); myNetwork.propagate(learningRate, [0]); // 0,1 => 1 myNetwork.activate([0,1]); myNetwork.propagate(learningRate, [1]); // 1,0 => 1 myNetwork.activate([1,0]); myNetwork.propagate(learningRate, [1]); // 1,1 => 0 myNetwork.activate([1,1]); myNetwork.propagate(learningRate, [0]); }
Itt 20 000 alkalommal működtetjük a hálózatot. Minden alkalommal, amikor hirdetik előre és hátra négyszer, átadva a négy lehetséges bemenetek ezen a hálózaton: [0,0] [0,1] [1,0] [1,1]
.
Kezdjük azzal, hogy myNetwork.activate([0,0])
hol [0,0]
van az adatpont, amelyet a hálózatba küldünk. Ez az előremenő terjedés, más néven a hálózat aktiválása . Minden előre történő terjesztés után meg kell csinálni egy visszapopagációt, ahol a hálózat frissíti saját súlyait és torzításait.
The backpropagation is done with this line of code: myNetwork.propagate(learningRate, [0])
, where the learningRate
is a constant that tells the network how much it should adjust its weights each time. The second parameter 0
represents the correct output given the input [0,0]
.
The network then compares its own prediction to the correct label. This tells it how right or wrong it was.
It uses the comparison as a basis for correcting its own weights and bias values so that it will guess a little bit more correct the next time.
After it has done this process 20,000 times, we can check how well our network has learned by activating the network with all four possible inputs:
console.log(myNetwork.activate([0,0])); // -> [0.015020775950893527] console.log(myNetwork.activate([0,1])); // -> [0.9815816381088985] console.log(myNetwork.activate([1,0])); // -> [0.9871822457132193] console.log(myNetwork.activate([1,1])); // -> [0.012950087641929467]
If we round these values to the closest integer, we’ll get the correct answers for the XOR equation. Hurray!
És ennyi. Annak ellenére, hogy épp most kaparintuk meg az ideghálózatok felületét, ennek elegendőnek kell lennie ahhoz, hogy elkezdhesse a Synaptic játékot magának, és folytathassa a saját tanulását. A wiki sok jó oktatóanyagot tartalmaz.
Végül feltétlenül ossza meg ismereteit egy Scrimba screencast létrehozásával vagy egy cikk megírásával, ha valami újat tanul! :)
PS: Több ingyenes tanfolyamunk van az Ön számára!
Ha a következő kihívásra vágyik, számos más ingyenes tanfolyamot kínál, amelyeket megnézhet a Scrimba.com oldalon. Három lehet releváns az Ön számára:
- Ideghálózatok a JavaScript-ben
- Bevezetés az ES6 + -ba
- Tanulja meg a D3 JS-t
Boldog kódolást!