PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : weltweit erstes Neuronales Jordan Netz auf Arduino Due !



HaWe
17.08.2015, 22:43
mein letztes größeres Projekt:
das weltweit erste Neuronale Jordan Netz (Neural Net) auf Arduino Due !
(lernfähiges mehrschichtiges rückgekoppeltes neuronales Netz):

http://www.mindstormsforum.de/viewtopic.php?f=70&t=5601#p67272
(Stand: 30.5.2015, inzwischen in einigen Modulen weiter entwickelt)

share and enjoy!

HaWe
18.08.2015, 10:25
Stiichwörter für Suchmaschinen:
Neuronales Netz Neural Net Jordan Netz Jordan Net Backpropagation Netz Backpropagation Net
rückgekoppeltes Neuronales Netz Recurrent neural network

http://www.mindstormsforum.de/viewtopic.php?f=70&t=5601#p67272

Rabenauge
18.08.2015, 11:19
Zweifellos eine tolle Leistung aber: ich denke, nicht nur mir geht es so, dass ich den konkreten Nutzen nicht wirklich erkenne.
Da hilfts auch nix, wenn du es mehrmals postest. :)

Im Ernst: ich hab sogar ein Buch über Neuronale Netze, und generell interessiert mich das Thema schon, aber scheinbar kann einem _niemand_ in vernünftigen Worten und mit nem _konkreten, funktionierenden Beispiel_ erklären, welche Vorteile da sind...von einigen speziellen Anwendungen abgesehn (Sprach-oder Mustererkennung, aber solche Sachen gehn auch _ohne_ neuronale Netze ganz gut).
Immerhin isses ja doch ein ziemlicher Aufwand.
Und: ich hab den Beitrag bei Mindstorms überflogen (für mich redest du wie ein Wissenschaftler, die Hälfte versteh ich nich), aber ich bin _nicht_ schlau draus geworden, wozu genau das nun in deinem Fall gut sein sollte.

Erklär es mal, wenn du ne Diskussion willst- aber bitte auf deutsch.:)

HaWe
18.08.2015, 11:41
besser als ich es unter http://www.mindstormsforum.de/viewtopic.php?f=70&t=5601#p47811 (und folgende Posts) auf deutsch erklärt habe, kann ich es leider nicht erklären (außer, ich würde sehr weit ausholen und ein eigenes Buch darüber schreiben....)

Aber es gibt ja bereits sehr gute Bücher darüber, um die Grundlagen und auch Anwendungsbereiche zu erklären, ich könnte es selber nicht annähernd so gut selber schreiben, und es würde verständlicherweise den Rahmen eines Forums-Topics sprengen. Die Betonung bei dieser Art KI liegt eben auf "lernfähig", und zwar zur Laufzeit - d.h. Lernen an Erfolg und Misserfolg, so wie es lebendige Wesen tun: das finde ich das Faszinierende daran.
Aber man braucht zum Verständnis auch zugegebenermaßen sehr gute Mathekenntnisse, das stimmt.
Auch kann man bestimmte Aufgaben sicher auch anders lösen, auch das stimmt, nur muss man dazu den Zweck und alle Reaktions-Möglichkeiten bereits vor der Compilierzeit kennen und festlegen -
aber noch nichtmal diese spezielle Aufgabe oder Zweckbestimmung muss ich aber beim neuronalen Netz schon zur Compilierzeit definieren, denn jedes Verhalten kann theoretisch erst später zur Laufzeit trainiert werden (die passende Sensorik und Motorik vorrausgesetzt).

Außerdem ist ein Neuronales Netz nach entsprechendem Grund-Training auch in der Lage, völlig neue Situationen zu erkennen und auf sie sinnvoll zu reagieren, die vorher überhaupt noch nie definiert oder trainiert wurden (evtl weil sie gar nicht vorhersehbar waren), und dies funktioniert allein aus der Kenntnis der bereits bekannten (rudimentären) Lernmuster heraus.
Aber ebenfalls ja: auch das Grund-Training ist bereits sehr aufwändig, nur lernt ja auch ein Kind nicht in 1 Tag auf 2 Beinen zu gehen.

Ich selber beschäftige mich auch schon seit ca. 9-10 Jahren mit der Thematik und mir waren die beiden Bücher
Lämmel+Cleve, Künstliche Intelligenz, Lepzig 2004 (2) und
Burkhard Lenze, Einführung in die Mathematik neuronaler Netze, Berlin 2003 (2)
sehr hilfreich.
Beide sind sehr gut verständlich, und ich bin sicher, wenn du sie erfolgreich durchgearbeitet hast, dann siehst auch du deutlich klarer.
Orientierend kannst du dir sicher auch Videos bei Youtube ansehen, um einen sehr groben Überblick zu bekommen (ich habe früher auch mal so angefangen, allerdings war da die Ausbeute noch deutlich geringer als heute) - ein Lehrbuch werden sie sicherlich aber nicht ersetzen:

