Bandidos de varios brazos

Reinforcement Learning con Gymnasium en Python

Fouad Trad

Machine Learning Engineer

Bandidos de varios brazos

 

  • Jugador ante tragaperras
  • Reto → maximizar aciertos
  • Solución → exploración-explotación

Imagen de un hombre frente a una fila de tragaperras

Reinforcement Learning con Gymnasium en Python

Tragaperras

Imagen con 4 tragaperras con probabilidades de acierto distintas: 45%, 35%, 85% y 62%, desconocidas para el usuario.

  • La recompensa de un brazo es 0 o 1
  • Objetivo del agente → acumular la máxima recompensa
Reinforcement Learning con Gymnasium en Python

Resolver el problema

 

  • Epsilon-greedy con decaimiento
  • Epsilon → elige máquina al azar

Diagrama: con probabilidad epsilon, el agente explora eligiendo una máquina al azar.

Reinforcement Learning con Gymnasium en Python

Resolver el problema

 

  • Epsilon-greedy con decaimiento
  • Epsilon → elige máquina al azar
  • 1 - epsilon → elige la mejor hasta ahora
  • Epsilon disminuye con el tiempo

Diagrama: con prob. epsilon, el agente explora eligiendo una máquina al azar y con 1 - epsilon explota eligiendo la mejor conocida.

Reinforcement Learning con Gymnasium en Python

Inicialización

n_bandits = 4  
true_bandit_probs = np.random.rand(n_bandits)

n_iterations = 100000 epsilon = 1.0 min_epsilon = 0.01 epsilon_decay = 0.999
counts = np.zeros(n_bandits) # Cuántas veces se jugó cada bandido
values = np.zeros(n_bandits) # Prob. estimada de acierto de cada bandido
rewards = np.zeros(n_iterations) # Historial de recompensas
selected_arms = np.zeros(n_iterations, dtype=int) # Historial de brazos elegidos
Reinforcement Learning con Gymnasium en Python

Bucle de interacción

for i in range(n_iterations):
    arm = epsilon_greedy()

reward = np.random.rand() < true_bandit_probs[arm]
rewards[i] = reward selected_arms[i] = arm counts[arm] += 1
values[arm] += (reward - values[arm]) / counts[arm]
epsilon = max(min_epsilon, epsilon * epsilon_decay)
Reinforcement Learning con Gymnasium en Python

Analizar selecciones

selections_percentage = np.zeros((n_iterations, n_bandits))


Diagrama que muestra el primer paso: un array de tamaño (iteraciones, n_bandits) lleno de ceros.

Reinforcement Learning con Gymnasium en Python

Analizar selecciones

selections_percentage = np.zeros((n_iterations, n_bandits))

for i in range(n_iterations): selections_percentage[i, selected_arms[i]] = 1

Diagrama del segundo paso: se marca con 1 el brazo seleccionado en cada iteración dentro del array.

Reinforcement Learning con Gymnasium en Python

Analizar selecciones

selections_percentage = np.zeros((n_iterations, n_bandits))

for i in range(n_iterations): selections_percentage[i, selected_arms[i]] = 1
selections_percentage = np.cumsum(selections_percentage, axis=0) / np.arange(1, n_iterations + 1).reshape(-1, 1)

Diagrama de los últimos pasos: suma acumulada de elecciones y división por el número de iteración para obtener el porcentaje de selección de cada brazo en cada iteración.

Reinforcement Learning con Gymnasium en Python

Analizar selecciones

  Imagen con la curva de selections_percentage por bandido; a medida que avanzan las iteraciones, el agente tiende a elegir más el bandido nº 2.

for arm in range(n_bandits):
    plt.plot(selections_percentage[:, arm], label=f'Bandit #{arm+1}')
plt.xscale('log')
plt.title('Bandit Action Choices Over Time')
plt.xlabel('Episode Number')
plt.ylabel('Percentage of Bandit Selections (%)')
plt.legend()
plt.show()

for i, prob in enumerate(true_bandit_probs, 1): print(f"Bandit #{i} -> {prob:.2f}")
Bandit #1 -> 0.37
Bandit #2 -> 0.95
Bandit #3 -> 0.73
Bandit #4 -> 0.60
  • El agente aprende a elegir el bandido con mayor probabilidad
Reinforcement Learning con Gymnasium en Python

¡Vamos a practicar!

Reinforcement Learning con Gymnasium en Python

Preparing Video For Download...