Hier das Bild sorry :S
Druckbare Version
Hier das Bild sorry :S
Hallo zusammen. Ich arbeite derzeit an einem Netzsimulator in C++.
Mein Ziel ist es ein Programm zu entwerfen das einfach und autonom Netze für komplexe Anwendungen "züchtet"
Wie schon im Titel erwähnt beschreite ich dabei hinsichtlich der Lernfunktion ungewöhnliche Wege. Ich verzichte nämlich völlig darauf.
Zu Grunde liegt bei mir ein Neuronales Netz das Vollverbunden ist sowohl in vorwärts als auch in entgegengesetzter Richtung. Dadurch lässt sich ein zeitliches "Gedächtnis" realisieren
Wie lernt nun das Netz?
Ganz einfach: durch Mutation und Selektion. Eine Population von Standartnetzen wird auf eine Simulationswelt losgelassen. Die Gewichte sind rnd initialisiert.
Eine Fitnessfunktion ermittelt wie erfolgreich ein Netz ist.
Ist genügend Zeit vergangen werden schlechte Netze gelöscht, Erfolgreiche in mutierter Form vervielfältigt. Dabei werden sowohl Gewichte bzw. die Größe des Netzes geringfügig geändert.
Der ganze Prozess ist sehr zeitaufwändig, allerdings sollte sich ein sehr effizientes Netz herauskristallisieren, welches dann eventuell auf Hardware übertragen lässt.
Der eigentliche Sinn dahinter ist dass der Anwender nur Eingänge und Ausgänge, sowie die Fitnessfunktion anpassen muss, und automatisch gute Netze erhält
Was haltet ihr davon?
Bei Interesse gehe ich gerne auch auf Details ein
Vom Ansatz her klingt es phänomenal!
Würde gern mal Dein Programm in Aktion erleben, um gezeigt zu bekommen, ob Du die Anforderungen umsetzen konntest.
Das klingt wirklich vielversprechend, mehr Infos erwünscht :)
Nach welchen Regeln mutierst du die Netze? Oder auch nach Zufall?
mfg
Hört sich tatsächlich sehr interessant an. Ist es möglich dein Programm irgendwo einzusehen oder herunterzuladen würde es gerne in Aktion erleben.
Auch würde mich interessieren wie die Simulationswelt aussieht. Außerdem: was verstehst du unter "zeitaufwändig"? Ich versteh darunter eine Simulationszeit von ein paar Stunden für jede neue Population, sehe ich das richtig?
Fragen über Fragen ich hoffe es ist nicht zuviel ;)
beste Grüße
the.speciali
Die Netze laufen derzeit in der einfachsten Umgebung die mir eingefallen ist. Sie besteht aus einer 2d Welt ohne Objekte, mit einer Lichtquelle. Die Mutation erfolgt derzeit nach Zufall, später will ich eine Art Rekombination zwischen den Netzen einführen, allerdings weiß ich nicht ob diese Variante zielführend ist.
Der Zeitaufwand ist abhängig von Populationsgröße sowie Netzgröße. Derzeit laufen 400 Netze gleichzeitig. Nach 1000 Netzschritten wird ausgewertet. Dafür werden etwa 40 Sekunden benötigt. Ein akzeptables Netz wird bei einfachen Aufgaben etwa nach 100 Populationen erreicht sein, damit liegt die Lernzeit im Minutenbereich. Allerdings kann es bei Schwierigen Aufgaben durchaus Stunden / Tage dauern, da die Netzgröße erheblich steigt.
Zum runterladen gibts das Programm noch nicht, da ich noch mit einigen Problemen zu kämpfen habe, und das Interface zur Zeit nur unter Linux läut
In einigen Tagen werde ich dann wohl so weit sein das erste Netz zu "züchten"
Dabei werden die Netze einen Lichtsensor, sowie einen Wärmesensor haben und versuchen mit 2 Aktoren zur "Sonne zu fahren"
@yodakohl
Absatz 7.3 oben genanntes Skript
Es kommt darauf an, wie die Mutationsmechanismen funktionieren und die Mutabilität sich entwickelt und vererbt wird.
Wenn du einfach nur so einzelne Werte veränderst, wandelst Du mit linearen Schritten in einem nicht linearen Qualitätsgebirge. Mit jeder Zwischenschicht nimmt die Linearität ab, bzw. steigt die Exponentialität an. Deswegen gibts die Lösung des Optima-Findens im Backpropagation über eine nichtlineare Aktivierungsfunktion, dank vollständiger Stetigkeit und damit voll differenzierbar.
Die Rückkopplung verstärkt die nichtlineare Eigenschaft nochmals. Dem muß Rechnung getragen werden.
Falls das nicht verständlich ist, schaut Euch das Bild dieses Qualitätsgebirges an und stellt es Euch noch ein bisschen zackiger vor.
Bild hier
Quelle: http://www.henrys.de/daniel/index.ph...l3_2_index.htm
Zum Verständniss ein kleines Netz mit 2 verdeckten Schichten mal per Hand ausrechnen, meinetwegen mit Excel und mutieren.
Habe ich das so richtig verstanden?
Hast Du eingentlich einen konreten Anwendungsfall für Dein Netz?
Bin gespannt auf Vorschläge :)
Meinst du das ich durch beliebige Mutation Gefahr laufe schon durch kleine Veränderungen direkt von einer guten Lösung in eine schlechte zu springen?
Abhilfe könnte hier die Wahl einer größeren Population schaffen. Hättest du einen besseren Vorschlag die Mutation durchzuführen? Ist es überhaupt möglich Gewichte durch traditionelle Lernvorgänge zu optimieren wenn der gewünschte Output nicht bekannt ist?
Konkrete Anwendungsfälle:
Grundsätzlich sollten mit genügend Zeit und Rechenleistung verschiedenste Anwendungen möglich sein.
Begrenzungen sehe ich derzeit nur durch die angebotene Simulationswelt und dem Erstellen einer geeigneten Fitnessfunktion (Wobei ich meinen Mund nicht zu weit aufreißen will, da ja immer wieder Netzmodelle als die eilegende Wollmilchsau gesehen wurden und sich dann als Enttäuschung herausstellten)
Beispiele wären:
Quellen finden (Licht, Feuer, Schall, usw)
Beinbewegung erlernen
Mustererkennung
Objekte auf einen Haufen schieben ...
Interessant wären die Möglichkeit durch entsprechende Inputs/Outputs eine einfache Kommunikation von Netzen zur Verfügung zu stellen
und ihnen Problemstellungen zu geben die Teamwork erfordern.
Ja genau das meine ich, dadurch dass du selbstverstärkende Faktoren hast (Rückkopplung) und eine nicht lineare Natur, du hast ja mehrere Polynome, denkst Du vielleicht erst du änderst das Gewicht nur etwas, machst aber im Qualitätsgebirge ein großen Sprung. Große Populationen sind immer gut, von der Rechenzeit einmal abgesehen, lösen aber das Problem nicht. Ich habe leider auch mal versucht die Parameter verschiedener Differentialgleichungen durch Mutation und Crossing Over zu variieren, ich bin bei einem Maxima angekommen, aber bei weitem nicht das Globale.Zitat:
Meinst du das ich durch beliebige Mutation Gefahr laufe schon durch kleine Veränderungen direkt von einer guten Lösung in eine schlechte zu springen?
Für diese Probleme gibt es Lösungen wurde mir gesagt, ich habe seit damals die Sache nicht mehr näher verfolgt, ich denke es ist nicht so schwer, aber meine Mathematikfähigkeiten degenerieren zunehmst ;)
Ich will Dich ermutigen das Problem zu verstehen und ein Lösung zu finden. Ich bin ebenfalls sehr interessiert und würde mich gerne belesen, wenn die Zeit es zulässt.
Ich glaube, man muss der Nichtlinearität in der Mutation Rechnung tragen, in der Fittnessfunktion befürchte ich, ist es zu spät.
Vielleicht spiele ich mal mit Excel um mir die Zusammenhänge nochmals zu verdeutlichen.
Im Skript sieht man diese Attraktoren, sehr nette Gebilde mathematischer Schönheit. Wie auch beschrieben konvergieren die Rückkopplungsnetze eventuell irgendwann, dann hättest du einen festen unveränderlichen Output, aber Attraktoren schwingen wenn ich es richtig verstehe. Damit bekommst du sich ständig verändernde Ergebnisse, die auch periodisch gleiche Werte annehmen können. Das wird ganz schön wuselig.
Lieber erstmal ein normales FeedForwardNetz versuchen zu optimieren per Mutation. Die rekursiven Netze rennen nicht weg.
Ich wünschte mein Mathewissen wäre besser. Ich bin nicht kompetent Dir eine Prognose zu geben, teile aber die Faszination an der Idee.
Arbeite dich mit wirklich kleinen Netzen ran, und lass den letzten Gedanken erstmal Zukunftsmusik sein. Ein bisschen träumen und spinnen darf man immer :) Das ist die Motivation.
Das dürfte Dich interessieren:
http://www.heise.de/tp/r4/artikel/24/24696/1.html
http://www.sciencedirect.com/science...cce0d8bb36937b
kein Zwischenschichte, nur 10 Eingänge, 3 Ausgänge