可运行的 from-scratch 实现 + 测试。PPO 里估计优势 At 的标准做法。
数学 / The math
TD 残差:δt=rt+γV(st+1)−V(st)
GAE 是 δ 的指数加权和:
AtGAE(γ,λ)=l=0∑∞(γλ)lδt+l
实现上用反向递推(从后往前):At=δt+γλAt+1。回报 Rt=At+V(st)。
两个极端:
- λ=0:At=δt —— 单步 TD,低方差、高偏差。
- λ=1:At=∑lγlrt+l−V(st) —— 蒙特卡洛,高方差、低偏差。
- λ∈(0,1):在偏差/方差间插值。
文件 / Files
from_scratch.py — compute_gae(rewards, values, last_value, gamma, lam, dones)(+ python from_scratch.py 演示)。
test_gae.py — λ=0 退化为单步 TD、λ=1 退化为 MC−V、done 重置 bootstrap。
python from_scratch.py
python test_gae.py
追问分层 / Stratified follow-ups
- L1:δt 是什么?GAE 里 λ 调大调小分别意味着什么?
- L2:为什么用反向递推而不直接求和?λ=0 和 λ=1 各对应什么经典估计?
done 为什么要切断 bootstrap?
- L3:GAE 的偏差/方差如何随 γ,λ 变化?为什么 GRPO/RLOO 能不用 GAE?优势归一化(减均值除标准差)在 PPO 里的作用?