© StonePictures/Shutterstock.com
Classic Games Reloaded – Teil 13

Intelligente Neuronen und dendritisches Lernen (I)


Im heutigen Artikel befassen wir uns mit der Funktionsweise und den Einsatzmöglichkeiten eines weiterentwickelten Neuronenmodells. Mit Hilfe dieser intelligenten Neuronen lassen sich unter anderem verschiedene Verhaltensweisen in einem Computerspiel simulieren, Gefahrenabschätzungen innerhalb der Spielewelt vornehmen oder Funktionsverläufe approximieren.

Können Einzeller bzw. einzelne Neuronen intelligente Verhaltensweisen an den Tag legen? In Frank Schätzings Roman „Der Schwarm“ aus dem Jahr 2004 wird diese Frage eindeutig mit einem dicken, fetten „Ja“ beantwortet. Intelligente Einzeller, die Yrr, die in den Tiefen des Meeres leben und die Menschen vom Angesicht der Erde tilgen wollen, gehören selbstredend in das Reich der Fantasie (hoffe ich zumindest). Nichtsdestotrotz handelt es sich ohne Frage um ein recht interessantes Gedankenspiel. Nun ja, zumindest der Versuch, das Verhalten dieser Einzeller mit Hilfe eines Computerprogramms simulieren zu wollen, scheint dann doch zunächst ein wenig an den Haaren herbeigezogen zu sein: Man nehme ein künstliches neuronales Netzwerk, kappe sämtliche neuronalen Verbindungen und gestatte es den einzelnen Neuronen, in Eigenregie miteinander zu verschmelzen – und schon soll die Post abgehen? Die aus den Verschmelzungen hervorgehenden Schwärme und Netzwerke sollen angeblich die Leistungsfähigkeit der modernsten Parallelrechner um Längen übertreffen und urplötzlich in der Lage dazu sein, selbst die kompliziertesten Probleme in Nullkommanix zu bewältigen. Ich muss an dieser Stelle wohl nicht extra betonen, dass sich mit Hilfe der künstlichen Neuronen, die in unseren Programmbeispielen bislang zum Einsatz gekommen sind, keine derartigen Computersimulationen realisieren lassen.

rudolph_spieleklassiker_1.tif_fmt1.jpgAbb. 1: Neuronenmodelle

Die einzelnen Neuronen, die wir zum Aufbau der von uns verwendeten künstlichen neuronalen Netzwerke genutzt haben (siehe hierzu das in Abbildung 1 illustrier-te Neuronenmodell ohne Dendriten), repräsentieren lediglich sogenannte Aktivierungsfunktionen. Mit deren Hilfe lassen sich die jeweiligen Eingangssignale – hierbei kann es sich um Umgebungsreize handeln oder um Signale von vorgeschalteten Neuronen – in entsprechende Ausgangssignale umrechnen, bevor sie dann mit unterschiedlichen Gewichtungen an nachgeschaltete Neuronen weitergeleitet werden:

NeuronOutput = Activationfunction(SumOfNeuronInputs)
  • Beispiel 1 – Tanh-Aktivierung (Tangens hyperbolicus):

    NeuronOutput = tanh(SumOfNeuronInputs);
  • Beispiel 2 – ReLU-Aktivierung (Rectified Linear Unit):

    NeuronOutput = max(0.0f, SumOfNeuronInputs);
  • Beispiel 3 – binäre Aktivierung:

    NeuronOutput = 0.0f; if (SumOfNeuronInputs > Threshold) NeuronOutput = 1.0f;

