Entendí cómo aprende una red neuronal viendo a Mario morir
En 2015, SethBling publicó MarI/O, un video en que una red neuronal aprende sola a pasar un nivel de Super Mario World. Once años después quise repetirlo con Super Mario Bros. sin saber qué era NEAT. Esta es la historia de cómo usé a Claude para entenderlo.
Camilo Henríquez · 18 de octubre de 2026 · 10 min de lectura
Once años después
SethBling escribió MarI/O en Lua, dentro de un emulador. Su red jugaba un nivel, la generación siguiente jugaba un poco mejor, y después de 34 generaciones y cerca de un día de entrenamiento terminó el nivel. Él entendía cada pieza: el algoritmo, la lectura de la memoria del juego y el diseño del premio.
Yo llegué al tema por otro lado. Ese mismo día había hecho con Claude un curso de bases de IA en cinco módulos: vectores, regresión, backpropagation, redes convolucionales y transformers. Entendía las fórmulas, pero nunca había visto a una red aprender. Quería un experimento donde pudiera cambiar un parámetro y ver el efecto en un gráfico. Mario sirve para eso: cada partida dura segundos, la red muere a la vista y la generación siguiente muere un poco más lejos.
Claude escribió casi todo el código. Yo hice las preguntas, corrí los entrenamientos y miré los gráficos. Este texto cuenta cómo usé esa conversación para aprender.
Generaciones 5 a 40 de la corrida que terminó el nivel. A la izquierda, el juego. A la derecha, lo que ve la red (la grilla), la red misma (verde si el peso es positivo, rojo si es negativo), los botones que aprieta y su curva de fitness hasta esa generación.
Lo mínimo para seguir el resto
La red no mira la pantalla
Lee la memoria RAM del emulador y la resume en una grilla de 13×13 casillas alrededor de Mario: bloque, enemigo o vacío. Son 169 números de entrada y una salida por cada botón del control.
NEAT
NeuroEvolution of Augmenting Topologies. No entrena con ejemplos: hace evolución. 300 redes juegan, las que llegan más lejos tienen hijos, los hijos mutan (cambian sus pesos, ganan conexiones o neuronas) y se repite. Cada vuelta es una generación.
Fitness
La nota de cada partida: cuán a la derecha llegó Mario, menos la mitad de los cuadros que tardó, más 1000 si toca la bandera. Pasar el 1-1 da algo más de 3000.
Especies
NEAT agrupa las redes parecidas, para que una idea nueva compita primero con las de su grupo y tenga unas generaciones para madurar.
Lo que ve la red
En x = 2850, frente al último tubo. Negro: bloque. Ámbar: enemigo. Recuadro: Mario.
Preguntar sin vergüenza
Mi primer mensaje fue largo y desordenado:
He visto modelos aprender a jugar Mario Bros. […] No sé si tiene la capacidad visual o si el ROM del juego está modificado para que el modelo pueda leer directamente los estados del juego […] ¿Cuál es la mejor forma de hacerlo?
No sabía la diferencia entre mirar píxeles y leer memoria. La respuesta me ordenó el mapa. Un modelo puede percibir un juego de tres maneras: por los píxeles, por la RAM convertida en una grilla o por una mezcla. Puede aprender por neuroevolución, por aprendizaje por refuerzo o imitando partidas humanas. Y un LLM con visión no sirve para jugar Mario, porque el juego pide reaccionar 60 veces por segundo y un LLM tarda segundos en cada decisión. Elegí reproducir MarI/O porque es la opción en que se ve crecer la red.
Después vinieron preguntas básicas, y las hice igual:
¿Cuántas redes se ponen a correr a la vez? ¿Una generación por vez?
¿Hasta cuándo va a estar entrenando?
Ninguna es una pregunta de experto, y cada respuesta me dejó una pieza del modelo mental.
El vocabulario, con mis propios datos
Mientras entrenaba, la consola imprimía una tabla por generación con columnas como adj fit, stag y age. No entendía ninguna. Le pedí a Claude una clase de NEAT en una página web, con gráficos y dibujos de redes. Mientras la escribía, le fui agregando pedidos: la extinción, qué significa cada columna de la consola y cómo decide NEAT cuántas neuronas y capas usar.
La clase quedó armada con mi propia corrida. Las curvas eran las mías y las redes dibujadas eran las que estaban jugando en mi computador. Un concepto se entiende distinto cuando el ejemplo es tu experimento.
Esa misma noche pregunté si una grilla más grande daría mejores resultados, y agregué:
Solo dímelo, no hagas cambios en el código.
Quería entender el efecto antes de gastar una corrida en verlo. Separar esos dos modos, explicar y hacer, resultó una de las cosas más útiles de todo el proceso.
La tesis antes que el experimento
Dejé corriendo 1000 generaciones. Mario no terminó el nivel: la mejor red llegó a x = 2850, la bandera está en x = 3161, y las últimas 270 generaciones no mejoraron nada.
Ahí cambié la forma de trabajar. Le pedí a Claude que revisara el entrenamiento y que dejara sus explicaciones «a modo de tesis, que comprobaremos después de cambiar los parámetros». Desde entonces, cada cambio llevó una hipótesis y predicciones escritas antes de correr: cuántas especies debería haber, en qué generación debería subir el récord, qué entrada debería usar la red. Al terminar cada corrida, anotábamos cuál se cumplió y cuál no. Fueron 14 predicciones antes de terminar el 1-1.
Una predicción escrita no se puede reinterpretar después. Me protegía de convencerme de lo que quería ver, y también ponía a prueba las explicaciones de Claude.
Mover una perilla y mirar el gráfico
Cada corrida cambió una cosa a la vez, y cada una me dejó un concepto que antes era solo una palabra.
Corrida 2 · especies
Dos especies que no podían morir
Lo que vimos
En 897 de las 1000 generaciones de la primera corrida hubo solo 2 o 3 especies. Con species_elitism = 2, NEAT nunca elimina a las 2 mejores especies, así que con 2 especies ninguna podía morir. Una llevaba 270 generaciones sin mejorar y seguía ahí.
Perilla
compatibility_threshold, que define cuán distintas deben ser dos redes para ser de especies distintas, pasó de un valor fijo a uno que se ajusta solo para mantener unas 12 especies. species_elitism bajó de 2 a 1.
Predicción
Habrá entre 8 y 16 especies, y las estancadas morirán a tiempo.
Resultado
Se cumplió: el 93 % de las generaciones tuvo entre 8 y 16 especies. El récord subió más rápido, pero tampoco terminó el nivel.
Lo que entendí
Una población que converge deja de explorar. Las especies son la forma en que NEAT protege la diversidad, y un parámetro mal puesto la apaga sin que se note en la curva de fitness.
Especies por generación
corrida 1 · umbral fijocorrida 2 · umbral que se ajusta soloobjetivo: 8 a 16
Primeras 556 generaciones de cada corrida. Pasa el cursor para ver cada generación.
Corrida 3 · mutación
Los hijos no heredaban lo que sabía el padre
Lo que vi yo
Mirando la corrida 2 escribí: «el gráfico de fitness vs. promedio muestra cómo va cada vez haciéndose más grande la brecha del promedio con el mejor fitness […] ¿alguna forma de remediar eso?».
Lo que midió Claude
No respondió con una opinión. Tomó a la mejor red, le generó 1500 hijos con la mutación de entonces y los hizo jugar: solo el 10,5 % conservaba al menos el 95 % del fitness del padre. Cada hijo cambiaba cerca del 90 % de sus pesos. Con una mutación suave, el 78 % lo conservaba.
Perilla
weight_mutate_rate de 0,8 a 0,1, y algo parecido para los bias y para los borrados de conexiones y neuronas.
Predicción
Los hijos heredarán, y el borde del nivel se llenará de redes cerca de la mejor.
Resultado
Las redes con al menos el 90 % del fitness de la mejor pasaron de 2 a una mediana de 63. Llegó a 2160 en la generación 168; la primera corrida había necesitado 730 generaciones para llegar a 2150.
Lo que entendí
Evolucionar es explorar sin olvidar. Si la mutación es muy fuerte, cada generación empieza casi de cero, y el promedio no sube por bueno que sea el campeón.
La mejor red contra el promedio
mejor redpromedio de la poblaciónbrecha
Primeras 556 generaciones de las corridas 2 y 3. Lo único que cambió entre ambas fue la mutación.
La corrida 3 se estancó después en otro punto, con 830 generaciones sin avanzar. A la red le faltaba algo que no se arreglaba cambiando cómo busca la evolución. Para averiguar qué, Claude hizo una prueba que me hizo dudar de todo el experimento.
¿Estás manipulando el aprendizaje?
Para saber qué le faltaba a la red, Claude probó forzar el botón A en ciertos tramos y ver si así llegaba a la bandera. Llegaba. Eso me incomodó, y pregunté:
¿Pero estás manipulando el aprendizaje? ¿Sin que se aprenda de forma no supervisada?
La respuesta separó dos cosas que yo tenía mezcladas. Esas pruebas eran diagnóstico: se corrían aparte, después del entrenamiento, y nada volvía a la población. Servían para saber qué le faltaba a la red, no para enseñárselo. Lo que sí cambiábamos entre corridas era cómo busca la evolución (las especies, la mutación) y qué percibe la red (sus entradas). Nunca qué botón apretar ni cuándo. El único maestro seguía siendo el fitness.
Trampa habría sido una regla como «saltar en x = 2600», que el programa repitiera el salto solo o que se premiara cada Goomba esquivado.
También me corrigió el vocabulario. NEAT no es aprendizaje no supervisado, porque ese no recibe ninguna señal de premio. NEAT aprende de un premio, igual que el aprendizaje por refuerzo.
De ahí salió una regla escrita para el resto del proyecto: darle a la red sentidos y un método de búsqueda, nunca conductas ni premios a medida. La pregunta importaba porque una IA optimiza la meta que le das. Si la meta es que Mario pase el nivel, el camino corto es meterle conocimiento humano. Mi meta era entender cómo aprende una red.
La red que recuerda
Corrida 4 · memoria
Un salto largo exige recordar
Lo que vimos
Al final del nivel hay saltos largos, y un salto largo exige mantener A apretado entre 20 y 30 cuadros. La red decide cada 5 cuadros mirando solo la grilla de ese instante, sin recordar qué hizo antes. Ya le habíamos dado una entrada que dice si A estaba apretado en la decisión anterior. Con ella aprendió a soltar A, pero solo le alcanzaba para saltos cortos.
Dos caminos
Claude propuso dos. El primero era un sentido nuevo que dijera si Mario está en el aire: rápido, pero es conocimiento mío puesto en la red. El segundo, una red recurrente con memoria, como la del MarI/O original: más fiel a que aprenda sola, con una búsqueda más difícil. Elegí el segundo, por la regla de la sección anterior.
Perilla
feed_forward = False.
Predicción
La red guardará memoria en ciclos, conexiones que vuelven sobre sí mismas.
Resultado
Tocó la bandera en la generación 42. Las tres corridas anteriores sumaban más de 2500 generaciones sin lograrlo. La predicción del mecanismo falló: la red no usa ciclos. En una red recurrente, cada neurona oculta entrega el valor que calculó en la decisión anterior, y ese retraso es su memoria. Si la misma red juega sin él, su fitness cae de 3366 a 369.
Lo que entendí
La memoria de una red puede ser algo tan simple como un retraso de una decisión. Y una predicción concreta que falla obliga a buscar el mecanismo real.
Sobre la línea de 3000 solo se llega tocando la bandera. La corrida 2 se cortó en la generación 556 y la 4 corrió 300.Una de las 17 redes de la generación 45 que tocan la bandera, con fitness 3366,5. La primera en lograrlo apareció en la generación 42.
SethBling necesitó 34 generaciones. Mi red necesitó 42, pero llegar a una configuración que funcionara me tomó cuatro corridas, y en cada una aprendí algo que antes no sabía nombrar.
Cómo usé a Claude para aprender
Si tuviera que repetirlo con otro tema que no domino, haría esto:
Pregunta lo que no sabes tal como lo piensas.Mi primera pregunta era confusa y sirvió igual. La pregunta obvia no le cuesta nada a nadie.
Pide explicaciones con tus datos.La clase de NEAT usó mis curvas y mis redes, y por eso se me quedó.
Escribe la predicción antes de correr.Una predicción escrita no se reinterpreta después, ni por ti ni por la IA.
Tú observas, la IA mide.La brecha del promedio la vi yo en un gráfico. Los 1500 hijos los midió Claude. Ninguno de los dos solo habría llegado a la causa.
Separa explicar de hacer.«Solo dímelo, no hagas cambios» es una instrucción válida, y a veces es la que más enseña.
Define qué es trampa.La IA optimiza la meta que le das. Si tu meta es aprender, dilo y deja la regla por escrito.
Elige el camino que enseña.Un sentido nuevo habría terminado antes. La red con memoria me enseñó qué es la memoria en una red.