https://www.google.de/search?q=youtube+neural+net&ie=utf-8&oe=utf-8&gws_rd=cr&ei=XgzTVbrINKnoywO265OwBQ

Diese beiden Videos habe ich gerade selber unter dieser Google-Suche zum ersten Mal gesehen, ich finde sie ganz nett, wenngleich sie auch sehr speziell und alles andere als erschöpfend oder absolut repräsentativ sind:


https://www.youtube.com/watch?v=0Str0Rdkxxo


https://www.youtube.com/watch?v=d_05KBoKBTA

Andre_S
19.08.2015, 08:12
Hallo,

interessantes Thema!

Hatte mich vor Jahren auch mal näher damit beschäftigt und um es etwas besser zu verstehen einen Mini-Taschenrechner auf dieser Basis erstellt. Das Ganze war einfach und überschaubar, sowie auf Grund des minimalen Leistungsumfanges auch recht schnell angelernt.
Als Beispiel konnte ich mir das Ganze dann auch noch bei zwei Antriebs-Motoren, einem Bumper und zwei gerichteten Entfernungsmessern vorstellen, wobei auch der Lernprozess schon erheblich wäre.

Allerdings habe ich dann Überlegungen getroffen, wie ich dies unter den Gesichtspunkten bezüglich des aktuellen Bot anwenden könnte.
- drehzalreguliertes Antriebssystem mit Encodern, Rampen, sowie Strom und Spannungüberwachung
- mehrere Sonarsensoren mit verschieden ausgerichteten Keulen
- Kollisionsbumpern
- Kinect-System zur Tiefenmessung bei Umrissprojektion
- Kompass und Lagesensoren
- inzwischen auch noch ein Rotationslaser
Hinzu kommen verfälschte Messwerte durch Umgebungseinflüsse, besonders beim Kompass aber auch andere Einflussfaktoren.

Da fehlte mir dann völlig der Ansatz für ein neuronales Netz, was beherrschbar , noch zeitrelevant anlernbar wäre und letztendlich auch noch ein komplexes Ziel verfolgen könnte. Also später mehr als nur eine kollisionsfreie Bewegung. Einfach nur ein trial & error führt da wohl in absehbarer Zeit nicht zum Erfolg.
Und das ist ja „nur“ das Antriebssystem,… da kommen ja noch viele andere Dinge, wie Spracherkennung, Ausgabe, Raderdedektion, Objekterkennung etc. hinzu.

So gesehen habe ich mich ganz schnell wieder den für mich überschaubaren Möglichkeiten gewidmet, denn zu einem „Chappie“ ist es wohl noch ein sehr sehr langer Weg.


Gruß André

shedepe
19.08.2015, 08:34
Ich finde das Thema neuronale Netze auch faszinierend.
Möchte aber auch nachdem die neuronalen Netze hier überschwinglich gelobt wurden auch mal die Schattenseiten davon aufzeigen.
Zum einen wie schon erwähnt: Die Beherrschbarkeit bzw. komplexität des Netzes. Viele Ein und Ausgabevektoren bedeuten auch einen enormen Lernaufwand. Hier muss man zunächst die Ein und Ausgabeschichten passend modellieren, und danach einen ausreichend großen Satz an Testdaten bereitstellen. Insbesondere in der autonomen Robotik zeigen sich hier bereits die ersten Probleme auf. So kann man bei Bildverarbeitung sehr leicht passende Testdaten generieren, will man jedoch einem Roboter autonome Navigation durch eine unbekannte Umgebung beibringen steht man hier vor einigen Problemen.

Weiterhin hat man bei neuronalen Netzen gerne auch Probleme, dass das Netz auf ein bestimmtes Merkmal aber nicht den allgemeinen Fall trainiert wird. Beispiel hierfür. Ein Netz soll auf Fahrzeuge eines bestimmten Herstellers trainiert werden. Mit den Testdaten klappt das auch wunderbar, in Praxis jedoch gar nicht. Es stellt sich dann heraus. Die Testbilder hatten alle hellen Hintergrund, da Netz hat den hellen Hintergrund und nicht Merkmale des Fahrzeugs gelernt. In diesem Fall klingt das Problem leicht vermeidbar, diesen Fehler kann es jedoch auch wesentlich weniger offensichtlich geben.

