Zum Hauptinhalt Zur Navigation

Vielfältiger Einsatz mit geringen Mitteln

Das Grundprinzip lässt sich über viele verschiedene Domänen hinweg einsetzen, etwa auch für das Schreiben von Code. Über zehn Jahre bevor es überhaupt denkbar war, mit neuronalen Netzen Programmcode zu produzieren, wurde evolutionäre Programmierung bereits eingesetzt, um zum Beispiel besseren Code(öffnet im neuen Fenster) für die Shader im Rendering zu produzieren.

Als Population dient dann eine Liste von möglichen Programmcodes, deren Modifikation durch zufällige Änderungen (Mutation) und Rekombination von Codeschnipseln (Crossover) geschieht. Als Fitness kann etwa die benötigte Rechenzeit eines Shaders beziehungsweise die Korrektheit der berechneten Farbe verwendet werden. Hacks wie die berühmte Annäherung einer inversen Wurzel(öffnet im neuen Fenster) , wie sie in Quake verwendet wurde, lassen sich so automatisch produzieren.

Selbst modernes Deep Learning mit neuronalen Netzen kann von evolutionären Algorithmen profitieren. Wo häufig eine Mischung aus Bauchgefühl, ein paar Grundregeln und einer Prise schwarzer Magie als eine Art moderne Alchemie verwendet wird, um gute Architekturen zu finden, lässt sich das Ganze evolutionär automatisieren(öffnet im neuen Fenster) .

Mehr Inspiration aus der Biologie

Besonders interessant sind die Parallelen zur echten Biologie, deren Analyse Potenzial für weitere Verbesserungen birgt. So treten etwa Phänomene wie konvergente Evolution auf: Aus mehreren eigentlich unterschiedlichen Lösungen entwickeln sich semantisch identische Konzepte.

Etwa, wenn zwei unterschiedlich formulierte Programmcodes oder Rechenbäume für ein Problem am Ende das Gleiche tun. Wie in der Biologie wird dann von einem identischen Phänotyp, also einem beobachtbaren Erscheinungsbild, gesprochen: Der generierte Programmcode verhält sich identisch, auch wenn er etwas anders aufgebaut ist.

Aus der Natur lassen sich dabei direkt Lösungen für Probleme ablesen. Ohne weitere Beschränkungen besteht nach wenigen Generationen etwa eine Population nur noch aus einer Lösung und ihren Nachkommen, Diversität geht verloren. Das führt dazu, dass potenzielle Nachkommen sich weniger weiterentwickeln. Ein größerer Genpool schafft hier Abhilfe: Durch die künstliche Schaffung von Nischen lässt sich eine gewisse Diversität erzwingen.

Ähnlich kann etwa ein künstlicher Lebenszyklus eingebaut werden, der dazu führt, dass jede Lösung ein Ablaufdatum hat, um Platz für neue Lösungen zu schaffen. Temporär ein Nachteil, auf lange Sicht schafft aber nur das Platz für Nachkommen, die das Potenzial haben, noch besser zu werden.

Gerade das ist ein Beispiel dafür, was evolutionäre Algorithmen auszeichnet: Wo bei neuronalen Netzen nur schrittweise angepasst wird, können Mutationen und Crossover massive Änderungen erreichen, die ein normalerweise erstarrtes Problem in eine neue, zuerst widersinnig erscheinende Richtung bewegen. Ein lokales Optimum, also eine Lösung, bei der eine Änderung erst einmal Dinge nur schlechter macht, kann so langfristig möglicherweise überwunden werden, um in Zukunft eine global bessere Lösung zu finden.


Relevante Themen