Für einen deterministischen Problemraum muss ich ein neuronales Netzwerk mit der optimalen Knoten- und Verbindungsstruktur finden. Ich möchte einen genetischen Algorithmus verwenden, um viele neuronale Netzwerke zu simulieren und die beste Netzwerkstruktur für die Problemdomäne zu finden.
Ich habe noch nie zuvor genetische Algorithmen für eine solche Aufgabe verwendet. Was sind die praktischen Überlegungen? Wie soll ich die Struktur eines neuronalen Netzwerks in ein Genom kodieren?
Die Verwendung evolutionärer Algorithmen zur Entwicklung neuronaler Netze wird als Neuroevolution bezeichnet .
Einige Neuroevolution-Algorithmen optimieren nur die Gewichte eines neuronalen Netzwerks mit fester Topologie. Das hört sich nicht so an, wie Sie es wollen. Andere Neuroevolution-Algorithmen optimieren sowohl die Gewichte als auch die Topologie eines neuronalen Netzes. Diese Art von Algorithmen scheint besser für Ihre Ziele geeignet zu sein und wird manchmal als TWEANNs (Topology and Weight Evolving Neural Networks) bezeichnet.
Ein beliebter Algorithmus heißt NEAT und ist wahrscheinlich ein guter Anfang, schon allein deshalb, weil es eine Vielzahl von Implementierungen gibt, von denen hoffentlich eine in Ihrer Lieblingssprache geschrieben ist. Das würde Ihnen zumindest eine Basis geben, mit der Sie arbeiten können.
NEAT kodiert ein neuronales Netzwerkgenom direkt als Graphstruktur. Mutationen können auf die Struktur des Netzwerks angewendet werden, indem neue Verknüpfungen (durch Verbinden von zwei zuvor nicht verbundenen Knoten) oder neue Knoten (durch Aufteilen einer vorhandenen Verbindung) hinzugefügt werden, oder sie können nur auf das Ändern der mit Kanten in den Diagrammen verbundenen Gewichte angewendet werden (als Mutieren bezeichnet) die Gewichte). Um Ihnen eine Vorstellung von der Größenordnung der Größen von ANNs zu geben, mit denen dieser spezielle Algorithmus arbeitet, würde es wahrscheinlich mit mehr als 100 oder 200 Knoten zu kämpfen haben.
Es gibt skalierbarere TWEANNs, die jedoch komplexer sind und Annahmen über die Art der von ihnen erzeugten Strukturen treffen, die in der Praxis möglicherweise nicht immer produktiv sind. Eine andere Möglichkeit, die Struktur eines neuronalen Netzwerks zu codieren, ist beispielsweise das Produkt eines Keimmusters, das wiederholt um eine Grammatik erweitert wird (z. B. ein L-System). Sie können größere Strukturen viel einfacher erkunden, aber da sie durch eine Grammatik generiert werden, haben sie eine charakteristische, sich selbst wiederholende Art von Gefühl. HyperNEAT ist eine beliebte Erweiterung von NEAT, die eine andere Annahme macht (dass Gewichtungsmuster leicht als Funktion der Geometrie ausgedrückt werden können) und auf ANNs mit Millionen von Verbindungen skaliert werden kann, wenn diese Annahme gut zu einer bestimmten Domäne passt.
Im oberen Link sind einige Umfragepapiere verlinkt, wenn Sie eine größere Vielfalt von Techniken beobachten möchten.
quelle