Multi-Armed Bandits

Reinforcement Learning mit Gymnasium in Python

Fouad Trad

Machine Learning Engineer

Multi-Armed Bandits

 

  • Spieler vor Spielautomaten
  • Ziel → Gewinn maximieren
  • Lösung → Exploration vs. Exploitation

Bild: Ein Mann steht vor einer Reihe von Spielautomaten

Reinforcement Learning mit Gymnasium in Python

Spielautomaten

Bild: 4 Spielautomaten mit unbekannten Gewinnwahrscheinlichkeiten: 45 %, 35 %, 85 % und 62 %.

  • Reward eines Arms ist 0 oder 1
  • Ziel des Agents → maximale Gesamtreward
Reinforcement Learning mit Gymnasium in Python

Das Problem lösen

 

  • Decayed Epsilon-Greedy
  • Epsilon → wähle zufälligen Automaten

Diagramm: Mit Wahrscheinlichkeit Epsilon erkundet der Agent, indem er zufällig einen Automaten wählt.

Reinforcement Learning mit Gymnasium in Python

Das Problem lösen

 

  • Decayed Epsilon-Greedy
  • Epsilon → wähle zufälligen Automaten
  • 1 − Epsilon → wähle bisher besten Automaten
  • Epsilon sinkt über die Zeit

Diagramm: Mit Wahrscheinlichkeit Epsilon erkundet der Agent zufällig; mit 1 − Epsilon exploitet er den bisher besten Automaten.

Reinforcement Learning mit Gymnasium in Python

Initialisierung

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) # Wie oft jeder Bandit gespielt wurde
values = np.zeros(n_bandits) # Geschätzte Gewinnwahrscheinlichkeit je Bandit
rewards = np.zeros(n_iterations) # Reward-Verlauf
selected_arms = np.zeros(n_iterations, dtype=int) # Verlauf der Arm-Wahlen
Reinforcement Learning mit Gymnasium in Python

Interaktionsschleife

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

Auswahlen analysieren

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


Diagramm mit dem ersten Schritt: ein Array der Größe (iterations, n_bandits) nur mit Nullen.

Reinforcement Learning mit Gymnasium in Python

Auswahlen analysieren

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

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

Diagramm mit dem zweiten Schritt: In jeder Iteration wird der gewählte Arm im Array mit 1 markiert.

Reinforcement Learning mit Gymnasium in Python

Auswahlen analysieren

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)

Diagramm mit den letzten Schritten: kumulative Summe der gewählten Bandits, dann Division durch die Iterationszahl, um den Auswahlprozentsatz je Arm pro Iteration zu erhalten.

Reinforcement Learning mit Gymnasium in Python

Auswahlen analysieren

  Bild: Die Kurve selection_percentage für jeden Bandit. Mit mehr Iterationen wählt der Agent Bandit #2 häufiger.

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 lernt, den Bandit mit der höchsten Wahrscheinlichkeit zu wählen
Reinforcement Learning mit Gymnasium in Python

Lass uns üben!

Reinforcement Learning mit Gymnasium in Python

Preparing Video For Download...