Bandiți multi-armed

Reinforcement Learning cu Gymnasium în Python

Fouad Trad

Machine Learning Engineer

Bandiți multi-armed

 

  • Jucător în fața aparatelor de slot
  • Provocare → maximizarea câștigului
  • Soluție → explorare-exploatare

Imagine cu un bărbat în fața unui șir de aparate de slot

Reinforcement Learning cu Gymnasium în Python

Aparate de slot

Imagine cu 4 aparate de slot cu probabilități diferite de câștig: 45%, 35%, 85% și 62%, necunoscute utilizatorului.

  • Recompensa unui braț este 0 sau 1
  • Scopul agentului → Acumularea recompensei maxime
Reinforcement Learning cu Gymnasium în Python

Rezolvarea problemei

 

  • Epsilon-greedy cu descreștere
  • Epsilon → selectare mașină aleatoare

Diagramă care arată că, cu probabilitatea epsilon, agentul explorează selectând o mașină aleator.

Reinforcement Learning cu Gymnasium în Python

Rezolvarea problemei

 

  • Epsilon-greedy cu descreștere
  • Epsilon → selectare mașină aleatoare
  • 1 - epsilon → selectare cea mai bună mașină
  • Epsilon scade în timp

Diagramă care arată că, cu probabilitatea epsilon, agentul explorează selectând o mașină aleator, iar cu probabilitatea 1 - epsilon exploatează selectând cea mai bună mașină cunoscută.

Reinforcement Learning cu Gymnasium în Python

Inițializare

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 cu Gymnasium în Python

Bucla de interacțiune

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 cu Gymnasium în Python

Analiza selecțiilor

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


Diagramă care arată primul pas al procesului: un tablou de dimensiune (iterații, n_bandiți) completat cu zerouri.

Reinforcement Learning cu Gymnasium în Python

Analiza selecțiilor

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

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

Diagramă care arată al doilea pas al procesului: brațul selectat în fiecare iterație este marcat cu valoarea 1 în tablou.

Reinforcement Learning cu Gymnasium în Python

Analiza selecțiilor

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ă care arată ultimii pași ai procesului: se calculează suma cumulativă a bandiților selectați, apoi se împarte la numărul iterației pentru a obține procentul de selecție al fiecărui braț.

Reinforcement Learning cu Gymnasium în Python

Analiza selecțiilor

  Imagine cu curbele selection_percentage pentru fiecare bandit, arătând că pe măsură ce iterațiile avansează, agentul tinde să selecteze banditul #2 mai des decât ceilalți.

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
  • Agentul învață să selecteze banditul cu probabilitatea cea mai mare
Reinforcement Learning cu Gymnasium în Python

Să exersăm!

Reinforcement Learning cu Gymnasium în Python

Preparing Video For Download...