Bandidos de vários braços

Reinforcement Learning com Gymnasium em Python

Fouad Trad

Machine Learning Engineer

Bandidos de vários braços

 

  • Apostador diante de caça-níqueis
  • Desafio → maximizar vitórias
  • Solução → exploração vs. exploração

Imagem de um homem diante de uma fileira de caça-níqueis

Reinforcement Learning com Gymnasium em Python

Caça-níqueis

Imagem mostrando 4 caça-níqueis com diferentes probabilidades de ganhar: 45%, 35%, 85% e 62%, desconhecidas para o usuário.

  • Recompensa de um braço é 0 ou 1
  • Objetivo do agente → acumular máxima recompensa
Reinforcement Learning com Gymnasium em Python

Resolvendo o problema

 

  • Epsilon-greedy com decaimento
  • Epsilon → seleciona máquina aleatória

Diagrama mostrando que, com probabilidade epsilon, o agente explora selecionando uma máquina aleatória.

Reinforcement Learning com Gymnasium em Python

Resolvendo o problema

 

  • Epsilon-greedy com decaimento
  • Epsilon → seleciona máquina aleatória
  • 1 - epsilon → seleciona a melhor até agora
  • Epsilon diminui ao longo do tempo

Diagrama mostrando que, com probabilidade epsilon, o agente explora selecionando uma máquina aleatória e, com 1 - epsilon, explora selecionando a melhor conhecida.

Reinforcement Learning com Gymnasium em Python

Inicialização

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) # Quantas vezes cada bandido foi jogado
values = np.zeros(n_bandits) # Prob. de vitória estimada de cada bandido
rewards = np.zeros(n_iterations) # Histórico de recompensas
selected_arms = np.zeros(n_iterations, dtype=int) # Histórico de braços escolhidos
Reinforcement Learning com Gymnasium em Python

Loop de interação

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 com Gymnasium em Python

Analisando seleções

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


Diagrama mostrando a primeira etapa: um array (iterations, n_bandits) preenchido com zeros.

Reinforcement Learning com Gymnasium em Python

Analisando seleções

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

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

Diagrama mostrando a segunda etapa, marcando o braço selecionado em cada iteração com valor 1 no array.

Reinforcement Learning com Gymnasium em Python

Analisando seleções

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 mostrando as últimas etapas: soma cumulativa dos braços escolhidos e divisão pelo número da iteração para obter a porcentagem de seleção de cada braço por iteração.

Reinforcement Learning com Gymnasium em Python

Analisando seleções

  Imagem mostrando a curva de selections_percentage para cada bandido; com o tempo, o agente tende a escolher mais o bandido #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
  • Agente aprende a escolher o bandido com maior probabilidade
Reinforcement Learning com Gymnasium em Python

Vamos praticar!

Reinforcement Learning com Gymnasium em Python

Preparing Video For Download...