Phase 09 - Lesson 04

Diferencia Temporal — Q-Learning y SARSA

This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.

Monte Carlo espera hasta que termine el episodio. TD se actualiza después de cada paso mediante bootstrapping de la siguiente estimación de valor. Q-learning es off-policy y optimista; SARSA es on-policy y cauteloso. Ambos son una línea de código. Ambos fundamentan cada método de deep RL en esta fase.

Tipo: Crear Lenguajes: Python Prerrequisitos: Fase 9 · 01 (MDPs), Fase 9 · 02 (Programación Dinámica), Fase 9 · 03 (Monte Carlo) Tiempo: ~75 minutos

El Problema

Monte Carlo funciona pero tiene dos demandas costosas. Requiere episodios que terminen y solo se actualiza después de que se recibe el retorno final. Si tu episodio tiene 1,000 pasos, MC espera 1,000 pasos para actualizar algo. Es de alta varianza, bajo sesgo y lento en la práctica.

La programación dinámica tiene el perfil opuesto — actualizaciones basadas en bootstrap con varianza cero — pero requiere un modelo conocido.

El aprendizaje por diferencia temporal (TD) divide la diferencia. A partir de una sola transición (s, a, r, s'), forma un objetivo de un paso r + γ V(s') y acerca V(s) hacia él. Sin modelo. Sin episodios completos. Sesgo por usar un V aproximado en el lado derecho de la ecuación, pero una varianza dramáticamente menor que MC y actualizaciones en línea desde el paso uno.

Este es el eje sobre el cual gira todo el RL moderno: DQN, A2C, PPO, SAC. El resto de la Fase 9 son capas de aproximación de funciones y trucos construidos sobre la actualización TD de un paso que escribirás en esta lección.

El Concepto

Q-learning vs SARSA: max off-policy vs Q(s', a') on-policy

La actualización TD(0) para V:

V(s) ← V(s) + α [r + γ V(s') - V(s)]

La cantidad entre corchetes es el error TD δ = r + γ V(s') - V(s). Es el análogo en línea de G_t - V(s_t) en MC. La convergencia requiere que α satisfaga a Robbins-Monro (Σ α = ∞, Σ α² < ∞) y que todos los estados sean visitados infinitamente.

Q-learning. Un método TD off-policy para control:

Q(s, a) ← Q(s, a) + α [r + γ max_{a'} Q(s', a') - Q(s, a)]

El max asume que se seguirá la política codiciosa (greedy) a partir de s' en adelante, independientemente de la acción que el agente realmente tome. Ese desacoplamiento hace que Q-learning aprenda Q* mientras el agente explora a través de ε-greedy. Mnih et al. (2015) convirtieron esto en deep Q-learning en Atari (Lección 05).

SARSA. Un método TD on-policy:

Q(s, a) ← Q(s, a) + α [r + γ Q(s', a') - Q(s, a)]

El nombre es la tupla (s, a, r, s', a'). SARSA utiliza la acción a' que el agente realmente toma a continuación, no el argmax codicioso. Converge a Q^π para cualquier π ε-greedy en ejecución, lo que en el límite ε → 0 se convierte en Q*.

La diferencia en cliff-walking. En la clásica tarea de caminar por el acantilado (cliff-walking, caer del acantilado = recompensa -100), Q-learning aprende el camino óptimo a lo largo del borde del acantilado pero ocasionalmente sufre la penalidad durante la exploración. SARSA aprende un camino más seguro a un paso de distancia del acantilado porque incluye el ruido de exploración en su valor Q. Con el entrenamiento, ambos alcanzan el óptimo cuando ε → 0. En la práctica importa: cuando la exploración realmente ocurre en el despliegue, el comportamiento de SARSA es más conservador.

Expected SARSA. Reemplaza Q(s', a') con su valor esperado bajo π:

Q(s, a) ← Q(s, a) + α [r + γ Σ_{a'} π(a'|s') Q(s', a') - Q(s, a)]

Menor varianza que SARSA (sin muestra de a'), mismo objetivo on-policy. A menudo es la opción predeterminada en los libros de texto modernos.

n-step TD y TD(λ). Interpola entre TD(0) y MC al esperar n pasos antes del bootstrapping. n=1 es TD, n=∞ es MC. TD(λ) promedia sobre todos los n con pesos geométricos (1-λ)λ^{n-1}. La mayoría del deep RL utiliza n entre 3 y 20.

Constrúyelo

Paso 1: SARSA en política ε-greedy

def sarsa(env, episodes, alpha=0.1, gamma=0.99, epsilon=0.1):
    Q = defaultdict(lambda: {a: 0.0 for a in ACTIONS})

    def choose(s):
        if random() < epsilon:
            return choice(ACTIONS)
        return max(Q[s], key=Q[s].get)

    for _ in range(episodes):
        s = env.reset()
        a = choose(s)
        while True:
            s_next, r, done = env.step(s, a)
            a_next = choose(s_next) if not done else None
            target = r + (gamma * Q[s_next][a_next] if not done else 0.0)
            Q[s][a] += alpha * (target - Q[s][a])
            if done:
                break
            s, a = s_next, a_next
    return Q

Ocho líneas. La única diferencia con Q-learning es la línea del objetivo (target).

Paso 2: Q-learning

def q_learning(env, episodes, alpha=0.1, gamma=0.99, epsilon=0.1):
    Q = defaultdict(lambda: {a: 0.0 for a in ACTIONS})
    for _ in range(episodes):
        s = env.reset()
        while True:
            a = choose(s, Q, epsilon)
            s_next, r, done = env.step(s, a)
            target = r + (gamma * max(Q[s_next].values()) if not done else 0.0)
            Q[s][a] += alpha * (target - Q[s][a])
            if done:
                break
            s = s_next
    return Q

El max desacopla el objetivo del comportamiento. Ese único símbolo es la diferencia entre on-policy y off-policy.

Paso 3: curvas de aprendizaje

Monitorea el retorno promedio por cada 100 episodios. Q-learning converge más rápido en un GridWorld determinista simple; SARSA es más conservador en cliff-walking. En el GridWorld de 4×4 en code/main.py, ambos están cerca del óptimo después de ~2,000 episodios con α=0.1, ε=0.1.

Paso 4: comparar con el resultado de DP

Ejecuta la iteración de valores (Lección 02) para obtener Q*. Verifica max_{s,a} |Q_learned(s,a) - Q*(s,a)|. Un agente TD tabular saludable se sitúa dentro de ~0.5 en el GridWorld de 4×4 después de 10,000 episodios.

Dificultades Comunes

  • Los valores iniciales de Q importam. La inicialización optimista (Q = 0 para una tarea con recompensas negativas) fomenta la exploración. La inicialización pesimista puede atrapar una política codiciosa para siempre.
  • Cronograma (schedule) de α. Un α constante está bien para problemas no estacionarios. El decaimiento α_n = 1/n da convergencia en teoría pero es demasiado lento en la práctica: fija α en [0.05, 0.3] y monitorea la curva de aprendizaje.
  • Cronograma (schedule) de ε. Comienza alto (ε=1.0), decae a ε=0.05. "GLIE" (greedy in the limit with infinite exploration / codicioso en el límite con exploración infinita) es la condición de convergencia.
  • Sesgo de maximización en Q-learning. El operador max tiene un sesgo hacia arriba cuando Q es ruidoso. Esto conduce a una sobreestimación; Double Q-learning de Hasselt (utilizado por DDQN en la Lección 05) corrige esto con dos tablas Q.
  • Episodios no terminantes. TD puede aprender sin terminales, pero necesitas limitar los pasos o manejar el bootstrap correctamente en el límite. Estándar: trata el límite como no terminal, continúa haciendo bootstrap.
  • Hashing de estados. Si los estados son tuplas/tensores, usa una clave hashable (tupla, no lista; tupla de floats redondeados, no crudos).

Cómo Usarlo

El panorama de TD en 2026:

Tarea Método Motivo
Entornos tabulares pequeños Q-learning Aprende la política óptima directamente.
On-policy crítico para la seguridad SARSA / Expected SARSA Conservador durante la exploración.
Estado de alta dimensión DQN (Fase 9 · 05) Función Q de red neuronal con replay y red objetivo.
Acciones continuas SAC / TD3 (Fase 9 · 07) Actualización TD en una red Q; la red de política emite acciones.
RL de LLM (basado en modelo de recompensa) PPO / GRPO (Fase 9 · 08, 12) Actor-crítico con ventaja estilo TD vía GAE.
RL offline CQL / IQL (Fase 9 · 08) Q-learning con regularización conservadora.

El noventa por ciento del "RL" del que se lee en los artículos de 2026 es alguna elaboración de Q-learning o SARSA. Comprende la actualización tabular en tus manos antes de leer más a fondo.

Envíalo

Salve como outputs/skill-td-agent.md:

---
name: td-agent
description: Pick between Q-learning, SARSA, Expected SARSA for a tabular or small-feature RL task.
version: 1.0.0
phase: 9
lesson: 4
tags: [rl, td-learning, q-learning, sarsa]
---

Given a tabular or small-feature environment, output:

1. Algorithm. Q-learning / SARSA / Expected SARSA / n-step variant. One-sentence reason tied to on-policy vs off-policy and variance.
2. Hyperparameters. α, γ, ε, decay schedule.
3. Initialization. Q_0 value (optimistic vs zero) and justification.
4. Convergence diagnostic. Target learning curve, `|Q - Q*|` check if DP is possible.
5. Deployment caveat. How will exploration behave at inference? Is SARSA's conservatism needed?

Refuse to apply tabular TD to state spaces > 10⁶. Refuse to ship a Q-learning agent without a max-bias caveat. Flag any agent trained with ε held at 1.0 throughout (no exploitation phase).

Ejercicios

  1. Fácil. Implementa Q-learning y SARSA en el GridWorld de 4×4. Grafica las curvas de aprendizaje (retorno promedio por cada 100 episodios) para 2,000 episodios. ¿Quién converge más rápido?
  2. Medio. Construye un entorno de cliff-walking (4×12, la última fila es el acantilado con recompensa de -100 y reinicio al inicio). Compara las políticas finales de Q-learning y SARSA. Toma una captura de pantalla de las rutas que toma cada uno. ¿Cuál está más cerca del acantilado?
  3. Difícil. Implementa Double Q-learning. En un GridWorld con recompensa ruidosa (ruido gaussiano σ=5 agregado a la recompensa por paso), muestra que Q-learning sobreestima V*(0,0) por una cantidad significativa mientras que Double Q-learning no lo hace.

Términos Clave

Término Lo que dice la gente Lo que realmente significa
Error TD La señal de actualización δ = r + γ V(s') - V(s), el residuo bootstrapped.
TD(0) TD de un paso Actualización después de cada transición utilizando solo la estimación del siguiente estado.
Q-learning RL off-policy básico Actualización TD con max sobre las acciones del siguiente estado; aprende Q* independientemente de la política de comportamiento.
SARSA Q-learning on-policy Actualización TD usando la acción siguiente real; aprende Q^π para la política π ε-greedy actual.
Expected SARSA El SARSA de baja varianza Reemplaza el a' muestreado con su valor esperado bajo π.
GLIE Cronograma de exploración correcto Greedy in the Limit with Infinite Exploration (Codicioso en el Límite con Exploración Infinita); necesario para la convergencia de Q-learning.
Bootstrapping Usar la estimación actual en el objetivo Lo que distingue a TD de MC. Fuente de sesgo pero con reducción masiva de varianza.
Sesgo de maximización Q-learning sobreestima El max sobre estimaciones ruidosas tiene un sesgo hacia arriba; corregido por Double Q-learning.

Lecturas Adicionales

0 lifetime access. Curriculum based on AI Engineering from Scratch by Rohit Ghumare (MIT, used under attribution).