CommencezCommencez gratuitement

Échantillonner à partir du tampon PER

Avant de pouvoir utiliser la classe Prioritized Experience Buffer pour entraîner votre agent, vous devez encore implémenter la méthode .sample(). Cette méthode prend en argument la taille de l'échantillon à tirer et retourne les transitions échantillonnées sous forme de tensors, ainsi que leurs indices dans le tampon mémoire et leur poids d'importance.

Un tampon d'une capacité de 10 a été préchargé dans votre environnement pour que vous puissiez y puiser des échantillons.

Cette activité fait partie du cours

Deep Reinforcement Learning en Python

Voir le cours

Instructions de l’exercice

  • Calculez la probabilité d'échantillonnage associée à chaque transition.
  • Tirez les indices correspondant aux transitions de l'échantillon; np.random.choice(a, s, p=p) prend un échantillon de taille s avec remise à partir du tableau a, selon le tableau de probabilités p.
  • Calculez le poids d'importance associé à chaque transition.

Exercice interactif pratique

Essayez cet exercice en complétant ce code d’exemple.

def sample(self, batch_size):
    priorities = np.array(self.priorities)
    # Calculate the sampling probabilities
    probabilities = ____ / np.sum(____)
    # Draw the indices for the sample
    indices = np.random.choice(____)
    # Calculate the importance weights
    weights = (1 / (len(self.memory) * ____)) ** ____
    weights /= np.max(weights)
    states, actions, rewards, next_states, dones = zip(*[self.memory[idx] for idx in indices])
    weights = [weights[idx] for idx in indices]
    states_tensor = torch.tensor(states, dtype=torch.float32)
    rewards_tensor = torch.tensor(rewards, dtype=torch.float32)
    next_states_tensor = torch.tensor(next_states, dtype=torch.float32)
    dones_tensor = torch.tensor(dones, dtype=torch.float32)
    weights_tensor = torch.tensor(weights, dtype=torch.float32)
    actions_tensor = torch.tensor(actions, dtype=torch.long).unsqueeze(1)
    return (states_tensor, actions_tensor, rewards_tensor, next_states_tensor,
            dones_tensor, indices, weights_tensor)

PrioritizedReplayBuffer.sample = sample
print("Sampled transitions:\n", buffer.sample(3))
Modifier et exécuter le code