Praktikumsbericht Marco Wangerin Inhaltsverzeichnis 1 Einleitung 1.1 Neuronales Netz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Das lernende Neuron . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Sensomotorische Schleife . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Projekte 2.1 Roboterrad micro.eva . . . . . . . . . . 2.1.1 Sensomotorische Schleife mit fünf 2.1.2 neuronales Netz als Modell . . . 2.1.3 Rad-Simulation . . . . . . . . . . 2.1.4 serielle Schnittstelle . . . . . . . 2.2 Gnuplot . . . . . . . . . . . . . . . . . . 2.3 Kephera-Simulator . . . . . . . . . . . . 2.4 SNN-Simulator . . . . . . . . . . . . . . 1 . . . . . . Neuronen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 4 5 5 . 5 . 6 . 9 . 9 . 9 . 9 . 10 . 11 1 Einleitung Die Rechenleistung der Computer stieg in den letzten Jahren enorm an und ermöglicht das Lösen von bestimmten Problemen (Rechenaufgaben durch Algorithmen beschrieben) in kürzester Zeit. Dennoch bleibt das menschliche Gehirn in dessen Arbeitsweise unübertroffen, da es sich im Laufe der Evolution perfekt seiner Umwelt anpasste. Das Erkennen und Zuordnen von sichtbaren Objekten, komplizierten Sachverhalten usw. kann ein Computer heute nur mit hohem Rechen- bzw Zeitaufwand oder gar nicht erreichen. Meine Bewunderung für dieses natürliche Konstrukt und meine Interesse an der Wissenschaft dessen, motivierten mich mein Praktikum an der Universität Leipzig im Bereich Neuroninformatik und Robotik zu absolvieren. 1.1 Neuronales Netz Das Gehirn ist ein komplexes Netzwerk von Nervenzellen (Neuronen). Jedes dieser Neuronen verfügt über einen Zellkörper, Dendriten und ein Axon. Die Dendriten sowie das Axon sind Ausläufer, die aus dem Zellkörper hervorgehen und Nervenfasern, die für die Weiterleitung von Reizen zuständig sind. Die Dendriten nehmen Reize auf und leiten sie Abbildung 1: Motorsignale zum Neuroninneren weiter. Wenn die Summe dieser Impulse einen bestimmten Schwellwert überschreitet, feuert das Neuron einen Reiz über das Axon zu anderen Nerven- oder auch Muskellzellen ab. Die Synapsen, die sich am Ende des Axons befinden, bilden den 2 Kontakt zwischen den Neuronen und legen fest, wie stark ein Reiz auf das Empfängerneuron eingeht. Aus diesem biologischen Vorbild gehen das mathematische Modell eines Neurons und die Grundlage für künstliche neuronale Netze hervor. Die Reize sowie die synaptischen Gewichte werden in künstlichen neuronalen Netzen durch Zahlenwerte beschrieben. x...Input y...Output w...synaptisschesGewicht Jedem Input xi ist ein synaptisches Gewicht wi in der Form z = ~x ∗ w ~= X (xi ∗ wi ) i zugerodnet. Die Transferfunktion y = f (z) = f (~x|w) ~ beschreibt wie sich der Input ~x auf den Output y des Neurons auswirken. Als Transferfunktion können unterschiedliche Abbildung 2: Motorsignale Funktionen eingesetzt werden. (lineare- ,Schwellwert- ,logistische Funktionen, Tangenshyperbolicus) Beispiel mit einer Tangenshyperbolicus-Funktion X y = tanh( i 3 (xi ∗ wi )) Das Tangeshyperbolicus-Neuron eignet sich gut zur Ansteuerung von Motoren, da es Abbildung 3: Tangenshyperbolicus positive und negative Ausgangswerte liefern kann und somit die Unterscheidung zwischen rechts und links drehen vereinfacht. In Verbindung mit Robotik kommt das TanghNeuron oft zum Einsatz. 1.2 Das lernende Neuron Das Neuron bzw. das neuronale Netz kann nur dann etwas lernen, wenn ein Lehrer vorhanden ist, der vorgibt was richtig und falsch ist. Dieser Lehrer kann die Umwelt oder einfach nur eine Zielfunktion sein. Einen Fehler E macht das Neuron dann, wenn der Output y des Neurons von dem der Zielfunktion ysoll abweicht. E = (y − ysoll )2 Ziel ist die Minimierung des Fehlers durch die Anpassung der Gewichte w des Neurons. Diese Anpassung erfolgt in Lernschritten. In jedem Schritt wird der Vektor w optimiert (Update). Die Suche nach den optimalen Parametern wird über den Gradientenabstieg auf der Fehlerlandschaft realisiert. gradw E = (E/w1 , E/w2 , ..., E/wn ) So kann der Algorithmus gegen ein lokales Minimum der Fehlerfunktion konvergieren. Ist dieses der Fall hat das Neuron die Zielfunktion gelernt. 4 1.3 Sensomotorische Schleife Die sensomotorische Schleife beschreibt die Wechselwirkung zwischen dem Roboter und seiner Umwelt. Jede Aktion die der Roboter über seine Motoren ausführt, verändert seine Umwelt. Somit erhält der Controller des Roboters über seine Sensoren neue Informationen, welche seine nächste Aktion beeinflussen. Das Ziel ist ein Roboter der sich Abbildung 4: Motorsignale seiner Umwelt anpasst und die Konsequenzen seiner Aktionen kennt. Dazu benötigt der Roboter ein Modell der Welt. Das Modell soll die Zusammenhänge, die zwischen Motorsignalen und Sensorwerten bestehen, lernen. Im einfachstem Fall ist das Modell eine lineare Funktion. Für kompliziertere Zusammenhänge kann ein neuronales Netz verwendet werden. Das Modell soll dazu verwendet werden, die Sensorwerte des Roboters auf Grund seiner Motoraktivitäten vorauszusagen. Aus der Differenz der Voraussage xmodell und den tatsächlichen Sensorwerten x ergibt sich ein Fehler E. E = (xmodell − x)2 Dieser Fehler wird als Lernsignal für den Controller sowie das Modell verwendet. 2 2.1 Projekte Roboterrad micro.eva Das fünfarmige Roboter-Rad micro.eva wurde im Jahre 2001 von Julius Popp entwickelt und verschiedenen Forschungsinstituten zur Verfügung gestellt. Das Ziel war es, ein Roboter zu bauen, der in Bezug auf seine Umgebung ein eigenes Bewusstsein entwickelt. Ein neuronales Netz sollte diese Aufgabe lösen und micro.eva zum Leben erwecken. Jeder der fünf Roboterarme wird mit einem Servomotor angetrieben. Ein Gyroskop 5 Abbildung 5: Motorsignale steht für Drehgeschwindigkeitmessung und fünf Magnetsensoren für die Ermittlung der Radstellung zur Verfügung. Die Ansteuerung und Datenverarbeitung übernimmt ein Microcontroller, der mit einem kleinen Speicher ausgestattet ist, so dass Programme direkt auf das Rad übertragen werden können. 2.1.1 Sensomotorische Schleife mit fünf Neuronen Die ersten Versuche wurden mit ein C-Programm, welches eine sensomotorische Schleife mit fünf Neuronen simulierte, durchgeführt. Jedes dieser Neuronen sollte jeweils einen Arm des Rades ansteuern und die neuen Armstellungen des eigenen und die der Nachbararme als Sensorwert erhalten. Ziel war es, einen Zusammenhang zwischen den NachbarArmstellungen zu finden und eine Reaktion hervorzurufen, die das Rad dreht. Das Gyroskop sowie die Magnetsensoren des Rades wurden als Sensoren vernachlässigt, so konnte man das Programm am Rechner testen ohne es auf das Rad zu übertragen. Jeder Arm des Rades wird von einem Neuron angesteuert werden. Jedes dieser Neuronen i hat drei Eingäge xn und einen Bias H. Der Sensorwert xi ist die Stellung des vom Neuroun i angesteuerten Armes. Die Sensorwerte xi−1 und xi+1 ergeben sich aus den den benachbarten Armstellungen. zi = X (xn ∗ cij ) + Hi ; n = (i + j + 4)mod5 (1) j Der Fehler ist nur fu”r das Biasupdate bedeutend, wobei Bias sowie Fehler in diesem Fall keinen grossen Einfluss auf das Verhalten der Neuronen haben, da nur das Rauschen 6 in den Fehler eingeht. E= X (xi − yi )2 i Die Rückkopplungsstäke des Neurons i ist ( Ki = X (cij ∗ aji ) ; aji = j 1 0 : j=1 : j= 6 1 Die Gewichte cij werden fr jedes Neuron i und jeden Eingang j seperat berechnet, wobei ci1 das Gewicht des eigenen Sensorwertes ist. Die Update-Regel der Gewichte: ∆cij = ∗ (1 − tanh2 (zi )) ∗ (aji − 2 ∗ Ki ∗ yi ∗ xn ) − γ ∗ cij (2) Die Update-Regel des Bias: ∆Hi = ∗ (−2 ∗ Ki ∗ yi ∗ E ∗ f req ∗ (1 − tanh2 (zi ))) (3) Die Startparameter sind auf = 0.001, γ = 0.01, f req = 10 festgelegt. Die Sensorwerte und synaptischen Gewichte werden mit Zufallszahlen initialisiert. Nach einigen Abbildung 6: Motorsignale Durchläufen stabilisieren sich die Gewichte und die Motorsignale y schwingen phasenverschoben zwischen -1 und 1. Auch die Reihenfolge der Flanken ist ideal um eine Drehung des Rades zu erzeugen. Problematisch ist die hohe Frequenz, die auch mit den Lernparametern nicht ausreichend verringert werden kann, da zu stark verı̈¿ 21 derte Startwerte 7 eine vı̈¿ 21 lig andere Dynamik des Systems verursachen. Um die Frequenz dennoch zu reduzieren kann man das zi zu einem Update umformulieren und so eine Trı̈¿ 12 heit des Neurons erreichen. λ ist eine Zeitkonstante mit der die Stı̈¿ 21 ke der Trı̈¿ 12 heit festgelegt werden kann. X ∆zi = λ( (xn ∗ cij ) + Hi − zi ) j Abbildung 7: Motorsignale Die Frequenz ist ungefär 40 mal kleiner als zuvor und würde das Rad zum drehen bringen. Der Quelltext: for(;;) { for (i =0; i < 5; i++) { E[i] = (x[i] - y[i]) * (x[i] - y[i]); k[i]=c[i][1]*a[i][1]; for(j=0;j<3;j++) c[i][j] += epsilonc *tanh((1 - tanh (z[i]) * tanh (z[i]))* (a[i][j] - 2 * k[i] * y[i] *x[(i+j+4)%5]) - gam * c[i][j]); h[i] += epsilonc * tanh(-2 * k[i] * y[i]* E[i] * freq * (1 - tanh (z[i])* tanh (z[i]))); z[i] += lam*((x[i] * c[i][1] + x[(i+4)%5] * c[i][0] +x[(i+1)%5] * c[i][2] + h[i])-z[i]); } 8 for (i = 0; i < 5; i++) { y[i] = tanh (z[i]); x[i] = y[i] + r*n(); } } 2.1.2 neuronales Netz als Modell 2.1.3 Rad-Simulation 2.1.4 serielle Schnittstelle 2.2 Gnuplot Abbildung 8: Motorsignale Gnuplot ist eine Software mit der man Funktionen oder Datensätze graphisch darstellen kann. Das Programm eignet sich besonders für die Auswertung von Messwerten und ist in den Linux-Paketen enthalten. Da die Bediennung nur über die Konsole möglich ist, erstellte ein wissenschaftlicher Mitarbeiter bereits verschiedene Template-Klassen, welche die Verwendung vereinfachen und in Echtzeit ermöglichen. Meine Aufgabe bestand darin weitere Klassen zu erstellen. 9 PlotLog Erzeugt ein Gnuplot-Fenster und ein Gnuplot-Logfile gleichzeitig. Ist hilfreich wenn die selben Daten in eine Datei geschrieben und in einem Gnuplot-Fenster angezeigt werden sollen, da die Funktionen addChannel und putData nicht zweimal aufzurufen sind. PlotDlg Ein Dialogfenster nur für Qt-Anwendungen in Verbindung mit der Klasse Gnuplot oder PlotLog. Einzelne Kanäle lassen sich während des Plotvorgangs ein- und ausschalten und der Bereich der abgebildeten Daten verändern (Zoomfunktion). GnuplotText In Verbindung mit der Gnuplot-Klasse besteht die Möglichkeit über eine Zeichenkette den Plotvorgang für einzelne Kanäle ein- und auszuschalten. Eine Erweiterung dieser Klasse kann für den Khepera-Simulator verwendet werden. (GnuplotSIM) 2.3 Kephera-Simulator Der Kephera ist ein kleiner Roboter mit acht Näherungssensoren und zwei Motoren. Er wird in der Schweiz in produziert. Die Software zum Kephera ist ein Steuerprogramm und eine Simulation zu gleich. Dem Anwender steht ein Programmabschnitt user.c für die eigene Programmierung der KI zur Verfügung. Zum einen war es meine Aufgabe Abbildung 9: Motorsignale die alte Geschwindigkeitsmessung des Roboters durch eine neue zu ersätzen. Die alte Messung gab nur ganzahlige Werte zurück, welche für ein neuronales Netz zu sprunghaft seinen können. Die Idee war es, den Wheel-Counter und den Timer für die Berechnung 10 der Geschwindigkeit zu verwenden. In jedem Rechenzyklus wird die Geschwindigkeit des Roboters über W egdif f erenz/Zeitdif f erenz neu berechnet. Die Rückgabewerte haben so eine höher Aufgelösung und sind genauer. Zum anderen schrieb ich eine kleine Funktion die über die Näherungssensoren erkennen sollte, ob der Kephera mit der Hand umgesetzt wird. Der Funktion werden die acht Werte der Näherungssensoren übergeben und es wird geprüft wie sich die Sensorwete untereinander verhalten. Wenn zum Beispiel die vorderen und hinteren Senoren aktiv sind, gibt die Funktion ein true zurück, da es sich nicht um eine Wand oder ein Ball handeln kann. 2.4 SNN-Simulator Der Stuttgarter Neuronales Netz Simulator wurde an der Universität Stuttgart entwickelt. Die graphische Oberfläche ermöglicht ein einfaches und schnelles Erstellen von neuronalen Netzen. Unter Verwendung einer Pattern-File (Datei in der Inputs und ZielOutputs gespeichert sind) kann das Netz angelernt werden. Dazu stehen verschiedene Lernalgorithmen zur Verfügung. Aus dem angelernte Netz kann eine C-Klasse erstellt werden, so dass eine weitere Verwendung des neuronalen Netz ausserhalb des Simulators möglich ist. Ich verwendete den SNNS dazu, ein neuronales Netz zu erstellen, welches Abbildung 10: Motorsignale die Position eines Objektes, von einem Kephera-Roboter gesehen, als Winkel bzgl. des Roboters ausgibt. Als Input des Netzes werden die acht IV-Sensoren verwendet. Um das Netz anzulernen, benötigt man eine Reihe von Datensätzen, die das Verhalten der 11 Sensoren in Bezug auf die Position des Objektes zeigen. Diese Daten mussten zuvor aufgenommen werden. Dazu legte man das Objekt (kleiner Ball) neben den Roboter und liess den Roboter um sich selbst drehen. So erhält man die gleichen Messdaten, als wenn man den Ball um den Roboter drehen würde. Die Zeit und die Sensorwerte wurden währendessen in einem Logfile gespeichert. Um das Logfile als Patternfile für den SNNS zu nutzen, waren noch einige Anpassungen notwendig. Dazu schrieb ich ein kleines C-Programm welches die Daten des Logfiles einlass und sie in die Form eines SNNS-Pattern-Files brachte. Der Winkel, den das Netz lernen sollte, berechnete ich aus der Zeit, die neben den Sensorwerten aufgenommen wurde. Mit dem fertigen pat-file konnte das neuronale Netz, welches mit wenigen Mausklicks erstellt war, angelernt und in einen C-Quellcode umgewangelt werden. Das Ergebniss zeigte Erflog. Das neuronale Netz gab die Position des Balls richtig an. 12