GAE:优势估计的 λ 旋钮
广义优势估计在 TD(0) 和 Monte Carlo 之间插值;PPO 里 advantage 质量直接决定更新方向。

1. Critic 差时,GAE 再 smooth 也救不了 policy
PPO 更新方向由 advantage 决定——估偏了,clip 也挡不住错误梯度。Monte Carlo return 方差大,一条 lucky trajectory 就能主导整个 mini-batch 更新;TD(0) 偏差大,critic 不准时 系统性偏。GAE 用 λ 在两者之间插值,是 PPO 里 advantage 质量的核心旋钮。Locomotion 和 manipulation 我几乎总是从 、 起步,但 λ 差 0.01 很少是主因——done bootstrap 写错才是。
Critic 很差时,GAE 再 smooth 也救不了 policy——explained_variance 低时先修 critic,再谈 λ 微调。PPO 里 advantage 质量直接决定更新方向,GAE 是 advantage 的估计器,不是 magic fix。调 λ 是 fine-tune,修 bootstrap 和 critic 是 foundation——顺序反了,会在错误方向上 smooth 得更优雅。
2. 公式与实现
TD residual:
GAE:
实现从轨迹末尾反向递推:
gae = 0.0
for t in reversed(range(T)):
next_non_terminal = 1.0 - done[t]
delta = rew[t] + gamma * next_val[t] * next_non_terminal - val[t]
gae = delta + gamma * lam * next_non_terminal * gae
adv[t] = gaeReturns 常设为 ,用于 value loss。λ→0 接近 TD(0),低方差高偏差;λ→1 接近 MC,高方差低偏差。PPO 在 mini-batch 内 normalize advantage:,不是 entire rollout——SB3 PPO 默认如此,复现论文时注意实现细节。Advantage normalize 消除 batch 间 scale 差异,但不修复错误的 bootstrap——bootstrap 错了,normalize 只是均匀地摊错。
Locomotion 常用 ;sparse reward 长 episode 有时 略增 MC 成分。调 λ 前先看 explained_variance,critic 差时 λ 网格搜索是浪费时间。
3. truncated 与 done 的契约
terminated 处 gae_next=0,episode 结束不 bootstrap。truncated(TimeLimit)是否在 上 bootstrap 必须和 value target 一致——Gymnasium + SB3 对 timeout 通常仍 bootstrap。一处 bootstrap 一处不,advantage 和 value target 矛盾,critic 永远拟合不好——这是 silent bug,loss 曲线看起来正常,policy 就是不收敛。TimeLimit 截断时 agent 并非真正失败, 仍有 value,bootstrap 合理。
VecEnv 里 (n_envs, n_steps) 要在每个 env 的 episode 边界把 gae 清零,否则 advantage 跨 episode 污染——多 env 并行时最容易漏,表现为 advantage 均值漂移、policy 更新方向系统性偏。
4. λ 调参与 critic 优先级
λ grid {0, 0.9, 0.95, 1.0} 四条短 run 足够定 λ,不必 full 10M steps×4。GAE 错通常不是 λ 差 0.01,而是 done bootstrap 写错。小 batch 上 advantage normalize 必不可少,否则一次 update 被单条高方差轨迹主导。
读 SB3 compute_returns_and_advantage 对照自己的实现是省时间的事——timeout bootstrap 若和 GAE 不一致,critic 永远拟合不好,调 λ 是白费。Full rollout normalize 和 minibatch normalize 数值不同,复现论文时对不上。GAE 实现 bug 往往表现为 explained_variance 长期低迷,而非 loss 爆炸。
5. 失败模式
Critic 很差时调 λ 无效。VecEnv reset 边界未清零 GAE 累加器,advantage 跨 episode 污染。Recurrent PPO 的 seq len 和 truncation 不匹配,BPTT 截断处 hidden 未 detach。
6. 验收
- 打印单条轨迹的 和 ,符号和量级合理。
- 调 λ=0 vs 0.95 对比 PPO 收敛;done bootstrap 与 SB3 源码一致。
- VecEnv episode 边界 gae 清零;timeout bootstrap 与 value target 一致。
explained_variance>0.5 再谈 λ 微调。- Mini-batch 内 advantage normalize,非 entire rollout。
7. 案例:timeout bootstrap 不一致导致 critic 永远拟合不好
某 custom PPO 实现里 truncated 时 GAE 不 bootstrap ,但 value target 仍 bootstrap——advantage 和 value loss 优化方向矛盾,explained_variance 长期低于 0.2。对照 SB3 源码改为 timeout 也 bootstrap 后,critic 几个 epoch 内恢复正常。教训:done/truncated 处理是契约,契约错了 λ 再优雅也是错的方向。
8. Returns 与 value loss 的对齐
用于 value loss 时,value target 和 advantage 必须来自同一套 bootstrap 逻辑——GAE 用 truncated bootstrap、value target 用 terminated-only bootstrap,critic 拟合的是混合目标。SB3 里二者同源,custom 实现最容易在这里分裂。
Value loss 权重 过大时 critic 过拟合当前 batch、advantage 相对噪声小;过小则 advantage 基于烂 critic,policy 更新方向随机。explained_variance 是 critic 健康度的一阶指标,低于 0.3 时不应继续训 policy,应先加 value epoch 或修 bootstrap。
9. 与 reward scale 的交互
Reward scale 改变 量级,进而改变 GAE 量级——normalize reward 的 wrapper 和 advantage normalize 是两层 scale,改 reward scale 后 advantage normalize 仍必要,但不能替代 critic 质量。Reward 从 [-1,1] 改到 [-10,10] 后若不调 value lr,critic 跟不上,GAE 基于 stale value,policy 更新方向偏。改 reward 设计后应重训 critic 或至少 freeze policy 若干 step 让 value 追上。Custom PPO 实现应单测:timeout step 上 GAE 的 next_val 与 value target 是否同源——一处 bootstrap 一处不,是 silent killer。VecEnv 多 env 并行时 episode 边界 gae 清零最容易漏,建议单测覆盖。Recurrent PPO 在 reset 时清 hidden state,与 gae 清零同样重要——漏任一都会污染 advantage。λ 微调应在 bootstrap 和 critic 健康后进行。explained_variance 低于 0.3 时不调 λ,先修 value。SB3 源码对照是 custom PPO 实现的第一站。Timeout bootstrap 与 value target 不一致是 critic 拟合不好的头号 silent bug。VecEnv episode 边界 gae 清零不可省略。
GAE 的 λ 是 bias-variance 权衡旋钮,但 done/truncated 处理是契约——先修 critic,再调 λ;先对齐 bootstrap,再谈 smooth。
相关
也可以看看
johan's blog