Apuntes / Aprendizaje Reforzado / Paper 1 de 1

Read in English

Jugar Atari con aprendizaje reforzado profundo

Cómo un agente aprende a jugar videojuegos solo a partir de los cuadros del juego: una red que convierte los últimos cuadros en un valor para cada movimiento, entrenada con Q-learning sobre momentos sacados al azar de una memoria de su propio juego.

Los agentes de los apuntes anteriores recibían su estado hecho, como una celda de grilla o el ángulo del cart-pole. El paper de este apunte, de Mnih y seis colegas en DeepMind (2013), le da al agente solo lo que tiene un jugador: los cuadros y el puntaje de un juego de Atari 2600, la señal de fin y los controles. Con un mismo diseño de red y de aprendizaje, aprendió siete juegos.

Las figuras usan un juego propio: en un cuadro de 8 por 6 píxeles, una pelota rebota en tres paredes, y el agente mueve una paleta por el borde derecho para devolverla. Cada devolución vale 1 punto; dejarla escapar cuesta 1 y termina el juego.

El aprendizaje profundo, redes de muchas capas, había aprendido de imágenes etiquetadas e independientes entre sí; un juego no ofrece ninguna de las dos, y el paper nombra tres obstáculos:

  • +1

    El punto llega cuadros después de su movimiento, y ninguna etiqueta dice qué movimiento lo ganó

  • ≈

    Los cuadros en orden casi se repiten unos a otros, así que no son independientes

  • Una paleta que se queda cerca de arriba llena casi todos los cuadros, así que aquello de lo que aprende el agente cambia con su juego

El paper enfrenta el primer obstáculo con Q-learning y los otros dos con una memoria de su propio juego. Q-learning lleva cada punto hacia atrás, a los movimientos que lo ganaron, y sacar de la memoria al azar mezcla momentos viejos con nuevos.

En toda esta página, la tinta azul es lo que estima la red, la roja aquello a lo que apunta (un objetivo, o el valor exacto de un movimiento), y el amarillo el movimiento recién elegido.

1Valores desde los cuadros

Aparte del puntaje, el agente ve solo los cuadros del juego, y el agente de las figuras mira los dos últimos. Una red convierte ese par en un valor para cada movimiento: los puntos que cabe esperar al hacerlo y jugar bien después, contando menos los puntos que llegan más tarde.

La figura muestra la red que entrena la corrida de la sección 3. Arrastra la pelota: donde la sueltas es donde está ahora, en el último cuadro, y la dirección en que la moviste fija dónde estaba un paso antes, dibujada tenue.

  • Las barras son los valores que la red da a los tres movimientos, y la flecha azul junto a la paleta apunta al movimiento que más vale.
  • La línea roja corta sobre cada barra es el valor exacto de ese movimiento con el mejor juego, calculado con las reglas del juego, que la red nunca ve.
  • El botón Un cuadro muestra los valores de una red cuya entrada es solo el último cuadro.
Entrada:

Arrastra la pelota. Con el teclado, selecciónala con Tab y usa las flechas.

Donde un movimiento decide la devolución, el mejor movimiento de la red devuelve la pelota; los movimientos que casi no se hacen en una situación quedan con valores toscos. El resto de esta sección construye lo que muestra la figura: el estado que ve la red, los valores a los que apunta y la red misma.

El agente del paper juega a través de un emulador de la consola, ℰ. En cada paso de tiempo t elige una acción at de 𝒜 = {1, …, K}, aquí K = 3: subir, quedarse y bajar; ve una imagen xt ∈ ℝd, los píxeles del cuadro (aquí d = 48, cada uno 0 o 1); y recibe una recompensa rt, el cambio en el puntaje. El resto del juego de este apunte:

  • Hay 12 saques, desde la pared izquierda en cualquiera de las 6 filas, subiendo o bajando, con la paleta en las filas 2 y 3; dentro de un paso, la paleta se mueve antes que la pelota.
  • Un peloteo se corta a las 10 devoluciones: el corte no es un final, y el agente aprende como si el juego siguiera.

Con Un cuadro, una pelota junto a la paleta recibe los mismos valores subiendo o bajando, aunque el movimiento que la devuelve depende de cuál: un cuadro no muestra toda la situación.

Estados con aliasing perceptual, en palabras del paper: situaciones distintas que un cuadro muestra iguales.

Así que el paper toma como estado toda la secuencia de cuadros y acciones hasta ese momento,

