開始使用免費開始

Experience replay 緩衝區

你現在要建立支援 Experience Replay 的資料結構,讓你的代理人能更有效率地學習。

這個 replay 緩衝區需要支援兩個操作:

  • 將經驗存入記憶體,供之後取樣使用。
  • 從記憶體中隨機取樣一批過去的經驗並「重播」。

由於從 replay 緩衝區取出的資料要餵進神經網路,為了方便起見,緩衝區應該回傳 torch 的 Tensor。

torch 與 random 模組以及 deque 類別都已經在你的練習環境中匯入。

本練習屬於課程

Python 的深度強化學習

檢視課程

練習說明

  • 完成 ReplayBuffer 的 push() 方法,將 experience_tuple 加入緩衝區記憶體。
  • 在 sample() 方法中,從 self.memory 隨機抽取大小為 batch_size 的樣本。
  • 仍在 sample() 中,最初抽到的是由多個 tuple 組成的清單;請確保將其轉換為由多個清單組成的 tuple。
  • 將 actions_tensor 轉換成形狀 (batch_size, 1),而不是 (batch_size)。

動手互動練習

試著完成這個範例程式碼,體驗一下這個練習。

class ReplayBuffer:
    def __init__(self, capacity):
        self.memory = deque([], maxlen=capacity)
    def push(self, state, action, reward, next_state, done):
        experience_tuple = (state, action, reward, next_state, done)
        # Append experience_tuple to the memory buffer
        self.memory.____    
    def __len__(self):
        return len(self.memory)
    def sample(self, batch_size):
        # Draw a random sample of size batch_size
        batch = ____(____, ____)
        # Transform batch into a tuple of lists
        states, actions, rewards, next_states, dones = ____
        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)
        # Ensure actions_tensor has shape (batch_size, 1)
        actions_tensor = torch.tensor(actions, dtype=torch.long).____
        return states_tensor, actions_tensor, rewards_tensor, next_states_tensor, dones_tensor
編輯並執行程式碼