開始使用免費開始

優先級經驗回放緩衝區

你將建立 PrioritizedExperienceReplay 類別,這是一個資料結構,之後你會用它來實作含有優先級經驗回放(Prioritized Experience Replay, PER)的 DQN。

PrioritizedExperienceReplay 是你目前用來訓練 DQN 智能體之 ExperienceReplay 類別的改良版。優先級經驗回放緩衝區會確保從中採樣的轉移(transition)較具學習價值,而不是採用平均(均勻)抽樣。

現在先實作 .__init__()、.push()、.update_priorities()、.increase_beta() 與 .__len__() 這些方法。最後的 .sample() 方法會在下一個練習中重點實作。

本練習屬於課程

Python 的深度強化學習

檢視課程

練習說明

  • 在 .push() 中,將該轉移的優先順序設為緩衝區中的最大優先順序(若緩衝區為空則設為 1)。
  • 在 .update_priorities() 中,將優先順序設為對應 TD 誤差的絕對值;加入 self.epsilon 以處理邊界情況。
  • 在 .increase_beta() 中,將 beta 以 self.beta_increment 遞增;確保 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)
編輯並執行程式碼