Buffer de experience replay prioritizat
Vei introduce clasa PrioritizedExperienceReplay, o structură de date pe care o vei folosi ulterior pentru a implementa DQN cu Experience Replay Prioritizat.
PrioritizedExperienceReplay este o versiune îmbunătățită a clasei ExperienceReplay pe care ai folosit-o până acum pentru a antrena agenții DQN. Un buffer de experience replay prioritizat garantează că tranzițiile eșantionate din acesta sunt mai valoroase pentru învățarea agentului decât cele obținute prin eșantionare uniformă.
Deocamdată, implementează metodele .__init__(), .push(), .update_priorities(), .increase_beta() și .__len__(). Metoda finală, .sample(), va fi subiectul exercițiului următor.
Acest exercițiu face parte din cursul
Deep Reinforcement Learning în Python
Instrucțiuni pentru exercițiu
- În
.push(), inițializează prioritatea tranziției cu prioritatea maximă din buffer (sau 1 dacă bufferul este gol). - În
.update_priorities(), setează prioritatea la valoarea absolută a erorii TD corespunzătoare; adaugăself.epsilonpentru a acoperi cazurile limită. - În
.increase_beta(), incrementează beta cuself.beta_increment; asigură-te căbetanu depășește niciodată valoarea 1.
Exercițiu interactiv practic
Încearcă acest exercițiu completând acest cod de exemplu.
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)