Apuntes / Aprendizaje Reforzado / Apunte 1 de 9

Read in English

Bandits de múltiples brazos

Cómo elegir una y otra vez entre opciones cuyo rendimiento solo se conoce probándolas, estimando cuánto vale cada una y equilibrando probar las demás con usar la mejor encontrada hasta ahora.

Una pescadora pasa una temporada en un lago. Cada mañana pesca en uno de cuatro lugares, el muelle, los juncos, las rocas o el puente, y se queda con lo que pesca. Algunos lugares tienen más peces que otros, pero nadie le ha dicho cuáles.

? muelle ? juncos ? rocas ? puente pesca media

La pesca de una mañana dice cuán bueno fue ese día el lugar que eligió, y nada sobre los tres que dejó de lado. Para encontrar el mejor lugar, a veces debe pescar en lugares que parecen peores, renunciando a peces hoy: eso es explorar. Para pescar muchos peces, debe pescar en el lugar que parece mejor, explotando lo que ha aprendido. Este apunte trata de equilibrar las dos cosas. Nada en el lago le indica que otro lugar sea mejor en una mañana dada: hay una sola situación, y los apuntes que siguen a este agregan situaciones que cambian la mejor elección.

Un problema de bandit de k brazos consiste en elegir una y otra vez entre k acciones, cada una de las cuales da una recompensa aleatoria cuya distribución depende solo de la acción y no cambia con el tiempo, para reunir tanta recompensa como sea posible a lo largo de muchas elecciones. El nombre viene de las máquinas tragamonedas, llamadas en inglés one-armed bandits, bandidos de un brazo: este problema es una máquina con k palancas. En el lago, k = 4: las acciones son los cuatro lugares, cada mañana es un paso de tiempo t, y la recompensa de una mañana es su pesca.

El apunte recorre cinco ideas:

  1. estimar cuánto vale cada lugar, y elegir a partir de las estimaciones;
  2. actualizar una estimación sin guardar cada pesca;
  3. seguir a los peces cuando se mueven;
  4. hacer que las estimaciones iniciales impulsen la exploración;
  5. aprender preferencias en vez de valores.

En esta página, las estimaciones se dibujan con tinta azul, y aquello hacia lo que se mueven, las pescas y las medias reales, con tinta roja.

1Valores de las acciones

Sea At el lugar donde se pesca la mañana t y Rt su pesca. Cada lugar a tiene un valor, la pesca que cabe esperar al pescar en él:

q*(a) ≐ E[Rt | At = a]

El valor de una acción es la recompensa que cabe esperar tras tomarla. La estrella marca el valor real, que la pescadora nunca ve, y ≐ se lee «se define como».

En el lago, q*(muelle) = 1, q*(juncos) = 3, q*(rocas) = 4 y q*(puente) = 2 peces por mañana. Su estimación en la mañana t, Qt(a), es el promedio de las pescas que el lugar ha dado hasta entonces:

Qt(a) ≐ Σt−1i=1Ri · 𝟙Ai=aΣt−1i=1𝟙Ai=a

Aquí 𝟙Ai=a vale 1 si se pescó en el lugar a la mañana i y 0 si no, así que ambas sumas conservan solo las mañanas pasadas en a. Un lugar donde nunca se ha pescado recibe una estimación por defecto, como 0. Mientras más se pesca en un lugar, más se acerca su promedio a q*(a), por la ley de los grandes números: el promedio de más y más muestras se asienta en su media. Este es el método del promedio muestral.

La forma más simple de elegir es greedy: pescar en el lugar con la mayor estimación, la acción greedy, desempatando al azar.

At ≐ argmaxa Qt(a)

Una pescadora ε-greedy es greedy la mayoría de las mañanas, pero con una probabilidad pequeña ε elige un lugar al azar entre los k, incluido el greedy. El lugar greedy se pesca entonces con probabilidad 1 − ε + ε/k, y cada uno de los otros con ε/k. Con k = 4 y ε = 0.2:

  • el lugar greedy recibe 0.85 y cada uno de los otros 0.05;
  • cuando dos lugares empatan en la mayor estimación, se reparten el 0.8 de las mañanas greedy, así que cada uno recibe 0.4 + 0.05 = 0.45, y los otros dos conservan 0.05.