st = x1, a1, x2, …, at−1, xt

La secuencia contiene todo lo que decide lo que viene después, y como en los juegos del paper todo episodio termina, hay una cantidad finita de secuencias: un problema grande pero finito, al que se aplican los métodos de los apuntes anteriores.

Una red necesita una entrada de largo fijo, así que el paper le da φ(st), los últimos cuatro cuadros, cada uno reducido a 84 × 84 píxeles en grises. En el juego de este apunte la pelota se mueve un píxel en diagonal por paso, en línea recta entre rebotes, así que dos cuadros muestran hacia dónde va, salvo en el saque, donde el primer cuadro cuenta dos veces:

φ(st) = (xt−1, xt)

El agente apunta al retorno, las recompensas desde t en adelante, cada una descontada por γ por cada paso que llega más tarde (el paper no da un valor; las figuras usan γ = 0.9):

Rt = ΣTt′=tγt′−trt′

y el valor de una acción es el mayor retorno esperado tras ella, entre todas las formas de seguir jugando,

Q*(s, a) = maxπ E[Rt | st = s, at = a, π]

Las líneas rojas de la figura son Q*, que la página calcula exactamente para este juego, con el value iteration del apunte de model-based RL sobre las 552 situaciones verdaderas del juego, algo que el agente, que no conoce las reglas ni el estado, no puede hacer. Como el corte no es un final, estos son los valores de un peloteo que nunca termina:

Dónde está el peloteoValor exacto
Un paso antes de una devolución, y después una devolución cada 12 pasos1 + 0.912 + 0.924 + ⋯ = 1/(1 − 0.912) ≈ 1.39
En un saque0.95 × 1.39 ≈ 0.82
Una pelota que se escapará con seguridad k pasos más adelante−0.9k−1: −1 un paso antes

Con un valor para cada secuencia, o para cada par de cuadros, el agente no aprendería nada sobre un par que no hubiera visto, y aunque este juego tiene solo 1336 pares, un juego de Atari tiene demasiados. Así que el paper estima Q* con pesos θ, como lo hacían los apuntes de aproximación:

Q(s, a; θ) ≈ Q*(s, a)

Una estimación lineal como las de esos apuntes fracasa sobre los píxeles. Cada píxel encendido suma su propio peso, así que la estimación no puede decir que subir es bueno cuando la pelota está sobre la paleta y malo cuando está debajo, estén donde estén las dos. Una red aprende esas combinaciones desde los píxeles.

Una red se construye en capas, cada una de las cuales multiplica lo que recibe por una tabla de pesos y pasa el resultado por una función fija (la red del apunte de word2vec). La red de las figuras tiene dos capas:

  • 96 entradas, los píxeles de los dos cuadros;
  • 32 unidades ocultas rectificadoras, max(0, z), que mantienen un número positivo y convierten uno negativo en 0;
  • y 3 salidas, un valor para cada movimiento:
Q(φ, ·; θ) = W2 max(0, W1φ)

con un 1 delante de φ y de la capa oculta, de modo que las primeras columnas de W1 y W2 tienen los sesgos, como en el apunte de los vectores de palabras; θ es W1 (32 × 97) y W2 (3 × 33), 3203 pesos; el Q(s, a; θ) del paper se calcula como Q(φ(s), a; θ).

El paperPrimero vienen dos capas convolucionales, que deslizan un mismo conjunto pequeño de pesos por la imagen para encontrar un patrón dondequiera que aparezca.

En el peloteoLos cuadros son lo bastante pequeños para una capa que une cada píxel con cada unidad.

Una salida por movimiento es la elección del paper: las redes anteriores recibían la acción como entrada y necesitaban una pasada por cada acción; esta da el valor de todos los movimientos en una sola pasada. En la notación de los apuntes anteriores:

El paperLos apuntes anteriores
θel w de los apuntes de aproximación
Q(s, a; θ)su q(s, a, w)
Q*el q* del apunte de Q-learning
rt, la recompensa que sigue a atRt+1
el retorno RtGt

2Aprender de sus propias estimaciones

Q* cumple la ecuación de optimalidad de Bellman del apunte de Q-learning, aquí en la notación del paper (su ecuación 1):

Q*(s, a) = Es′∼ℰ[r + γ maxa′ Q*(s′, a′) | s, a]

Value iteration, que el apunte de model-based RL aplicó a los valores de los estados, la convierte en una actualización que se repite iteración tras iteración, y converge a Q*:

