Forum: PC-Programmierung Zeitliche Auflösung von Simulationen


von Sima80 (Gast)


Lesenswert?

Ich möchte eine physikalische Simulation mit zeitlich akkurat 
aufgelösten Vorgängen durchführen. Dabei will ich aber keine unnötigen 
Wartezeiten. Ich will nicht so etwas wie sleep(2). Ich will die zur 
Verfügung stehende Rechenkapazität auslasten können. Die Simulation soll 
vom Anwender nicht in Echtzeit beobachtet werden. Das Programm soll mit 
maximaler Geschwindigkeit die Simulation berechnen. Und danach kann der 
Anwender die einzelnen aufgezeichneten Vorgänge abspielen.

Nun habe ich aber keine Erfahrung damit wie man so etwas am besten 
macht. Das was mir einfällt ist folgendes: ich habe eine Schleife. Ein 
Durchlauf würde den kleinst möglichen Zeitschritt der Simulation 
repräsentieren. Sagen wir jeder Durchlauf steht für 1 ms. Dabei ist es 
also egal wie lange ein Durchlauf wirklich dauert. Es wird mit maximaler 
Geschwindigkeit ausgeführt.
Angenommen ich will einen physikalischen Vorgang simulieren der alle 2 
ms aktiv wird und eine Dauer von 4 ms hat. Dann würde ich in jedem 
Schleifendurchlauf einen Zähler allein für diesen Vorgang hochzählen. 
Beim zweiten Durchlauf würde der Vorgang dann ausgelöst werden und nach 
weiteren 4 Durchläufen würde der Vorgang wieder deaktiviert werden.

Das würde wohl funktionieren aber ist das ideal? Wenn ich 10.000 
Vorgänge/Objekte habe, die nicht zeitgleich aktiviert werden, sondern 
dynamisch in der Simulation, dann müsste ich in jedem Schleifendurchlauf 
10.000 Zähler verwalten und hochzählen.
Wäre das unvermeidbar? Welche Möglichkeiten gibt es noch?

von Theor (Gast)


Lesenswert?

Vielleicht schreibst Du mal, was Du simulieren willst. Ich bin mir nicht 
sicher ob Du Dein Problem richtig beschreibst oder ob ich Deine an sich 
korrekte Beschreibung richtig verstehe.

Aber, - falls ich das recht Problem verstehe -, dann wäre
eine Analogie zu Deinem unbekannten Simulat z.B. eine VHDL-Simulation, 
bei der sämtliche Prozesse getaktet sind (was eine Design-Regel ist, 
aber nicht zwingend) und sich also zwischen den Taktflanken die 
Ausgangssignale nicht ändern können .
In dem Fall würden bei jeder Flanke des Taktes, alle Bedingungen 
sämtlicher Prozesse geprüft werden, ob sie zutreffen. Die Prozesse 
gelangen dann in einen neuen Zustand, bei dem die Bedingungen anders 
sind und die dann evtl. bei der nächsten Taktflanke zutreffen.
Das braucht keine besondern Zähler für die Prozesse; die Zustände 
selbst, ihre Kodierung, sind die Zähler. Der Zeitablauf ergibt sich aus 
der Beschreibung der Prozesse und dem Fortschreiten der Zustände.

von Theor (Gast)


Lesenswert?

Hm. OK. Wer mit VHDL oder der Idee dahinter nicht vertraut ist, wird 
damit wenig anfangen können. Aber ich musste meine Antwort auch erstmal 
entwickeln.

Der Punkt auf den ich hinauswollte, ist, dass Dein Ansatz das Problem 
aus einer bestimmten Perspektive, nämlich dem Zeitablauf auffasst. Das 
Simulat verhält sich aus dieser Perspektive entlang der Zeit auf eine 
bestimmte Weise. Das suggeriert evtl. bei Dir, das die Zeit sozusagen, 
der "Antrieb" des Verhaltens ist. Deswegen scheint es nahe zu liegen, 
die individuelle Zeit jedes Simulats mit zu führen.

Ich will den Fokus darauf richten, dass sich das Simulat je nach seinem 
inneren Zustand und den gegenwärtigen Stimuli verhält. Die Zeit ist 
dabei "nur" die Koordinate, an der die Stimuli und der innere Zustand zu 
einem neuen Zustand und einer Reaktion führen. Jedes Simulat "hat" dabei 
die selbe Zeit, nur einen anderen inneren Zustand und evtl. andere 
"lokale" Stimuli.

Ist das verständlich?


Das zweite scheint mir ohnehin die korrekte Betrachtungsweise zu sein.

von Jemand (Gast)


Lesenswert?

Sima80 schrieb:
> mit zeitlich akkurat aufgelösten Vorgängen durchführen. Dabei will ich
> aber keine unnötigen Wartezeiten. Ich will nicht so etwas wie sleep(2).

Ich sehe da 0 Zusammenhang.

Sima80 schrieb:
> Welche Möglichkeiten gibt es noch?

Für zeitlich exakt vorhersehbare Ereignisse kann man alle Objekte in 
einer Warteschlange (gemäß Zeit zum nächsten Eireignis) verwalten, so 
kann man die Verarbeitung auf Objekte beschränken, die tatsächlich etwas 
beim aktuellen Zeitschritt tun müssen. Problem: schwieriger zu 
parallelisieren. Für z. B. eine Partikelsimulation wo man eh auf alles 
für jeden Zeitschritt zugreifen muss wäre das allerdings unnütz.

Statt Zähler hochzuzählen kann man übrigens auch die Zeit des nächsten 
Ereignisses speichern, damit vergleichen und bei Bedarf aktualisieren, 
das vermeidet Schreibzugriffe, was ggf. vorteilhaft ist.

von C. A. Rotwang (Gast)


Lesenswert?

Jemand schrieb:
> Sima80 schrieb:
>> mit zeitlich akkurat aufgelösten Vorgängen durchführen. Dabei will ich
>> aber keine unnötigen Wartezeiten. Ich will nicht so etwas wie sleep(2).
>
> Ich sehe da 0 Zusammenhang.

Vielleicht meint ja der TO mit seinem Gestammel nicht Simulation sondern 
Emulation, genau Hardware in the Loop -> HIL

Obwohl, was den von Nicht-Echtzeit eingefordert wird, spricht dann 
wieder dagegen.

> Sima80 schrieb:
>> Welche Möglichkeiten gibt es noch?

Mal sich selbstständig die Grundlagen von Simulation, modellierung 
physikalischer Vorgänge erarbeiten, vielleicht ?!

Was du verstehen musst, ist die Numerik physikalischer Vorgänge, also 
wie löst man DGL-Systeme durchzeitliche Diskretisierung, Runge-Kutta ist 
dar ein gängiger Einstieg:
https://de.wikipedia.org/wiki/Runge-Kutta-Verfahren

Die Simulation von einfachen mechanischen Systemen aus Feder und Massen 
kann man sich auch mit xspringies anschauen. Das findet sich in 
Linux-Distries, quelltext sollte auch dabei sein.

Allerdings ist das schon reichlich alt, vielleicht hilft das modernere 
SOFA eher:
https://www.sofa-framework.org/

https://www5.in.tum.de/lehre/vorlesungen/konkr_math/05_06/vorl/Handout_01.pdf
https://blobtestweb.opal-rt.com/medias/L00161_0436.pdf
https://de.wikipedia.org/wiki/Ereignisorientierte_Simulation

von Rolf M. (rmagnus)


Lesenswert?

Sima80 schrieb:
> Angenommen ich will einen physikalischen Vorgang simulieren der alle 2
> ms aktiv wird und eine Dauer von 4 ms hat.

Das klingt seltsam. Hast du mal ein Beispiel für einen solchen 
physikalischen Vorgang? Die Physik in der realen Welt hat keine 
begrenzte Dauer und bleibt auch nicht alle 2 Millisekunden stehen.

von Gustl B. (gustl_b)


Lesenswert?

Vermutlich will er etwas so simulieren, dass es dann ich Echtzeit läuft 
oder so aussieht. Also nicht sehr schnell simulieren und dann mit 
normaler Zeit wiedergegeben sondern zur Laufzeit berechnen aber auch 
nicht so, dass sich die CPU langweilt.

