În acest articol, vă voi arăta cum să creați și să antrenați o rețea neuronală folosind Synaptic.js, care vă permite să învățați în profunzime în Node.js și browser.

Vom crea cea mai simplă rețea neuronală posibilă: una care reușește să rezolve Ecuația XOR.

De asemenea, am creat un tutorial interactiv Scrimba pe acest exemplu, deci verificați și asta:

În tutorialul Scrimba, veți putea juca cu codul oricând doriți.
În tutorialul Scrimba, veți putea juca cu codul oricând doriți.

Sau dacă sunteți interesat de un curs complet despre rețelele neuronale în JavaScript, vă rugăm să consultați un curs gratuit pe Brain.js la Scrimba.

Faceți clic pe imagine pentru a ajunge la curs
Clic aici pentru a ajunge la curs

Dar, înainte de a ne uita la cod, să trecem prin elementele de bază ale rețelelor neuronale.

Neuroni și sinapse

Primul element constitutiv al unei rețele neuronale este, ei bine, neuroni.

Un neuron este ca o funcție, ia câteva intrări și returnează o ieșire.

Există multe tipuri diferite de neuroni. Rețeaua noastră va fi folosită neuroni sigmoizi, care iau orice număr dat și îl strivesc la o valoare între 0 și 1.

Cercul de mai jos ilustrează un neuron sigmoid. Intrarea sa este 5 iar ieșirea sa este 1. Săgețile sunt numite sinapse, care conectează neuronul la alte straturi din rețea.

1611623526 194 Cum se creeaza o retea neuronala in JavaScript in doar

Asa de De ce este numărul roșu 5? Pentru că este suma celor trei sinapse care se conectează la neuron așa cum arată cele trei săgeți din stânga. Să despachetăm asta.

În extrema stângă, vedem două valori plus un așa-numit părtinire valoare. Valorile sunt 1 și 0 care sunt numerele verzi. Valoarea de prejudecată este -2 care este numărul maro.

În primul rând, cele două intrări sunt multiplicate cu ale lor greutăți, care sunt 7 și 3 așa cum arată cifrele albastre.

În cele din urmă, îl adăugăm cu părtinire și sfârșim cu 5 sau numărul roșu. Aceasta este intrarea pentru neuronul nostru artificial.

1611623526 143 Cum se creeaza o retea neuronala in JavaScript in doar

Deoarece acesta este un neuron sigmoid care scutură orice valoare între 0 și 1, ieșirea se stoarce la 1.

Dacă conectați o rețea a acestor neuroni împreună, aveți o rețea neuronală. Acest lucru se propagă înainte de la intrare la ieșire, prin neuroni care sunt conectați între ei prin sinapse. Ca pe imaginea de mai jos:

1611623527 33 Cum se creeaza o retea neuronala in JavaScript in doar

Scopul unei rețele neuronale este să-l antreneze să facă generalizări, cum ar fi recunoașterea cifrelor scrise de mână sau a e-mailului spam. Și a fi bun la generalizare este o chestiune de a avea dreptul greutăți și părtinire valorile din rețea. Ca și în cazul numerelor albastre și maro din exemplul nostru de mai sus.

Atunci când instruiți rețeaua, îi arătați pur și simplu o mulțime de exemple, cum ar fi cifre scrise de mână, și obțineți rețeaua să prezică răspunsul corect.

După fiecare predicție, veți calcula cât de greșit predicția a fost și ajustează greutățile și valorile de prejudecată astfel încât rețeaua să ghicească puțin mai corect data viitoare. Acest proces de învățare se numește propagare înapoi. Faceți acest lucru de mii de ori și rețeaua dvs. va deveni în curând bună la generalizare.

Modul în care funcționează tehnic retrocedarea este în afara scopului acestui tutorial, dar iată cele mai bune trei surse pe care le-am găsit pentru a o înțelege:

Codul

Acum că ai primit o introducere de bază, să trecem la cod. Primul lucru pe care trebuie să-l facem este să creăm straturile. Facem acest lucru cu new Layer() funcție în sinaptic. Numărul transmis funcției dictează câte neuroni ar trebui să aibă fiecare strat.

Dacă ești confuz cu privire la ce strat este, verificați screencast de mai sus.

const {Layer, Network} = window.synaptic;

var inputLayer = layer nou (2);
var hiddenLayer = layer nou (3);
var outputLayer = Layer nou (1);

În continuare vom conecta aceste straturi împreună și vom crea o nouă rețea, astfel:

inputLayer.project (hiddenLayer);
hiddenLayer.project (outputLayer);

var MyNetwork = rețea nouă ({
input: inputLayer,
ascuns: [hiddenLayer],
output: outputLayer
});

Deci, aceasta este o rețea 2-3, care poate fi vizualizată astfel:

1611623527 733 Cum se creeaza o retea neuronala in JavaScript in doar

Acum să pregătim rețeaua:

// train the network - learn XOR

var learningRate = .3;

for (var i = 0; i < 20000; i++) {  
  // 0,0 => 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]);  
}

Aici rulăm rețeaua de 20.000 de ori. De fiecare dată când ne propagăm de patru ori înainte și înapoi, trecând în cele patru intrări posibile pentru această rețea: [0,0] [0,1] [1,0] [1,1] .

Începem prin a face myNetwork.activate([0,0]) , Unde [0,0] este punctul de date pe care îl trimitem în rețea. Aceasta este propagarea înainte, numită și activând rețeaua. După fiecare propagare înainte, trebuie să facem o propagare înapoi, unde rețeaua își actualizează propriile greutăți și prejudecăți.

Propagarea înapoi se face cu această linie de cod: myNetwork.propagate(learningRate, [0]), unde learningRate este o constantă care spune rețelei cât de mult ar trebui să-și regleze greutățile de fiecare dată. Al doilea parametru 0 reprezintă ieșirea corectă dată intrării [0,0].

Rețeaua compară apoi propria predicție cu eticheta corectă. Acest lucru îi spune cât de corect sau greșit a fost.

Folosește comparația ca bază pentru corectarea propriilor greutăți și valori de părtinire, astfel încât data viitoare va ghici puțin mai corect.

După ce a făcut acest proces de 20.000 de ori, putem verifica cât de bine a învățat rețeaua noastră activând rețeaua cu toate cele patru intrări posibile:

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]

Dacă rotunjim aceste valori la cel mai apropiat număr întreg, vom obține răspunsurile corecte pentru ecuația XOR. Ura!

Și cam atât. Chiar dacă tocmai am zgâriat suprafața rețelelor neuronale, acest lucru ar trebui să vă ofere suficient pentru a începe să jucați cu Synaptic pentru dvs. și să continuați să învățați singuri. Wiki-ul lorconține o mulțime de tutoriale bune.

În cele din urmă, asigurați-vă că vă împărtășiți cunoștințele prin crearea unui Scrimbascreencast sau scrierea unui articol când aflați ceva nou! 🙂

PS: Avem mai multe cursuri gratuite pentru tine!

Dacă sunteți în căutarea următoarei dvs. provocări, avem și alte câteva cursuri gratuite pe care le puteți consulta la Scrimba.com.Iată trei care ar putea fi relevante pentru dvs.:

Codificare fericită!