Qi+1(s, a) = E[r + γ maxa′ Qi(s′, a′) | s, a]

Pero necesita un valor para cada secuencia, y no aprende nada de una secuencia a partir de otra.

El paper mantiene la forma de value iteration con una red. En la iteración i ajusta los pesos θi a objetivos calculados con los pesos de la iteración anterior, θi−1, haciendo pequeña una pérdida, un número que dice cuán equivocadas están las estimaciones, como lo hacía el VE del apunte de predicción (la ecuación 2 del paper):

Li(θi) = Es,a∼ρ(·)[(yi − Q(s, a; θi))2]

donde el objetivo es

yi = Es′∼ℰ[r + γ maxa′ Q(s′, a′; θi−1) | s, a]
  • ρ(s, a) es la distribución de comportamiento del paper, cuán seguido aparecen cada secuencia y cada acción al jugar (el μ del apunte de predicción, no la razón ρ del apunte de n-step bootstrapping).
  • θi−1 no es una segunda red: son los pesos antes de un paso, y θi los pesos que el paso cambia.

Así que los objetivos dependen de los pesos. En el aprendizaje supervisado, el objetivo de cada ejemplo, su etiqueta, está fijo antes de empezar a aprender. Aquí cada paso que cambia los pesos puede cambiar también los objetivos.

La figura toma el primer paso del juego desde un saque: la paleta se queda quieta, la recompensa es 0, y el siguiente par de cuadros es φ2. La red aprende Q(φ1, quedarse; θ) solo de esa transición, con un paso de gradiente sobre Li por iteración, en dos corridas, el valor en azul y su objetivo en rojo:

  • la de la izquierda mantiene el primer objetivo, como se mantendría una etiqueta;
  • la de la derecha lo vuelve a calcular antes de cada paso, con los pesos como están.
quedarse, 0 φ1 φ2 Objetivo fijo 01020300.10.20.3 objetivo valor 0.167 Objetivo de la red 0102030 0.329 iteración i valor
Fijo como una etiqueta (izquierda), el objetivo se queda en y1 ≈ 0 + 0.9 · 0.186 ≈ 0.167, y el valor lo alcanza en la iteración 4. Calculado con los pesos antes de cada paso (derecha), el objetivo sube junto con el valor, y los dos se encuentran en y30 ≈ 0 + 0.9 · 0.365 ≈ 0.329, cerca del doble del primer objetivo.

El objetivo se movió porque una misma red calcula los dos valores:

  1. El paso que subió quedarse en φ1 cambió los pesos de salida de quedarse, que usan todos los pares de cuadros, y las unidades ocultas que reciben los píxeles que comparten los dos cuadros; así que subió también quedarse en φ2, en cerca de cuatro quintos de esa subida.
  2. Bajar había sido el mayor valor de φ2, apenas sobre quedarse; después del paso, el mayor es quedarse, así que el objetivo toma prestado justo el valor que suben los pasos.
  3. Multiplicado por γ = 0.9, el objetivo gana cerca de 0.73 de lo que gana el valor, así que la brecha se achica cerca de un quinto por paso, hasta que los dos se encuentran en 0.329, un punto fijo, como el fixed point de TD del apunte de predicción lo era para una estimación lineal.

Si un paso hubiera subido el valor del siguiente par de cuadros en más de 1/0.9 veces lo que sube el valor que actualiza, el objetivo se habría adelantado, y los dos habrían crecido sin límite: aprender de sus propias estimaciones puede diverger, como retoma la sección 4. Solo el objetivo de una transición final, la recompensa −1, no puede moverse.

Para hacer pequeña Li, el paper sigue su gradiente. Con θi−1 fijo, es (la ecuación 3 del paper, con un factor agregado):

−½∇θiLi(θi) = Es,a∼ρ(·); s′∼ℰ[(r + γ maxa′ Q(s′, a′; θi−1) − Q(s, a; θi)) ∇θiQ(s, a; θi)]

Un error del paperImprime su ecuación 3 sin el −½: su lado derecho es entonces la dirección que toma un paso de descenso, no el gradiente mismo, que apunta hacia el otro lado y es el doble de largo.

El ½ del apunte de predicción daba el mismo paso, w ← w − ½α∇[…]2 = w + α[…]∇v (apunte de predicción), y mantener θi−1 fijo lo vuelve lo que ese apunte llamaba semi-gradient: el paso sigue cómo los pesos mueven la estimación, e ignora cómo mueven el objetivo. Para una red, ∇θQ se calcula capa por capa, desde la salida hacia atrás, con la regla de la cadena del apunte de los modelos lineales, un cálculo que se llama retropropagación (backpropagation).