Una pescadora greedy que parte con todas las estimaciones en 0 puede dejar de explorar tras una sola mañana:

  1. La primera mañana las cuatro estimaciones valen 0, y el empate se rompe al azar.
  2. Una pesca nunca es negativa, así que si la primera es mayor que cero, la estimación de ese lugar sube sobre 0 mientras las otras tres siguen en 0.
  3. Su promedio sigue sobre 0 pesque lo que pesque después, así que los otros lugares nunca se vuelven a probar.

La figura sigue una de esas temporadas. Cada fila es una mañana, con las cuatro estimaciones antes de ella; el lugar donde se pesca está sombreado en amarillo, y su pesca, en rojo.

estimación de cada lugar antes de la mañana mañana muelle juncos rocas puente pesca 1 0 0 0 0 5 2 0 5 0 0 2 3 0 3.5 0 0 1 4 0 2.67 0 0 3 5 0 2.75 0 0 1 6 0 2.4 0 0 4 7 0 2.67 0 0 0 8 0 2.29 0 0 3
Una temporada greedy con estimaciones iniciales de 0. Los juncos ganan el empate de la primera mañana y dan 5 peces; desde entonces las otras estimaciones siguen en 0, y la temporada pasa sus 300 mañanas en los juncos sin probar nunca las rocas, el mejor lugar.

En 1000 temporadas de 300 mañanas, 9 de cada 10 temporadas greedy nunca dejan su primer lugar (en las demás no se pescó nada la primera mañana, así que el empate siguió abierto), y greedy pesca en las rocas cerca del 29% de las mañanas durante toda la temporada. Explorar lo arregla:

PescadoraPeces por mañana, mañanas 291–300Con estimaciones exactas
Greedy2.614
ε = 0.053.823.925
ε = 0.23.673.7

La última columna es lo que pescaría cada una con estimaciones exactas: 4 con greedy, lo mejor posible, pescando en las rocas cada mañana, y menos con ε, ya que explorar todavía la manda a lugares peores algunas mañanas. Con ε = 0.2 encuentra antes las rocas, y pesca en ellas el 76% de las mañanas 91–100, contra el 62% con ε = 0.05, pero más avanzada la temporada sus muchas mañanas al azar le cuestan más. Explorar cuesta peces hoy y rinde después.

2Promediar sobre la marcha

Promediar todas las pescas significa guardar todas las pescas. El promedio puede, en cambio, actualizarse tras cada una, guardando un número y un conteo por lugar. Toma un solo lugar y cuenta sus propias mañanas: Ri es ahora la pesca de su i-ésima mañana, y Qn su estimación después de haber pescado en él n − 1 veces:

Qn ≐ R1 + R2 + ⋯ + Rn−1n − 1

Las primeras n − 1 pescas suman (n − 1)Qn, así que tras la n-ésima pesca el promedio es Qn+1 = [Rn + (n − 1)Qn]/n, que se reordena como

Qn+1 = Qn + 1n[Rn − Qn]

Vale también para n = 1, y da Q2 = R1 sea cual sea la conjetura inicial Q1. Ahora hay dos contadores en juego: t cuenta las mañanas de la temporada, y n las mañanas en un lugar. En seis mañanas, para las rocas:

tLugarPescanQ(rocas) después
1juncos20
2rocas510 + 1(5 − 0) = 5
3rocas325 + ½(3 − 5) = 4
4muelle14
5rocas634 + ⅓(6 − 4) ≈ 4.67
6rocas244.67 + ¼(2 − 4.67) = 4

Las rocas terminan en 4, el promedio simple de 5, 3, 6 y 2. Cada fila de la tabla tiene la misma forma:

EstimaciónNueva ← EstimaciónAnterior + TamañoDePaso [Objetivo − EstimaciónAnterior]

El corchete es un error, cuán lejos está la estimación del objetivo, aquí la última pesca. Una sola pesca es un objetivo ruidoso, pero en promedio apunta en la dirección correcta, y el tamaño de paso, aquí 1/n, fija cuánto moverse. Cada método de estos apuntes mueve una estimación un paso hacia un objetivo; los apuntes de Monte Carlo y de TD lo hacen con otros objetivos. Un tamaño de paso se escribe α, o αn(a) cuando cambia de una pesca a la siguiente.