Ein primitives Beispiel wäre ein Pendel. Der Benutzer soll interaktiv 
über einen Schieberegler die Länge ändern können.
Jetzt reicht es für jedes Frame des Bildschirms einmal zu rechnen. Aber 
da langweilt sich die CPU. Er will wohl, dass die dann eben genauer 
rechnet oder noch zwischen den Frames Schritte rechnet.

von Rolf M. (rmagnus)


Lesenswert?

> Vermutlich will er etwas so simulieren, dass es dann ich Echtzeit läuft
> oder so aussieht.

Er schreibt eigentlich ziemlich klar, dass er gerade das nicht will:

Sima80 schrieb:
> Die Simulation soll vom Anwender nicht in Echtzeit beobachtet werden.

Gustl B. schrieb:
> Also nicht sehr schnell simulieren und dann mit normaler Zeit wiedergegeben

Sima80 schrieb:
> Das Programm soll mit maximaler Geschwindigkeit die Simulation berechnen. Und
> danach kann der Anwender die einzelnen aufgezeichneten Vorgänge abspielen.

von NichtWichtig (Gast)


Lesenswert?

Formeln für jedes Objekt programmieren und Stepweite festlegen.
Dann alle Objektberechnungen durchführen, Ergebnisse speichern und 
wieder von vorn anfangen.

Ob sich ein Ojekt nun bewegt hat oder nicht ist an den Ergebnisse 
erkennbar.

Eigentlich ganz einfach.

von Sima80 (Gast)


Lesenswert?

Interessante anregende Antworten.
Ich simuliere verschiedene Dinge. Aktuell ist es ein Netz von noch 
primitiven Neuronen. In dem Netz feuern einige Neuronen mit einer 
bestimmten Frequenz. Die maximale Frequenz liegt bei 500 Signale pro 
Sekunde.
Wenn ein verbundenes Neuron ein Signal erhält wird ein interner Zähler 
des Neuron hochgezählt. Sobald ein Schwellenwert erreicht wird feuert 
das Neuron.

Das ist das einfache Ausgangsmodell und das will ich nun nach und nach 
verfeinern. Das Verhalten der Neurone wird komplexer. Es werden mehrere 
innere Zustände pro Neuron zu berechnen sein. Und die Frage ist wie 
modelliere ich am besten zeitliche Prozesse.

Ein Beispiel für ein zeitlichen Vorgang in einem echten Neuron:
Die Zahlen sind für das Beispiel erfunden.
Empfängt ein biologisches Neuron einen elektrischen Impuls steigt 
vereinfacht gesagt die Spannung des Neurons an. Sagen wir die 
Schwellenspannung wäre nach 10 elektrischen Impulsen erreicht und das 
Neuron würde dann feuern.
Es ist so dass diese 10 Impulse innerhalb eines bestimmten Zeitfensters 
stattfinden müssen, weil das Neuron die wachsende Spannung langsam 
wieder abbaut und zu seiner Ausgangsspannung zurückfällt. Sagen wir es 
sind 10 Impulse innerhalb von 200 µs notwendig damit das Neuron feuert.

Ich möchte solche zeitabhängigen Eigenschaften einbringen um zu sehen 
welchen Einfluss es auf die Simulation hat. Und inwiefern diese 
Eigenschaften für den Signalverlauf im neuronalen Netz vernachlässigbar 
sind.

Und ich muss ja eine Grenze für die zeitliche Auflösung setzen. Ich 
könnte sagen der kleinste Schritt meiner Simulation repräsentiert 1 µs.
Im Eingangspost habe ich 1 ms gesagt. Welchen Wert ich letztendlich 
nehme müsste ich noch festlegen.

von Gustl B. (gustl_b)


Lesenswert?

Rolf M. schrieb:
> Er schreibt eigentlich ziemlich klar, dass er gerade das nicht will:

Sorry. Ja dann quasi wie bei einem normalen Simulationsprogramm. 3ds Max 
kann Physiksimulation. Da kannst du das Video rendern lassen und danach 
bequem angucken. Der rendert die Framerate die du einstellst, das ist 
völlig frei, Auflösung auch.

von Pilotanwärter Pirx (Gast)


Lesenswert?

