So erstellen Sie ein neuronales Netzwerk in JavaScript in nur 30 Codezeilen

In diesem Artikel werde ich Ihnen zeigen, wie Sie mit Synaptic.js ein neuronales Netzwerk erstellen und trainieren, mit dem Sie in Node.js und im Browser vertiefen können.

Wir werden ein möglichst einfaches neuronales Netzwerk erstellen: eines, das es schafft, die XOR-Gleichung zu lösen.

Ich habe auch ein interaktives Scrimba-Tutorial zu diesem Beispiel erstellt. Schauen Sie sich das auch an:

Im Scrimba-Tutorial können Sie jederzeit mit dem Code herumspielen.

Wenn Sie an einem vollständigen Kurs über neuronale Netze in JavaScript interessiert sind, lesen Sie bitte unseren kostenlosen Kurs über Brain.js bei Scrimba.

Klicken Sie auf das Bild, um zum Kurs zu gelangen

Bevor wir uns jedoch den Code ansehen, gehen wir die Grundlagen neuronaler Netze durch.

Neuronen und Synapsen

Der erste Baustein eines neuronalen Netzwerks sind Neuronen.

Ein Neuron ist wie eine Funktion, es benötigt einige Eingaben und gibt eine Ausgabe zurück.

Es gibt viele verschiedene Arten von Neuronen. Unser Netzwerk wird Sigmoid-Neuronen verwenden, die eine beliebige Zahl nehmen und auf einen Wert zwischen 0und drücken 1.

Der Kreis unten zeigt ein Sigmoidneuron. Sein Eingang ist 5und sein Ausgang ist 1. Die Pfeile werden als Synapsen bezeichnet, die das Neuron mit anderen Schichten im Netzwerk verbinden.

Also , warum ist die rote Zahl 5? Weil es die Summe der drei Synapsen ist, die sich mit dem Neuron verbinden, wie durch die drei Pfeile links gezeigt. Packen wir das aus.

Ganz links sehen wir zwei Werte plus einen sogenannten Bias- Wert. Die Werte sind 1und 0welche sind die grünen Zahlen. Der Bias-Wert ist -2die braune Zahl.

Zuerst werden die zwei Eingänge mit ihren multiplizierten Gewichte , welche 7und 3wie durch die blauen Zahlen dargestellt.

Schließlich addieren wir es mit der Vorspannung und enden mit 5oder der roten Zahl. Dies ist der Input für unser künstliches Neuron.

Da dies ein Sigmoid-Neuron ist, das jeden Wert auf 0 bis 1 drückt, wird der Ausgang auf gedrückt 1.

Wenn Sie ein Netzwerk dieser Neuronen miteinander verbinden, haben Sie ein neuronales Netzwerk. Dies breitet sich von Eingang zu Ausgang über Neuronen aus, die über Synapsen miteinander verbunden sind. Wie auf dem Bild unten:

Das Ziel eines neuronalen Netzwerks besteht darin, es für Verallgemeinerungen wie das Erkennen handgeschriebener Ziffern oder E-Mail-Spam zu trainieren. Um gut zu verallgemeinern, müssen die richtigen Gewichte und Bias- Werte im gesamten Netzwerk vorhanden sein. Wie bei den blauen und braunen Zahlen in unserem obigen Beispiel.

Wenn Sie das Netzwerk trainieren, zeigen Sie ihm einfach eine Vielzahl von Beispielen, z. B. handgeschriebene Ziffern, und lassen das Netzwerk die richtige Antwort vorhersagen.

Nach jeder Vorhersage berechnen Sie, wie falsch  die Vorhersage war, und passen die Gewichte und Bias-Werte an, damit das Netzwerk beim nächsten Mal ein bisschen korrekter raten kann. Dieser Lernprozess wird als Backpropagation bezeichnet. Wenn Sie dies tausende Male tun, kann Ihr Netzwerk bald gut verallgemeinern.

Wie Backpropagation technisch funktioniert, liegt außerhalb des Rahmens dieses Tutorials. Hier sind jedoch die drei besten Quellen, die ich zum Verständnis gefunden habe:

  • Ein schrittweises Backpropagation-Beispiel - von Matt Mazur
  • Hackers Guide to Neural Nets - von Andrej Karpathy
  • NeuralNetworksAndDeepLarning - von Michael Nielsen

Der Code

Nachdem Sie ein grundlegendes Intro erhalten haben, springen wir in den Code. Als erstes müssen wir die Ebenen erstellen. Wir machen das mit der new Layer()Funktion in synaptic. Die an die Funktion übergebene Nummer bestimmt, wie viele Neuronen jede Schicht haben soll.

Wenn Sie sich nicht sicher sind, was eine Ebene ist, lesen Sie den obigen Screencast.

const {Layer, Network} = window.synaptic;

var inputLayer = neue Ebene (2);

var hiddenLayer = neue Ebene (3);

var outputLayer = neue Ebene (1);

Als nächstes verbinden wir diese Ebenen miteinander und instanziieren ein neues Netzwerk wie folgt:

inputLayer.project (hiddenLayer);

hiddenLayer.project (outputLayer);

var myNetwork = neues Netzwerk ({

Eingabe: inputLayer,

versteckt: [hiddenLayer],

Ausgabe: outputLayer

});

Dies ist also ein 2–3–1-Netzwerk, das folgendermaßen visualisiert werden kann:

Lassen Sie uns nun das Netzwerk trainieren:

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

Hier betreiben wir das Netzwerk 20.000 Mal. Jedes Mal, wenn wir uns viermal vorwärts und rückwärts ausbreiten, werden die vier möglichen Eingaben für dieses Netzwerk übergeben : [0,0] [0,1] [1,0] [1,1].

Wir beginnen damit myNetwork.activate([0,0]), wo [0,0]sich der Datenpunkt befindet, den wir an das Netzwerk senden. Dies ist die Vorwärtsausbreitung, die auch als Aktivierung  des Netzwerks bezeichnet wird. Nach jeder Vorwärtsausbreitung müssen wir eine Rückausbreitung durchführen, bei der das Netzwerk seine eigenen Gewichte und Vorurteile aktualisiert.

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!

Und das war's auch schon. Obwohl wir gerade die Oberfläche neuronaler Netze zerkratzt haben, sollte dies Ihnen genug geben, um selbst mit Synaptic zu spielen und selbstständig weiter zu lernen. Ihr Wiki enthält viele gute Tutorials.

Teilen Sie Ihr Wissen mit, indem Sie einen Scrimba-Screencast erstellen oder einen Artikel schreiben, wenn Sie etwas Neues lernen! :) :)

PS: Wir haben mehr kostenlose Kurse für Sie!

Wenn Sie nach Ihrer nächsten Herausforderung suchen, bieten wir Ihnen mehrere andere kostenlose Kurse an, die Sie auf Scrimba.com nachlesen können. Hier sind drei, die für Sie relevant sein könnten:

  • Neuronale Netze in JavaScript
  • Einführung in ES6 +
  • Lerne D3 JS

Viel Spaß beim Codieren!