En vez de calcular las esperanzas, el paper da pasos de gradiente estocástico; con una sola muestra de ρ y de ℰ después de cada paso de tiempo, la actualización es

θ ← θ + α[r + γ maxa′ Q(s′, a′; θ) − Q(s, a; θ)] ∇θQ(s, a; θ)

Esto es Q-learning: con una tabla, un peso para cada secuencia y movimiento, ∇θQ es 1 para el par que se actualiza y 0 para todos los demás, y el paso es la actualización del apunte de Q-learning; con el valor del movimiento siguiente en lugar del máximo, sería semi-gradient Sarsa.

Como los métodos del apunte de TD, es model-free: aprende de muestras de ℰ y no construye ningún modelo de él. Y es off-policy, como en el apunte de Q-learning: aprende sobre la política greedy, a = argmaxa Q(s, a; θ), mientras juega de forma ε-greedy. El paper escribe max ahí, y en su algoritmo, donde quiere decir argmax.

Después del paperLa versión posterior de DQN (Mnih et al., Nature, 2015) calcula sus objetivos con una segunda copia de la red, la red objetivo, cuyos pesos escribe θ−i y usa en lugar de θi−1:

yi = Es′∼ℰ[r + γ maxa′ Q(s′, a′; θ−i) | s, a]

Cada C actualizaciones de θ, 10 000 en todos los juegos, copia θ en θ−i, así que el objetivo se queda quieto entre copias, como en Objetivo fijo, el gráfico de la izquierda de la figura de esta sección. Un paso que sube el valor del siguiente par de cuadros mueve entonces el objetivo solo en la siguiente copia, lo que hace mucho menos probables las oscilaciones y la divergencia. El θi−1 del paper de 2013 es el caso de una copia antes de cada paso.

3Deep Q-learning

Deep Q-learning le agrega una cosa a esa actualización: una memoria. Después de cada paso, el agente guarda la transición, et = (st, at, rt, st+1), en un conjunto de datos (el algoritmo guarda cada s como su φ, todo lo que lee la red),

𝒟 = e1, …, eN

la memoria de replay, que guarda las últimas N transiciones, juntando muchos episodios.

Experience replay (repetición de experiencia): aprender de una memoria así, una idea que viene de Lin (1993). Cada actualización saca al azar de 𝒟 un minibatch de transiciones, 32 en el paper, y da un paso de gradiente sobre su promedio.

Eso queda entre el único estado por paso del apunte de predicción y la actualización por lotes del apunte de TD. Dyna-Q, en el apunte de model-based RL, también sacaba al azar pasos recordados, pero guardaba solo el último resultado de cada par. La sección 4 dice por qué se sacan al azar.

El algoritmo

Deep Q-learning con experience replay, para una red Q con pesos θ, una memoria de N transiciones, minibatches de 32, un tamaño de paso α y un ε que baja con el tiempo, como lo dejaba achicarse el apunte de Monte Carlo, durante M episodios:

  1. Parte con 𝒟 vacío, con espacio para N transiciones, y θ al azar.
  2. Al inicio de cada episodio, observa el primer cuadro x1, y haz s1 = x1 y φ1 = φ(s1).
  3. Con probabilidad ε elige una acción at al azar; si no, at = argmaxa Q(φt, a; θ).
  4. Toma at, observa rt y xt+1, y haz st+1 = st, at, xt+1 y φt+1 = φ(st+1).
  5. Guarda (φt, at, rt, φt+1) en 𝒟, y descarta la transición más antigua cuando ya tiene N.
  6. Saca al azar de 𝒟 un minibatch de transiciones (φj, aj, rj, φj+1), y fija el objetivo yj de cada una (abajo).
  7. Da un paso de gradiente sobre sus errores cuadráticos, con los objetivos fijos,
    θ ← θ + α · 132 Σj[yj − Q(φj, aj; θ)] ∇θQ(φj, aj; θ)
    Si φt+1 es terminal, o el peloteo llegó al corte del juego, empieza el episodio siguiente en el paso 2; si no, vuelve al paso 3.

Los objetivos del paso 6 son

yj = rj, si φj+1 es terminal;
yj = rj + γ maxa′ Q(φj+1, a′; θ), si no.

