总结
广义优势估计是对多步时序差分误差的指数加权平均.
指数加权平均
对于一组数字 计算指数加权平均
, 其中i是下标. 那么有
把按照下标顺序代入,
多步时序差分误差


分别是t时刻的 一步误差, 两步误差, 三步误差, ... k步误差. 把这些步的误差倒过来代入指数加权公式,就得到了该时刻的GAE.
GAE的计算
考虑t时刻的无穷步误差的指数加权, 有

把代入,然后重新拆分得到

可见GAE的递推公式, 可以利用该公式, 从后往前一次性算出所有时刻的GAE.
python
def compute_gae_and_returns(
rewards: torch.Tensor,
values: torch.Tensor,
next_values: torch.Tensor,
dones: torch.Tensor,
discount_rate: float,
lambda_gae: float,
) -> Tuple[torch.Tensor, torch.Tensor]:
advantages = torch.zeros_like(rewards)
last_advantage = 0.0
n_steps = len(rewards)
# 计算GAE
for t in reversed(range(n_steps)):
mask = 1.0 - dones[t]
delta = rewards[t] + discount_rate * next_values[t] * mask - values[t]
advantages[t] = delta + discount_rate * lambda_gae * last_advantage * mask
last_advantage = advantages[t]
# 返回给critic作为TD目标
returns_to_go = advantages + values
return advantages, returns_to_go