Am Institut für Anthropomatik bei uns an der Uni war das Argument gegen neuronale Netze: Man kann nicht einsehen was das Netz letzendlich macht. Man kann nicht zeigen, dass der vom Netz gefundene Algorithmus optimal für das Problem ist. Nachdem man auch nicht einsieht, was das Netz macht kann man auch kaum von Hand nachoptimieren. Insbesondere in der Industrierobotik ist das stark von Nachteil, da man hier Zeit und damit Kosten sparen will bzw. muss.

HaWe
19.08.2015, 09:23
was die Praktikabilität in bestimmten technischen oder industriellen Steuerungen angeht, gebe ich euch völlig recht -
man kann sicher umschriebene Probleme durch andere Algorithmen oder Filter ebenfalls lösen, ich denke da nur an den Kalmanfilter oder den Partikelfilter oder AStern oder Bug2 oder Probleme wie das des "travelling Salesman".
Die "Durchschaubarkeit und Nachvollziehbarkeit" ist hier für mich gar nicht das durchschlagende Argument, gerade bei AI lege ich hier dieselben Maßstäbe an wie in der Psycholgie beim operanden Konditionieren - da weiß ich ja auch nicht, was genau im Hirn des Trainierten vorgeht, ich sehe nur die Reize, und dann die daraus erfolgende Reaktion.
Mein Ansatz war eher: mal auf einem Due ein wirklich komplexes KI Programm zu programmieren, das alle beliebigen Situationen trainierbar macht, samt Erinnerungsvermögen per Rückkopplung, in einem Umfang, was hier grade so machbar ist.

Letzlich war ich bei der Entwicklung selber sehr erstaunt, was da so an cpu-Resourcen nötig wird, wenn man etwas umsetzen will. Ich dachte zwar schon, ein DUE käme damit an seine Grenzen, und ich habe ehrlich gesagt auch vorgehabt, die eigentliche spätere Weiterentwicklung auf einem viel mächtigeren TRE vorzunehmen (den es ja wohl jetzt nicht mehr geben wird). Herausgestellt hat sich dann aber, dass der DUE in der vorliegenden Implementierung nur gut 60 Reiz-Reaktionsmuster lernen kann (ich hatte ursprünglich schon mindestens 10 mal so viele von allen auf dem DUE vorgesehen gehabt), aber immerhin konnte ich zeigen, dass sowohl die Implementierung eines rückgekoppelten Backpropagation Netzes und auch dann dessen autonomes Training theoretisch und auch praktisch auf einem DUE möglich und durchführbar ist. Mit den sehr beschränkten Möglichkeiten des DUE für diese Applikation zeigt es aber doch hier erstmalig immerhin: Es geht, es funktioniert prinzipiell und auch praktisch, und das Verhaltens-Training samt User-Interface sogar zum manuellen Patchen der Neuron-Matrix ist mit einfachen Button- und Display-Menü-Steuerungen machbar !
Auch lässt sich das antrainierte "Wissen" multipel abspeichern, dann ein alternatives Training durchführen, dieses ebenfalls abspeichern und dann wieder ein anderes (früheres oder leeres) "Gedächtnis" während der Laufzeit laden: Total Recall auf dem Arduino ^^.

Das hat immerhin bisher noch niemand auf dieser Plattform etablieren und zeigen können.

Das Programm spannt hierbei ein skalierbares Netz aus 60 Neuronen auf (plus Input-Layer von gut 100 reelen und virtuellen Sensor-Inputs), man muss zur Erweiterung nur die Konstanten für die Neuronen-Layer und die max. Lernmusterzahl vergößern:


#define NMAXIN 108 // max number of inputs (sensors)
#define NMAXHID 20 // max number of hidden layer neurons
#define NMAXOUT 20 // max number of output layer neurons
#define NMAXCONT NMAXOUT // max number of context neurons
#define NMAXPAT 60 // <<< max number of possibly trained patterns;

und schon hat man sein persönliches Netz an seine persönlichen Anforderungen auch größerer cpus mit mehr Speicher-Resourcen angepasst.
Mein Wunsch hierbei:


#define NMAXIN 1000 // max number of inputs (sensors)
#define NMAXHID 250 // max number of hidden layer neurons
#define NMAXOUT 250 // max number of output layer neurons
#define NMAXCONT NMAXOUT // max number of context neurons
#define NMAXPAT 5000 // <<< max number of possibly trained patterns;