El algoritmo

Un algoritmo de bandit simple, ε-greedy con promedios muestrales:

  1. Para cada lugar a, haz Q(a) ← 0 y N(a) ← 0.
  2. Elige A: con probabilidad 1 − ε, el lugar con la mayor Q, desempatando al azar; con probabilidad ε, un lugar al azar.
  3. Pesca en A y observa la pesca R.
  4. Haz N(A) ← N(A) + 1 y Q(A) ← Q(A) + [R − Q(A)]/N(A).
  5. Repite desde el paso 2 cada mañana.

3Cuando los peces se mueven

Un promedio muestral pesa la primera pesca tanto como la última. Eso es correcto mientras los lugares no cambien, pero un lago cambia, en contra del «no cambia con el tiempo» del problema de bandit definido arriba. En un problema no estacionario los valores reales cambian mientras el agente juega, y las recompensas recientes merecen más peso. La forma usual de dárselo es un tamaño de paso constante α, con 0 < α ≤ 1:

Qn+1 ≐ Qn + α[Rn − Qn]

Reescrita como αRn + (1 − α)Qn, puede desenrollarse sustituyendo Qn por su propia actualización, luego Qn−1, y así hasta Q1:

Qn+1 = αRn + (1 − α)[αRn−1 + (1 − α)Qn−1]
= αRn + (1 − α)αRn−1 + (1 − α)2Qn−1 = ⋯
= (1 − α)nQ1 + Σni=1α(1 − α)n−iRi

Es un promedio ponderado del inicio y de cada pesca. Cada actualización multiplica la estimación anterior por 1 − α, así que el peso de una pesca se achica en ese factor con cada pesca posterior. Los pesos de las pescas forman una suma geométrica, α[1 + (1 − α) + ⋯ + (1 − α)n−1] = 1 − (1 − α)n, así que junto con el (1 − α)n de Q1 suman 1.

Un promedio ponderado que privilegia lo reciente (exponential recency-weighted average) da a cada recompensa pasada un peso que decae exponencialmente con el número de recompensas que llegaron después de ella.

Con α = 0.25 y Q1 = 0, las cuatro pescas de las rocas de la sección 2 (5, 3, 6 y 2) dan estimaciones de 1.25, 1.69, 2.77 y 2.57. La figura muestra los pesos en la última.

peso en la estimación 0 0.1 0.2 0.3 0.316 Q1 = 0 0.105 R1 = 5 0.141 R2 = 3 0.188 R3 = 6 0.25 R4 = 2 el inicio y las pescas, la más antigua primero
Los pesos en la estimación de las rocas tras cuatro pescas, con α = 0.25. La última pesca es la que más cuenta, y el inicio aún conserva 0.316, más que cualquier pesca; por eso la estimación, 2.57, queda tan por debajo del promedio de las pescas, que es 4. El peso del inicio, (1 − α)n, baja de 0.05 solo después de 11 pescas.

Ahora el agua se entibia en la mañana 151: los peces dejan las rocas por los juncos, la media de las rocas cae de 4 a 1 y la de los juncos sube de 3 a 5. Para comparar el promedio muestral con α = 0.25 sin nada más en juego, supón que la pescadora sigue pescando en las rocas y que cada pesca es exactamente la media.

estimación de las rocas 0 1 2 3 4 0 10 20 30 mañanas desde que el agua se entibia el agua se entibia promedio muestral α = 0.25 media real
La estimación de las rocas tras 150 pescas de exactamente 4, seguidas de pescas de exactamente 1. Tras 1, 5, 10 y 30 mañanas, el promedio muestral marca 3.98, 3.90, 3.81 y 3.50, sostenido por las 150 pescas anteriores; con α = 0.25 marca 3.25, 1.71, 1.17 y 1.00.

Con pescas aleatorias y ε = 0.2, en 1000 temporadas, la fracción de mañanas en el mejor lugar (las rocas hasta que el agua se entibia, los juncos después) es:

MañanasPromedio muestralα = 0.25
141–150, antes de que el agua se entibie81%76%
161–17015%81%
191–20048%84%

Antes de que el agua se entibie, al promedio muestral le va un poco mejor, ya que sus estimaciones son menos ruidosas. Después, el promedio muestral sigue volviendo a las rocas, y de la mañana 151 a la 300 pesca 3.46 peces por mañana, contra 4.34 con α = 0.25.

