Benutzer-Werkzeuge

Webseiten-Werkzeuge


ein_neuronales_netz_fuer_den_nxt_roboter

Dies ist eine alte Version des Dokuments!


Ein neuronales Netz für den NXT Roboter

Dieser Artikel verwendet Methoden der künstlichen Intelligenz, um einen Lego NXT Roboter lernfählig zu machen. Der Roboter wird mit Java programmiert und verwendet Neuronale Netze. Künstliche neuronale Netze haben ihr Vorbild in dem vielleicht größten komplexen System was wir derzeit kennen, dem menschliche Gehirn. Dieser Abschnitt basiert auf einem engl. Artikel aus dem Jahre 2005 (weiter unten Downloadbar). Der Quellcode wurde der neuesten Lego Mindstorm NXT Generation angepasst.

Geschrieben von: Leander Cascorbi, Lukas Immertreu


Java bietet ideale Voraussetzungen zum Programmieren eines Roboters. Mit Java ist es möglich hörende, sehende, sprechende und sich bewegende Roboter zu programmieren. Benutzt man neuronale Netze, kann man noch einen Schritt weiter gehen, denn dann werden die Roboter lernfähig.

Dieser Artikel zeigt, wie man einen sogenannten Backpropagation-Algorithmus, ein grundlegendes neuronales Netz, programmiert, und auf einem Lego-NXT-Roboter implementiert. Mithilfe des Algorithmus und Java kann der Roboter grundlegende Bewegungsregeln erlernen.

LeJOS

LeJOS ist ein kleines Java-basiertes Betriebssystem für LEGO-NXT-Roboter. Menü Download gibt es eine Anleitung die zeigt, wie LeJOS auf dem LEGO Roboter installiert werden kann. Desweiteren wird gezeigt, wie LeJOS auf einem Linux-System zusammen mit Eclipse konfiguriert werden kann, so dass dem Programmieren nichts mehr im Wege steht.

Neural Networks

Um intelligente Roboter zu programmieren, orientiert man sich an der Struktur des menschlichen Gehirns. Anfang der 1940er begannen der Neurophysiologe Warren McCulloch und der Mathematiker Walter Pitts an der Idee intelligenter Roboter auf Basis künstlicher Neuronen zu arbeiten. Eines der ersten Modelle neuronaler Netze war das Perzeptron, eine Erfindung F. Rosenblats 1962.
Das Perzeptron ist lernfähig! Aus der Summe gewichteter Input-SIgnale wird über eine Aktivierungsfunktion und einen festgesetzten Grenzwert ein Output generiert, der entweder den Wert 1 oder den Wert 0 annimmt, je nach Größe der Input-Summe. Abbildung 1 zeigt ein Neuron, Abbildung 2 ein Perzeptron.

Abb. 1: Ein Neuron
Abb. 2: Das Perzeptron mit einfacher Aktivierungsfunktion

Die Inputwerte ($x_1$, $x_2$, $x_3$, …, $x_n$) und die Verbindungsgewichte ($w_1$,$w_2$,$w_3$, …,$w_n$) in der Grafik sind normalerweise reelle Werte.

Beispiel

Wenn $x_i$ das Perzeptron zum feuern anregt (Aktivierungsfunktion gibt den Wert 1 aus), muss das Gewicht $w_i$ folglich einen positiven Wert gehabt haben. Ist das Gewicht $w_i$ allerdings negativ, so wird das Neuron hingegen nicht feuern (Aktivierungsfunktion nimmt den Wert 0 an).
Wie Elaine Rich und Kevon Knight in ihrem Buch Artificial Intelligence (McGraw-Hill, 1990) schreiben:
„Das Perzeptron selbst besteht aus Gewichten, einem Summierungsprozessor und dem feszulegenden Grenzwert. Das Lernen ist der Prozess des Modifizierens der Gewichtswerte und des Grenzwertes“

Backpropagation-Netzwerke

Ein Backpropagation-Netzerk (Backpropagation engl. für Fehlerrückführung) ist ein neuronales Netz, in dem die Neuronen in Ebenen angeordnet sind, wobei jedes Neuron eines Layers (einer Ebene) mit jedem Neuron des darüber liegenden Layers verbunden ist.
Des weiteren feuern die Neuronen nur in eine Richtung, auf die nächsthöhere Ebene. In diesem Fall fließt die Aktivität vom Input-Layer über den Hidden-Layer zum Output-Layer.
Die Gewichte zwischen den Einheiten stellen den Wissensstand des Netzwerkes kodiert dar.

Abb. 3: Ein typisches neuronales Netzwerk mit 3 Layers (Schichten)

