Neural Networks / Massiv Multithreading
-
Soll das wirklich in Echtzeit zugehen? Ich bin ja nicht so der Spezialist für neurale Netzwerke, aber - um das mal in der Sprache der Computersimulation auszudrücken - du hast doch eine Simulation mit einem diskreten "Zeitschritt". Deine Neuronen warten nicht in Echtzeit darauf, dass etwas passiert, sondern es gibt irgendeinen Updateschritt, der ein Neuron veranlasst, seinen Status (und den seiner "Nachbarn") zu prüfen und zu aktualisieren. Das macht er (je nach genauem Aufbau des Netzwerks) nach und nach für alle Neuronen und dann geht es von vorne los.
Deine Neuronen brauchen also keinen Thread für sich.
Die Parallelisierung erreichst du dann, indem du deine Neuronen clever verteilst auf die parallelen Hardwareressourcen, so dass du in deinem Updateschritt möglichst viele Neuronen gleichzeitig abarbeiten kannst (z.B. weil die Neuronen in Hardware(!)thread A aufgrund der Netzstruktur nicht das Ergebnis von den Neuronen in Thread B zu wissen brauchen). Es gibt sicher noch andere Parallelisierungsverfahren, aber das ist die Grundidee. Die Neuronen selber sind nicht aktiv, sie werden aktiviert.
-
SeppJ danke für die Antwort. Es muss nicht exakt in Echtzeit zugehen, bin jedoch sehr daran interessiert das ganze so realitätsnah wie möglich zu halten. Was aus programmiertechnischer sicht wahrscheinlich nicht das schlauste ist.
An deine Möglichkeit mit einem "updatepuls" hab ich noch nicht gedacht, klingt aber interessant und wäre für mich auch technisch sicher möglich zu implementieren.
Dennoch würd ich die Idee mit dem Multithreading zumindest noch gerne im Auge behalten. Also wenn es noch Ideen zur Umsetzung des Multithreading gibt nur her damit. Auch für andere Ideen bin ich offen

