Retour au Blog
Machine Learning 28 novembre 2024 9 min de lecture

Algorithme NEAT : faire évoluer des réseaux de neurones sans backprop

Comment NEAT fait évoluer les poids et la topologie des réseaux de neurones — spéciation, croisement, numéros d'innovation.

Ce qui rend NEAT spécial

Contrairement aux réseaux classiques, NEAT démarre avec des réseaux minimaux et n'ajoute de la complexité que lorsque nécessaire. Cela évite le surdimensionnement et trouve des solutions efficaces.

Concepts clés

Spéciation

Les réseaux sont regroupés en espèces selon leur similarité structurelle. Chaque espèce concourt en interne, préservant la diversité.

Numéros d'innovation

Chaque nouvelle mutation structurelle (nouvelle connexion/nœud) reçoit un numéro d'innovation global unique. Cela permet un croisement pertinent entre topologies différentes.

Partage de fitness

La fitness est divisée par la taille de l'espèce pour empêcher une espèce de dominer.

Implémentation Python (neat-python)

import neat

config = neat.Config(
    neat.DefaultGenome,
    neat.DefaultReproduction,
    neat.DefaultSpeciesSet,
    neat.DefaultStagnation,
    'config-feedforward'
)

def eval_genomes(genomes, config):
    for genome_id, genome in genomes:
        net = neat.nn.FeedForwardNetwork.create(genome, config)
        genome.fitness = run_game(net)  # your game/simulation

population = neat.Population(config)
population.run(eval_genomes, n=1000)
NEATNeuroevolutionGenetic AlgorithmGame AIEvolutionary Computing
O

Ossama Elhakki

Ingénieur IA & Systèmes ML — Maroc