Saltar al contenido

# aprendizaje-por-refuerzo-en-python

Aprendizaje por Refuerzo en Python

Volver a la portada del curso
Lectura (Markdown)

Componentes del Sistema

Sección 2 · Marco del Aprendizaje por Refuerzo

Componentes del sistema

Casi todos los problemas de aprendizaje por refuerzo se describen con el mismo molde: un proceso de decisión de Markov (MDP, por sus siglas en inglés). Son cinco piezas que ya conoces del almacén de PyShop. Entenderlas te ayuda a leer la documentación de cualquier entorno de Gymnasium y a saber qué tiene que aprender el agente y qué le da el entorno hecho.

Las cinco piezas de un MDP

  1. Estados: las situaciones posibles. El almacén tiene 25 (una por casilla); FrozenLake 4×4, 16.
  2. Acciones: lo que el agente puede hacer en cada estado. En ambos entornos son 4: izquierda, abajo, derecha y arriba.
  3. Transiciones: las reglas que dicen a qué estado se llega al tomar una acción. Se escriben como una probabilidad, $P(s' \mid s, a)$: la probabilidad de llegar a $s'$ si en $s$ se toma $a$.
  4. Recompensas: el número que se recibe en cada transición. En el almacén, −1 por paso, +10 en el andén y −10 en un derrame.
  5. Factor de descuento $\gamma$: cuánto pesan las recompensas futuras frente a las inmediatas.

El agente conoce los estados y las acciones; las transiciones y las recompensas las descubre jugando.

La propiedad de Markov

Un estado cumple la propiedad de Markov cuando resume todo lo que importa del pasado: lo que pasará después depende solo del estado actual y de la acción, no del camino que se recorrió para llegar. La casilla del robot la cumple: da igual por dónde llegó a la casilla 12, desde ahí los movimientos funcionan igual. Si el almacén tuviera una puerta que se abre después de 10 pasos, la casilla ya no bastaría y habría que agregar el número de pasos al estado.

Deterministas y estocásticos

En un entorno determinista, la misma acción en el mismo estado lleva siempre al mismo resultado. El almacén básico es así. En uno estocástico hay azar. FrozenLake es un lago congelado y, por defecto, resbaloso. Gymnasium guarda sus transiciones en env.unwrapped.P, así que puedes verlas:

import gymnasium as gym

env = gym.make("FrozenLake-v1")   # resbaloso por defecto
print(env.observation_space, env.action_space)

# Transiciones desde la salida (0) al pedir "derecha" (2):
# (probabilidad, siguiente estado, recompensa, terminado)
for p, s, r, fin in env.unwrapped.P[0][2]:
    print(round(p, 3), s, r, fin)

quieto = gym.make("FrozenLake-v1", is_slippery=False)
print(quieto.unwrapped.P[0][2])
Discrete(16) Discrete(4)
0.333 4 0 False
0.333 1 0 False
0.333 0 0 False
[(1.0, 1, 0, False)]

En el lago resbaloso, pedir «derecha» desde la salida lleva a la casilla 1 (derecha) solo un tercio de las veces; los otros dos tercios el agente se desliza hacia abajo (casilla 4) o choca con el borde y se queda en 0. Sin resbalar, la transición es segura: probabilidad 1.0 a la casilla 1. El almacén tiene una opción parecida, resbaloso=0.1: el 10 % de las veces el robot se desliza a un lado. Ese azar hace más difícil aprender, y el proyecto final lo usa.

Episódicos y continuos

Una tarea episódica tiene final: el almacén termina en el andén, en un derrame o a los 50 pasos. Una tarea continua no termina nunca, como un termostato que ajusta la temperatura todo el día; ahí $\gamma < 1$ es necesario para que la suma de recompensas no crezca sin límite. Gymnasium distingue dos formas de terminar un episodio en los valores que devuelve step:

  • terminated: el episodio acabó por las reglas del MDP (llegar al andén, pisar un derrame, caer en un hoyo de FrozenLake).
  • truncated: se cortó desde fuera, normalmente por un límite de tiempo (los 50 pasos del almacén, los 100 de FrozenLake).

Espacios: Discrete y Box

Gymnasium describe estados y acciones con espacios. Discrete(n) son los enteros de 0 a n − 1: el almacén usa Discrete(25) para los estados y Discrete(4) para las acciones; Taxi-v4 usa Discrete(500) y Discrete(6). Box son vectores de números reales con límites: CartPole, por ejemplo, observa un Box de 4 números (posición y velocidad del carro, ángulo y velocidad del palo). Este curso usa solo espacios discretos, porque permiten guardar lo aprendido en una tabla.

Lo que vive dentro del agente

  • Política: la regla estado → acción. Es lo que el agente usa para actuar.
  • Función de valor: cuánto retorno espera desde cada estado ($V$) o desde cada par estado-acción ($Q$). En el almacén es una tabla de 25 × 4.
  • Modelo: una copia de las transiciones y recompensas del entorno. Los métodos que lo usan para planear se llaman basados en modelo; los que aprenden solo de la experiencia, como Q-learning, son libres de modelo. En este curso el agente nunca lee P: aprende jugando.

Trampas comunes

  • Tratar truncated como un fracaso. Un corte por tiempo no es un derrame. Al aprender, conviene no sumar valor futuro solo cuando el episodio está terminated.
  • Estados que no cumplen Markov. Si el resultado depende de algo que el estado no incluye, el agente aprende promedios confusos.
  • Esperar el mismo resultado en un entorno estocástico. En FrozenLake resbaloso, repetir la misma acción puede dar resultados distintos: evalúa con muchos episodios, no con uno.
  • Usar env.unwrapped.P para entrenar. Sirve para inspeccionar; un agente libre de modelo no debería depender de él.

El notebook primeros-pasos-con-gymnasium revisa los espacios de FrozenLake, CliffWalking y Taxi-v4 y construye el almacén como entorno propio. Al leerlo, identifica en el código cada una de las cinco piezas del MDP.

Recursos