Sima80 schrieb:
> Das ist das einfache Ausgangsmodell und das will ich nun nach und nach
> verfeinern. Das Verhalten der Neurone wird komplexer. Es werden mehrere
> innere Zustände pro Neuron zu berechnen sein. Und die Frage ist wie
> modelliere ich am besten zeitliche Prozesse.

Ja man kann das Rad auch zweimal erfinden und vom Anfangsmodell 
'Dreieckiges Rad' ausgehend die Komplexität auf 'zwei dreieckige Räder' 
verfeinern ...

von Sima80 (Gast)


Lesenswert?

Pilotanwärter Pirx schrieb:
> Ja man kann das Rad auch zweimal erfinden und vom Anfangsmodell
> 'Dreieckiges Rad' ausgehend die Komplexität auf 'zwei dreieckige Räder'
> verfeinern ...

Nach dem selben Grundprinzip bist du als Mensch evolutiv entstanden :D
Ich frage ja nach Tipps. Gerne auch Hinweise auf ein fehlerhaftes 
Vorgehen. Wie könnte man es besser machen?

von Theor (Gast)


Lesenswert?

Sima80 schrieb:
> Pilotanwärter Pirx schrieb:
>> Ja man kann das Rad auch zweimal erfinden und vom Anfangsmodell
>> 'Dreieckiges Rad' ausgehend die Komplexität auf 'zwei dreieckige Räder'
>> verfeinern ...
>
> Nach dem selben Grundprinzip bist du als Mensch evolutiv entstanden :D
> Ich frage ja nach Tipps. Gerne auch Hinweise auf ein fehlerhaftes
> Vorgehen. Wie könnte man es besser machen?

Es ist wie im richtigen Leben: Auf manche Bemerkungen muss man nichts 
erwidern. Man kann auch 'nen Schluck Kaffee trinken oder die Zeitung 
aufschlagen.

Aber ist denn jetzt noch eine Frage offen? Dein Beitrag scheint das 
anzudeuten.

von Maxe (Gast)


Lesenswert?

Ich würde das so machen:

Ausgangspunkt ist der Vorgang des Zustandsübergangs mit 2ms. Diesen 
willst bspw mit 1000 Schritten auflösen. Dann beträgt deine Zykluszeit 
2µs und du hast eine Taktrate von 500'000/sek.

Jetzt hast du eine Liste mit allen Elementen diese gehst du für jeden 
Takt komplett durch. Ist der Eingang gleich dem vorherigen Zustand, dann 
bleibt auch der Ausgang gleich - keine Berechnung für dieses Element 
nötig. Ist das Element in der Übergangsdynamik, dann muss der Ausgang in 
Abhängigkeit der Zeit berechnet werden. Die Änderung ist so zu 
berechnen, dass sie für die 2µs passt.

Für die Ausgabe reicht es vermutlich auch nur jeden 100sten Wert oder so 
herzunehmen, falls es eher um die übergeordneten Werte geht.

von Sima80 (Gast)


Lesenswert?

Wegen der Echtzeit Beobachtung: damit wollte ich nur sagen ich will die 
Simulation nicht gleichzeitig berechnen und visuell anzeigen.
Bei sehr großen neuronalen Netzen werden die Berechnungen so lange 
dauern dass vielleicht für die Simulation von 1 Sekunde der Computer 
vielleicht 5 Minuten braucht.
Ich will das also nicht in Zeitlupe beobachten und durch das zeichnen 
von Frames unnötig Ressourcen nutzen.
Daher einmal im Hintergrund die Simulation durchlaufen lassen, die 
Zustände der einzelnen Neuronen in einer Datei aufzeichnen und dann die 
Aufzeichnung in beliebiger Geschwindigkeit abspielen können. Dadurch 
kann man die ganze Simulation auch besser untersuchen. Man kann 
beliebige Zeitschritte vor und zurück gehen und Messungen am Datensatz 
durchführen.

Theor schrieb:
> Ich will den Fokus darauf richten, dass sich das Simulat je nach seinem
> inneren Zustand und den gegenwärtigen Stimuli verhält. Die Zeit ist
> dabei "nur" die Koordinate, an der die Stimuli und der innere Zustand zu
> einem neuen Zustand und einer Reaktion führen. Jedes Simulat "hat" dabei
> die selbe Zeit, nur einen anderen inneren Zustand und evtl. andere
> "lokale" Stimuli.
>
> Ist das verständlich?

