Archiv verlassen und diese Seite im Standarddesign anzeigen : weltweit erstes Neuronales Jordan Netz auf Arduino Due !
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!
Counterfeiter
24.10.2016, 22:21
Du kannst dir ja mal das FANN-Projekt anschauen. Das ist eine bereits ziemlich unfangreiche Bibliothek für künstliche neuronale Netze. Man kann beliebe Netzgrößen anlegen, trainieren, speichern, laden, Aktivierungsfunktionen wechseln usw.
Und wenn das Ausführen zu langsam wird, kann man es sogar im Fixpunktformat berechnen.
Ich hab die Lib für den CortexM4 cross-compaliert und bin sehr zufrieden mit der Geschwindigkeit und dem Funktionsumfang!
Was mit FANN leider nicht möglich ist sind LSTMs. Aber die können auch nicht mehr ohne weiteres mit backpro. trainiert werden und brauchen noch mal mehr Rechenpower, um einen akzeptablen Gradientabstieg zu berechnen...
Der Gedanke die Ausgänge rückzukoppeln ist okay, jedoch erreicht man meiner Meinung nach bessere Ergebnisse, wenn man eine kleine Eingangshistory in die Inputs gibt. Also Position gerade und Position bei der letzten Iteration. Googles Deep Mind nimmt z.B. beim Atari spielen die letzten 4 Bilder als Eingang.
Insgesamt schön das sich noch andere Leute für das Thema interessieren... Weiter so :)
ja, du hast Recht, da existieren schon sehr mächtige Bibliotheken. Ich war selber beim Entwickeln überrascht, wieviel Rechenpower samt RAM tatsächlich verbraten wird, und es macht auch klar, dass wirklich leistungsstarke NNs nur auf Grossrechnern laufen (für Meteorologie oder zum Go-Spielen ;) ) - das zumindest war mir allerdings schon klar.
Für mich als Laie stand aber selbst bei den allerersten Anfängen mit einer Bytecode-Interpreter-VM auf dem Lego-NXT (NXC) und dann eben auch auf dem Arduino Due (C++) zunächst die reine Implementierung das Ziel - erst nur für FF-Netze, und dann für Backpropagation-Netze mit und ohne Rückkopplung - in beiden Fällen aber mit frei skalierbarer Architektur, nur begrenzt durch den - sehr begrenzten - Speicher, und außerdem mit der Möglichkeit, sowohl lokal zu trainieren, die Trainingsergebnisse zu speichern (als AI-Gehirn) und dann wechselweise auch weiter zu machen im Ausführungsmodus, und auch dann ebenfalls jederzeit wieder durch weitere Lernschritte optimierbar. Und all das auf kleinen embedded Systemen ohne Vernetzung mit Host-Rechnern, das war meine persönliche Herausforderung.
In beiden Fällen aber handelt es sich ja um assistiertes Lernen "am Fehler", durch assistiert gestartete Fehlerminimierungs-Algorithmen.
So lernt ein Mensch (oder ein Tier) aber ja nicht, sie lernen am Erfolg, durch positive Verstärkung (behaviouristisch betrachtet).
Dieser behaviouristische AI-Ansatz interessiert mich als nächstes großes Forschungsthema, zunächst sicher auch assistiert, und natürlich später auch selbsttätig, selbst-verstärkend. 8)
Counterfeiter
26.10.2016, 15:18
Hallo HaWe,
an Reinforcement Learning bin ich auch gerade sehr interessiert. Nach einer kurzen Trainingsphase hat man je nach Größe des möglichen Zustandsraumes einen Roboter der seine Lösungen selbst findet.
In diesem Beitrag bin ich z.B. gerade an diesem Thema dran:
https://www.roboternetz.de/community/threads/69790-Vierfu%C3%9F-Laufroboter-ohne-Kniegelenk-M%C3%B6glich
Werde aber auch noch einen längeren Blog-Artikel darüber schreiben, wenn ich weitere gute Lösungen gefunden habe. Die ganze Berechnung passiert auch direkt auf dem Kontroller. Die Kabel sind nur Spannungsversorgung und Debugausgabe.
Ich habe das Gefühl, dass du in deinem Beitrag die Fehlerminimierung / den Gradientabstieg mit der Lernparadigmen in einen Topf wirfst?!
Für Reinforcement Learning ist wohl das Q-Learning der bekanntest Vertreter. Das Lernen lässt sich aber gar nicht bis sehr schwer in einer allgemeinen Lib abbilden. Das muss man schon jedes mal für sein Problem neu schreiben.
Wenn deine lib fertig ist, dann müsste es funktionieren mein Hello World Blinky - Q-Learning Beispiel, statt mit FANN mit deiner lib abzubilden... Da deine lib automatisch Rückkoppeln kann, brauchst du wahrscheinlich nur 4 Eingänge. Wäre ein interessanter Versuch:
https://github.com/Counterfeiter/ANN-QLearning-CortexM4/blob/master/Src/ann.c
Achso, vielleicht das Video noch dazu, das zugegeben sehr langweilig sein kann... jedenfalls für Leute die noch keinen Einblick in Komplexität der internen Abläufe hatten.
https://www.youtube.com/watch?v=5Tk-lP5oaU4
VG
Basti
hallo,
nein, ich habe mich bisher noch nicht mit Q-Learning beschäftigt, aber vieles kommt mir bekannt vor.
Mit der Verstärkung meinte ich aber etwas anderes:
wenn man ein Netzwerk trainiert (z.B. ein ganz simples FF-Netz), dann präsentiert das Netz ja auf ein Input-Pattern spontan ein Output-Pattern.
Ist das richtig (so wie gewünscht), tut der Trainer nichts.
Ist es falsch, nennt der Trainer das richtige Ziel-Ergebnis.
Dann wird trainiert, d.h. die Netz-Input-Gewichte und thresholds werden so lange durch Algorithmen verändert, bis das Input-Pattern dann doch dem Ziel-Output entspricht.
Diese Zurodnung wird gespeichert.
Also reagiert der Trainer nur, wenn das output-Pattern NICHT dem spontan präsentierten Pattern entspricht.
Beim Operanten Konditionieren durch positive Verstärkung passiert es ganz anders, nicht nur "anders herum":
Das Netz (das Tier) präsentiert bei ständigen zufälligen Reizmustern ein spontanes Output-Pattern (spontanes Verhalten).
Ist es richtig, wird vom Trainer belohnt, und durch die Belohnung wird diese Zuordnung tendenziell modifiziert, wenn auch noch nicht endgültig fest gespeichert.
(z.B. (1) bestimmtes Reizmuster => (2) Tier erzeugt Verhaltensmuster
=> (3) wenn "richtig": Futterkugel als Belohnung), das ist der Lernschritt, der gefestigt und später dauerhaft gespeichert werden soll.
Ist es falsch, passiert gar nichts, es wird auch kein Hinweis in irgendeiner Weise gegeben.
Wird gar kein Verhalten vom Tier geäußert oder präsentiert (Nichts-Tun), passiert aber ebenfalls nichts seitens des Trainers.
Nicht irgendein Verhalten oder Nichtstun an sich wird belohnt oder bestraft oder berichtigt, sondern alleine "richtiges" Verhalten, und damit es endgültig gelernt wird, muss es immer und immer wieder verstärkt werden.
Falsches oder Nicht-Verhalten wird in diesem Modell mit der positiven Konditionierung nicht bestraft, es "erlischt" spontan mit der Zeit, da es nicht verstärkt wird, und der Trainer wird dabei einfach nicht aktiv.
(Grundsätzlich erfordert dieser Ansatz allerdings ein weiteres Element, nämlich einen natürlichen, angeborenen Trieb (Fressen) auf ein Grundbedürfnis (Hunger) hin, und einen primären Reiz (Futter), um den Trieb zu stillen.
Ohne dies könnte dann auch Futter nicht als Verstärker funktionieren.
Und wenn es dieses Bedürfnis nach Futter wegen des Fress-Triebs nicht wäre, könnte man damit auch keine sekundären Verstärker antrainieren.)
Und das wäre jetzt auf künstliche neuronale Netze zu übertragen, z.B. um einen Roboter wie einen Hund trainieren zu können.
Counterfeiter
26.10.2016, 19:08
Ist das ein Grundlegend neuer Ansatz? Den habe ich so noch nie gehört.
Jedoch wird das Netz sehr wohl bestraft. Schau dir mal das Q-Learning an. Die richtige Aktion wird belohnt, die falsche bestraft. Hierzu wird aber eine "Lernrate" mitgegeben (die nichts mit der Learnrate des FF-Netzes zu tun hat):
Aus meinem Quellcode oben:
qval[action] = (reward < 0.0) ? (reward + (gamma * maxQ)) : reward;
Wird bestraft, wird die maximale Aktion des Folgeschrittes genommen (maxQ) und mit der Lernrate multipliziert. Anschließend wird es zum negativen reward (Bestrafung) addiert...
Folglich, wird die falsche starke Aktion bestraft und eine kleinere Ausgabe wird antrainiert... Natürlich sollte gamma unter 1,0 liegen! Ich verwende aktuell 0,9.
Es gibt da schon verdammt gute Konzepte... Ich denke nicht, dass du hier eigene Sachen entwickeln musst! Aber ohne das sich Leute einen Kopf darüber machen, gibt es keine neuen Erkenntnisse... Von daher... auf auf!
Viele Grüße
Sebastian
nein, kein grundsätzlich neuer Ansatz, sondern ein neuer Ansatz für "MEINE" neuronalen Netze, für die ich mich besonders interessiere.
Aber negative Verstärkung = Bestrafung hat nichts mit einer Intervention mitsamt Korrektur-Vorgabe bei Fehlern zu tun, Bestrafung führt einen negativen Reiz zu, den das Tier/das Netz von sich aus "primär" vermeiden will, nämlich (meist) Schmerz als primären negativen Reiz.
Die Folge ist ein ungerichtetes Vermeidungsverhalten, ohne jeden Reiz oder irgendeine "Vorgabe" in eine "richtige" Lösungs- oder Ergebnis-Richtung oder auch ohne eine Art "Lernrate" dafür: das ist hier der entscheidende Punkt!
Genau wie für positive Reize und positive Verstärker braucht man hier auch wieder ein Modell für unbedingte Reflexe und bedingte Reflexe auf negative Reize.
Aber zur Zeit steht bei mir eh erst mal Linux- und C- und C++ - Lernen für den Raspi an erster Stelle. Wie wäre es doch schön, wenn der so einfach wie ein Arduino funtionieren würde und zu programmieren wäre... :-/
Counterfeiter
26.10.2016, 21:25
Achso, ich dachte wir könnten über dieses Model aus mathematischer Sicht schon sprechen. Wenn die Arbeiten noch andauern, dann verschieben wir das noch.
Dann viel Erfolg beim Lernen. Es lohnt sich auf jedenfall...
VG
Basti
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.