Im heutigen Artikel werden wir uns unter anderem damit beschäftigen, auf welche Weise wir unsere künstlichen Neuronen zumindest mit ein wenig Intelligenz ausstatten können. Im Unterschied zu den Yrr, die in Schätzings Roman ihr selbsterlangtes und geerbtes Wissen in ihrer DNS kodieren, stellen in unserem Fall die sogenannten RBF-Neuronen den Ausgangspunkt für alle weiteren Betrachtungen dar. Die Abkürzung RBF verweist in diesem Zusammenhang auf einen speziellen Typus von Aktivierungsfunktionen, die bei der Simulation eines solchen Neurons zum Einsatz kommen: den sogenannten radialen Basis-Funktionen. Ähnlich wie ein Yrr besitzt ein RBF-Neuron gewissermaßen ein eigenes Gedächtnis, in welchem sich beispielsweise Zahlenwerte, Zahlenreihen, Muster, Ziffern oder Buchstaben abspeichern lassen.

Das Funktionsprinzip eines RBF-Neurons

Wie Sie anhand der nachstehend vorgestellten RBF-Aktivierungsfunktion erkennen können, liegt die neuronale Aktivität (neuronOutput) eines RBF-Neurons in einem Bereich zwischen null und eins, sofern man als Vorfaktoren (f1, f2 usw.) lediglich positive Zahlenwerte berücksichtigt. Der Aktivitätsverlauf selbst entspricht einer Glockenkurve, deren Breite von den einzelnen Vorfaktoren abhängt. Je kleiner die Faktoren sind, umso breiter ist die Kurve:

  • RBF-Aktivierungsfunktion:

    sumSquare = f1*(input1–c1)*(input1–c1) + f2*(input2–c2)*(input2–c2) + ...; neuronOutput = exp(-sumSquare);

Das Gedächtnis eines RBF-Neurons wird nun gewissermaßen einerseits durch die einzelnen Centroid-Werte c1, c2, usw. (Centroid, zu Deutsch: Schwerpunkt) und andererseits durch die zugehörigen Vorfaktoren repräsentiert. Wenn nun, wie im ersten Rechenbeispiel gezeigt wird, die einzelnen Inputwerte mit den jeweils zugeordneten Centroid-Werten identisch sind (der Eingabevektor entspricht folglich dem Schwerpunktvektor), dann führt das zu der maximal möglichen neuronalen Aktivität von eins:

  • Beispiel 1 – maximale neuronale Aktivität, da die Eingabewerte mit den zugehörigen Centroid-Werten identisch sind:

    input = (1, 0) sowie centroid = (1, 0) und f1 = f2 = 1 sumSquare = 1*(1–1)*(1–1) + 1*(0–0)*(0–0) = 0 neuronOutput = exp(-sumSquare) = exp(-0) = 1

Jede einzelne Abweichung zwischen einem Input- und dem jeweils zugeordneten Centroid-Wert führt zu einer Verringerung der neuronalen Aktivität. Mit Hilfe der einzelnen Vorfaktoren können wir nun die jeweiligen Abweichungen ganz individuell gewichten. Spielt eine Abweichung nur eine untergeordnete Rolle, muss der Wert des zugehörigen Vorfaktors entsprechend klein sein. Ein entsprechend großer Vorfaktor führt hingegen dazu, dass die neuronale Aktivität schon bei einer verhältnismäßig kleinen Abweichung gegen null geht:

  • Beispiel 2 – verringerte neuronale Aktivität aufgrund einer Abweichung zwischen dem zweiten Input- und dem zugehörigen Centroid-Wert:

    input = (1, 0), centroid = (1, 2) und f1 = f2 = 1 sumSquare = 1*(1–1)*(1–1) + 1*(0–2)*(0–2) = 4 neuronOutput = exp(-sumSquare) = exp(-4) = 0.018

Intelligente Neuronen

Am Anfang dieses Artikels habe ich die Frage in den Raum gestellt, ob Einzeller oder einzelne Neuronen so etwas wie Intelligenz hervorbringen können. Anhand von mehreren einfachen Fallbeispielen möchte ich Ihnen an dieser Stelle demonstrieren, dass sich diese Frage für RBF-Neuronen durchaus mit einem „Ja“ beantworten lässt. In unserem ersten Beispiel beschäftigen wir uns zunächst einmal mit dem Thema der Risikoabschätzung. So ist die Voraussetzung dafür, dass sich eine von der KI kontrollierte Einheit oder Spielfigur möglichst gefahrlos durch die Spielewelt bewegen kann, eine Risikobewertung von sämtlichen in Frage kommenden Wegen. In diesem Zusammenhang könnte das für die Gefahrenabschätzung verantwortliche RBF-Neuron beispielsweise auf die nachfolgende Aktivierungsfunktion zurückgreifen:

risk = exp(-f*distSq);

Je größer der quadratische Abstand distSq zu einer potenziell gefährlichen Position innerhalb der Spielewelt ist (an dieser Stelle könnte sich beispielsweise ein möglicher Gegner oder ein todbringendes Objekt wie eine Bombe befinden), umso geringer ist die Gefahr für eine KI-Einheit oder -Spielfigur. Mit Hilfe des Faktors f können wir zudem festlegen, wie groß das Risiko an den jeweiligen Positionen tatsächlich ist. Befindet sich an einer Position zum Beispiel ein übermächtiger Gegner, dann muss der Wert des Faktors f entsprechend klein gewählt sein (der Funktionsverlauf entspricht dann einer breiten Glockenkurve). Geht von dem betreffenden Gegner hingegen nur eine mäßige Gefahr aus, dann müssen wir für den Faktor f einen entsprechend größeren Wert verwenden (Peak-förmiger Funktionsverlauf). So gesehen könnten wir den Faktor beispielsweise wie folgt berechnen:

f = 1.0f / (0.0001f + riskPotential);

Selbstverständlich können wir bei der Risikobewertung auch das Gefahrenpotenzial mehrerer Positionen gleichzeitig berücksichtigen:

risk = exp(-f1*distSq1) + exp(-f2*distSq2) + ...;

Kommen wir nun auf unser zweites Fallbeispiel zu sprechen. Wie Sie vielleicht wissen, ist die Aktivität vieler Lebewesen unter anderem von der Umgebungstemperatur T und der momentanen Helligkeit H abhängig. Sobald die besagten Werte von den optimalen Parametern (optimale Temperatur oT sowie optimale Helligkeit oH) abweichen, verringert sich die Aktivität der besagten Lebewesen zusehends. Mittels der nachfolgend gezeigten Aktivierungsfunktion können wir ein solches Verhalten unter Zuhilfenahme eines einzelnen RBF-Neurons simulieren:

activity = exp(-(f1*(H-oH)*(H-oH) + f2*(T-oT)*(T-oT)));

In Rahmen unseres dritten Fallbeispiels werden wir uns mit dem Thema der Verhaltenssimulation in einem Computerspiel auseinandersetzen. Es versteht sich von selbst, dass man auch in einem recht einfach gestrickten Spiel das Verhalten der einzelnen KI-Gegner nicht mal eben so nach dem Zufallsprinzip festlegen kann. In der Regel muss die KI zunächst einmal eine Reihe von Grundbedürfnissen (Gesundheit, Nahrung, Munition, usw.) im Blick behalten und wenn nötig durch Auswahl einer der nachfolgend aufgelisteten Verhaltensweisen sicherstellen, dass es hier zu keiner Schieflage kommt, die im schlimmsten Fall ein vorzeitiges Ableben zur Folge hätte:

  • Gesundheitsfürsorge (Erste-Hilfe-Ausrüstung suchen, Lebenspunkte einsammeln usw.)

  • Nahrungssuche bzw. Energiebeschaffung

  • Munitionsbeschaffung

Geht beispielsweise der Munitionsvorrat zur Neige, müssen wir natürlich erst einmal der Munitionsbeschaffung den Vorrang geben, bevor der betreffende KI-Gegner wieder in den Angriffsmodus wechseln kann:

  • Ermittlung des Prioritätswerts für die Munitionsbeschaffung (Variante 1):

    value = max(Ammo, minTolerableAmmo) - minTolerableAmmo; priority = exp(-f*value*value);
  • Ermittlung des Prioritätswerts für die Munitionsbeschaffung (Variante 2):

    value = min(Ammo, minTolerableAmmo) - minTolerableAmmo; priority ...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang