Kuidas luua JavaScripti närvivõrk ainult 30 koodireaga

Selles artiklis näitan teile, kuidas luua ja treenida närvivõrku Synaptic.js abil, mis võimaldab teil sügavalt õppida Node.js-s ja brauseris.

Loome võimalikult lihtsa närvivõrgu: võrgu, mis suudab lahendada XOR-võrrandi.

Olen selle näite jaoks loonud ka interaktiivse Scrimba õpetuse, nii et vaadake ka seda:

Scrimba õpetuses saate koodiga mängida, kui soovite.

Või kui olete huvitatud JavaScripti närvivõrkude täielikust kursusest, vaadake palun meie tasuta kursust saidil Brain.js aadressil Scrimba.

Kursusele pääsemiseks klõpsake pilti

Kuid enne kui vaatame koodi, läheme läbi närvivõrkude põhitõed.

Neuronid ja sünapsid

Närvivõrgu esimene ehitusplokk on neuronid.

Neuron on nagu funktsioon, see võtab paar sisendit ja tagastab väljundi.

Neuroneid on palju erinevaid. Meie võrk hakkab kasutama sigmoidseid neuroneid, mis võtavad suvalise arvu ja viivad selle väärtuseni vahemikus 0ja 1.

Allpool olev ring illustreerib sigmoidset neuroni. Selle sisend on 5ja väljund on 1. Noole nimetatakse sünapsideks, mis ühendab neuroni võrgu teiste kihtidega.

Nii , miks on punane number 5? Sest see on kolme sünapsi summa, mis ühenduvad neuroniga, nagu näitavad vasakul olevad kolm noolt. Pakime selle lahti.

Vasakpoolses servas näeme kahte väärtust pluss nn kallutatud väärtus. Väärtused on 1ja 0mis on rohelised numbrid. Kallutatav väärtus on -2pruun number.

Esiteks korrutatakse need kaks sisendit nende kaaludega , mis on 7ja 3mida näitavad sinised numbrid.

Lõpuks liidame selle koos eelarvamustega ja saame lõpuks 5punase numbri. See on meie kunstnärvi sisend.

Kuna tegemist on sigmoidse neuroniga, mille väärtus on vahemikus 0 kuni 1, pigistatakse väljund alla 1.

Kui ühendate nende neuronite võrgu omavahel, on teil närvivõrk. See levib sisendist väljundisse neuronite kaudu, mis on omavahel ühendatud sünapside kaudu. Nagu alloleval pildil:

Närvivõrgu eesmärk on õpetada seda tegema üldistusi, näiteks käsitsi kirjutatud numbrite või e-posti rämpsposti tuvastamine. Ja hea üldistamine on kogu võrgus õigete kaalude ja eelarvamuste omamine . Nagu sinises ja pruunis numbris meie ülaltoodud näites.

Võrgu koolitamisel näitate talle lihtsalt hulgaliselt näiteid, näiteks käsitsi kirjutatud numbreid, ja panete võrgu õiget vastust ennustama.

Pärast iga ennustust arvutate, kui  ennustus vale oli, ja reguleerige kaalu ja eelarvamused nii, et võrk arvaks järgmisel korral natuke õigemini. Seda õppeprotsessi nimetatakse tagasi paljundamiseks. Tehke seda tuhandeid kordi ja teie võrk saab peagi üldistamise heaks.

Kuidas paljundamine tehniliselt töötab, jääb selle õpetuse reguleerimisalast välja, kuid siin on kolm parimat allikat, mille leidsin selle mõistmiseks:

  • Näide samm-sammult tagasi paljundamise kohta - autor Matt Mazur
  • Närvivõrkude häkkerite juhend - autor Andrej Karpathy
  • NeuralNetworksAndDeepLarning - Michael Nielsen

Kood

Nüüd, kui olete põhitutvustuse saanud, läheme koodi juurde. Esimene asi, mida peame tegema, on kihtide loomine. Teeme seda new Layer()funktsiooniga sünaptiliselt. Funktsioonile edastatud arv määrab, kui palju neuroneid peaks igal kihil olema.

Kui olete segaduses, mis kiht on, vaadake ülaltoodud ekraanipilti.

const {kiht, võrk} = window.synaptic;

var inputLayer = uus kiht (2);

var hiddenLayer = uus kiht (3);

var outputLayer = uus kiht (1);

Next up we’ll connect these layers together and instantiate a new network, like this:

inputLayer.project(hiddenLayer);

hiddenLayer.project(outputLayer);

var myNetwork = new Network({

input: inputLayer,

hidden: [hiddenLayer],

output: outputLayer

});

So this is a 2–3–1 network, which can be visualized like this:

Now let’s train the network:

// 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]); } 

Here we’re running the network 20,000 times. Each time we propagate forward and backwards four times, passing in the four possible inputs for this network: [0,0] [0,1] [1,0] [1,1] .

We start by doing myNetwork.activate([0,0]) , where [0,0] is the data point we’re sending into the network. This is the forward propagation, also called activating  the network. After each forward propagation, we need to do a backpropagation, where the network updates it’s own weights and biases.

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!

Ja see on kõik. Kuigi oleme just närvivõrkude pinda kraapinud, peaks see andma teile piisavalt, et hakata Synapticuga ise mängima ja jätkata iseseisvat õppimist. Nende viki sisaldab palju häid õpetusi.

Lõpuks jagage kindlasti oma teadmisi, luues Scrimba ekraanikuva või kirjutades artikli, kui saate midagi uut teada! :)

PS: Meil ​​on teile rohkem tasuta kursusi!

Kui otsite oma järgmist väljakutset, on meil mitmeid muid tasuta kursusi, mida saate vaadata aadressil Scrimba.com. Siin on kolm, mis võivad teie jaoks asjakohased olla:

  • Neuraalvõrgud JavaScriptis
  • ES6 + sissejuhatus
  • Õpi D3 JS

Head kodeerimist!