Generalized Advantage Estimation(GAE)
用 λ 加权多步 TD residual,在偏差与方差间调节 advantage。
学习目标
- 将多步 TD 残差按衰减权重组合,并正确处理终止与片段边界。
- 独立复核“两步轨迹的 GAE 倒序计算”的输入、计算和解释。
- λ 改变估计器使用未来残差的长度。
为什么重要
将多步 TD 残差按衰减权重组合,并正确处理终止与片段边界。
学习前需要掌握
背景与问题
一步优势估计依赖 critic 精度,完整回报又可能方差很大。GAE 用 λ 控制未来 TD 残差的贡献,形成从短期 bootstrap 到较长真实轨迹之间的连续折中,在 PPO 等算法中很常见。
概念定义
广义优势估计 GAE 是折扣 TD error 的加权和,常通过从后向前递推计算。γ 定义回报折扣,λ 控制残差传播长度;二者都让远处残差衰减,但不能在任务语义上互相替代。
直观理解
一次评价不只听“这一步比预期好多少”,还部分听后面几步不断修正后的评价。λ 越大,越愿意让较远的实际结果影响当前动作,但也会接收更多随机波动。
核心原理
先用同一组固定价值估计计算 δ,再倒序递推 。若本步真正终止,后续递推为零;纯采样截断仍可用最后观察价值构造本步 δ,但不能把下一局优势接过来。
λ=0 只保留当前一步 TD error;在完整终止轨迹上 λ=1 会望远镜式化为采样折扣回报减当前价值。有限 rollout 或不准确末端 bootstrap 仍可能带来误差,不能将 λ=1 简写成任何条件下无偏。
优势通常在 actor 损失里停止梯度,有些实现还做批内标准化。critic 的回归目标可用优势加旧价值构造,但这个 target 应固定,不能随着同一轮在线价值变化而任意重算。
数学表达
GAE
λ 控制多步权重衰减。
变量含义
G_t从时刻 t 开始的折扣累计回报。R_{t+1}执行动作后收到的下一步奖励。γ折扣因子,通常位于 [0,1)。
计算步骤
- 1两个 TD error 为 0+0.9×0.6−0.5=0.04,以及 1−0.6=0.4。
- 2末步优势为 0.4。
- 3首步优势为 0.04+0.9×0.8×0.4=0.328。
代码对应位置
示例 1两步轨迹的 GAE 倒序计算:GAE 优势为 0.328、0.400;若 λ=0,首步只剩 0.040。
变量解释
| 变量 | 含义 |
|---|---|
G_t | 从时刻 t 开始的折扣累计回报。 |
R_{t+1} | 执行动作后收到的下一步奖励。 |
γ | 折扣因子,通常位于 [0,1)。 |
完整数值示例
两步轨迹的 GAE 倒序计算
已知条件
- 奖励为 0、1,价值为 0.5、0.6、0;最后一步真正终止。
- γ=0.9,λ=0.8。
计算步骤
- 两个 TD error 为 0+0.9×0.6−0.5=0.04,以及 1−0.6=0.4。
- 末步优势为 0.4。
- 首步优势为 0.04+0.9×0.8×0.4=0.328。
计算结果
GAE 优势为 0.328、0.400;若 λ=0,首步只剩 0.040。
处理前后对比
- λ 改变估计器使用未来残差的长度。
- 真正终止末端值为零,时间截断末端值需要另行处理。
计算与实现步骤
- 计算每步 δ
- 反向递推 GAE
- 构造 return
- 标准化 advantage
代码实现
示例 1
两步轨迹的 GAE 倒序计算
example_01.py用途:GAE 优势为 0.328、0.400;若 λ=0,首步只剩 0.040。
rewards, values = [0.0, 1.0], [0.5, 0.6, 0.0]
gamma, lam = 0.9, 0.8
advantages = [0.0] * len(rewards)
carry = 0.0
for t in reversed(range(len(rewards))):
delta = rewards[t] + gamma * values[t + 1] - values[t]
carry = delta + gamma * lam * carry
advantages[t] = carry
print("advantages=" + ",".join(f"x={x:.3f}" for x in advantages))代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
GAE 优势为 0.328、0.400;若 λ=0,首步只剩 0.040。
Step 1 · 1–9 行
输出中间参数、形状或最终指标,用于核对代码是否符合预期。
rewards, values = [0.0, 1.0], [0.5, 0.6, 0.0]
gamma, lam = 0.9, 0.8
advantages = [0.0] * len(rewards)
carry = 0.0
for t in reversed(range(len(rewards))):
delta = rewards[t] + gamma * values[t + 1] - values[t]
carry = delta + gamma * lam * carry
advantages[t] = carry
print("advantages=" + ",".join(f"x={x:.3f}" for x in advantages))预期输出或运行结果
advantages=x=0.328,x=0.400
常见错误 · 3 条
- 正序递推时错误使用尚未计算的未来优势。
- 跨 episode 传播优势,把新一局奖励接到上一局。
- 将 λ 与 γ 当成可以随意交换的同义参数。
实际应用
- 序贯决策
- 控制与资源分配
常见错误
- 正序递推时错误使用尚未计算的未来优势。
- 跨 episode 传播优势,把新一局奖励接到上一局。
- 将 λ 与 γ 当成可以随意交换的同义参数。
扩展内容说明
本页数值均为解释机制的构造案例,不能解读为真实训练或基准性能。定义和适用条件参见 Schulman 等:High-Dimensional Continuous Control Using Generalized Advantage Estimation。
算法属性与数据边界
失败模式、风险与性能
失败模式
- 正序递推时错误使用尚未计算的未来优势。
- 跨 episode 传播优势,把新一局奖励接到上一局。
- 将 λ 与 γ 当成可以随意交换的同义参数。
风险
- 奖励函数与真实目标不一致会诱发奖励黑客。
- 部署策略的行动权限必须由环境和应用层约束。
性能考虑
- 样本效率、墙钟时间和显存占用需要分别报告。
- 应使用多个随机种子、置信区间和固定评测策略。
常见问题
λ 越大是否一定更好?
不一定。较大 λ 更多依赖长轨迹实际结果,通常降低部分 bootstrap 偏差但提高方差;合适取值与 critic 质量、任务长度和数据预算有关。
网页是否会训练模型?
不会。所有图表使用固定种子或解析公式在浏览器本地计算,不执行页面中的示例代码。
推荐学习资料
Proximal Policy Optimization Algorithms
提出基于概率比率裁剪的策略优化目标,限制单次更新幅度并复用 rollout。
Schulman et al. · arXiv