Apuntes / Aprendizaje Reforzado / Apunte 3 de 9

Read in English

Predicción TD y Sarsa

Actualizar una estimación después de cada paso, hacia la recompensa recién recibida más la estimación del estado siguiente, en vez de esperar al final del episodio, y la misma idea para aprender a actuar.

Los métodos Monte Carlo no aprenden nada de un episodio hasta que termina, porque solo entonces se conoce el retorno. Pero se puede aprender mucho antes. Piensa en el robot del apunte anterior, que anda por una casa con una cocina, un pasillo, un estudio y un cargador, con un costo de 1 por movimiento. Cuando pasa del pasillo de vuelta a la cocina, ya sabe que su viaje se alargó. No necesita llegar al cargador para bajar su estimación del pasillo.

El aprendizaje por diferencias temporales (TD) actualiza una estimación justo después de cada paso, hacia la recompensa recién recibida más la estimación actual del estado al que llevó ese paso. Aprende una conjetura a partir de otra conjetura.

Resulta que eso funciona bien: los métodos TD no necesitan un modelo del mundo, aprenden mientras el episodio sigue en curso y muchas veces aprenden más rápido que los métodos Monte Carlo. Este apunte cubre TD para predecir valores, a qué converge, y Sarsa, la misma idea para aprender a actuar.

En esta página, los pasos de un episodio se dibujan con tinta azul, y el objetivo de una actualización, y la estimación en la que se apoya, con tinta roja.

1Aprender del paso siguiente

Monte Carlo con α constante mueve la estimación de cada estado visitado hacia el retorno que vino después:

V(St) ← V(St) + α[Gt − V(St)]

pero Gt se conoce solo cuando termina el episodio. El método TD más simple, TD(0) o TD de un paso, usa en cambio la recompensa Rt+1 y la estimación del estado siguiente, ambas disponibles en el tiempo t + 1:

V(St) ← V(St) + α[Rt+1 + γV(St+1) − V(St)]

¿Por qué es un objetivo razonable? El retorno de un paso es la recompensa siguiente más el retorno descontado del paso siguiente, Gt = Rt+1 + γGt+1, así que el valor de un estado se puede escribir de dos maneras:

vπ(s) = Eπ[Gt | St = s] = Eπ[Rt+1 + γvπ(St+1) | St = s]

Los tres métodos usan las dos formas de manera distinta:

MétodoQué hace con las dos formas
Monte Carloestima la primera forma, reemplazando la esperanza por un retorno muestreado
Programación dinámicacalcula la esperanza de la segunda forma exactamente a partir de un modelo del mundo, apoyándose en la estimación actual V en lugar de vπ
TDmuestrea la segunda forma, con una recompensa y un estado siguiente reales, y usa V(St+1) en lugar de vπ(St+1)

TD hace ambas cosas a la vez: como la programación dinámica, hace bootstrapping, y como Monte Carlo, no necesita modelo.

El TD error es el corchete de la actualización: cuánto se equivocó la estimación de St, un paso después.

δt ≐ Rt+1 + γV(St+1) − V(St)
St St+1 TD(0) St ST Monte Carlo
Lo que mira cada actualización. TD(0) usa un paso, la recompensa Rt+1 y la estimación del estado siguiente, en rojo. Monte Carlo usa todas las recompensas hasta el final del episodio y ninguna estimación.

El algoritmo

TD(0) tabular, para una política π y un tamaño de paso α en (0, 1]:

  1. Parte con cualquier V(s), salvo V(terminal) = 0.
  2. Al comienzo de cada episodio, observa el primer estado S.
  3. Toma la acción que π da para S, y observa la recompensa R y el estado siguiente S′.
  4. Actualiza V(S) ← V(S) + α[R + γV(S′) − V(S)].
  5. Haz S ← S′, y vuelve al paso 3 hasta que S sea terminal.

La figura ejecuta TD(0) sobre los mismos 30 episodios de la primera figura del apunte anterior: los movimientos al azar son los mismos, y solo cambia el aprendizaje. Otra vez γ = 0.9, con α = 0.5 y todas las estimaciones partiendo en 0. Ahora a cada movimiento le siguen su TD error, cuyo objetivo usa la estimación con borde rojo, y la actualización.

Siguiente avanza, Atrás retrocede. Teclas: → y ←.

2Un viaje, paso a paso

