始める無料で始める

優先度付き経験再生バッファ

この演習では、後で Prioritized Experience Replay を用いた DQN を実装する際に使うデータ構造 PrioritizedExperienceReplay クラスを導入します。

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)
コードを編集して実行