Kuinka luoda hermoverkko JavaScriptissä vain 30 koodirivillä

Tässä artikkelissa näytän sinulle, kuinka luoda ja kouluttaa hermoverkko käyttämällä Synaptic.js: ää, jonka avulla voit tehdä syvällistä oppimista Node.js: ssä ja selaimessa.

Luomme yksinkertaisen mahdollisen hermoverkon: verkon, joka onnistuu ratkaisemaan XOR-yhtälön.

Olen myös luonut interaktiivisen Scrimba-opetusohjelman tästä esimerkistä, joten tarkista myös tämä:

Scrimba-opetusohjelmassa voit pelata koodia milloin tahansa.

Tai jos olet kiinnostunut täydellisestä hermoverkkokurssista JavaScriptissä, tutustu ilmaiseen Brain.js-kurssillemme Scrimba.

Napsauta kuvaa päästäksesi kurssille

Mutta ennen kuin katsomme koodia, käydään läpi hermoverkkojen perusteet.

Neuronit ja synapsit

Neuroverkon ensimmäinen rakennuspalikka ovat hyvin, neuronit.

Neuroni on kuin funktio, se vie muutaman tulon ja palauttaa lähdön.

Neuroneja on monia erilaisia. Verkostomme aikoo käyttää sigmoid neuronien, jotka ottavat tahansa määrän ja squash sitä arvoon välillä 0ja 1.

Alla oleva ympyrä kuvaa sigmoidia neuronia. Sen panos on 5ja sen tuotos on 1. Nuolia kutsutaan synapsiksi, joka yhdistää neuronin verkon muihin kerroksiin.

Joten miksi punainen numero on 5? Koska se on niiden kolmen synapsin summa, jotka yhdistyvät neuroniin, kuten vasemmalla olevat kolme nuolta osoittavat. Pura tämä.

Vasemmassa reunassa näemme kaksi arvoa ja ns. Bias- arvon. Arvot ovat 1ja 0mitkä ovat vihreitä numeroita. Bias-arvo on -2ruskea luku.

Ensinnäkin nämä kaksi tuloa kerrotaan painoilla , jotka ovat 7ja 3kuten siniset numerot osoittavat.

Lopuksi lisätään se yhteen puolueellisuudesta ja päätetään 5punaisella numerolla. Tämä on tulo keinotekoiselle neuronillemme.

Koska tämä on sigmoidi neuroni, joka puristaa minkä tahansa arvon välille 0 ja 1, lähtö puristuu alas 1.

Jos yhdistät näiden neuronien verkon yhteen, sinulla on hermoverkko. Tämä etenee sisääntulosta lähtöön hermosolujen kautta, jotka ovat yhteydessä toisiinsa synapsien kautta. Kuten alla olevassa kuvassa:

Neuroverkon tavoitteena on kouluttaa se tekemään yleistyksiä, kuten tunnistaa käsin kirjoitetut numerot tai sähköpostin roskaposti. Ja hyvä yleistäminen on asianmukaista painoa ja ennakkoarvoa verkon kautta. Kuten sinisen ja ruskean numeron kanssa yllä olevassa esimerkissämme.

Kun harjoittelet verkkoa, näytät yksinkertaisesti sille esimerkkejä, kuten käsinkirjoitettuja numeroita, ja saat verkon ennakoimaan oikean vastauksen.

Jokaisen ennusteen jälkeen lasket kuinka väärä  ennuste oli, ja säädä painot ja esijännitysarvot niin, että verkko arvaa hieman oikeammin seuraavalla kerralla. Tätä oppimisprosessia kutsutaan takaisin lisääntymiseksi. Tee tämä tuhansia kertoja, ja verkostosi tulee pian hyväksi yleistämisessä.

Kuinka jälkikasvu toimii teknisesti, tämä opetusohjelma ei kuulu, mutta tässä on kolme parasta lähdettä, jotka olen löytänyt sen ymmärtämiseksi:

  • Esimerkki askel askeleelta -lisäosasta - Matt Mazur
  • Hakkerien opas hermoverkoihin - kirjoittanut Andrej Karpathy
  • NeuralNetworksAndDeepLarning - Michael Nielsen

Koodi

Nyt kun olet saanut perustiedot, siirrytään koodiin. Ensimmäinen asia, joka meidän on tehtävä, on luoda kerrokset. Teemme tämän new Layer()synaptisella toiminnolla. Funktiolle välitetty numero määrää kuinka monta hermosolua jokaisella kerroksella pitäisi olla.

Jos olet hämmentynyt kerroksen merkistä , tutustu yllä olevaan kuvakaappaukseen.

const {Layer, Network} = ikkuna.synaptic;

var inputLayer = uusi kerros (2);

var hiddenLayer = uusi kerros (3);

var outputLayer = uusi kerros (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 siinä kaikki. Vaikka olemme juuri naarmuuntuneet hermoverkkojen pintaan, tämän pitäisi antaa sinulle tarpeeksi aloittaa pelaaminen Synapticin kanssa itsellesi ja jatkaa oppimista itse. Heidän wikinsä sisältää paljon hyviä opetusohjelmia.

Lopuksi, muista jakaa tietosi luomalla Scrimba-kuvaruutu tai kirjoittamalla artikkeli, kun opit jotain uutta! :)

PS: Meillä on enemmän ilmaisia ​​kursseja sinulle!

Jos etsit seuraavaa haastettasi, meillä on useita muita ilmaisia ​​kursseja, jotka voit tarkistaa osoitteessa Scrimba.com. Tässä voi olla sinulle kolme asiaa:

  • Neuraaliverkot JavaScriptissä
  • ES6 +: n esittely
  • Opi D3 JS

Hyvää koodausta!