rsl_rl

$$ Advantage: A(s_t, a_t) = Q(s_t,a_t) - V(s_t)\\ = (r_t + \gamma * V(s_{t+1}) - V(s_t)) + \gamma * \lambda * A(s_{t+1}) \\

$$

$$ Return \ (Critic's \ \ target) : \ \ R_t = A(s_t, a_t) + V(s_t) $$

Q(s,a)는 1스텝 TD 에러 지만, GAE 어드밴티지는 한 스텝의 TD-에러뿐만 아니라, 두 스텝, 세 스텝, ..., 에피소드 끝까지의 모든 TD-에러를 lambda라는 값으로 정교하게 가중 평균하여 합산한다.

따라서, 그걸 계산한게 self.returns 이며, 이는 Q(s,a)의 정교한 근사치이다.

    def compute_returns(self, last_values, gamma, lam):
        advantage = 0
        for step in reversed(range(self.num_transitions_per_env)):
            if step == self.num_transitions_per_env - 1:
                next_values = last_values
            else:
                next_values = self.values[step + 1]
            next_is_not_terminal = 1.0 - self.dones[step].float()
            delta = self.rewards[step] + next_is_not_terminal * gamma * next_values - self.values[step]
            advantage = delta + next_is_not_terminal * gamma * lam * advantage
            self.returns[step] = advantage + self.values[step]

        # Compute and normalize the advantages
        self.advantages = self.returns - self.values # rollout 전체의 advantage
        self.advantages = (self.advantages - self.advantages.mean()) / (self.advantages.std() + 1e-8)