Las dos actualizaciones son una sola, con un tamaño de paso αn(a) que puede cambiar de una pesca a otra:

Qn+1 = Qn + αn(a)[Rn − Qn]

Con αn(a) = 1/n es el promedio muestral, y con un α constante, el que privilegia lo reciente. Las estimaciones convergen a los valores reales, con probabilidad 1 (en todas las temporadas salvo las de una mala suerte imposible), cuando

Σ∞n=1αn(a) = ∞ y Σ∞n=1α2n(a) < ∞

La primera suma debe crecer sin límite, para que los pasos siempre puedan superar el inicio y las pescas desafortunadas; la segunda debe quedar finita, para que los pasos terminen siendo lo bastante pequeños como para asentarse. Los promedios muestrales cumplen ambas: la suma de 1/n llega a 7.49 en n = 1000 y sigue creciendo, mientras que la suma de 1/n2 se queda bajo 1.645. Un α constante no cumple la segunda, así que sus estimaciones nunca se asientan y siguen las últimas pescas, que es lo que necesita un lago que cambia. Las secuencias de pasos que cumplen ambas suelen aprender lento o requerir ajuste, y como la mayoría de los problemas cambian con el tiempo, un α constante es la elección usual en la práctica.

4Inicios optimistas

Todos los métodos vistos hasta aquí dependen de las estimaciones iniciales Q1(a): están sesgados por ellas, con sus estimaciones arrastradas hacia el inicio y, por lo tanto, en promedio, desviadas de q*(a). Cuánto dura el sesgo depende del tamaño de paso:

  • con promedios muestrales desaparece tras la primera pesca de un lugar, ya que Q2 = R1;
  • con un α constante solo se achica, como (1 − α)n: desde Q1 = 8, las pescas 5, 3, 6 y 2 con α = 0.25 aún dan 5.11, y 2.53 de eso es el inicio.

Así que el inicio es una elección, una forma de introducir conocimiento previo o de impulsar la exploración. La pescadora greedy de la sección 1 partió en 0, bajo el valor de cada lugar, y se quedó en su primer lugar. Un α constante no la habría liberado: una pesca de 0 solo multiplica su estimación por 1 − α, así que nunca vuelve a 0. Si, en cambio, parte en 8, sobre la media de cada lugar, casi toda pesca decepciona, y la elección greedy se va a los lugares que siguen en 8, hasta que todos se han probado. La figura se dibuja como la de la sección 1.

estimación de cada lugar antes de la mañana mañana muelle juncos rocas puente pesca 1 8 8 8 8 2 2 2 8 8 8 4 3 2 8 4 8 1 4 2 8 4 1 4 5 2 4 4 1 3 6 2 3.5 4 1 6
Una temporada greedy con estimaciones iniciales de 8, con promedios muestrales. Cada pesca deja a su lugar muy por debajo de 8, así que cada mañana va a un lugar aún no probado. La mañana 5 los juncos y las rocas empatan en 4 y ganan los juncos; su pesca de 3 deja adelante a las rocas, y la temporada pasa las 295 mañanas restantes en las rocas.

En 1000 temporadas, la fracción de las mañanas 291–300 pasadas en las rocas:

PescadoraInicioTamaño de pasoEn las rocas
Greedy01/n29%
Greedy81/n78%
Greedy80.2593%
ε = 0.0500.2577%

Con promedios muestrales, el optimismo consigue cerca de un intento en cada lugar (una primera pesca de 8 o más, que es rara, mantiene a un lugar en carrera), y una primera pesca desafortunada aún puede enterrar a las rocas para siempre. Con α = 0.25, el optimismo se desvanece en varias pescas y mantiene a la pescadora probando por más tiempo. Las dos últimas filas comparten tamaño de paso, así que son la comparación justa, y gana el inicio optimista.

Solo ayuda una vez, al principio. Si el agua se entibia en la mañana 151, el inicio ya se olvidó, y nada en él manda a la pescadora a buscar lo que cambió. Una tercera forma de dirigir la exploración, la selección por cota superior de confianza (UCB), prefiere los lugares cuyas estimaciones aún son inciertas porque se ha pescado poco en ellos; este apunte no entra en ella.

