Cómo aumentar el rendimiento de NEAT (NeuroEvolution of Augmenting Topologies)
NEAT, siglas de NeuroEvolution of Augmenting Topologies, es un algoritmo evolutivo desarrollado por Kenneth Stanley y Robert Miikkulainen en 2002. A diferencia de otros métodos de entrenamiento de redes neuronales, NEAT no solo ajusta los pesos sino que evuelve la propia topología de la red, añadiendo nuevas neuronas y conexiones a lo largo de las generaciones. Cuando hablamos de «aumentar NEAT», normalmente nos referimos a mejorar su capacidad evolutiva para que converja más rápido hacia soluciones de mayor rendimiento.
El primer paso para aumentar el rendimiento de NEAT es comprender sus mecanismos internos. El algoritmo opera con tres fases principales: la fase de mutación (donde se alteran pesos y topología), la fase de cruce o recombinación (donde se combinan genes de dos redes padre) y la fase de selección (donde las redes con mejor fitness superviven). Si cualquiera de estas fases está mal calibrada, la evolución se estanca o deriva hacia soluciones subóptimas.
Un aspecto clave es la protección de la innovación. NEAT utiliza un sistema de «especies» que agrupa redes con compatibilidad genética similar. Esto permite que innovaciones estructurales (nuevas conexiones, nuevas neuronas) no sean inmediatamente eliminadas por la selección. Para aumentar el rendimiento, conviene ajustar el umbral de compatibilidad genética (compatibility threshold): un valor demasiado alto fragmenta las especies y reduce la diversidad; uno demasiado bajo las agrupa en exceso y puede eliminar innovaciones prematuramente.
La función de fitness es otro pilar fundamental. Si tu problema implica optimizar una red neuronal para una tarea concreta (clasificación, control robótico, predicción, etc.), la función de fitness debe reflejar con precisión el criterio de éxito. Un error común es usar una función de fitness demasiado ruidosa o con múltiples picos, lo que confunde al algoritmo. En esos casos, se recomienda añadir ruido controlado o promediar la fitness sobre varias evaluaciones.
El tamaño de población también influye directamente en la capacidad de NEAT para explorar el espacio de soluciones. Una población demasiado pequeña (menos de 100 individuos) reduce la diversidad genética; una demasiado grande (más de 5000) aumenta el coste computacional sin garantizar mejoras proporcionales. Un rango habitual y bien estudiado es entre 300 y 1500 individuos, dependiendo de la complejidad del problema.
| Parámetro | Rango típico | Efecto en el rendimiento |
|---|---|---|
| Tasa de mutación de pesos | 0.5 – 1.0 | Exploración local |
| Tasa de mutación topológica | 0.1 – 0.3 | Innovación estructural |
| Tamaño de población | 300 – 1500 | Diversidad vs. coste |
| Umbral de compatibilidad | 1.0 – 3.0 | Número de especies |
| Presión de selección | 1.0 – 3.0 | Velocidad de convergencia |
Otra estrategia avanzada para aumentar NEAT es la adaptación de la tasa de mutación topológica. En las primeras generaciones, se puede incrementar la probabilidad de añadir nuevas conexiones o neuronas para construir rápidamente la arquitectura; en generaciones posteriores, se reduce esa tasa para refinar los pesos. Este enfoque, conocido como annealing topológico, acelera la convergencia sin sacrificar la calidad de la solución final.
Si trabajas con implementaciones específicas como neat-py (la biblioteca Python de referencia), el objeto Config permite ajustar todos estos parámetros de forma declarativa. Es recomendable mantener un registro de las configuraciones probadas y sus resultados, ya que la optimización de NEAT es altamente dependiente del problema concreto.
Finalmente, no subestimes el uso de semillas aleatorias fijas durante el desarrollo. Al fijar la semilla, puedes reproducir exactamente la misma evolución y aislar el efecto de un cambio de parámetro específico antes de escalar a múltiples corridas con diferentes semillas.
El rango óptimo de tamaño de población en NEAT suele situarse entre 300 y 1500 individuos, equilibrando diversidad genética y coste computacional.
Dato clave