广义优势估计
Generalized Advantage Estimation
GAE是一种 优势函数估计方法。
它想解决的问题很具体:
- 在策略梯度里,我们希望知道某一步动作到底“比平均水平好多少”;
- 这个量就是 advantage;
- 但真实 advantage 很难直接得到,只能估计;
- 如果估计太“短视”,方差小但偏差可能大;
- 如果估计太“长视”,偏差小但方差又会变大。
GAE 的核心思想可以先记成一句话:
把很多个不同步长的 advantage 估计做指数加权平均,在偏差和方差之间做折中。
回顾
:策略 下真实的状态价值函数; :策略 下真实的动作价值函数; :真实 advantage; :算法当前维护的状态价值估计; :从时刻 开始的折扣回报。
在策略梯度里,我们最理想地希望使用的量是:
因为它直接表示:
当前动作相对“策略平时会做出的平均动作”到底好多少。
如果这个值是正的,说明这个动作比平均水平更好;如果是负的,说明更差。
为什么需要 GAE
如果真实的 advantage 已知,那当然最好;但现实里它通常不知道,所以必须估计。
最自然的做法有两种极端。
第一种:用完整回报
最直接的 advantage 估计可以写成:
也就是:
- 先拿到从当前时刻开始的完整折扣回报
; - 再减去状态基线
。
这很直观,因为完整回报看得最远,偏差通常更小;但问题是它方差很大。
第二种:只看一步 TD residual
另一种更短视的做法是直接用一步 TD 误差:
它的优点是更新很局部,方差通常更小;但如果
所以 GAE 想做的事情就是:
不走两个极端,而是在“完整回报”和“一步 TD”之间做平滑折中。
从一步 TD residual 开始
GAE 的出发点就是一步 TD residual:
这条式子可以理解成:
- 当前状态估计是
; - 如果只往前看一步,那么更合理的新目标应该是
; - 二者之差,就是这一步的 TD residual。
如果把它当成 advantage 估计,就得到最短视的版本:
这就是“一步 advantage 估计”。
两步、三步、一直往后推
如果不想只看一步,那就可以往后多看几步。
两步版本
先写:
把
于是:
中间的
这说明:
两步 advantage 估计 = 两步真实奖励 + 末端 bootstrap 值 - 当前基线。
三步版本
同理:
展开后会得到:
一般的 步版本
于是可以总结成:
也等价于:
这说明
一个
当 时会发生什么
如果一直往后推到无限远,那么末端 bootstrap 项会消失在完整回报里,于是:
也就是:
这就回到了“完整回报减基线”的形式。
所以现在已经很清楚了:
:最短视,更像一步 TD; 很大:看得更远,更像 Monte Carlo; - 中间的
:在两者之间过渡。
GAE 的定义
GAE 的核心做法不是只选某一个固定的
定义:
这就是 广义优势估计。
它的含义是:
- 短步长估计权重大;
- 长步长估计权重小;
- 权重按
指数衰减。
所以
你愿意看多远。
从加权平均推到最常见公式
上面的定义虽然直观,但实际实现更常用另一种写法。
先把前几项代进去:
代入 GAE 定义:
把相同的项收集起来:
利用等比级数:
于是前面的
这就是 GAE 最值得记住的一条式子。
这条公式该怎么理解
它的直觉非常清楚:
- 当前时刻的 TD residual 权重最大;
- 越往后的 TD residual,权重越小;
- 衰减速度由
决定。
所以可以把 GAE 看成:
把未来很多步的 TD residual 做折扣求和。
这也是为什么很多实现会直接把 GAE 叫做“discounted sum of TD residuals”。
两个最重要的特例
当
此时:
也就是只剩一步 TD residual。
这时:
- 方差通常较小;
- 但如果
不够准,偏差会更明显。
当
此时:
也就是完整回报减基线。
这时:
- 更接近 Monte Carlo advantage;
- 但方差会更大。
所以一句话记忆就是:
:最短视; :最远视; - 中间值:偏差—方差折中。
为什么 GAE 能降低方差
优势估计的难点从来不是“能不能写出一个公式”,而是:
这个估计拿来更新策略时,方差会不会太大。
完整回报
GAE 的做法就是:
- 不完全相信最远的完整回报;
- 也不只相信最短的一步 TD;
- 而是把不同步长的信息按指数权重混合。
这就是它能在实践里常常比纯 Monte Carlo advantage 更稳的原因。
和 分别控制什么
这两个参数很容易混,但作用并不完全一样。
它越小,越远的 TD residual 衰减得越快;它越大,越愿意把远处的信息保留下来。
它越小,就越偏向短步长、低方差;它越大,就越偏向长步长、低偏差。
一起看
因为最终公式里出现的是
不过直觉上最好分开记:
更像是“未来奖励折扣”; 更像是“优势估计看多远”。
一个很实用的递推写法
虽然定义式是:
但实现时更常用从后往前递推:
这个式子直接由上面的求和展开得到。
因为:
而
所以自然有:
这就是代码里最常见的 backward recursion。
如果某一步是 episode 终止点,通常会把之后的那部分截断;实现时常写成带 done mask 的形式。
一个小例子
假设某段轨迹上有三步 TD residual:
并且取:
那么:
因为:
所以:
这个例子能看出两件事:
- 当前 TD residual 影响最大;
- 更远处的信息仍然有影响,但会被逐步衰减。
GAE 和 TD( ) 的关系
GAE 和 TD(
最简单的区别是:
- TD(
) 是 值函数估计 的思路; - GAE 是 优势函数估计 的思路。
它们的结构非常相似:
- 都在混合不同步长的目标;
- 都体现偏差—方差折中;
- 都会出现一个
参数来控制“看多远”。
所以你可以把 GAE 理解成:
把 TD(
论文里的一个细节提醒
在 GAE 原论文里,作者强调他们讨论的是一个 undiscounted objective,而把
如果你现在主要是在读 PPO / actor-critic 的工程实现,那通常可以先用更直接的理解:
是折扣因子; 是 GAE 的折中参数; - GAE 主要负责把 advantage 估计得更稳。
等到后面更深入再回来看原论文里 γ-just estimator 的表述,会更容易懂。
总结
GAE 的核心不是一条孤立公式,而是一条完整思路:
- 一步 TD residual
太短视,方差小但可能有偏; - 完整回报减基线
看得最远,偏差小但方差大; - 那就把不同步长的 advantage estimator 按指数权重混合;
- 最终得到一个兼顾偏差和方差的优势估计。
::; tip 重点
一步 TD residual:
GAE 定义:
最常见写法:
:::
GAE = 把未来很多步 TD residual 做折扣求和,用来得到一个更稳的 advantage 估计。