开始使用免费开始使用

优先经验回放缓冲区

您将引入 PrioritizedExperienceReplay 类,这是一个数据结构,稍后您将用它来实现带有优先经验回放的 DQN。

PrioritizedExperienceReplay 是对您此前用于训练 DQN 智能体的 ExperienceReplay 类的改进版。优先经验回放缓冲区确保从中采样的转移相较于均匀采样更有助于智能体学习。

目前,请实现方法 .__init__().push().update_priorities().increase_beta().__len__()。最后一个方法 .sample() 将在下一个练习中重点实现。

本练习是课程的一部分

Python 中的深度强化学习

查看课程

练习说明

  • .push() 中,将该转移的初始优先级设为缓冲区中的最大优先级(若缓冲区为空则为 1)。
  • .update_priorities() 中,将优先级设为对应 TD 误差的绝对值;为覆盖边界情况,加上 self.epsilon
  • .increase_beta() 中,用 self.beta_increment 递增 beta;确保 beta 不会超过 1。

交互式实操练习

通过完成这段示例代码来试试这个练习。

class PrioritizedReplayBuffer:
    def __init__(
        self, capacity, alpha=0.6, beta=0.4, beta_increment=0.001, epsilon=0.01
    ):
        self.memory = deque(maxlen=capacity)
        self.alpha, self.beta, self.beta_increment, self.epsilon = (alpha, beta, beta_increment, epsilon)
        self.priorities = deque(maxlen=capacity)

    def push(self, state, action, reward, next_state, done):
        experience_tuple = (state, action, reward, next_state, done)
        # Initialize the transition's priority
        max_priority = ____
        self.memory.append(experience_tuple)
        self.priorities.append(max_priority)
    
    def update_priorities(self, indices, td_errors):
        for idx, td_error in zip(indices, td_errors.tolist()):
            # Update the transition's priority
            self.priorities[idx] = ____

    def increase_beta(self):
        # Increase beta if less than 1
        self.beta = ____

    def __len__(self):
        return len(self.memory)
      
buffer = PrioritizedReplayBuffer(capacity=3)
buffer.push(state=[1,3], action=2, reward=1, next_state=[2,4], done=False)
print("Transition in memory buffer:", buffer.memory)
print("Priority buffer:", buffer.priorities)
编辑并运行代码