Supón que las estimaciones del robot son V(cocina) = −5, V(pasillo) = −4 y V(estudio) = −2, promedios de dos viajes con suerte; los valores reales de su andar al azar son −9, −8 y −5. Su siguiente viaje va cocina, pasillo, cocina, pasillo, estudio, cargador. Con γ = 1 y α = 0.5, TD(0) hace una actualización por movimiento:

tMovimientoTD errorActualización
0cocina → pasillo−1 − 4 + 5 = 0ninguna
1pasillo → cocina−1 − 5 + 4 = −2V(pasillo): −4 → −5
2cocina → pasillo−1 − 5 + 5 = −1V(cocina): −5 → −5.5
3pasillo → estudio−1 − 2 + 5 = 2V(pasillo): −5 → −4
4estudio → cargador−1 + 0 + 2 = 1V(estudio): −2 → −1.5

En t = 1, volver a la cocina le dice al robot que el pasillo era peor de lo que creía, y TD baja la estimación del pasillo en el acto. En t = 3 el robot llega al estudio desde el pasillo, que es una mejor noticia, y la estimación vuelve a subir. Monte Carlo con α constante espera hasta el cargador, y luego mueve la estimación de cada visita hacia su retorno:

EstadoRetornosMonte Carlo termina en
cocina−5, luego −3−4
pasillo−4, luego −2−3
estudio−1−1.5

El error de Monte Carlo como suma de TD errors

Si la tabla no cambia durante el episodio, el error de la actualización Monte Carlo es la suma descontada de los TD errors del resto del episodio, porque las estimaciones intermedias se cancelan de a pares:

Gt − V(St) = δt + γδt+1 + ⋯ = ΣT−1k=tγk−tδk

Con la tabla fija en −5, −4 y −2, los TD errors de este viaje son 0, −2, 0, 1 y 1, que suman 0: exactamente G0 − V(cocina) = −5 − (−5). TD(0) cambia la tabla sobre la marcha, así que entonces la identidad se cumple solo en forma aproximada; el tercer TD error de arriba es −1 en vez de 0 porque el pasillo ya se había actualizado.

3¿Por qué aprender de una conjetura?

Comparado con la programación dinámica, TD no necesita modelo: ni probabilidades de recompensas y estados siguientes, solo experiencia. Comparado con Monte Carlo, aprende en línea, un paso a la vez. Eso importa:

  • cuando los episodios son largos;
  • cuando la tarea nunca termina;
  • cuando algunas políticas harían que un episodio durara para siempre: Monte Carlo no puede aprender nada de un episodio que nunca termina, mientras que TD se da cuenta durante el episodio de que las cosas van mal.

Además es correcto. Para una política fija π, TD(0) converge a vπ. Lo hace en promedio con un α constante lo bastante pequeño, y con probabilidad 1 si α se achica de la forma habitual, con una suma que crece sin límite y una suma de cuadrados que se mantiene finita. Qué método aprende más rápido no se ha demostrado en general, pero en la práctica TD suele ganarle a Monte Carlo con α constante en tareas con azar.

4Actualización por lotes: a qué converge cada método

Con una cantidad fija de experiencia, digamos unos pocos episodios, se puede repasar una y otra vez hasta que las estimaciones dejen de cambiar. En la actualización por lotes (batch updating), se calculan y suman los incrementos de cada paso de cada episodio, la tabla cambia una sola vez por su suma, y se vuelve a procesar todo el lote, hasta que converge.

Con un α lo bastante pequeño, TD(0) por lotes converge a una única respuesta que no depende de α, y lo mismo Monte Carlo por lotes, pero las dos respuestas son distintas.

Un ejemplo. A veces otro robot ocupa el cargador. Llegar a él desde el estudio da +1 si está libre y 0 si está ocupado, y moverse del pasillo al estudio da −1; γ = 1. Se registraron cinco episodios:

EpisodiosQué pasó
1pasillo, −1, estudio, 0 (el cargador estaba ocupado)
3estudio, +1
1estudio, 0

Ambos métodos le dan al estudio el promedio de sus cinco retornos, 0, 1, 1, 1 y 0: V(estudio) = 0.6. Discrepan sobre el pasillo:

