시작하기무료로 시작하기

우선순위 기반 경험 재생 버퍼

이제 PrioritizedExperienceReplay 클래스를 소개합니다. 이 자료구조는 이후에 Prioritized Experience Replay가 적용된 DQN을 구현할 때 사용하게 됩니다.

PrioritizedExperienceReplay는 지금까지 DQN 에이전트를 학습시키는 데 사용하던 ExperienceReplay 클래스를 개선한 버전입니다. 우선순위 기반 경험 재생 버퍼는 균일 표본추출보다 에이전트가 학습하기 더 가치 있는 전이들이 선택되도록 보장해 줍니다.

이번에는 .__init__(), .push(), .update_priorities(), .increase_beta() 그리고 .__len__() 메서드를 구현하세요. 마지막 메서드인 .sample()은 다음 연습 문제에서 다룹니다.

이 연습은 강의의 일부입니다

Python으로 배우는 Deep Reinforcement Learning

강의 보기

연습 안내

  • .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)
코드 편집 및 실행