Hm eigentlich nicht. Mal ein konkretes Beispiel: ich will einen Neuron 
simulieren. Nachdem das Neuron einmal gefeuert hat, soll es für eine 
kurze Zeit nicht mehr feuern können. Eine Art Erholungsphase bis das 
Neuron für neue Impulse empfänglich ist. Wie soll ich das in diskreten 
Schritten simulieren ohne einen Zähler der die verstrichene Zeit 
repräsentiert?

von Marek N. (Gast)


Lesenswert?

Klingt für mich nach Markov-Kette.

von A. S. (Gast)


Lesenswert?

Sima80 schrieb:
> Wie soll ich das in diskreten Schritten simulieren ohne einen Zähler der
> die verstrichene Zeit repräsentiert?

Ich glaube dein grundsätzliches Problem ist die Trennung von Zuständen 
des Neuronen (jedes Neuron hat n Attribute/Eigenschaften/Variablen) und 
der einen Zeit t (z.b. ein Zähler mit Auflösung 1us)

In der simu zahlst Du t z.b. jeden Takt 10us hoch und berechnest jedes 
Neuron. Wenn ein Neuron jetzt feuert, wird sein "Feuertimer" = t 
gesetzt. Erholt ist es dann erst, wenn die Zeit t um die Erholungszeit 
Te fortgeschritten ist: (t-"Feuertimer")>Te.

Du hast also keine Zähler pro Neuron, die laufend verändert werden, 
sondern Variablen, die feste Zeitpunkte speichern und in jedem 
Simulationsschritt vergleichen.

Ob du dann später 1us, 10 oder 100us-schritte machst, ist dann egal. 
Kannst du sogar beliebig mixen.

von Bernd (Gast)


Lesenswert?

Sima80
>Ich möchte eine physikalische Simulation mit zeitlich akkurat
>aufgelösten Vorgängen durchführen.
> Mal ein konkretes Beispiel: ich will einen Neuron
> simulieren.

Klingt interessant. Für Echtzeitanwendungen käme vielleicht ein FPGA in 
Frage:
Beitrag "Neuronale Netze in FPGAs"
Ist es einfach ein Privatprojekt oder eher eine Diplomarbeit?

von Tilo R. (joey5337) Benutzerseite


Lesenswert?

Die Beschreibungen von Maxe und A. S. sind richtig und für dein Problem 
geeignet.

Ich vermute dass du viel mehr Neuronen hast, als tatsächlich in einem 
Zeitschritt feuern.
Dann ist es vielleicht CPU-technisch effizienter, nicht alle Neuronen 
jeden Schritt anzuschauen, sondern nur die, die in diesem Zeitschritt 
von anderen Neuronen befeuert werden.
Dazu braucht man eine Warteschlange die diese Ereignisse speichert.