5Preferencias en vez de valores

En vez de estimar valores, la pescadora puede aprender una preferencia Ht(a) por cada lugar y elegir los lugares con probabilidades que crecen con ella, mediante un softmax, cuya exponencial hace positiva cada probabilidad y cuya división por la suma hace que sumen 1:

Pr{At = a} ≐ eHt(a)Σkb=1eHt(b) ≐ πt(a)

Una preferencia es un número que hace más probable una acción mientras mayor sea comparado con los de las demás. No significa nada en peces. πt(a) es la probabilidad de tomar la acción a en el paso t. Una regla que da a cada acción una probabilidad es una política, y πt es la primera de estos apuntes.

Solo importan las diferencias entre preferencias: el softmax de 0.3, −0.1, 0.5 y 0 es 0.275, 0.185, 0.336 y 0.204, y sumar 5 a cada preferencia no lo cambia. Las preferencias parten iguales, aquí en 0, así que cada lugar parte con 0.25. Tras cada mañana se actualizan:

Ht+1(At) ≐ Ht(At) + α(Rt − Rt)(1 − πt(At)),
Ht+1(a) ≐ Ht(a) − α(Rt − Rt)πt(a) para todo a ≠ At

Aquí Rt, el baseline, es el promedio de las pescas antes de la mañana t, con R1 ≐ R1. Una pesca sobre el baseline sube la preferencia del lugar donde se pescó y baja las de los otros; una pesca bajo él hace lo contrario. Los otros se mueven según sus probabilidades, que suman 1 − πt(At), exactamente lo que se mueve el lugar donde se pescó, así que la suma de las preferencias nunca cambia: si parte en 0, sigue en 0. Al repetir las seis mañanas de la sección 2, con los mismos lugares y pescas, y α = 0.1:

  • La mañana 1 no cambia nada, ya que R1 = R1.
  • La mañana 5 es una pesca de 6 en las rocas contra un baseline de 2.75, el promedio de 2, 5, 3 y 1, y π(rocas) sube de 0.319 a 0.387.
  • La mañana 6 es una pesca de 2 contra un baseline de 3.4, y π(rocas) baja a 0.360. Si solo la mañana 6 no hubiera usado baseline, la misma pesca de 2 la habría subido a 0.426.
antes de la mañana 5 muelle 0.193 juncos 0.244 rocas 0.319 puente 0.244 tras la mañana 5: pesca 6, baseline 2.75 muelle 0.176 juncos 0.219 rocas 0.387 puente 0.219 tras la mañana 6: pesca 2, baseline 3.4 muelle 0.183 juncos 0.229 rocas 0.360 puente 0.229 0 0.25 0.5 probabilidad de pescar en el lugar, π
Las probabilidades de los cuatro lugares antes de la mañana 5 y tras las mañanas 5 y 6, marcadas en azul como lo que la pescadora ha aprendido. Una buena pesca en las rocas les quita probabilidad a los otros tres lugares; una mala les devuelve algo.

El baseline hace que una pesca cuente como buena o mala en comparación con la pesca habitual. Sin él, toda pesca de un pez o más sube al lugar donde se pescó, incluidos los lugares malos, y la pescadora distingue los lugares más lentamente. En 1000 temporadas:

PreferenciasEn las rocas, mañanas 291–300
Con el baseline98%
Sin baseline86%

Por qué funciona la actualización

La actualización es ascenso de gradiente estocástico sobre la pesca esperada. El ascenso de gradiente exacto movería cada preferencia según la pendiente de la recompensa esperada:

Ht+1(a) ≐ Ht(a) + α∂E[Rt]∂Ht(a), E[Rt] = Σx πt(x)q*(x)

