Multi-armed bandits

Reinforcement Learning med Gymnasium i Python

Fouad Trad

Machine Learning Engineer

Multi-armed bandits

 

  • En spelare framför spelautomater
  • Utmaning → maximera vinsten
  • Lösning → utforskning-utnyttjande

Bild som visar en man framför en rad spelautomater

Reinforcement Learning med Gymnasium i Python

Spelautomater

Bild som visar 4 spelautomater med olika vinstchans: 45 %, 35 %, 85 % och 62 %, okända för användaren.

  • Belöning från en arm är 0 eller 1
  • Agentens mål → ackumulera maximal belöning
Reinforcement Learning med Gymnasium i Python

Lösa problemet

 

  • Avklingande epsilon-girig
  • Epsilon → välj slumpmässig maskin

Diagram som visar att agenten med sannolikhet epsilon utforskar genom att välja en maskin slumpmässigt.

Reinforcement Learning med Gymnasium i Python

Lösa problemet

 

  • Avklingande epsilon-girig
  • Epsilon → välj slumpmässig maskin
  • 1 - epsilon → välj bästa maskin hittills
  • Epsilon minskar över tid

Diagram som visar att agenten med sannolikhet epsilon utforskar genom att välja en maskin slumpmässigt, och med sannolikhet 1 - epsilon utnyttjar den bästa kända maskinen.

Reinforcement Learning med Gymnasium i Python

Initialisering

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) # How many times each bandit was played
values = np.zeros(n_bandits) # Estimated winning probability of each bandit
rewards = np.zeros(n_iterations) # Reward history
selected_arms = np.zeros(n_iterations, dtype=int) # Arm selection history
Reinforcement Learning med Gymnasium i Python

Interaktionsloop

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 med Gymnasium i Python

Analysera val

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


Diagram som visar det första steget i processen: en exempelmatris av storleken (iterations, n_bandits) fylld med nollor.

Reinforcement Learning med Gymnasium i Python

Analysera val

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

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

Diagram som visar det andra steget i processen, där den valda armen i varje iteration markeras med värdet 1 i matrisen.

Reinforcement Learning med Gymnasium i Python

Analysera val

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 som visar de sista stegen i processen, där en kumulativ summa beräknas för valda banditer och sedan divideras med iterationsnumret för att ge andelen val av varje arm per iteration.

Reinforcement Learning med Gymnasium i Python

Analysera val

  Bild som visar selection_percentage-kurvan för varje bandit, och som visar att agenten tenderar att välja bandit nr 2 mer än de andra i takt med att iterationerna fortskrider.

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
  • Agenten lär sig välja banditen med högst sannolikhet
Reinforcement Learning med Gymnasium i Python

Nu kör vi en övning!

Reinforcement Learning med Gymnasium i Python

Preparing Video For Download...