03 · SARSA

El nombre es el algoritmo

SARSA se llama así porque su actualización usa exactamente cinco elementos en orden:

$$(S,\ A,\ R,\ S’,\ A’)$$

Letra Representa
$S$ estado actual
$A$ acción tomada
$R$ recompensa recibida
$S’$ siguiente estado
$A’$ siguiente acción (elegida antes de actualizar)

La diferencia clave respecto a Q-learning: la siguiente acción $A’$ se elige antes de hacer la actualización, usando la misma política $\varepsilon$-greedy que generó $A$. El agente aprende el valor de la política que realmente ejecuta.


Regla de actualización

$$\boxed{Q(s,a) \leftarrow Q(s,a) + \alpha\bigl[r + \gamma Q(s’, a’) - Q(s,a)\bigr]}$$

donde $a’ \sim \pi_\varepsilon(s’)$ — la siguiente acción está muestreada de la política $\varepsilon$-greedy.

Comparado con el esqueleto TD de la sección anterior, el ? se llena con $Q(s’, a’)$.


Pseudocódigo

Antes de ver el código, la idea en palabras: Al inicio de cada episodio, el agente observa el estado $s$ y ya elige la primera acción $a$ con $\varepsilon$-greedy — esto es clave en SARSA. Luego entra al bucle: ejecuta $a$, recibe la recompensa $r$ y llega a $s’$. Ahora, antes de actualizar $Q$, elige la siguiente acción $a’$ usando la misma política $\varepsilon$-greedy. Con los cinco elementos $(s, a, r, s’, a’)$ en mano, aplica la regla de actualización y avanza: $s$ pasa a ser $s’$ y $a$ pasa a ser $a’$. El ciclo se repite hasta llegar al estado terminal.

SARSA(α, γ, ε, num_episodios):
  Inicializa Q[s, a] ← 0 para todo (s, a)
  Para cada episodio:
    s ← estado_inicial()
    a ← ε-greedy(Q, s)            ← elegimos a ANTES de entrar al bucle
    Mientras s no sea terminal:
      s', r ← ejecutar(a)          ← observamos (s', r)
      a' ← ε-greedy(Q, s')         ← elegimos a' AHORA (on-policy)
      Q[s, a] ← Q[s, a] + α · (r + γ · Q[s', a'] − Q[s, a])
      s ← s'                        ← avanzamos el estado
      a ← a'                        ← avanzamos la acción (5-tuple completo)

La firma estructural de SARSA: a' se selecciona dentro del bucle, antes de actualizar, y luego se usa como la acción del siguiente paso. Esto es lo que lo hace on-policy.


Traza completa: 2 episodios sobre la escalera

Parámetros: $\alpha = 0.5$, $\gamma = 1$, $\varepsilon = 0.4$. La tabla $Q$ empieza en cero.

Episodio 1: trayectoria $0 \to 1 \to 3 \to 5$

El agente elige las acciones con $\varepsilon$-greedy (con la tabla en cero, las acciones greedy son todas iguales, así que explorar o explotar es equivalente). Fijamos esta trayectoria para el ejemplo:

Paso $s$ $a$ $r$ $s’$ $a’$ (on-policy) $\delta$ Actualización
1 0 $+1$ $-2$ 1 $+2$ $-2 + 0 - 0 = -2$ $Q(0,+1) \mathrel{+}= 0.5 \cdot (-2) = -1.0$
2 1 $+2$ $-10$ 3 $+2$ $-10 + 0 - 0 = -10$ $Q(1,+2) \mathrel{+}= 0.5 \cdot (-10) = -5.0$
3 3 $+2$ $0$ 5 (meta) $0 + 0 - 0 = 0$ $Q(3,+2)$ no cambia

Recompensas: $R(s’=1)=-2$ (costo de estado 1), $R(s’=3)=-10$ (costo de estado 3), $R(s’=5)=0$ (meta).

Tabla $Q$ después del episodio 1:

Estado $+1$ $+2$
$s=0$ −1.0 0
$s=1$ 0 −5.0
$s=2$ 0 0
$s=3$ 0 0
$s=4$ 0

Episodio 2: trayectoria $0 \to 2 \to 4 \to 5$

Ahora hay valores en la tabla. En $s=0$: $Q(0,+1)=-1.0$ y $Q(0,+2)=0$. La acción greedy es $+2$. $\varepsilon$-greedy puede explorar: fijamos que elige $+2$ (greedy).

Paso $s$ $a$ $r$ $s’$ $a’$ (on-policy) $\delta$ Actualización
1 0 $+2$ $-5$ 2 $+2$ (exploración) $-5 + 1 \cdot 0 - 0 = -5$ $Q(0,+2) \mathrel{+}= 0.5 \cdot (-5) = -2.5$
2 2 $+2$ $-1$ 4 $+1$ (única acción) $-1 + 1 \cdot 0 - 0 = -1$ $Q(2,+2) \mathrel{+}= 0.5 \cdot (-1) = -0.5$
3 4 $+1$ $0$ 5 (meta) $0 + 0 - 0 = 0$ $Q(4,+1)$ no cambia

Recompensas: $R(s’=2)=-5$ (costo de estado 2), $R(s’=4)=-1$ (costo de estado 4), $R(s’=5)=0$ (meta).

Tabla $Q$ después del episodio 2 — idéntica en SARSA y Q-learning hasta aquí:

Estado $+1$ $+2$
$s=0$ −1.0 −2.5
$s=1$ 0 −5.0
$s=2$ 0 −0.5
$s=3$ 0 0
$s=4$ 0

Esta es la tabla en la que vimos el momento de divergencia en la sección anterior.

Evolución de la tabla Q


Convergencia de SARSA

Con $\varepsilon$ fijo: SARSA converge a $Q^{\pi_\varepsilon}$ — el valor de la política $\varepsilon$-greedy, no la política greedy pura. $Q^{\pi_\varepsilon}(s,a)$ es ligeramente peor que $Q^∗(s,a)$ porque el agente sigue explorando ocasionalmente con probabilidad $\varepsilon$.

Con $\varepsilon \to 0$ (decrementando gradualmente): SARSA converge a $Q^∗$ (bajo condiciones de convergencia estándar: visitas infinitas y tasa de aprendizaje decreciente).

¿Por qué SARSA con $\varepsilon$ fijo no converge a $Q^∗$? Porque la política $\pi_\varepsilon$ nunca es completamente greedy: siempre hay una probabilidad $\varepsilon$ de tomar una acción subóptima. SARSA aprende fielmente el valor de esa política — incluyendo sus imperfecciones.

Esto no es un defecto; es una característica: SARSA es honesto sobre lo que el agente hará en el futuro. En entornos peligrosos (como el problema del acantilado), esa honestidad puede ser preferible.