Los valores q*(x) son desconocidos, así que esta pendiente no se puede calcular. Cuatro pasos muestran que la actualización de arriba la sigue en promedio:

  1. Un baseline no agrega nada. Los valores q*(x) no dependen de las preferencias, así que la pendiente solo alcanza a las probabilidades: ∂E[Rt]/∂Ht(a) = Σx q*(x) ∂πt(x)/∂Ht(a). Las probabilidades siempre suman 1, así que sus cambios suman 0: Σx ∂πt(x)/∂Ht(a) = 0. Por eso se puede restar cualquier número Bt que no dependa de x:
    ∂E[Rt]∂Ht(a) = Σx (q*(x) − Bt) ∂πt(x)∂Ht(a)
  2. La suma se vuelve una esperanza. Multiplicar cada término por πt(x)/πt(x) lo pondera por la probabilidad de pescar en x, lo que convierte la suma en un valor esperado sobre el lugar elegido, At:
    = E[(q*(At) − Bt) ∂πt(At)∂Ht(a) / πt(At)]
  3. Lo observado reemplaza a lo desconocido. Elige Bt = Rt, que se construye con las pescas anteriores a t y por eso no depende del lugar elegido en t. Luego pon la pesca Rt en lugar de q*(At). Por la ley de la esperanza total, el valor esperado puede tomarse primero sobre la pesca para un At dado; los otros factores dependen solo de At, y E[Rt | At] = q*(At), así que el resultado es el mismo.
  4. La pendiente del softmax. En πt(x) = eHt(x)/Σb eHt(b), subir Ht(a) agranda la suma, y también el numerador cuando x = a. Por la regla del cociente, la pendiente es πt(a) − πt(a)2 para x = a y −πt(x)πt(a) para cualquier otro x; en una sola fórmula, ∂πt(x)/∂Ht(a) = πt(x)(𝟙a=x − πt(a)), donde 𝟙a=x vale 1 si a = x y 0 si no. El πt(At) se cancela:
    ∂E[Rt]∂Ht(a) = E[(Rt − Rt)(𝟙a=At − πt(a))]

Una muestra de esta esperanza en lugar de la pendiente da

Ht+1(a) = Ht(a) + α(Rt − Rt)(𝟙a=At − πt(a)) para todo a,

la actualización de las preferencias en una línea. Con a = At la indicadora vale 1, lo que da la primera línea de la actualización de arriba, y para cualquier otro a vale 0, lo que da la segunda. Usar una muestra, correcta solo en promedio, en lugar de la pendiente exacta es lo que hace estocástico el ascenso. El baseline no cambia la actualización esperada, sea cual sea su valor, siempre que no dependa del lugar elegido, pero sí cambia cuánto varían las actualizaciones individuales, y con ello cuán rápido se asientan las preferencias.

6Resumen

Las ideas clave junto a sus equivalentes en NumPy. r guarda la pesca de esta mañana y a su lugar, r_hist y a_hist las anteriores, r_a las pescas del lugar a hasta ahora, de la más antigua a la más reciente y con la de esta mañana incluida, q, n y h las estimaciones, los conteos y las preferencias, k el número de lugares y rng un generador aleatorio de NumPy.

Promedio muestral
Qt(a) = promedio de las recompensas cuando se tomó a
q[a] = r_hist[a_hist == a].mean()
Elección greedy
At = argmaxa Qt(a), empates al azar
best = np.where(q == q.max())[0]
a = rng.choice(best)
Elección ε-greedy
ε/k cada una, más 1 − ε para la acción greedy
if rng.random() < eps:
    a = rng.integers(k)
else:
    a = rng.choice(best)
Promedio incremental
Qn+1 = Qn + [Rn − Qn]/n
n[a] += 1
q[a] += (r - q[a]) / n[a]
Tamaño de paso constante
Qn+1 = Qn + α[Rn − Qn]
q[a] += alpha * (r - q[a])
Sus pesos
Qn+1 = (1 − α)nQ1 + Σi α(1 − α)n−iRi
i = np.arange(1, n[a] + 1)
w = alpha * (1-alpha) ** (n[a]-i)
q_next = (1-alpha) ** n[a] * q1
q_next += w @ r_a
Inicio optimista
Q1(a) sobre todos los valores, aquí 8
q = np.full(k, 8.0)
Softmax
πt(a) = eHt(a) / Σb eHt(b)
pi = np.exp(h - h.max())
pi /= pi.sum()
Gradient bandit
Ht+1(a) = Ht(a) + α(Rt − Rt)(𝟙a=At − πt(a))
onehot = np.arange(k) == a
step = alpha * (r - r_bar)
h += step * (onehot - pi)
Baseline
Rt = promedio de R1, …, Rt−1; R1 = R1
if r_hist.size:
    r_bar = r_hist.mean()
else:
    r_bar = r