Выборка из буфера PER
Прежде чем использовать класс буфера приоритизированного воспроизведения опыта для обучения агента, необходимо реализовать метод .sample(). Этот метод принимает в качестве аргумента размер выборки и возвращает выбранные переходы в виде тензоров (tensors), а также их индексы в буфере памяти и соответствующие веса важности.
В вашей среде предварительно загружен буфер ёмкостью 10 элементов, из которого вы будете делать выборку.
Это упражнение является частью курса
Глубокое обучение с подкреплением на Python
Инструкции к упражнению
- Вычислите вероятность выборки для каждого перехода.
- Извлеките индексы переходов, входящих в выборку; функция
np.random.choice(a, s, p=p)формирует выборку размеромsс возвращением из массиваaна основе массива вероятностейp. - Вычислите вес важности для каждого перехода.
Интерактивное практическое упражнение
Попробуйте выполнить это упражнение, дополнив этот пример кода.
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))