Legt man zugrunde, dass der DUE 96kB RAM hat, und dass dieses mit den bisherigen Neuronen bis Oberkante Unterlippe ausgelastet ist, kann man sich schnell ausrechnen, in welche RAM-Größenordnungen man hier vorstoßen müsste, denn die Mächtigkeit der Netz-Matrix (d.h. des Neuronennetzes und das Gedächtnis für alle seiner trainierten Lernmuster) beträgt ja etwa (Neuronenzahl * Lernmuster).

Aber es geht!

Man reiche mir eine cpu mit entsprechender Leistungsfähigkeit und portiere das Sketch-Programm auf diese andere Plattform,
dann braucht man einzig und allein die #define-Konstanten auf die gewünschte Größe zu ändern und zu kompilieren, und, voila, schon hat man ein weit größeres lernfähiges rückgekoppeltes Netz mit Erinnerungsvermögen.

Hätte ich einen TRE, der mit Sketch/Wiring programmierbar ist, würde ich es innerhalb von 30 Sekunden eben mal schnell machen. 8-)

Holomino
19.08.2015, 10:00
Hallo HaWe,

einige Fragen hab ich dazu.

- Ist diese Funktion "Summe(Eingänge) * Gewicht - Schwellwert" in der gezeigten Grafik "Schematischer Aufbau eines Computerneurons" die intern ablaufende Neuronfunktion? (Klingt so überraschend simpel).
- Im ersten verlinkten Video sehe ich am unteren Rand so eine Pünktchengrafik. 5 Pünktchen hoch und gaaanz breit. Was zeigt die genau? Sind die flimmernden Pünktchen die Ausgänge der Neuronen? Und in welche Richtung laufen die Schichten? Bei 5 eingezeichneten Linien als Abstandswerte liegt der Verdacht nahe, es läuft horizontal durch die Schichten? Allerdings sehe ich dann die Ausgänge nicht.
- Wenn Du so ein Netz aufbaust und anlernst, wie legst Du fest, wieviele Schichten du brauchst und wie breit eine Schicht sein muss? Ist das einfaches Ausprobieren oder steckt da eine Logik hinter? (Ich hab mal so was ähnliches, wie im ersten Video mit mehreren PID-Reglern durchsimuliert, da war mir recht schnell klar, was ich an Reglern brauchte und wie ich sie untereinander in Relation zu setzen habe. Naja, die Regelparameter musste ich natürlich selbst einstellen).
- In Bezug auf die vorhergehende Frage: Ein neuronales Netz löst eine Problemstellung. Bezogen auf das erste Video kann ich mir gut vorstellen, dass die Bahn des Autochens auch ein Rundkurs sein kann oder einige Kurven mehr haben kann. Die Problemstellung ist ja gelöst, das Autochen wird auch diese neuen Routen meistern können. Wenn ich jetzt aber z.B. eckige 90°-Winkel-Kurven in den Parcours einführe und deshalb ein Umlernen/ Erweitern des Netzes erforderlich ist (du bekommst ja ganz andere Eingangswerte der Sensoren mit sprunghaften Änderungen), ist dann der gesamte vorhergehende Lernvorgang für die Katz oder kannst Du dann nach der Erweiterung des Netzes noch irgendetwas von den alten Neuron-Parametern verwenden? Also hat das Netz dann etwas dazugelernt oder die neue Problemstellung komplett neu erlernt?

Sorry, die Fragen mögen etwas naiv klingen, allerdings hab ich überhaupt keine praktische Erfahrung mit neuronalen Netzen. Aber interessieren tut's mich trotzdem.:p

HaWe
19.08.2015, 10:31
hallo,
was das einzelne Neuron angeht: ja, das stimmt, es folgt aber noch die Aktivierungsfunktion.
Trainiert werden die Gewichte und die Schwellwerte eines jeden einzelnen Neurons, und bei jedem einzelnen Lernschritt innerhalb eines zusammenhängenden Lern- bzw. Trainings-Zyklus' wird dazu-gelernt, nichts wird gelöscht - aber möglicherweise wird altes Wissen modifiziert, eingeschränkt, erweitert, generalisiert, was auch immer, damit jetzt immer noch oder wieder alles gelernte zusammenpasst. Nur wenn eine bestimmte Input-Konstellation aller 100 oder 1000 Inputs 100%ig mit einer früher trainierten identisch ist und wenn nun die neue Reaktion die alte ersetzen soll, wird die neue die alte überschreiben - leicht unterschiedliche Muster-Konstellationen werden nebeneinander existent bleiben.

Wie das genau funktioniert, kann ich hier nicht erklären, ich müsste dazu hier ein eigenes Lehrbuch schreiben - ich muss daher auf die beiden oben erwähnten Lehrbücher verweisen.