-
lekos schrieb:
SeppJ danke für die Antwort. Es muss nicht exakt in Echtzeit zugehen, bin jedoch sehr daran interessiert das ganze so realitätsnah wie möglich zu halten. Was aus programmiertechnischer sicht wahrscheinlich nicht das schlauste ist.
Ich möchte deine Definition von "realistisch" anzweifeln. Du arbeitest mit einem Computermodell eines Systems, welches zwar mit kontinuierlicher "Zeit" abläuft, aber das Computermodell ist so gemacht, dass man die "Zeit" in kleine Schritte zerteilt. Das wird nicht realistischer, indem du es nun versuchst diese Computermodell in kontinuierlicher Zeit laufen zu lassen, sondern es wird dadurch schlicht und einfach Unsinn. Was käme wohl heraus, wenn du den Taktgeber in deinem Computer abschalten würdest und alle FlipFlops schalteten einfach dann, wenn sie die entsprechenden Signale bekämen?
lekos schrieb:
An deine Möglichkeit mit einem "updatepuls" hab ich noch nicht gedacht, klingt aber interessant und wäre für mich auch technisch sicher möglich zu implementieren.
Hast du überhaupt mal irgendwas zu neuronalen Netzwerken gelesen?
-
SeppJ ich habe wenig bis keine ahnung in der programmiertechnischen umsetzung von neuralen netzwerken, darum ja auch dieser Versuch. Ich komm aus einem neurobiologischen feld, daher auch meine wohl etwas realitätsfremden vorstellungen von "realitätsnaher" umsetzung des ganzen.
Wenn du jedoch Empfehlenswerte Literatur hast, nur her damit.
-
Ich kann dir keine professionelle Literatur angeben, ich mache andere Arten von "Simulationen" (für mich ist ein neuronales Netzwerk auch eine Art Simulation). Ich hätte aber erwartet, dass jemand, der das macht, wenigstens mal Wikipedia oder ähnliches gelesen hätte. Das reicht ja schon für die absoluten Grundlagen, über die wir hier reden.
Ich bin mir auch gerade nicht mehr sicher, ob du ein neuronales Netzwerk im Sinne der Informatik meinst oder ob du ein Gehirn simulieren möchtest. Der letzte Beitrag klingt irgendwie danach. Zwar ist die Technik des neuronalen Netzwerks inspiriert davon, wie ein Gehirn funktioniert, aber es ist keine echte Simulation desselben in dem Sinne, dass man damit aussagen über Gehirne machen könnte.
Letzteres würde eher in den Bereich der klassischen Computersimulation gehen (damit kenne ich mich aus
). Aber auch hier kann man nicht einfach drauf loslegen. Neben technischen Schwierigkeiten bei der Umsetzung (dein erster Ansatz) muss man ja auch sicher sein, ob das Ergebnis überhaupt stimmt (das dürfte ein anderes Problem mit deinem Ansatz sein). Es gibt bereits eine ganze Reihe von gängigen Simulationstechniken, die sowohl für die technische Umsetzung am Computer (inklusive Parallelisierung) gut geeignet sind, von denen auch -und das ist noch viel wichtiger - mathematisch bewiesen(!) ist, dass sie (unter gewissen Voraussetzungen und in einem gewissem Rahmen) korrekte Ergebnisse liefern*. Wenn man ein Gehirn simulieren wollte, würde man wohl damit beginnen, ein Modell für solch eine Simulationsmethode aufzustellen. Eine eigene Simulationsmethode zu erfinden ist durchaus auch möglich, wenn man sich gut auskennt, aber bedarf vor allem mathematischer Korrektheit, anstatt einfach drauf los zu legen (es ist aber durchaus möglich, erst einmal drauf los zu legen und dann dabei zu überlegen, auf was man achten muss, damit das Ergebnis stimmt. Das wäre vielleicht etwas für deinen Ansatz).*: Das heißt, sie lösen das verwendete Modell korrekt. Ob das Modell etwas taugt, ist noch einmal eine ganz andere Frage.
-
Highend Titel - Lowend Thread
-
lekos schrieb:
Ich würde mich gerne an einen Grundlegenden Neuronensimulator wagen. Um die Neurone im Netzwerk unabhängig voneinander zu machen, sodass sie parallel auf signale reagieren können dachte ich es wäre schlau für jedem Neuron einen Thread zuzuweisen.
Simulation auf welcher Ebene?
Bei Simulation auf molekularer oder Quanten-Ebene wäre für einen Schaltvorgang vielleicht genug für einen Thread (oder auch für einen Großrechner ...) zu berechnen. Wenn jedes Neuron aber lediglich durch eine stetige oder diskrete Schaltfunktion simuliert werden soll (z.B. Schwellwertschalter über eine gewichtete Summe der angrenzenden Axone) , frage ich mich, ob nicht der Verwaltungsaufwand eines Threads unangemessen hoch ist.
-
und was wäre die beste möglichkeit ein realitätsnahes model von einigen neuronen nachzubilden? (Also wenn man jetzt NICHT von einem neuronalen netz spricht wie man es in der Informatik versteht, sondern in der biologie). Wäre da der Ansatz mit dem Multithreading auch unangebracht? Wenn ja, was wäre angebracht?
-
Ein Modell fuer ein echtes biologisches Neuronennetz kann dir wohl nur ein Exporte fuer Neurologie entwerfen. Und du duerftest der einzige hier im Forum sein, der auch nur ein bisschen Ahnung davon hat*. Beim Entwurf eines Computermodells spielt auch ganz entscheidend eine Rolle, welche Fragen man ueberhaupt beantworten moechte. Das ist wieder etwas, was nur du weisst.
Wenn du einfach nur herumspielen moechtest: Tu das.
Wenn du wirklich echte Ergebnisse haben moechtest: Wende dich an Experten auf dem Gebiet.Den Ansatz mit einzelnen Threads pro Neuron halte ich in jedem Fall fuer schlecht. Selbst fuer das Herumspielen. Das einzige, was du damit bekommst, ist ein Haufen Race-Conditions. Das heisst du erhaeltst Ergebnisse die fast ausschliesslich auf Artefakten deiner Implementierung beruhen. Vollkommen wertlos
.*: Um dir mal einen Anhaltspunkt zu geben: Das Hoechste, was ich von Neurologie verstehe, ist, dass ich mal in Biophysik ein paar Aktionspotentiale modelliert habe. Und damit duerfte ich im Verlgeich zum Durchschnittsinformatiker ein absoluter Experte in der Biologie von Neuronen sein. Aber das ist eben trotzdem nur absolutes Anfaengerwissen fuer einen Biologen. Bei solchen Problemen darfst du keine Erwartungen an ein Programmiererforum haben.
-
Danke für die Antwort SeppJ, vorerst hab ich keine konkreten fragestellungen und würde einfach nur gerne etwas herumspielen. Gut zu wissen, dass der Threadansatz ein schlechter ist, dann werd ich nach etwas anderem Ausschau halten. Danke das war eigentlich alles was ich wissen wollte.
-
Nein, Threading, Multithreading und Massive-Multithreading ist erstmal nicht schlecht.
Aber es kommt extrem auf das an, was du brauchst, was du erreichen möchtest und in welchen Größenordnungen des Problems wir uns hier bewegen.
Wenn du quasi nur ein kleine Simulation, die einfach etwas läuft, schreiben willst und zufällig mehrere Tausend Prozessoren frei hast, dann schreib ruhig irgendwas. Aufs Ergebnis kommts ja eh nicht an.
Willst du aber ernsthaft, etwas simulieren mit einem Endergebnis, dann musst du dein Problem erstmal so modellieren, dass ein Computer (oder viele) damit etwas anfangen können. Dabei wiederum solltest du drauf schauen, wie schwierig und langwierig dein Problem ist. Wenn du Mehrere CPUs oder Threads verwendest, solltest du deine Algorithmen im Blick haben, damit sich Multithreading auch lohnt (Stichwort vllt mal grad Amdahl'sches Gesetz).
Und schließlich musst du natürlich das ganze Implementieren, was beim Multithreading auch nicht immer ganz so simpel ist.
-
die Frage ist kaum zu beantworten, solange nicht klar ist, was mit "relitätsnah" genau gemeint ist. Quantenebene? Molekularebene? Elektrische Ebene? Schaltebene?
-
Haykin, "Neural Networks - A Comprehensive Foundation".
Teuer, aber eines der Standardwerke. Neben dem habe ich auch noch mit Zell: "Simulation Neuronaler Netze" und Rojas: "Theorie der Neuronalen Netze" gearbeitet.
Ich empfehle, wenn es Dir mit dem Thema ernst ist, auf jeden Fall den Haykin. Der ist allerdings stark mathematiklastig (Nur als warnung, falls Du als Neurobiologe da eine gewisse Distanz zu haben solltest - ich kenne Euren Ausbildungskanon nicht). Die anderen beiden Bücher sind das sicherlich auch, aber nicht in dem Maße.
Zur grundlegenden Simulation eines Neuronalen Netzes eignen sicher besser Vektoroperationen als jedes Neuron in einem einzelnen Thread zu bearbeiten. Letzteres ist möglich und vielleicht für ein komplexes neurobiologisches Modell vielleicht auch sinnvoll, wird aber, verglichen mit dem was man mit künstlichen Neuronalen Netzen und Vektorverarbeitung erreichen kann um Größenordnungen (!) langsamer sein. Als Hinweis mag Dir dieser Link http://www.tomshardware.com/news/nvidia-google-brain-machine-learning,26395.html dienen.