Aprendizaje por refuerzo: value iteration y Q-learning en Python
En el aprendizaje por refuerzo, un agente actúa en un entorno y recibe recompensas. Aprende lo buena que es cada situación o acción para poder elegir las acciones que le den más recompensa con el tiempo.
El concepto en palabras sencillas
En el aprendizaje por refuerzo, un agente actúa en un entorno y recibe recompensas. Aprende lo buena que es cada situación o acción para poder elegir las acciones que le den más recompensa con el tiempo.
Enseña a un agente a llegar a una meta: calcula el valor de los estados con value iteration y luego apréndelos por ensayo y error con Q-learning.
Ideas clave
- El factor de descuento γ hace que las recompensas tempranas valgan más.
- Value iteration necesita un modelo del entorno; Q-learning aprende de la experiencia.
- Q(s, a) es la recompensa total esperada al realizar la acción a en el estado s.
- Hace falta explorar (aquí, un 20 % de movimientos al azar) para que el agente descubra la meta.
¿Cuándo se utiliza?
- Entender qué pasa dentro de las redes neuronales y las bibliotecas de IA.
- Aprender la idea antes de implementarla en los retos correspondientes.
- Prepararte para cursos de aprendizaje automático, entrevistas y proyectos.
Pruébalo en acción
Pulsa Reproducir a la izquierda para extender los valores desde la meta por toda la cuadrícula. A la derecha, mira cómo el agente aprende la misma ruta por ensayo y error.
Código de ejemplo
import random
# A corridor of 5 cells: start in cell 0, reward +10 for reaching cell 4.
N, GOAL, GAMMA = 5, 4, 0.9
# Value iteration: a cell is worth its reward plus the discounted best neighbour.
values = [0.0] * N
for _ in range(50):
values = [0.0 if s == GOAL else max((10 if n == GOAL else 0) + GAMMA * values[n]
for n in (max(0, s - 1), min(N - 1, s + 1))) for s in range(N)]
print("state values:", [round(v, 2) for v in values])
# Q-learning learns the same thing from trial and error.
random.seed(0)
Q = [[0.0, 0.0] for _ in range(N)] # actions: 0 = left, 1 = right
for episode in range(200):
s = 0
while s != GOAL:
a = random.randrange(2) if random.random() < 0.2 else Q[s].index(max(Q[s]))
n = max(0, s - 1) if a == 0 else min(N - 1, s + 1)
reward = 10 if n == GOAL else 0
target = reward + (0 if n == GOAL else GAMMA * max(Q[n]))
Q[s][a] += 0.5 * (target - Q[s][a]) # move the estimate toward the target
s = n
print("best action per cell:", ["right" if q[1] >= q[0] else "left" for q in Q[:GOAL]])
print("Q(0, right):", round(Q[0][1], 2))
Resultado esperado
state values: [7.29, 8.1, 9.0, 10.0, 0.0]
best action per cell: ['right', 'right', 'right', 'right']
Q(0, right): 7.29
Cómo funciona
Value iteration repite la actualización de Bellman, donde el valor de una casilla es la mejor recompensa más el valor descontado de la casilla siguiente; así se obtienen 10, 9, 8.1 y 7.29 al alejarse de la meta. Q-learning no conoce las reglas. Tras cada paso, acerca su estimación a reward + γ·max Q(next) y aprende a ir siempre a la derecha.
Cambia los valores y ejecuta el programa en el compilador Python online de CodeUtility sin instalar Python.
Ejercicios prácticos
Modifica las entradas y prueba casos límite antes de usar conjuntos de datos mayores.
- Cambia las entradas o los pesos y predice la salida antes de ejecutar.
- Imprime los valores intermedios para seguir cada paso del cálculo.
- Resuelve los retos enlazados abajo para implementar la idea por tu cuenta.
Practica con un reto
Usa lo que cubre esta lección para resolver un problema real. Cada reto se ejecuta en el navegador, con pruebas al instante y una revisión de IA.
- Iteración de valores Calcula cuánto vale cada estado de un proceso de decisión de Markov aplicando repetidamente la actualización de optimalidad de Bellman. Intermedio
- Actualizaciones de Q-learning Aplica la actualización de Q-learning a un flujo de experiencias y observa cómo las recompensas fluyen hacia estados anteriores. Intermedio