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.

Cuadrícula:
¿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.

Episodios0
Recompensa media (últimos 20)—
¿Llega solo a la madriguera?Todavía no

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

8. Para el aula

9. Retos 0/5

  1. Haz que funcione. Entrena 1000 episodios y comprueba que «¿Llega solo?» dice que sí.
  2. Modifica algo. Añade una casilla extra de trampa en el mapa de 8 × 8 y comprueba que el robot la evita.
  3. 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?
  4. Guarda los datos. Anota la recompensa media cada 100 episodios y haz una tabla en una hoja de cálculo.
  5. 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.