Den Gewichten in einem Backpropagation-Netzwerk werden normalerweise zu Beginn Zufallswerte zugeordnet. Jedes Mal, wenn ein Paar von Input- und Outputvektoren generiert wird, justiert das Netzwerk die Gewichte nach festgelegten Lernregeln nach. Jedes Vektorenpaar durchläuft dabei zwei Aktivierungsschritte, einen Vorwärtsschritt (forward pass) und einen Rückwärtsschritt (backward pass).
Beim Vorwärtsschritt durchläuft ein Eingabemuster das Netzwerk (Input-Layer → Output-Layer), welches daraus einen Output berechnet.
Beim Rückwärtsschritt wird der berechnete Output (aus dem Vorwärtsschritt) mit dem vorhergesagten Ziel-Output verglichen und Fehlerwerte für die Output-Neuronen werden berechnet.

Diese werden genutzt, um die Gewichte, die mit dem Output-Layer verbunden sind, so neu zu berechnen, dass die Fehler reduziert werden. Aus den Fehlerwerten der Output-Neuronen werden nun Fehlerabschätzungen der Hidden-Neuronen berechnet. Aus diesen Fehlerwerten werden die Gewichte zwischen Input- und Hidden-Layer neu justiert.

Nach jeder Runde „lernt“ das System Taktweise von anhand der Input-Output-Daten und reduziert dabei die Fehlerdifferenz zwischen dem berechneten Output und dem vorhergesagten Ziel-Output. Nach ausgiebigem Training hat das Netzwerk die Gewichte so justiert, dass kein Fehler mehr auftritt.

Der Backpropagation-Algorithmus

Ausgehend von einem Satz von Inputvektoren und den zugehörigen Oututvektoren (Vektorenpaar), kann man die Gewichte des neuronalen Netzwerks so justieren, dass die Inputs auf die vorhergesagten Ziel-Outputs abgebildet werden.

Sei A die Anzahl der Neuronen auf dem Input-Layer, die Größe von A hängt dabei von der Größe des für das Training verwendeten Input-Vektors ab. Sei C die Anzahl der Neuronen auf dem Output-Layer. Nun ist B, die Anzahl der Neuronen auf den Hidden-Layer festzulegen. Wie in Abbildung 4 dargestellt, beinhalten der Hidden- und der Input-Layer ein zusätzliches Neuron als festgelegten Grenzwert der Aktivierungsfunktion. Deshalb werden die Neuronen auf diesen Ebenen häufig von 0 bis A indiziert, anstatt von 1 bis A. Wir bezeichnen die Neuronen auf dem Input-Layer mit $x_j$ , auf dem Hidden-Layer mit $h_j$ , und auf dem Output-Layer mit $o_j$ . Gewichte, die den Input- und Hidden-Layer verbinden, heißen $w1_{ij}$ , wobei i die Input-Neuronen bezeichnet und j die Hidden-Neuronen. Gewichte, die den Hidden- und den Output-Layer verbinden, heißen $w2_{ij}$ , i bezeichnet analog die Hidden-Neuronen und j die Output-Neuronen.

StepBeschreibung
1.

Initialisieren der Gewichte. Dabei wird jedem Gewicht ein Zufallswert zwischen -0,1 und 0,1 zugeordnet.

  • $w1_{ij}$=random(-0.1, 0.1) für alle i=0, …, A, j=1, …, B
  • $w2_{ij}$=random(-0.1, 0.1) für alle i=0, …, B, j=1, …, C
2.

Initialisieren der Grenzwert-Neuronen. Für jeden Layer wird der Grenzwert auf 1 gesetzt und sollte nie verändert werden.

  • $x_0=1.0$
  • $h_0=1.0$
3.

Auswählen eines Input-Output-Paars. Sei $x_i$ ein Input-Vektor und $y_i$ der vorausgesagte Ziel-Vektor. Den Input-Neuronen werden Aktivierungslevel zugeordnet.

4.
5.
6.
7.
8.
9.
10.

Die Aktivierungsfunktion ist s-förmig. Damit die berechneten Outputs werte von 0.0 oder 1.0 annehmen, müssten die Gewichte unendlich groß sein. Deshalb werden die Ziel-Outputs (Oben in Schritt 4 und 7 als $y_j$ dargestellt) auf 0.1 und 0.9 gesetzt. Die S-Förmigkeit der Aktivierungsfunktion ist deshalb wichtig, weil sie differenzierbar sein muss. Ansonsten könnten die Gewichtsupdates im Backpropagationprozess nicht berechnet werden.

Das Backpropagation-Netzwerk für den NXT

Quellcode

Quellen

ein_neuronales_netz_fuer_den_nxt_roboter.1706265921.txt.gz · Zuletzt geändert: 2024/01/26 10:45 von torsten.roehl