Multi-armed bandits

Reinforcement Learning met Gymnasium in Python

Fouad Trad

Machine Learning Engineer

Multi-armed bandits

 

  • Gokker voor fruitautomaten
  • Doel → winst maximaliseren
  • Oplossing → exploratie vs. exploitatie

Afbeelding van een man voor een rij fruitautomaten

Reinforcement Learning met Gymnasium in Python

Fruitautomaten

Afbeelding met 4 fruitautomaten met verschillende, voor de gebruiker onbekende winstkansen: 45%, 35%, 85% en 62%.

  • Beloning per arm is 0 of 1
  • Doel van de agent → maximale totale beloning
Reinforcement Learning met Gymnasium in Python

De oplossing

 

  • Afnemende epsilon-greedy
  • Epsilon → kies willekeurige machine

Diagram: met kans epsilon verkent de agent door willekeurig een machine te kiezen.

Reinforcement Learning met Gymnasium in Python

De oplossing

 

  • Afnemende epsilon-greedy
  • Epsilon → kies willekeurige machine
  • 1 - epsilon → kies beste machine tot nu toe
  • Epsilon neemt af in de tijd

Diagram: met kans epsilon verkent de agent (willekeurige machine) en met kans 1 - epsilon exploiteert hij (beste bekende machine).

Reinforcement Learning met Gymnasium in Python

Initialisatie

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) # Hoe vaak elke bandit is gespeeld
values = np.zeros(n_bandits) # Geschatte winstkans per bandit
rewards = np.zeros(n_iterations) # Beloningsgeschiedenis
selected_arms = np.zeros(n_iterations, dtype=int) # Keuzehistorie van armen
Reinforcement Learning met Gymnasium in Python

Interactielus

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 met Gymnasium in Python

Selecties analyseren

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


Diagram dat de eerste stap toont: een array van formaat (iterations, n_bandits) gevuld met nullen.

Reinforcement Learning met Gymnasium in Python

Selecties analyseren

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

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

Diagram met de tweede stap: in elke iteratie wordt de gekozen arm gemarkeerd met 1 in de array.

Reinforcement Learning met Gymnasium in Python

Selecties analyseren

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)

Diagram met de laatste stappen: cumulatieve som van gekozen bandits, gedeeld door het iteratienummer om het selectiepercentage per arm per iteratie te krijgen.

Reinforcement Learning met Gymnasium in Python

Selecties analyseren

  Grafiek van de selections_percentage-curve per bandit; naarmate iteraties toenemen, kiest de agent bandit #2 vaker.

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
  • Agent leert de bandit met hoogste kans te kiezen
Reinforcement Learning met Gymnasium in Python

Laten we oefenen!

Reinforcement Learning met Gymnasium in Python

Preparing Video For Download...