Was die Programme in den Videos genau machen, weiß ich nicht, sie sind nur illustrativ und stammen nicht von mir selber, aber in dem darüber stehenden Suchlink findest du weitere, die ggf. besser erklärt und weiter verlinkt sind.

In meinem NN-Thread
http://www.mindstormsforum.de/viewtopic.php?f=70&t=5601#p67273
http://www.mindstormsforum.de/viewtopic.php?f=70&t=5601#p47811
habe ich erklärt, was mir in der Kürze eines Forums-Topics möglich ist, daher muss ich für weitergehende Erklärungen auf Fachbücher verweisen, auch im Internet findet sich einiges - z.B. auch
http://www.cs.bham.ac.uk/~jxb/NN/nn.html

Robobionic
19.08.2015, 21:11
Mein Ansatz war eher: mal auf einem Due ein wirklich komplexes KI Programm zu programmieren, das alle beliebigen Situationen trainierbar macht, samt Erinnerungsvermögen per Rückkopplung, in einem Umfang, was hier grade so machbar ist.

Hallo HaWe, erstmal Gratulation für Dein Projekt.

Ein Lernfähiges System ist natürlich auch unabhängig von der Rechendauer etwas ziemlich kostbares, vor allem wenn man es unter diesen Voraussetzungen entwickelt hat.
Die Realtime Berechnungsgrenzen und Lernzeit über native code zu optimieren hat Dir wieviel an Zeit gebracht?

Du hattest das Projekt ja mit Backpropagation begonnen, also keine Möglichkeit die erlernten Erfahrungswerte und Muster abzurufen.
Demnach war das Stunden oder Tagelange lernen umsonst und musstest nachträglich jede Menge Aufwand investieren um es überhaupt irgendwie autonom hinzubiegen.

Dein Aufwand ist schon bemerkenswert, aber wie gehst Du mit der Skalierbarkeit um?
Ich meine für den praktischen Einsatz müssen die Neuronengrenzen doch Hardwarebedingt echt ein Alptraum für Dich sein.

Wie auch immer, danke das Du Deine Leidenschaft mit uns teilst ... Tolles Projekt.

HaWe
19.08.2015, 21:50
ich bin nicht sicher, ob ich dich richtig verstehe - aber über Backpropagation Learning laufen sowohl das "einfache" als auch das Jordan Backpropagation Netz.
Beide Netze können grundsätzlich ihre Lern-Matrix auf SD Card speichern und wieder abrufen.
Der Unterschied ist, dass das Jordan-Netz auch bei identischen punktuellen Sensorkonstellationen berücksichtigen kann, wie sich ihr ZUstand in der zurückliegenden Vergangenheit entwickelt hat: hier habe ich es erklärt:
http://www.mindstormsforum.de/viewtopic.php?f=70&t=5601#p67272

Begonnen habe ich aber nicht mit Backpropagation, sondern mit einschichtigen Feed-Forward-Netzen und der der Perception Training Rule.

Die Skalierbarkeit heißt nichts anderes, als dass ich die Netzmatrix-Dimension frei durch einfache Definitionen der Arraygrößen vorwählen kann, so kann ich die Netzgröße und die Anzahl der gelernten Input-Output-Pattern den Erfordernissen und der cpu bzw. dem verfügbaren RAM jederzeit anpassen, ohne das ganze Programm neu schreiben zu müssen. Alle Neuronen samt allen ihren Verknüpfungen miteinander in sämtlichen Schichten werden automatisch angepasst und korrekt initialisiert. Einfach nach Größenänderung neu kompilieren, fertig, läuft.

Im Moment ist es für den DUE ausgereizt, für größere cpus / RAM könnte man es noch ein Riesen-Stück hochskalieren (hätte man z.B. einen TRE mit Sitara und mit 1GB statt 96kB RAM samt Sketch/Wiring per Arduino IDE). Da es den aber nicht gibt, ist hier für mich erstmal Ende Gelände mit dem momentanen Ausbau.
https://blog.arduino.cc/category/arduino/tre/

Aber vielleicht kommt er ja doch noch irgendwann, oder irgendwer bringt irgendwann WiringPi samt Arduino-IDE auf einem Raspi etc. zum Laufen.

Nicht verstanden habe ich allerdings deine Frage "Die Realtime Berechnungsgrenzen und Lernzeit über native code zu optimieren hat Dir wieviel an Zeit gebracht?"

Robobionic
20.08.2015, 07:12
Begonnen habe ich aber nicht mit Backpropagation, sondern mit einschichtigen Feed-Forward-Netzen und der der Perception Training Rule.


