Conceptos de IA en Python

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

Ejecutar código →
main.py
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.

  1. Cambia las entradas o los pesos y predice la salida antes de ejecutar.
  2. Imprime los valores intermedios para seguir cada paso del cálculo.
  3. Resuelve los retos enlazados abajo para implementar la idea por tu cuenta.
Ejecutar en el IDE de Python →

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.

Todos los retos