Beispiel: Annahme Neuron A feuert bei t=0 und sei mit den Neuronen B und 
C verbunden. Der Strom erreicht B und C etwas später, ich schreibe hier 
der Einfachheit halber t=1. (Deine Zeitskala kann in µs oder beliebig 
fein sein).
In die Warteschlange kommt jetzt (t=1, "B wird befeuert") und (t=1, "C 
wird befeuert"). Du könntest auch unterschiedlich lange Laufzeiten 
abbilden mit (t=2, "C wird befeuert")

Alle weiteren Simulationsschritte bestehen jetzt darin, die nach t 
sortierte Warteschlange der Reihe nach abzuarbeiten, d.h. den inneren 
Zustand des betreffenden Neurons zu berechnen und daraus resultierend 
ggf. weitere Events in die Warteschlange einzustellen.

von C. A. Rotwang (Gast)


Lesenswert?

Sima80 schrieb:
> Ich frage ja nach Tipps. Gerne auch Hinweise auf ein fehlerhaftes
> Vorgehen. Wie könnte man es besser machen?

Einfach mal in einen Grundkurs Künstliche neuronale Netze schauen?!

Dann sollte klar sein das man die 'Impulfolgensmodulierten' 
Nervensignale locker durch konstante Werte ersetzen kann. Diese 
'zeitliche Simulation' ist völlig irrelevant für die mathematische 
Modellierung eines neuronalen Netzes, das lernt man bereits in der 
ersten Vorlesungsstunde zu diesem Thema:

https://cdn.weka-fachmedien.de/media_uploads/images/1462777275-270-worptzaup.jpg

Was bleibt ist ein zeitunabhängiges Skalarprodukt, das 
zyklen(Layer-)weise durchgerechnet wird. Das man die Signalwerte nicht 
als 'Digitalzahl' sondern wie in der Natur über die Frequenz 
repräsentiert und weiterverarbeit ist IMHo Stand der Technik von 1935 
wie seinerzeit von Helmut Hölzer mit seinem Analogrechner für das 
Aggregat-4 eingesetzt wurde.

https://www.cdvandt.org/Hoelzer%20V4.pdf

Und der musste das so machen weil der AD-Wandler nocht nicht erfunden 
war und man letzlich ohnehin ein analogas signal für die Steuerung der 
servos brauchte.

Wobei das damals auch nur ein Verfahren des 'analogen Rechens' von 
vielen war: 
https://tuprints.ulb.tu-darmstadt.de/5383/1/deBeauclair-Mathematik-ohne-Ziffern2016.pdf

von Sima80 (Gast)


Lesenswert?

Tilo R. schrieb:
> Die Beschreibungen von Maxe und A. S. sind richtig und für dein Problem
> geeignet.

Ja wirklich interessante Perspektiven die mir weiter helfen können. 
Danke dafür.

Tilo R. schrieb:
> Ich vermute dass du viel mehr Neuronen hast, als tatsächlich in einem
> Zeitschritt feuern.

Richtig. Das sehe ich in den bisherigen Simulationen mit sehr einfachen 
Modellneuronen. Bei einer stabilen Einstellung der verschiedenen Werte 
werden immer nur begrenzte Teile des Netz aktiv und andere Bereiche 
werden in rhythmischen Zeitabständen aktiviert.

Selbst bei einem gegenwärtig noch chaotisch generierten Netz entstehen 
interessante Effekte. Man kann temporäre Signal-Schleifen und 
rhythmische Wellen beobachten. Ich bin gespannt wie sich diese Effekte 
in einem weitgehend strukturierten Netz verhalten werden. Macht 
definitiv Spaß dem Signal Gewitter zuzuschauen :D
Jede zufällig generierte Netzstruktur hat dabei Eigenschaften die man 
kategorisieren kann.

Tilo R. schrieb:
> Beispiel: Annahme Neuron A feuert bei t=0 und sei mit den Neuronen B und
> C verbunden. Der Strom erreicht B und C etwas später, ich schreibe hier
> der Einfachheit halber t=1. (Deine Zeitskala kann in µs oder beliebig
> fein sein).
> In die Warteschlange kommt jetzt (t=1, "B wird befeuert") und (t=1, "C
> wird befeuert"). Du könntest auch unterschiedlich lange Laufzeiten
> abbilden mit (t=2, "C wird befeuert")

Auch das ist eine interessante Idee!


C. A. Rotwang schrieb:
> Einfach mal in einen Grundkurs Künstliche neuronale Netze schauen?!

Ich kenne und nutze einige KNN Modelle aus dem Bereich des machine 
learning bereits. Das geht in eine ganz andere Richtung. Ich möchte 
keine Bilderkennung oder dergleichen sondern das Verhalten biologischer 
Neuronen nachbilden.

C. A. Rotwang schrieb:
> Das man die Signalwerte nicht
> als 'Digitalzahl' sondern wie in der Natur über die Frequenz
> repräsentiert und weiterverarbeit ist IMHo Stand der Technik von 1935
> wie seinerzeit von Helmut Hölzer mit seinem Analogrechner für das
> Aggregat-4 eingesetzt wurde.

Ich habe noch vorhin zwei aktuelle Software Projekte gesehen Neuron und 
NEST. Die simulieren Neuronen immer noch mit Spannungskurven. Und ich 
glaube auch in den großen Projekten z.B. beim Human Brain Project 
simulieren die das analoge Verhalten biologischer Neuronen.
Diese wissenschaftlichen Modelle haben denke ich wenig mit den Modellen 
aus dem machine learning oder deep learning gemeinsam.

von Hans (Gast)


Lesenswert?

C-Rotwang
>Sima80 schrieb:
>> Ich frage ja nach Tipps. Gerne auch Hinweise auf ein fehlerhaftes
>> Vorgehen. Wie könnte man es besser machen?

>Einfach mal in einen Grundkurs Künstliche neuronale Netze schauen?!

>Dann sollte klar sein das man die 'Impulfolgensmodulierten'
>Nervensignale locker durch konstante Werte ersetzen kann. Diese
>'zeitliche Simulation' ist völlig irrelevant für die mathematische
>Modellierung eines neuronalen Netzes, das lernt man bereits in der
>ersten Vorlesungsstunde zu diesem Thema:

>https://cdn.weka-fachmedien.de/media_uploads/images/1462777275-270-worptzaup.jpg

Das mit dem "einfach mal in einen Grundkurs schauen" würde ich dir dann 
dringend mal ans Herz legen, bevor du meinst, den großen Max hier 
spielen zu müssen. Deiner Aussage zu Folge ist hier dein Fachkenntnis 
nämlich "Zero".
Damit es mit der Weiterbildung auch klappt, gebe ich dir mal das 
Sichwort "Spikin Neurons" als Start- und Suchbegriff.

Sima80: Was die Simulationstruktur deiner Netze anbelangt, kannst du bei 
den Vorträgen von Intel und IBM zu ihren Spiking-Neurons-Chips einige 
Anregungen finden.

von Sven B. (scummos)


Lesenswert?

Um mal nur auf die Frage aus dem ersten Post einzugehen, dein Problem 
ist nicht ganz untypisch, man findet dieses Muster -- viele Dinge, die 
nach einer bestimmten Zeit oder Schrittzahl irgendwann abgearbeitet 
werden müssen -- immer wieder in Software.

Es gibt grundsätzlich zwei Möglichkeiten damit umzugehen:
1. man diskretisiert die Zeit, und merkt sich in jedem Objekt, in 
welchem Zeitschritt es wieder aktiv wird. Dann geht man alle 
Zeitschritte durch und schaut jeweils in den Objekten nach.
2. man diskretisiert nicht, sondern hält eine sortierte Liste vor, in 
der die nächsten Ereignisse in ihrer Reihenfolge eingetragen sind. Die 
Schleife, die das abarbeitet, nimmt dann immer den ersten Eintrag aus 
der Liste raus.

Typischer ist Vorgehen (2), weil keine Diskretisierung notwendig ist und 
es für viele Problemklassen effizienter ist. Das gilt aber nicht 
unbedingt. Ich denke insbesondere dann, wenn die vorkommenden 
Intervalle sich ohnehin auf einem Grid unterbringen lassen und ein 
signifikanter Teil der Objekte in jedem Intervall angeschaut werden 
müssen, kann (1) effizienter sein.

Man kann auch eine Mischform bauen, wo man diskretisiert und alle 
Zeitschritte durchgeht, aber trotzdem die sortierte Liste mit 
Ereignissen hat statt alle Objekte durchzugehen.

: Bearbeitet durch User
von A. S. (Gast)


Lesenswert?

Sven B. schrieb:
> Man kann auch eine Mischform bauen, wo man diskretisiert und alle
> Zeitschritte durchgeht, aber trotzdem die sortierte Liste mit
> Ereignissen hat statt alle Objekte durchzugehen.

Am Ende ist es nur eine "Optimierungsaufgabe".

Wenn ein Großteil der Objekte in 10 Zeitschritten seinen Zustand ändert, 
ist der naive Ansatz (eine Schleife und rechnen) eher der effektivste 
(einfacher Code, einfache Operationen).

Wenn nur ein Bruchteil in 1000 Zeitschritten was tut UND die Simulation 
zu langsam wird, dann kann man je nach persönlicher Erfahrung das ganze 
optimieren.

Das unterscheidet sich kaum von z.B. einem RTOS: Die Warteschlangen 
sortieren oder es tickless zu machen.

Wenn allerdings in jedem Tick beliebig viele Eingänge sich ändern 
können, dann wird es schwierig, das zu optimieren. Da wäre es 
sinnvoller, eine angemessene Tickrate zu finden.

von C. A. Rotwang (Gast)


Lesenswert?

Sima80 schrieb:
> Ich möchte
> keine Bilderkennung oder dergleichen sondern das Verhalten biologischer
> Neuronen nachbilden.

Das ist in deinem verquasten Start-post nicht unbedingt zu erkennen, da 
steht nix von Biologie.

"Ich möchte eine physikalische Simulation mit zeitlich akkurat
aufgelösten Vorgängen durchführen."

Unter einer Physik-Simulation versteht man aber keine 
Neuronennachbildung,

https://en.wikipedia.org/wiki/Physics_engine

und schon der Begriff Neuron ist nicht ganz frei frei von 
Mehrdeutigkeiten:
https://de.wikipedia.org/wiki/Liste_menschlicher_Zelltypen#Nervensystem

Wenn es dir um eine Modellierung des Gehirns geht, dann ist dort eine 
populärwissenschaftliche Darstellung:
https://www.spektrum.de/pdf/82-91-sdw-09-2012-pdf/1159593?file

Dort ne website: 
https://www.humanbrainproject.eu/en/brain-simulation/brain-simulation-platform/

Am besten, du gehst erstmal in Dich und formulierst deine Absicht als 
Aufruf zur Mithilfe in einem neuen thread.

--
> Damit es mit der Weiterbildung auch klappt, gebe ich dir mal das
> Sichwort "Spikin Neurons" als Start- und Suchbegriff.
Danke, ist aber falsch geschrieben und geht auch nicht über das bisher 
gesagte hinaus und ist lediglich ein Beispiel dafür mit welchen 
Formulierungstricks man Fördergelder für kalten Kaffee lostreten kann. 
SCNR

von Sven B. (scummos)


Lesenswert?

A. S. schrieb:
> Am Ende ist es nur eine "Optimierungsaufgabe".

Naja, in diesem Fall würde ich mich ganz klar auf die "Performance 
always matters"-Seite stellen, aber stimmt natürlich ;)

von Hans (Gast)


Lesenswert?

>C. A. Rotwang (Gast)
> Hans schrob:
>> Damit es mit der Weiterbildung auch klappt, gebe ich dir mal das
>> Sichwort "Spikin Neurons" als Start- und Suchbegriff.
>Danke, ist aber falsch geschrieben und geht auch nicht über das bisher
>gesagte hinaus und ist lediglich ein Beispiel dafür mit welchen
>Formulierungstricks man Fördergelder für kalten Kaffee lostreten kann.

Über Rechtschreibfehler unterhält man sich im allgemeinen nur, wenn man 
sonst keinen Inhalt zu bieten hat.
Ansonsten, ja, das Thema "Spiking Neurons" ist sicherlich noch ein 
Forschungsthema und abgesehen von den großen Neuroprozessor-Racks die 
von Intel und IBM an die die Forschungslabore der Rüstungsindustrie 
verkauft werden, fließt da eher noch weniger Geld und die Universitäten 
leben da von Fördergeldern.
Was ich aber immer wieder bei alternden Ingenieuren feststellen muss, 
ist der Glaube, schon alles zu wissen und tatsächliche Neuerungen nicht 
mehr erkenn zu können und auch nicht erkennen zu wollen. Das geht dann 
meist so: Ki und Neuronen? Das hatte ich schon im ersten Semester im 
Studium. Da gbit's nicht wesentlich Neues.
Dem ist mitnichten so: Seit man vor ca. 25 Jahren in den Unis angefangen 
hat, die Grundlagen der KI zu vermitteln ist viel Zeit vergangen. Wie 
und mit welchen Verfahren man die Netze trainiert, welche Schichttiefe 
und Strukturen notwendig sind, das alles hat riesige Fortschritte 
gemacht.
Was die Spiking Neurons oder Pulsneuronen anbelangt, sind diese wieder 
eine völlig neue Richtung, das die einzelnen Neuronen und Synapsen dort 
interne Zustandsvariablen haben, die wieder ganz andere Algorithmen 
ermöglichen, die bisher noch gar nicht alle gefunden sind.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.