Aquí j cuenta las transiciones sacadas, donde el i de la sección 2 contaba iteraciones; los objetivos usan θ antes del paso, el θi−1 de la sección 2, y α absorbe el 2 del error cuadrático. Un peloteo cortado a las 10 devoluciones no es terminal, así que su último objetivo todavía suma γ veces el valor del siguiente par de cuadros. El paper llama a estas redes deep Q-networks, DQN.

Un error del paperSu algoritmo escribe Q* para la Q de la red.

El paperLas figuras
Cuadros en φ42
Red16 filtros de 8 × 8 con paso (stride) 4, 32 filtros de 4 × 4 con paso 2, 256 uni­dades, de 4 a 18 salidas32 uni­dades, 3 salidas, 3203 pesos
Recom­pensasrecor­tadas a −1, 0, +1 al entrenar, para que un solo tamaño de paso sirva en todos los juegosya son −1, 0, +1
εde 1 a 0.1 en el primer millón de cuadros, después 0.1de 1 a 0.1 en los primeros 10 000 pasos, después 0.1
Memoria Nel último millón de cuadroslas últimas 10 000 transi­ciones
Optimi­zadorRMSProp, que divide el paso de cada peso por el tamaño típico de sus gradientes recientesdescenso de gra­diente, α = 0.1

La figura ejecuta estos pasos en el juego, desde pesos al azar, con los ajustes de la tabla, en tres partes:

  • Arriba, el juego, con las barras y la flecha de la sección 1; el movimiento recién elegido llena su fila de amarillo, y las barras que usa un objetivo se marcan en rojo.
  • Al medio, la memoria, como celdas y después como una franja; números o marcas verdes señalan lo que saca cada paso.
  • Abajo, una transición sacada: sus dos pares de cuadros y una escala de su valor (azul) a su objetivo (rojo), con una marca verde donde el paso lo deja; un paso mueve un valor demasiado poco para verlo en las barras.

Cada vez que avanzas es una línea de los pasos de arriba, como en la figura de Sarsa del apunte de control; el episodio 1 se juega completo y el episodio 2 hasta su primera devolución, y desde ahí la figura salta a los momentos en que aprende algo nuevo.

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

Cada paso bajó el error cuadrático de sus 32 sorteos tomados juntos, pero no el de cada sorteo: cerca de un tercio de las transiciones sacadas se alejó de su objetivo en un paso, arrastrada por las demás.

4Por qué experience replay

Sarsa, Q-learning y TD-Gammon, un programa anterior que aprendió backgammon con una red, usaban cada paso una vez, en el orden en que llegaba. Una memoria cambia tres cosas, las ventajas del paper:

  1. Cada paso se usa en muchas actualizaciones: la transición 12 de la figura de la sección 3 salió 243 veces mientras estuvo en la memoria.
  2. Los pasos seguidos están muy correlacionados, el segundo obstáculo de la introducción, así que aprender de ellos en orden persigue el peloteo actual; sacarlos de los últimos 10 000 pasos rompe la correlación y baja la varianza de las actualizaciones.
  3. Cuando un agente aprende de los datos que producen sus pesos actuales, los pesos eligen los próximos datos, el tercer obstáculo de la introducción: una red que prefiere subir entrena sobre todo con cuadros con la paleta arriba. Esos ciclos pueden atrapar los pesos o hacerlos diverger; replay promedia ρ, la distribución de comportamiento, sobre muchas conductas pasadas.

Replay vuelve off-policy el aprendizaje, en el sentido de la sección 2, se quiera o no: una transición sacada tiene un movimiento que eligieron pesos más antiguos, muchas veces al azar. Eso decide el método:

Su objetivo usa
Sarsael movimiento que vino después, que también eligieron pesos más antiguos, así que con replay aprendería sobre políticas viejas
Q-learningel mejor movimiento del siguiente par de cuadros, con los pesos como están, y por eso el paper usa Q-learning

El objetivo de un paso de Q-learning no necesita ninguna corrección por la otra política, como mostró el apunte de Q-learning: dado el par que actualiza, la recompensa y el cuadro siguiente no dependen de quién eligió el movimiento. El paper también nombra los límites de su memoria: guarda solo las últimas N transiciones, y descarta las más antiguas tengan lo que tengan, y saca todas las transiciones por igual, aunque en esta corrida solo 3 o 4 de cada 32 sorteos traen una recompensa distinta de 0; sugiere favorecer las transiciones de las que hay más que aprender.