Monte Carlo por lotes
V(pasillo)el promedio de su único retorno, −1 + 0 = −1
Encuentralas estimaciones con el menor error cuadrático sobre los datos vistos: −1 calza perfecto con el único retorno del pasillo
TD(0) por lotes
V(pasillo)−1 + 0.6 = −0.4, porque el pasillo siempre llevó al estudio con una recompensa de −1
Encuentrala estimación de equivalencia de certeza (certainty equivalence): los valores exactamente correctos para el modelo de máxima verosimilitud del proceso, construido con los datos y tratado como si fuera seguro
siempre, −1 3/5, +1 2/5, 0 pasillo estudio
El proceso tal como lo describen los datos: las transiciones vistas, con cuántas veces ocurrió cada una y su recompensa. La probabilidad de cada transición es la fracción de veces que se observó, y su recompensa, el promedio de las recompensas observadas. TD(0) por lotes da los valores que son exactamente correctos para este modelo.

Si el proceso es de Markov, la respuesta de TD debería predecir mejor los retornos futuros. El único mal resultado después del pasillo fue culpa del cargador, y cinco visitas al estudio dicen más sobre el cargador que una.

Esto ayuda a explicar por qué TD tiende a aprender más rápido. Calcular directamente la estimación de equivalencia de certeza rara vez es práctico: con n estados, el modelo solo puede necesitar memoria del orden de n2, y resolverlo, unos n3 pasos. TD se acerca a la misma respuesta con memoria del orden de n, y TD en línea, que no repasa, igual avanza más o menos hacia ella.

El algoritmo

TD(0) por lotes, para un lote de episodios y un tamaño de paso α pequeño:

  1. Parte con cualquier V(s), salvo V(terminal) = 0.
  2. Con V fija, recorre cada paso de cada episodio del lote y calcula su TD error, δt = Rt+1 + γV(St+1) − V(St).
  3. Cambia cada estimación una sola vez, α veces la suma de los TD errors de los pasos que parten en su estado: V(s) ← V(s) + α Σ δt, sobre los pasos con St = s.
  4. Vuelve al paso 2 hasta que V deje de cambiar.

Monte Carlo por lotes es lo mismo con Gt − V(St) en lugar de δt, en cada paso, como en Monte Carlo con α constante.

La figura ejecuta ambos sobre los 702 movimientos de los 30 episodios de la primera figura, con todas las estimaciones en 0 y α = 0.005, pequeño porque cada estimación se mueve α veces una suma: 176 de los movimientos parten en A1.

  • El agente no se mueve de A1, porque el lote solo se repasa.
  • Cada vez que presionas Siguiente se ejecuta una línea de los pasos de arriba; las estimaciones que cambia una pasada tienen borde verde, y las que toman prestadas los objetivos, borde rojo, como en la primera figura.
  • Los botones sobre la grilla cambian entre TD(0) por lotes y Monte Carlo por lotes.

Siguiente avanza, Atrás retrocede. Teclas: → y ←.

5Sarsa: TD para control

Para aprender a actuar sin modelo, TD aprende valores de acción, y la política mejora en el camino: evaluar con TD, actuar de forma ε-greedy con respecto a las estimaciones actuales, y repetir, como en la iteración de políticas generalizada. La actualización es la misma de TD(0), de un par estado–acción al siguiente:

Q(St, At) ← Q(St, At) + α[Rt+1 + γQ(St+1, At+1) − Q(St, At)]

Se hace después de cada transición desde un estado no terminal, con Q(terminal, ·) = 0. Usa las cinco cantidades St, At, Rt+1, St+1 y At+1, que le dan su nombre al método. Sarsa es on-policy: At+1 es la acción que la política de verdad toma después, así que Sarsa aprende los valores de la política que sigue, exploración incluida.

Sarsa converge con probabilidad 1 a una política óptima y sus valores de acción si todos los pares se siguen visitando, los tamaños de paso se achican de la forma habitual y la política se vuelve greedy en el límite, por ejemplo ε-greedy con ε = 1/t.

El algoritmo

Para un tamaño de paso α en (0, 1] y un ε > 0 pequeño, con Q(s, a) arbitraria salvo Q(terminal, ·) = 0:

  1. Al comienzo de cada episodio, observa S y elige A de forma ε-greedy con respecto a Q.
  2. Toma A, y observa R y S′. Elige A′ en S′ de forma ε-greedy con respecto a Q.
  3. Actualiza Q(S, A) ← Q(S, A) + α[R + γQ(S′, A′) − Q(S, A)].
  4. Haz S ← S′ y A ← A′, y vuelve al paso 2 hasta que S sea terminal.

