Sådan oprettes et neuralt netværk i JavaScript i kun 30 linjer kode

I denne artikel viser jeg dig, hvordan du opretter og træner et neuralt netværk ved hjælp af Synaptic.js, som giver dig mulighed for at udføre dyb læring i Node.js og browseren.

Vi opretter det enkleste neurale netværk muligt: ​​et der formår at løse XOR-ligningen.

Jeg har også oprettet en interaktiv Scrimba-tutorial på dette eksempel, så tjek det også ud:

I Scrimba-selvstudiet kan du lege med koden, når du vil.

Eller hvis du er interesseret i et fuldt kursus om neurale netværk i JavaScript, så tjek vores gratis kursus på Brain.js på Scrimba.

Klik på billedet for at komme til kurset

Men inden vi ser på koden, lad os gennemgå det grundlæggende i neurale netværk.

Neuroner og synapser

Den første byggesten i et neuralt netværk er, ja, neuroner.

En neuron er som en funktion, det tager et par input og returnerer en output.

Der er mange forskellige typer neuroner. Vores netværk vil bruge sigmoidneuroner, som tager et hvilket som helst givent tal og klemmer det til en værdi mellem 0og 1.

Cirklen nedenfor illustrerer en sigmoid neuron. Dens input er, 5og dens output er 1. Pilene kaldes synapser, som forbinder neuronen med andre lag i netværket.

hvorfor er det røde tal 5? Fordi det er summen af ​​de tre synapser, der forbinder neuronen som vist med de tre pile til venstre. Lad os pakke det ud.

Yderst til venstre ser vi to værdier plus en såkaldt bias- værdi. Værdierne er, 1og 0hvilke er de grønne tal. Biasværdien er, -2hvilket er det brune tal.

For det første ganges de to indgange med deres vægte , som er 7og 3som vist med de blå tal.

Endelig tilføjer vi det med bias og ender med 5eller det røde tal. Dette er input til vores kunstige neuron.

Da dette er en sigmoid neuron, der klemmer enhver værdi til mellem 0 og 1, bliver output presset ned til 1.

Hvis du forbinder et netværk af disse neuroner sammen, har du et neuralt netværk. Dette spreder sig fremad fra input til output via neuroner, der er forbundet til hinanden gennem synapser. Ligesom på billedet nedenfor:

Målet med et neuralt netværk er at træne det i at generalisere, såsom at genkende håndskrevne cifre eller e-mail-spam. Og at være god til at generalisere er et spørgsmål om at have de rigtige vægte og biasværdier på tværs af netværket. Som med de blå og brune tal i vores eksempel ovenfor.

Når du træner netværket, viser du det simpelthen masser af eksempler som håndskrevne cifre og får netværket til at forudsige det rigtige svar.

Efter hver forudsigelse beregner du, hvor forkert  forudsigelsen var, og justerer vægte og forspændingsværdier, så netværket gætter lidt mere korrekt næste gang. Denne læringsproces kaldes backpropagation. Gør dette tusinder af gange, så bliver dit netværk snart godt til at generalisere.

Sådan fungerer backpropagation teknisk uden for omfanget af denne tutorial, men her er de tre bedste kilder, jeg har fundet for at forstå det:

  • Et trin for trin backpropagation eksempel - af Matt Mazur
  • Hackers Guide to Neural Nets - af Andrej Karpathy
  • NeuralNetworksAndDeepLarning - af Michael Nielsen

Koden

Nu hvor du har fået en grundlæggende introduktion, lad os hoppe ind i koden. Den første ting, vi skal gøre, er at skabe lagene. Vi gør dette med new Layer()funktionen synaptisk. Antallet, der sendes til funktionen, dikterer, hvor mange neuroner hvert lag skal have.

Hvis du er forvirret over, hvad et lag er, skal du tjekke screencast ovenfor.

const {Layer, Network} = window.synaptic;

var inputLayer = nyt lag (2);

var hiddenLayer = nyt lag (3);

var outputLayer = nyt lag (1);

Derefter forbinder vi disse lag sammen og indleder et nyt netværk, som dette:

inputLayer.project (hiddenLayer);

hiddenLayer.project (outputLayer);

var myNetwork = nyt netværk ({

input: inputLayer,

skjult: [hiddenLayer],

output: outputLayer

});

Så dette er et 2–3–1 netværk, som kan visualiseres således:

Lad os nu træne netværket:

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

Her kører vi netværket 20.000 gange. Hver gang vi udbreder frem og tilbage fire gange, passerer i de fire mulige indgange for dette netværk: [0,0] [0,1] [1,0] [1,1].

Vi starter med at gøre myNetwork.activate([0,0]), hvor [0,0]er datapunktet, vi sender til netværket. Dette er den fremadrettede formering, også kaldet aktivering  af netværket. Efter hver fremadgående udbredelse er vi nødt til at foretage en backpropagation, hvor netværket opdaterer sine egne vægte og bias.

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!

Og det handler om det. Selvom vi lige har ridset overfladen af ​​neurale netværk, skal dette give dig nok til at begynde at spille med Synaptic for dig selv og fortsætte med at lære på egen hånd. Deres wiki indeholder mange gode tutorials.

Endelig skal du sørge for at dele din viden ved at oprette en Scrimba screencast eller skrive en artikel, når du lærer noget nyt! :)

PS: Vi har flere gratis kurser til dig!

Hvis du leder efter din næste udfordring, har vi flere andre gratis kurser, du kan tjekke ud på Scrimba.com. Her er tre, der kan være relevante for dig:

  • Neurale netværk i JavaScript
  • Introduktion til ES6 +
  • Lær D3 JS

God kodning!