Klar, mir gings um Deinen Plan und Implementierung der mehrschichtigen Netze.
Dein Netz hat zu dem Zeitpunkt also immer alles neu berechnet aber noch nicht gelernt , zumindest konnte es durch Erfahrung noch keine Entscheidungen treffen.




Nicht verstanden habe ich allerdings deine Frage "Die Realtime Berechnungsgrenzen und Lernzeit über native code zu optimieren hat Dir wieviel an Zeit gebracht?"

Speichergrenzen waren für Dich ja keine optimalen Voraussetzungen wegen limitierter Neuronen.
Durch die Abhängigkeit mehrschichtiger Netze musstest Du ja das Lerntraining optimieren.

Waren native Executables nur Deine Theorie, oder hast Du dadurch die Performance der NXC VMs in den Griff bekommen?




Im Moment ist es für den DUE ausgereizt, für größere cpus / RAM könnte man es noch ein Riesen-Stück hochskalieren (hätte man z.B. einen TRE mit Sitara und mit 1GB statt 96kB RAM samt Sketch/Wiring per Arduino IDE). Da es den aber nicht gibt, ist hier für mich erstmal Ende Gelände mit dem momentanen Ausbau.
https://blog.arduino.cc/category/arduino/tre/

Das hatte mich interessiert, danke. :)

HaWe
20.08.2015, 08:10
Ach so, du meinst die beiden Plattformen NXT vs. DUE im Vergleich...:

cpu-Takt NXT=48MHz, DUE=84 MHz,
RAM NXT =48kB , DUE=96kB

Viel extremer sind aber execution speed und auch verfügbares RAM während der Laufzeit, da der NXC-Bytecodeinterpreter sehr langsam ist und selber als VM auch RAM benötigt (frei mit NXC-VM=30kB). Mein Benchmark-Test http://www.mindstormsforum.de/viewtopic.php?p=64772#p64772 verdeutlicht es besser.

Die Geschwindigkeit von Sketch C Execetubles auf Arduino DUE gegenüber NXC-Bytecode ist bei dieser Applikation (mit überwiegend float-Arithmetik, aber auch umfangreicher Pointer-Nutzung ) in etwa 200x schneller.

(edit: ) Was die Netzarchitektur angeht, so bietet der DUE grob geschätzt ein halbes Dutzend mal so viel Speicher für Neuronen, direkt vergleichen kann ich es nicht, da FF- und Jordan-Netze in ihrem Code nicht vergleichbar sind. Allein die Jordan-Netzstruktur verschlingt aber schon extrem viel RAM, besonders beim Training für temporäre Variablen (gut noch mal so viel wie das reine Netz).

HaWe
20.08.2015, 14:41
gerade erst gelesen...:

Dein Netz hat zu dem Zeitpunkt also immer alles neu berechnet aber noch nicht gelernt , zumindest konnte es durch Erfahrung noch keine Entscheidungen treffen.

nee, wie kommst du darauf? Dinge lernen und entsprechend der Netzmatrix aus den Inputs (Reizen) die entsprechenden Outputs (Reaktionen) generieren, dann gelernte Dinge als "Gedächtnis" auf Flash oder SD speichern, später wieder ein "Gedächtnis" der gelernten Dinge laden:
das könnrn bzw. konnten alle Netze (bereits schon die FF-Netze auf dem NXT), es ist ja nur eine simple Datensatz-schreib/lese-Funktion, die unabhängig vom Netz mit allen möglichen Daten funktioniert. Ich habe lediglich ein paar neue SD-API-Funktionen ähnlich denen von stdio.h dafür zusätzlich geschrieben (u.a. fprintf und fscanf), da es sie bei Arduino noch nicht gab.

Robobionic
20.08.2015, 15:07
Hallo HaWe, da habe ich mich wohl etwas missverstaendlich ausgedrueckt.

Ich war davon ausgegangen das Du Dir am Anfang noch nicht sicher ueber die Anforderungen und zukuenftige Entwicklung warst.

Ich kam darauf weil Backpropagation keine Moeglichkeiten fuer "Erinnerungen" bietet. Ich dachte dies sei der Grund fuer Dich gewesen weshalb Du es dann erst spaeter mit Jordan umgesetzt hast.