Aprender dentro del episodio es lo que le permite a Sarsa escapar de una política que nunca terminaría. Supón que todos los valores de acción del robot parten en 0 y que, al desempatar, su política lo manda del pasillo de vuelta a la cocina, desde donde el único movimiento es volver al pasillo. Seguida de forma greedy, esa política va y viene para siempre, y un método Monte Carlo esperaría para siempre un retorno. Con Sarsa, α = 0.5 y γ = 1:

  1. La primera vez que el robot vuelve a la cocina, Q(pasillo, cocina) baja a 0.5(−1 + 0 − 0) = −0.5.
  2. Eso queda por debajo del 0 del movimiento al estudio, que aún no ha probado.
  3. Así que la próxima vez que está en el pasillo, se va al estudio.

Para ver aprender a Sarsa, toma una grilla más grande que la de la galleta:

  • de 6 celdas de ancho y 4 de alto, desde A1 abajo a la izquierda hasta F4 arriba a la derecha;
  • el agente parte en A1, y un episodio termina cuando llega a la meta, F1, abajo a la derecha;
  • cada movimiento da −1, y entre el inicio y la meta, a lo largo del borde de abajo, hay un acantilado: un paso hacia él da −100 y devuelve al agente al inicio;
  • la ruta más corta va justo por el borde, en 7 movimientos.

La figura ejecuta Sarsa ahí con α = 0.5, γ = 1 y ε = 0.1, así que en cada celda el movimiento greedy tiene probabilidad 0.925 y cada uno de los demás 0.025. Cada celda vuelve a guardar los valores de sus cuatro movimientos, como en la figura de control Monte Carlo. Aquí cada movimiento cuesta, así que los valores son negativos, y el mapa de calor los sombrea de un coral tenue, más intenso cuanto más negativos son. Antes de cada actualización, el agente elige su siguiente movimiento, en amarillo, y el objetivo usa el valor de ese movimiento, con borde rojo.

Siguiente avanza, Atrás retrocede. Teclas: → y ←.

El objetivo de Sarsa usa el movimiento que el agente de verdad hace después, incluidos los de exploración, así que sus valores cuentan lo que cuesta explorar. Junto al borde, cada paso tiene una probabilidad de 0.025 de un movimiento al azar hacia abajo, al acantilado; una fila más arriba, un movimiento al azar hacia abajo solo cae en el borde. Eso hace que para Sarsa el borde valga menos.

En la figura, los valores todavía saltan con cada caída, porque α = 0.5 mueve una estimación la mitad del camino hacia cada objetivo. Con un tamaño de paso pequeño y muchos episodios, se asientan en los valores de la política ε-greedy que sigue el agente, que promedian cada caída:

Movimiento desde A2qπ(A2, movimiento)
arriba−9.39
derecha, hacia el borde−12.01

La ruta una fila más arriba, de 9 movimientos, es lo mejor que puede hacer un agente que sigue explorando. No es la mejor ruta: cuando deja de explorar, el borde es dos movimientos más corto y nunca cae.

6Resumen

Las ideas clave junto a sus equivalentes en NumPy, con las tablas v y q indexadas por estado, y por estado y acción.

Actualización TD(0)
V(S) ← V(S) + α[R + γV(S′) − V(S)]
g = r + gamma * v[s_next]
v[s] += alpha * (g - v[s])
TD error
δt = Rt+1 + γV(St+1) − V(St)
delta = r + gamma * v[s_next]
delta -= v[s]
Monte Carlo con α constante
V(St) ← V(St) + α[Gt − V(St)]
v[s] += alpha * (g - v[s])
Error de Monte Carlo como TD errors
Gt − V(St) = Σk γk−tδk, con V fija
k = np.arange(len(deltas))
err = gamma**k @ deltas
Una pasada de TD(0) por lotes
V(s) ← V(s) + α Σ δt, sobre los pasos del lote con St = s
delta = r + gamma * v[s_next]
delta -= v[s]
np.add.at(v, s, alpha * delta)
TD(0) por lotes converge a
los valores del modelo de máxima verosimilitud (equivalencia de certeza)
Sin código: es una propiedad del método.
Actualización de Sarsa
Q(S, A) ← Q(S, A) + α[R + γQ(S′, A′) − Q(S, A)]
g = r + gamma * q[s_next, a_next]
q[s, a] += alpha * (g - q[s, a])
Fin de un episodio
V(terminal) = 0 y Q(terminal, ·) = 0
g = r  # s_next es terminal