Chismes del Lince 95 · Aprendizaje por refuerzo: los robots Macrothele
Un robot que aprende por prueba y error. Nadie le enseña el camino: se equivoca, recibe premios y castigos, y poco a poco aprende a llegar a la madriguera.
En la cima de Sierra Bermeja, el Lince de la Noche ha sembrado robots de suelo que se llaman Macrothele, como la araña negra de los alcornocales. Tienen una misión: llegar a la madriguera de la sierra sin caer en las trampas. El Lince les ha dado un mapa en blanco. La Gata Montesa lo mira y le dice: «Si les explicas el camino, siempre irán por donde tú quieras. Déjalos equivocarse».
1. Introducción
En el chisme 93 vimos cómo romper un cifrado con estadística, y en otros chismes una IA aprendió a reconocer objetos con Teachable Machine. Allí los ejemplos ya venían etiquetados: alguien decía «esto es un obstáculo» antes de que la IA aprendiera. Hoy el robot no tiene ejemplos. Solo tiene un premio o un castigo después de cada paso.
Ese método se llama aprendizaje por refuerzo, y el algoritmo que vamos a usar, Q-learning, es uno de los más sencillos.
2. Por qué este chisme
Muchos sistemas reales aprenden así: un robot que aprende a caminar, un programa que aprende a jugar, un sistema que decide cuándo regar. Nadie les escribe todas las reglas; las descubren mirando qué les sale bien y qué les sale mal.
Lo importante es entender que el robot no «sabe» nada al principio. Su resultado depende de los premios que le damos, y los premios los decidimos nosotros.
3. Cómo funciona
El robot ve su posición en la cuadrícula (la casilla en la que está) y puede moverse en cuatro direcciones: arriba, derecha, abajo o izquierda. Por cada casilla y cada dirección guarda un número, que llamamos Q: cuánto cree que le compensa hacer ese movimiento desde esa casilla.
Al principio todos los números valen 0. Cada vez que hace un movimiento, mira lo que ha pasado y actualiza su Q con esta idea:
nuevo Q = Q + tasa · (premio + descuento · mejor Q de la casilla siguiente − Q)
En palabras: «lo que había aprendido se corrige un poco con lo que acabo de ver». Para elegir movimiento, el robot usa el mejor Q que tiene, pero de vez en cuando prueba algo al azar, porque si nunca se arriesga nunca descubrirá un camino mejor.
¿Y por qué el robot no ve todo el mapa a la vez?
Porque lo que aprende son números por casilla, no el mapa completo. La recompensa de una casilla acaba llegando a las casillas anteriores gracias al «descuento»: un premio al final del camino se va propagando hacia atrás, paso a paso, hasta que todo el camino vale algo.
4. Simulador de los Macrothele
Elige una cuadrícula, entrena al robot y mira qué aprende. La leyenda: S salida, M madriguera, T trampa, # pared. Las flechas azules muestran el movimiento que el robot cree mejor en cada casilla.
¿Qué significa?
Cuánto cambia el robot su opinión tras cada experiencia. Con 1 se fía solo de lo último que ha visto; con 0.1 cambia muy despacio. Si es muy alta, el aprendizaje va a tirones; si es muy baja, tarda una eternidad.
¿Qué significa?
Cuánto valen los premios futuros frente a los inmediatos. Con 0.9 el robot piensa a largo plazo y busca la meta lejana. Con 0 solo mira el paso siguiente y no sabe llegar a ninguna parte.
¿Qué significa?
La probabilidad de probar un movimiento al azar en lugar del mejor conocido. Con 0 el robot siempre repite lo que cree mejor y puede quedarse atascado con un camino malo. Con 1 se mueve al azar y no aprende nada útil.
¿Qué significa?
Cuánto tarda el robot en dar cada paso cuando lo miras en directo. No cambia lo que aprende, solo la rapidez con la que lo ves.
¿Por qué ese valor?
Es el objetivo del robot. Debe ser el premio más grande, para que todo el aprendizaje gire alrededor de llegar.
¿Por qué ese valor?
Termina el intento. Si es parecido al premio, el robot evita las trampas igual que busca la meta.
¿Por qué ese valor?
Un pequeño castigo por cada movimiento. Sin él, el robot daría vueltas sin prisa; con él, prefiere el camino corto.
¿Por qué ese valor?
El robot no se mueve y recibe este castigo. Hace que aprenda a no empujar paredes.
Un episodio es un intento: desde la salida hasta la madriguera, una trampa o 100 pasos. La curva sube cuando el robot empieza a encontrar mejores caminos.
5. Modo real: la micro:bit muestra al Macrothele
Con la cuadrícula de 5 × 5 podemos ver el recorrido en la matriz de LEDs de una micro:bit. La página calcula el aprendizaje y envía cada paso a la placa, igual que hicimos en el chisme 91: por cable USB o por Bluetooth. La placa solo muestra: no aprende nada. Esa diferencia es importante.
Sin conexión. Solo disponible con la cuadrícula de 5 × 5.
Necesitas Chrome o Edge en el ordenador, la micro:bit con el programa de abajo y la extensión «Bluetooth» en MakeCode. En Bluetooth, elige tu micro:bit («BBC micro:bit [...]») en la ventana del navegador.
6. El código de la micro:bit
Pégalo en MakeCode (modo JavaScript). Es el mismo sistema de la micro:bit del chisme 91: una línea de texto por paso, terminada en salto de línea. La micro:bit solo entiende cuatro mensajes: R para empezar de nuevo, x,y para encender la casilla, M para la madriguera y T para la trampa.
bluetooth.startUartService()
serial.setBaudRate(BaudRate.BaudRate115200)
let px = -1
let py = -1
basic.showString("MACROTHELE")
function digito(c: string): number {
if (c == "0") { return 0 }
if (c == "1") { return 1 }
if (c == "2") { return 2 }
if (c == "3") { return 3 }
return 4
}
function limpia() {
if (px >= 0) {
led.unplot(px, py)
}
px = -1
py = -1
}
function procesa(s: string) {
if (s == "R") {
basic.clearScreen()
limpia()
} else if (s == "M") {
basic.showIcon(IconNames.Happy)
} else if (s == "T") {
basic.showIcon(IconNames.Sad)
} else {
// Formato «x,y»: x en la posición 0 e y en la 2
limpia()
px = digito(s.charAt(0))
py = digito(s.charAt(2))
led.plot(px, py)
}
}
serial.onDataReceived(serial.delimiters(Delimiters.NewLine), function () {
procesa(serial.readUntil(serial.delimiters(Delimiters.NewLine)))
})
bluetooth.onUartDataReceived(serial.delimiters(Delimiters.NewLine), function () {
procesa(bluetooth.uartReadUntil(serial.delimiters(Delimiters.NewLine)))
})
Lee y predice: si cambias digito para que el 4 también se trate como un 0, ¿qué pasaría con la madriguera de la esquina inferior derecha?
7. Qué estamos midiendo realmente
- El robot no entiende el mapa. Solo acumula números por casilla. Si cambias un premio, cambia lo que aprende, aunque el mapa sea el mismo.
- El resultado depende de los parámetros. Con los mismos premios, una tasa de aprendizaje o un descuento distinto pueden tardar mucho más en encontrar la madriguera, o no encontrarla nunca. Prueba y comprueba.
- Una media engaña. La recompensa media de 20 episodios puede subir mientras el robot sigue cayendo en alguna trampa. Mira también el camino que aprende.
- Medir no es lo mismo que comprender. Que el robot llegue en 8 pasos en una cuadrícula de 5 × 5 no significa que haya aprendido «el mejor camino» en general: depende de los premios, del azar y de cuántos episodios entrenó.
- La micro:bit no aprende. Solo muestra lo que calcula el ordenador. Si la conexión se corta, el aprendizaje sigue en la página, no en la placa.
8. Para el aula
- Entrena 100 episodios con los valores por defecto y anota cuántas veces llega a la madriguera. Repite con 1000. ¿Qué cambia?
- Pon el descuento (γ) a 0. ¿Aprende a llegar? ¿Por qué?
- Pon la exploración (ε) a 0 desde el principio. ¿Se queda atascado con un mal camino? Compara con ε = 0.3.
- Haz que caer en una trampa cueste lo mismo que llegar a la meta (−10 y +10). ¿Qué pasa? ¿Y si la trampa vale −1?
- Diseña tu propia cuadrícula de 5 × 5 (en el código, cambia la lista MAPA5) y predice cuántos episodios tardará en aprender. Después compruébalo.
- Pregunta de investigación: ¿qué combinación de parámetros lo hace aprender más rápido en tu cuadrícula? Diseña una prueba justa: mismo número de episodios y varias repeticiones.
9. Retos 0/5
- Haz que funcione. Entrena 1000 episodios y comprueba que «¿Llega solo?» dice que sí.
- Modifica algo. Añade una casilla extra de trampa en el mapa de 8 × 8 y comprueba que el robot la evita.
- Añade un sensor. Con un sensor de luz de la micro:bit, cambia el premio según la luz que haya. ¿Qué nuevo problema aparece?
- Guarda los datos. Anota la recompensa media cada 100 episodios y haz una tabla en una hoja de cálculo.
- Haz que otro dispositivo participe. Dos micro:bit (una con el mapa y otra con el robot) pueden compartir el recorrido.
Qué hemos aprendido
Un robot puede aprender a llegar a un sitio sin que nadie le diga el camino, solo con premios, castigos y muchos intentos. Lo que aprende depende de los premios que le damos y de cómo ajustamos sus parámetros: el aprendizaje no es magia, es una tabla de números que se corrige paso a paso.
Los Macrothele ya saben encontrar la madriguera. Ahora toca preguntarse si lo han aprendido de verdad o solo han tenido suerte, y eso solo se responde midiendo.
Prototipo educativo: la cuadrícula y los premios son de juguete. Los sistemas reales de aprendizaje por refuerzo son mucho más complejos.