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
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 = 0para 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/nda 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
maxtiene un sesgo hacia arriba cuandoQes 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
- 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?
- 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?
- 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
- Watkins & Dayan (1992). Q-learning — el artículo original y la prueba de convergência.
- Sutton & Barto (2018). Ch. 6 — Temporal-Difference Learning — TD(0), SARSA, Q-learning, Expected SARSA.
- Hasselt (2010). Double Q-learning — solución para el sesgo de maximización.
- Seijen, Hasselt, Whiteson, Wiering (2009). A Theoretical and Empirical Analysis of Expected SARSA — motivación de expected SARSA.
- Rummery & Niranjan (1994). On-line Q-learning using connectionist systems — el artículo que acuñó el término SARSA (entonces llamado "modified connectionist Q-learning").
- Sutton & Barto (2018). Ch. 7 — n-step Bootstrapping — generaliza TD(0) a TD(n), el camino desde Q-learning hacia eligibility traces y, más tarde, GAE en PPO.