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