La figura corre el agente de la sección 3 con 16 semillas durante 30 000 pasos, con tres maneras de elegir el minibatch de cada paso:

Cada paso aprende deVentajas que conserva
Replay32 transiciones sacadas al azar de la memorialas tres
Últimas 32las 32 más recientes, en ordensolo la primera
Solo la últimala más nueva, sola y una vezninguna

Cada 250 pasos una prueba juega los 12 saques sin movimientos al azar, y cada curva cuenta los agentes que devuelven la pelota diez veces desde cada saque. Replay es azul, las otras tenues, Solo la última en línea discontinua.

agentes perfectos en una prueba, de 16 010 00020 00030 0000481216 paso de entrenamiento ε llega a 0.1 Replay Últimas 32 Solo la última
Los agentes de Replay son perfectos antes (una mediana de 9000 pasos, contra 11 000 en Últimas 32) y casi siempre lo siguen siendo: un 8% de sus pruebas posteriores falla un saque, contra un 30% en Últimas 32. En el paso 30 000, solo 6 de los 16 agentes de Solo la última juegan bien cada saque.

Lo que gana replay es que se mantiene estable con un tamaño de paso lo bastante grande para aprender rápido: con tres veces el α de la corrida, todos los agentes con replay siguen aprendiendo, mientras que ningún agente sin replay lo logra, y en más de la mitad de ellos los valores se disparan. El ciclo de la tercera ventaja no es la causa: cuando todo movimiento es al azar, la mitad de los agentes de Últimas 32 se disparan igual. Sin replay, cada paso aprende de las últimas transiciones, casi los mismos cuadros, y empuja los mismos pesos una y otra vez, hacia objetivos que esos mismos pesos fijan. Con transiciones sacadas al azar de 10 000 pasos, esos empujes se compensan.

El paper cita resultados que muestran que Q-learning puede diverger:

  • cuando su estimación no es lineal, como una red (Tsitsiklis y Van Roy, 1997);
  • o cuando aprende off-policy (Baird, 1995).

No ofrece ninguna garantía de que su propio método converja, e informa que ninguna de sus corridas divergió.

5Resumen

Las ideas clave junto a sus equivalentes en NumPy, para la red y los ajustes de las figuras. En el código:

  • x_prev y x son los dos últimos cuadros, w1 y w2 los pesos (los sesgos en la primera columna), theta los dos como un solo vector, y q los tres valores.
  • rs tiene las recompensas de un episodio desde t, y g es el retorno Rt.
  • En las filas del minibatch, r, done y q_a tienen las 32 recompensas, si cada par siguiente es terminal (1 o 0) y los valores de los movimientos hechos; q_next tiene los valores de cada par siguiente y grad_q el gradiente de cada Q(φj, aj; θ), por filas, que calcula la retropropagación.

El paso es el paso de gradiente simple de las figuras, con α absorbiendo el 2 del error cuadrático.

Retorno
Rt = ΣTt′=tγt′−trt′
g = rs @ gamma ** np.arange(len(rs))
Cuadros apilados
φ(st) = (xt−1, xt), donde el paper apila cuatro
phi = np.concatenate([x_prev, x])
Red Q (Q-network)
Q(φ, ·; θ) = W2 max(0, W1φ), con un 1 delante de φ y de la capa oculta
h = np.maximum(0, w1 @ np.append(1, phi))
q = w2 @ np.append(1, h)
Acción ε-greedy
al azar con probabilidad ε, si no, argmaxa Q(φ, a; θ)
a = rng.integers(3) if rng.random() < eps else np.argmax(q)
ε que baja con el tiempo
de 1 a 0.1 en los primeros 10 000 pasos
eps = max(0.1, 1 - 0.9 * t / 10_000)
Memoria de replay
𝒟 = e1, …, eN, las últimas N transiciones
memory = deque(maxlen=n)
memory.append((phi, a, r, phi_next, done))
Minibatch
32 sacadas al azar de 𝒟
idx = rng.integers(len(memory), size=32)
Objetivos
yj = rj + γ maxa′ Q(φj+1, a′; θ), o rj si φj+1 es terminal
y = r + gamma * q_next.max(axis=1) * (1 - done)
Pérdida
Li(θi) = E[(yi − Q(s, a; θi))2]
loss = np.mean((y - q_a) ** 2)
Paso de gradiente
θ ← θ + α · 132 Σj[yj − Q(φj, aj; θ)] ∇θQ(φj, aj; θ)
theta += alpha * (y - q_a) @ grad_q / 32