HaWe
20.08.2015, 16:40
ich glaube, das mit den "Erinnerungen" hast du falsch verstanden.
Erinnern an gelernte Muster kann sich jedes Netz (z.B. beim mobilen Robot bei <50 cm Abstand ein Hindernis umfahren oder beim Anstoßen in Stück zurückfahren),
aber ein Jordan Netz hat noch ein zusätzliches "automatisches Kurzzeitgedächtnis", um Situationen besser einzuordnen ("Was ist gerade kurz vorher geschehen und was hat sich soeben verändert?").
Wenn nämlich der Abstand jetzt zwar 49cm ist, aber kurz vorher war er noch 47cm, dann entfernt er sich ja bereits wieder und muss gar nicht mehr irgendwas umfahren. Das könnte z.B. bei einem Tier als Hindernis passieren, das sich inzwischen bewegt hat - oder er fährt bereits schon schräg dran vorbei oder sogar rückwärts - oder was auch immer.
Ich fürchte, du musst dazu wirklich mal eine gewisse Zeit investieren, um dich in die Theorie der Neuronalen Netze einzuarbeiten... bei mir sind es insgesamt fast 10 Jahre, allerdings mit enormen Unterbrechungen... ;)

Robobionic
22.08.2015, 00:29
Ja, ein spannendes Thema.

Das von Dir genannte Beispiel ist für die praktische Anwendung in der Robotik von hoher Bedeutung.

Je nach Anwendungszweck müssen autonome Roboter so schnell wie möglich auf ihre Umwelt reagieren.
Das hat jetzt nur noch wenig mit Deinem Projekt zutun aber für die zukünftige Netze ist es ein unverzichtbares Thema.

In der Praxis haben bisherige Modelle neuronaler Netze einige Nachteile, eines davon ist das wir vorhandenes Wissen nicht
auf autonome Systeme übertragen können. Erfahrungen kann man nicht kopieren und vererben sondern müssen immer trainiert werden.
Erschwerend hinzu kommt das Trainingsdaten nur simuliert werden und sehr Anwendungsspezifisch sind.

Kompliziert wird es also immer dann wenn ein autonomes System vor ungelösten Aufgaben steht.
Die Königsklasse künstlicher Intelligenz.

Um Entscheidungsbäume zu entwickeln braucht es immer Antworten die sich durch mangelnde Erfahrung
in bisher gelernten Mustern nicht so leicht finden lassen. Das System ist also Situationsbedingt
unfähig selbstständig zu entscheiden.

Um das zu verbessern orientiert man sich heute immer mehr an der Funktionsweise des menschlichen
Gehirns, genauer gesagt an unserem Großhirn. Den Ansatz verfolgt auch IBM mit True North,
ein Prozessor der die Neocortex von Säugetieren in einfacher Form simuliert.

Die Leistung wird aber erst durch Spiking Netze möglich die sich somit auch besser eignen als Multilayer Perceptron
vor allem dann wenn es sich um Anwendungsbereiche wie Sensorik und Mustererkennung handelt.

HaWe
22.08.2015, 08:54
das klingt jetzt wie irgendwo abgeschrieben...
aber es stimmt so nicht ganz:

Selbstverständlich ist mein Jordan Netz für den DUE ja als autonomes System konzipiert,
gelerntes / trainiertes Wissen kann in mannigfaltiger Weise auf SD abgespeichert werden,
und wenn das Netz (als compiliertes .ino- Programm) auf einem anderen Due hochgeladen wurde, dann kann man selbstverständlich die woanders trainierten Daten auch hier von der originalen oder einer beliebigen kopierten SD card lesen, verarbeiten, modifizieren, abspeichern, und dann wieder auf der ersten oder einer 3. oder 4. MCU lesen, laden, und verarbeiten.

Aber selbst wenn der Netz-.ino-Sourcecode in seiner Struktur nicht per Arduino IDE für den DUE kompiliert wurde, sondern auf GCC/Geany für RasPi portiert wurde und als .cpp source für den Raspi kompiliert wurde (nur die reine Netz-Architektur muss die gleiche sein, damit alle Inputs und Outputs an den gleichen Array-Stellen landen), selbst DANN kann man das auf dem DUE trainierte Netz-Gedächtnis (sein erworbenes "Wissen") auf den Raspi kopieren - und es wird in identischer Weise auch dort laufen.

Das ist hier ja auch gerade ein - für manche Leser - neuer Aspekt meines autonomen Netzes.

Und du brauchst dir nur sämtlich Gewichte und Schwellwerte sämtlicher Neuronen auf einem Display anzeigen zu lassen (es sind ja alles nur simple floats in durchnummerierten arrays), schon hast du das Gedächtnis in "Zahlenform" und kannst direkte float-Werte bestimmter Neuronen manuell patchen - und schon hast du das Gedächtnis manuell modifiziert und kannst auch diese Gedächtnisversion wieder abspeichern für später. Genau so funktioniert ja auch das Speichern und Lesen des Gedächtnisses auf SD !

