30 Zeilen des Kodes eines neuronalen Netzwerkes in JavaScript

3 min read

30 Zeilen des Kodes eines NN in JavaScript

In diesem Artikel wird beschrieben, wie ein neuronales Netzwerk in JavaScript mithilfe von Synaptic.js erstellt und trainiert wird. Damit kann man ein tiefes Lernen in Node.js und im Browser implementieren. Es wird das möglichst einfachste neuronale Netzwerk erstellt, d.h. dasjenige, das die XOR-Operation durchführen kann.

Hier ist das interaktive Scrimba-Tutorial zu sehen:

Im Scribma-Tutorial kann man mit dem Netzwerk spielen. Bevor aber der Kode betrachtet wird, ist es sinnvoll, sich an die Grundlagen neuronaler Netzwerke zu erinnern.

Neuronen und Synapsen

Es ist bekannt, dass das allererste Bauelement eines neuronalen Netzwerks ein Neuron ist. Es ist einer Funktion ähnlich: Es nimmt einige Eingangswerte und gibt das Ergebnis algebraischer Kalkülen damit zurück.

Es gibt viele Arten von Neuronen. In diesem Netzwerk wird ein Neuron mit einer Sigmoid-Aktivierungsfunktion verwendet, die eine beliebige Zahl annimmt und sie dann in einen Wert zwischen 0 und 1 umwandelt.

Im Kreis unten ist das Sigmoid-Neuron dargestellt. Am Eingang ist 5, am Ausgang ist 1. Die Pfeile werden Synapsen genannt. Ihre Funktion ist das Verbinden des Neurons mit anderen Schichten im neuronalen Netzwerk.

Was bedeutet die rote Zahl 5? Dies ist die Summe von drei mit einem Neuron verbundenen Synapsen. Dies ist durch drei Pfeile links vom Neuron dargestellt. Es macht Sinn, dies ausführlicher zu erklären.

Links ist zwei plus einen Wert zu sehen. Grüne Zahlen sind die Werte 1 und 0. Die braune Zahl ist der Verschiebungsparameter -2. Zuerst werden die Eingabezahlen mit den entsprechenden Gewichtungen 7 bzw. 3 multipliziert. Blaue Zahlen stellen die Gewichtungen dar.

Zum Schluss wird der Verschiebungsparameter hinzugefügt. Und so erhält man das Endergebnis 5 als eine rote Zahl. Dies dient als Eingang für das künstliche Neuron.

Da mit einem Sigmoid-Neuron gearbeitet wird, das jeden Eingabewert von 0 in 1 überträgt, wird die Ausgabe in 1 umgewandelt.

Nachdem die Neuronen miteinander verbunden werden, entsteht ein neuronales Netzwerk. Die Neuronen, die durch Synapsen miteinander verbunden sind, sichern den direkten Durchgang vom Eingang zum Ausgang. Dies sieht so aus.

Welche Aufgabe hat ein neuronales Netzwerk? Eine der wichtigsten besteht darin, zu lernen, gemeinsame Merkmale in den Daten zu finden.  Ein eindrucksvolles Beispiel dafür ist das Erkennen von handgeschriebenen Symbolen oder Spam in E-Mails. Für die Erfüllung dieser Aufgabe ist eine genaue Einstellung der Gewichtungen und der Verschiebungsparameter im gesamten Netzwerk erforderlich. Im obigen Beispiel sind dies blaue und braune Zahlen.

Während des Trainings wird dem Netzwerk einfach eine Vielzahl von Beispielen gezeigt, in unserem Fall sind das handgeschriebene Zeichen oder nur Bilder. Auf dieser Grundlage wird vom Netzwerk eine Antwort vorhergesagt.

Nach jeder Vorhersage wird berechnet, wie richtig sie war. Dementsprechend werden die Werte von Gewichtungen und Verschiebungsparametern angepasst, damit das Netzwerk nächstes Mal genauer ist. Dieses Schema wird Rückpropagierung genannt. Wenn dies tausendmal gemacht wird, wird dann das Netzwerk gut verallgemeinern.

JavaScript-Kode für neuronales Netzwerk

Nachdem eine Grundvorstellung über neuronale Netzwerke gegeben wurde, ist es sinnreich, sich als nächstes die Realisation anzusehen. Als Erstes sollen die Schichten erstellt werden. Dies wird mit Hilfe der Funktion new Layer in Synaptic gemacht. Die Zahl in Klammern bestimmt, wie viele Neuronen jede Schicht enthalten soll.

Um eine bessere Vorstellung über eine Schicht zu bekommen, kann man sich den Screencast anschauen.

const { Layer, Network } = window.synaptic;

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

Als Nächstes werden diese Schichten miteinander verbunden und eine Instanz des neuen Netzwerks erstellt, wie unten dargestellt wird:

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

var myNetwork = new Network({
 input: inputLayer,
 hidden: [hiddenLayer],
 output: outputLayer
});

So entstand ein Netzwerk mit 2 Neuronen in der Eingangsschicht, 3 Neuronen in der verborgenen Schicht und einem Neuron in der Ausgabeschicht. Die Architektur dieses Netzwerks wird unten gezeigt:

Zum Schluss soll das Netzwerk trainiert werden:

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

Das Netzwerk wird 20.000 Mal gestartet. Jedes Mal wird es viermal in Vorwärts- und Rückwärtsrichtung ausgebreitet, indem vier mögliche Eingaben für dieses Netzwerk durchgelaufen werden: [0,0], [0,1], [1,0], [1,1].

Man beginnt mit dem Befehl myNetwork.activate ([0,0]), wobei [0,0] die Daten sind, die an das Netzwerk gesendet werden. Dies ist eine direkte Propagation, die auch Netzwerkaktivierung genannt wird. Nach jeder direkten Propagation ist das Gegenteil erforderlich, damit das Netzwerk seine Gewichtung und Verschiebung aktualisiert.

Die Rückpropagation erfolgt mit dem Befehl myNetwork.propagate (learningRate, [0]). Der Parameter learningRate ist eine Konstante, die das Netzwerk informiert, wie viel jedes Mal das Gewicht geändert werden soll. Der zweite Parameter ist 0, die die korrekte Antwort für die angegebene Eingabe [0,0] darstellt.

Dann vergleicht das Netzwerk seine Vorhersage mit dem richtigen Tag. In diesem Schritt wird bestimmt, ob die Vorhersage richtig gemacht wurde.

Das Netzwerk verwendet den Vergleich als Grundlage für die Anpassung der Gewichtungs- und Verschiebungswerte. Deshalb wird die Vorhersage nächstes Mal etwas genauer sein.Nach der Durchführung von 20.000 Iterationen im for-Zyklus kann man sehen, wie gut das Netzwerk mit Hilfe der Aktivierung des Netzwerkes mit allen vier möglichen Eingaben gelernt hat:

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]

Wenn diese Werte auf die nächste ganze Zahl abgerundet werden, erhält man die richtigen Antworten für XOR-Operationen!

Fazit

Obwohl die neuronalen Netzwerke in diesem Artikel sehr oberflächlich beschrieben wurden, sollte diese Information ausreichend sein, um mit Synaptic herumzuspielen und mit selbständigen Erlernens dieses Gebietes zu beginnen. Diese Packetquelle enthält viele gute Tutorials.

Sollten Sie Fragen zum Erstellen und Training eines neuronalen Netzwerks in JavaScript mithilfe von Synaptic.js haben, so können Sie sich an das Team von AI-United.de per Mail oder Q&A wenden.

Quelle

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.