Kaip sukurti „Neural Network“ „JavaScript“ tik 30 kodo eilučių

Šiame straipsnyje aš jums parodysiu, kaip sukurti ir mokyti neuroninį tinklą naudojant „Synaptic.js“, kuris leidžia jums giliai mokytis „Node.js“ ir naršyklėje.

Sukursime kuo paprastesnį neuronų tinklą: tokį, kuris sugeba išspręsti XOR lygtį.

Šiame pavyzdyje taip pat sukūriau interaktyvią „Scrimba“ pamoką, todėl patikrinkite ir tai:

„Scrimba“ pamokoje galėsite žaisti su kodu, kai tik norite.

Arba, jei jus domina išsamus neuroninių tinklų „JavaScript“ kursas, peržiūrėkite nemokamus „Brain.js“ kursus „Scrimba“.

Spustelėkite vaizdą, kad patektumėte į kursą

Bet prieš pažvelgdami į kodą, pereikime pačius neuroninių tinklų pagrindus.

Neuronai ir sinapsės

Pirmasis neuroninio tinklo pagrindas yra neuronai.

Neuronas yra tarsi funkcija, jis reikalauja kelių įėjimų ir grąžina išvestį.

Yra daug įvairių neuronų tipų. Mūsų tinklas ketina naudoti riestinės neuronus, kurie gali imtis bet kokios tikrą skaičių ir skvošas jį vertė tarp 0ir 1.

Žemiau esantis apskritimas iliustruoja sigmoidinį neuroną. Jo įvestis yra 5ir jos išvestis yra 1. Rodyklės vadinamos sinapsėmis, kurios sujungia neuroną su kitais tinklo sluoksniais.

Taigi kodėl raudonas skaičius 5? Nes tai yra trijų sinapsių, jungiančių neuroną, suma, kurią rodo trys kairėje rodyklės. Išpakuokime tai.

Kairiajame kairiajame kampe matome dvi vertes ir vadinamąją šališkumo vertę. Reikšmės yra 1ir 0kurie yra žali skaičiai. Nukrypimo vertė yra -2rudas skaičius.

Pirma, du įėjimai padauginami iš jų svorio , kuris yra 7ir 3kaip parodyta mėlynais skaičiais.

Galiausiai susumuojame jį su šališkumu ir gauname 5arba raudoną skaičių. Tai yra mūsų dirbtinio neurono įvestis.

Kadangi tai yra sigmoidinis neuronas, kuris bet kurią reikšmę sutraukia tarp 0 ir 1, išvestis bus suspausta iki 1.

Jei sujungsite šių neuronų tinklą, turite neuronų tinklą. Tai plinta į priekį iš įėjimo į išvestį per neuronus, kurie yra tarpusavyje susiję per sinapses. Kaip ir paveikslėlyje žemiau:

Neuroninio tinklo tikslas yra išmokyti jį daryti apibendrinimus, pavyzdžiui, atpažinti ranka rašomus skaitmenis ar el. Pašto šlamštą. Gerai apibendrinti yra tinkamo svorio ir šališkumo reikšmė visame tinkle. Panašiai kaip su mėlynais ir rudais skaičiais mūsų pavyzdyje aukščiau.

Mokydami tinklą, jūs tiesiog parodote jam daugybę pavyzdžių, tokių kaip ranka rašyti skaitmenys, ir skatinate tinklą nuspėti teisingą atsakymą.

Po kiekvieno numatymo apskaičiuosite, ar klaidinga  buvo prognozė, ir pakoreguosite svorius ir šališkumo vertes, kad kitą kartą tinklas spėtų šiek tiek teisingiau. Šis mokymosi procesas vadinamas backpropagation. Darykite tai tūkstančius kartų ir jūsų tinklas netrukus taps geras.

Kaip techniškai veikia proporcija, šis mokymas nepatenka, tačiau čia yra trys geriausi šaltiniai, kuriuos radau, kad jį suprasčiau:

  • Žingsnis po žingsnio atkūrimo pavyzdys - Mattas Mazuras
  • Piratų neuroninių tinklų vadovas - Andrejus Karpathy
  • „NeuralNetworksAndDeepLarning“ - Michaelas Nielsenas

Kodas

Dabar, kai jūs turite pagrindinę įžangą, pereikime prie kodo. Pirmas dalykas, kurį turime padaryti, yra sukurti sluoksnius. Tai darome su new Layer()sinapsine funkcija. Funkcijai perduotas skaičius nurodo, kiek neuronų turėtų turėti kiekvienas sluoksnis.

Jei nesuprantate, kas yra sluoksnis , peržiūrėkite aukščiau pateiktą ekrano kopiją.

const {Layer, Network} = window.synaptic;

var inputLayer = naujas sluoksnis (2);

var hiddenLayer = naujas sluoksnis (3);

var outputLayer = naujas sluoksnis (1);

Toliau mes sujungsime šiuos sluoksnius ir sukursime naują tinklą, pavyzdžiui:

inputLayer.project (hiddenLayer);

hiddenLayer.project (outputLayer);

var myNetwork = naujas tinklas ({

įvestis: inputLayer,

paslėpta: [hiddenLayer],

output: outputLayer

});

Taigi tai yra 2-3 tinklas, kurį galima vizualizuoti taip:

Dabar mokykime tinklą:

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

Čia mes valdome tinklą 20 000 kartų. Kiekvieną kartą, kai mes propaguoti pirmyn ir atgal keturis kartus, einančios iš keturių galimų įėjimų šiai tinkle: [0,0] [0,1] [1,0] [1,1].

Pradedame nuo to myNetwork.activate([0,0]), kur [0,0]yra duomenų taškas, kurį siunčiame į tinklą. Tai yra priekinis sklidimas, dar vadinamas  tinklo aktyvavimu . Po kiekvieno skleidimo į priekį turime atlikti dauginimąsi, kai tinklas atnaujina savo svorį ir šališkumą.

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!

Ir viskas. Nors mes ką tik subraižėme nervinių tinklų paviršių, tai turėtų duoti jums pakankamai daug, kad galėtumėte pradėti žaisti su „Synaptic“ patys ir toliau mokytis savarankiškai. Jų wiki yra daug gerų pamokų.

Galiausiai, sužinoję ką nors naujo, būtinai pasidalykite savo žiniomis sukurdami „Scrimba“ ekranizaciją arba parašydami straipsnį! :)

PS: Mes turime daugiau nemokamų kursų jums!

Jei ieškote kito iššūkio, turime keletą kitų nemokamų kursų, kuriuos galite patikrinti svetainėje Scrimba.com. Štai trys gali būti jums aktualūs:

  • Neuroniniai tinklai „JavaScript“
  • Įvadas į ES6 +
  • Sužinokite D3 JS

Laimingo kodavimo!