Bandits manchots multiples

Reinforcement Learning avec Gymnasium en Python

Fouad Trad

Machine Learning Engineer

Bandits manchots multiples

 

  • Joueur face à des machines à sous
  • Objectif → maximiser les gains
  • Solution → exploration/exploitation

Image montrant un homme face à une rangée de machines à sous

Reinforcement Learning avec Gymnasium en Python

Machines à sous

Image montrant 4 machines à sous avec des probabilités de gain différentes : 45 %, 35 %, 85 % et 62 %, inconnues de l’utilisateur.

  • Gain d’un bras : 0 ou 1
  • Objectif de l’agent → accumuler un gain maximal
Reinforcement Learning avec Gymnasium en Python

Résoudre le problème

 

  • Epsilon-greedy décroissant
  • Epsilon → choisir une machine au hasard

Schéma montrant qu’avec une probabilité epsilon, l’agent explore en choisissant une machine au hasard.

Reinforcement Learning avec Gymnasium en Python

Résoudre le problème

 

  • Epsilon-greedy décroissant
  • Epsilon → choisir une machine au hasard
  • 1 − epsilon → choisir la meilleure machine connue
  • Epsilon diminue au fil du temps

Schéma montrant qu’avec une probabilité epsilon, l’agent explore en choisissant une machine au hasard et avec une probabilité 1 − epsilon il exploite en choisissant la meilleure machine connue.

Reinforcement Learning avec Gymnasium en Python

Initialisation

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) # Nombre de tirages par bandit
values = np.zeros(n_bandits) # Proba de gain estimée par bandit
rewards = np.zeros(n_iterations) # Historique des gains
selected_arms = np.zeros(n_iterations, dtype=int) # Historique des bras choisis
Reinforcement Learning avec Gymnasium en Python

Boucle d’interaction

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 avec Gymnasium en Python

Analyse des sélections

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


Schéma montrant la première étape : un tableau (iterations, n_bandits) rempli de zéros.

Reinforcement Learning avec Gymnasium en Python

Analyse des sélections

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

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

Schéma montrant la deuxième étape : le bras sélectionné à chaque itération est marqué par une valeur 1 dans le tableau.

Reinforcement Learning avec Gymnasium en Python

Analyse des sélections

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)

Schéma montrant les dernières étapes : somme cumulative des bras choisis, puis division par le numéro d’itération pour obtenir le pourcentage de sélection de chaque bras à chaque itération.

Reinforcement Learning avec Gymnasium en Python

Analyse des sélections

  Courbe de selections_percentage pour chaque bandit ; avec les itérations, l’agent choisit de plus en plus le bandit #2.

for arm in range(n_bandits):
    plt.plot(selections_percentage[:, arm], label=f'Bandit #{arm+1}')
plt.xscale('log')
plt.title('Choix des actions des bandits dans le temps')
plt.xlabel('Numéro d’épisode')
plt.ylabel('Pourcentage de sélections (%)')
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
  • L’agent apprend à choisir le bandit à la plus forte probabilité
Reinforcement Learning avec Gymnasium en Python

Passons à la pratique !

Reinforcement Learning avec Gymnasium en Python

Preparing Video For Download...