Willst du hingegen beim autonomen Betrieb (!) direkt bestimmte Input-Konstellationen mit einer bestimmten output-Reaktion "manuell designen" (d.h. manuell erstellte Matrix-patterns) , so kannst du dies auch tun:
Das User-Interface meines Programms bietet die Möglichkeit dazu!
Einfach nach dem input-output-verknüpfen per Knopfdruck einen neuen Trainingslauf durchführen (kannst du autonom ebenfalls jederzeit zwischendurch tun!), schon ist auch das neue manuell eingegebene pattern zusätzlich gelernt!

Aber auch andere von dir angeführte theoretische oder generelle Aspekte deines letzten Posts stimmen nicht, ich will aber jetzt hier nicht weiter darauf eingehen, denn es führt hier deutlich zu weit, und muss daher wieder auf entsprechende Lehrbücher verweisen.


ps,
Interessant finde ich allerdings die Frage, warum du hier in diesem Thread per Gastaccount schreibst - du bist doch sicher hier auch registrierter Benutzer in diesem Forum und schreibst hier sicher nicht zum ersten Mal - warum versteckst du dich also hinter "Robobionic (Gast)" ?

Robobionic
22.08.2015, 09:28
das klingt jetzt wie irgendwo abgeschrieben...
aber es stimmt so nicht ganz:

Selbstverständlich ist mein Jordan Netz für den DUE ja als autonomes System konzipiert,
gelerntes / trainiertes Wissen kann in mannigfaltiger Weise auf SD abgespeichert werden,
und wenn das Netz als Programm auf einem anderen Due hochgeladen wurde, dann kann man selbstverständlich die woanders trainierten Daten auch hier von der originalen oder einer beliebigen kopierten SD card lesen, verarbeiten, modifizieren, abspeichern, und dann wieder auf der ersten oder einer 3. oder 4. MCU lesen, laden, und verarbeiten.

Wie bereits erwähnt ging es in meinem Beispiel nicht mehr um Dein Projekt sondern allgemein um die Netztypen und ihre Leistung.
Die Nachteile haben also nichts mit baugleichen Robotern zutun bei denen man einfach mal von A nach B kopiert sondern
mit dem Wissen unabhängiger Systeme das man theoretisch teilen könnte, technisch aber noch nicht möglich ist.

HaWe
22.08.2015, 09:48
doch, auch das geht:
wenn du eine wichtige Verknüpfung (ganz simpel: auf einen bestiimten Sensor-Input einfach eine Rechtskurve fahren) auf einem Robi gelernt hast, dann brauchst du dieses input-output-Muster nur auf das andere System transponieren (ggf. die array-Indizes anpassen, wenn einmal der besagte Button an Input 10 hängt und das andere Mal an Input 11 und einmal die Motoren an D22-D31 und das andere Mal an D32-D41... das kann sogar automatisiert beim Einlesen der Daten erfolgen!) - und schon kann der 2. Robi genau das, was der 1. gelernt hat, nämlich bei einem bestimmtem Buttonclick rechtsrum fahren, selbst wenn der 1. einen ganz anderen Hardwareaufbau und ganz andere weitere Sensoren besitzt: alles was dazu nötig ist wäre ein Verfestigen des neuen Wissens per einmaligem Trainingszyklus.

Aber natürlich gilt das mit Einschränkungen, gewisse Ähnlichkeiten der Netze müssen schon vorhanden sein, man kann ja auch (bisher) kein Vogel-Gedächtnis auf einen Goldfisch portieren.

Robobionic
22.08.2015, 09:48
das klingt jetzt wie irgendwo abgeschrieben...
aber es stimmt so nicht ganz:
Interessant finde ich allerdings die Frage, warum du hier in diesem Thread per Gastaccount schreibst - du bist doch sicher hier auch registrierter Benutzer in diesem Forum und schreibst hier sicher nicht zum ersten Mal - warum versteckst du dich also hinter "Robobionic (Gast)"

Was ist denn daran bitte interessant? Klär diese belanglose Angelegenheit doch bitte mit dem Adminstrator wenn Du keine Gäste in einem Forum duldest ...

Ich nutze diese Möglichkeit weil registrierte E-Mail Adressen in vielen Foren irgendwann in Spamverteilern landen, nicht durch die Betreiber sondern über Dritte.
Von daher finde ich die Option in diesem Forum ganz nett.

Ich weiss ja nicht wieviele E-mails du bekommst, aber mich nervt das ganz gewaltig also vermeide ich unnötige E-Mail Registrierungen wo es nur geht.