Skip to content

广义优势估计 ​

Generalized Advantage Estimation ​

GAE是一种 优势函数估计方法。

它想解决的问题很具体:

  • 在策略梯度里,我们希望知道某一步动作到底“比平均水平好多少”;
  • 这个量就是 advantage;
  • 但真实 advantage 很难直接得到,只能估计;
  • 如果估计太“短视”,方差小但偏差可能大;
  • 如果估计太“长视”,偏差小但方差又会变大。

GAE 的核心思想可以先记成一句话:

把很多个不同步长的 advantage 估计做指数加权平均,在偏差和方差之间做折中。

回顾 ​

  • vπ(s):策略 π 下真实的状态价值函数;
  • qπ(s,a):策略 π 下真实的动作价值函数;
  • Aπ(s,a)=qπ(s,a)−vπ(s):真实 advantage;
  • V(s):算法当前维护的状态价值估计;
  • Gt:从时刻 t 开始的折扣回报。

在策略梯度里,我们最理想地希望使用的量是:

Aπ(St,At)

因为它直接表示:

当前动作相对“策略平时会做出的平均动作”到底好多少。

如果这个值是正的,说明这个动作比平均水平更好;如果是负的,说明更差。

为什么需要 GAE ​

如果真实的 advantage 已知,那当然最好;但现实里它通常不知道,所以必须估计。

最自然的做法有两种极端。

第一种:用完整回报 ​

最直接的 advantage 估计可以写成:

A^t=Gt−V(St)

也就是:

  • 先拿到从当前时刻开始的完整折扣回报 Gt;
  • 再减去状态基线 V(St)。

这很直观,因为完整回报看得最远,偏差通常更小;但问题是它方差很大。

第二种:只看一步 TD residual ​

另一种更短视的做法是直接用一步 TD 误差:

δtV=Rt+1+γV(St+1)−V(St)

它的优点是更新很局部,方差通常更小;但如果 V 还不够准,它会引入更明显的偏差。

所以 GAE 想做的事情就是:

不走两个极端,而是在“完整回报”和“一步 TD”之间做平滑折中。


从一步 TD residual 开始 ​

GAE 的出发点就是一步 TD residual:

δtV=Rt+1+γV(St+1)−V(St)

这条式子可以理解成:

  • 当前状态估计是 V(St);
  • 如果只往前看一步,那么更合理的新目标应该是 Rt+1+γV(St+1);
  • 二者之差,就是这一步的 TD residual。

如果把它当成 advantage 估计,就得到最短视的版本:

A^t(1)=δtV

这就是“一步 advantage 估计”。

两步、三步、一直往后推 ​

如果不想只看一步,那就可以往后多看几步。

两步版本 ​

先写:

A^t(2)=δtV+γδt+1V

把 δtV 和 δt+1V 展开:

δtV=Rt+1+γV(St+1)−V(St)δt+1V=Rt+2+γV(St+2)−V(St+1)

于是:

A^t(2)=Rt+1+γV(St+1)−V(St)+γ(Rt+2+γV(St+2)−V(St+1))

中间的 +γV(St+1) 和 −γV(St+1) 抵消,得到:

A^t(2)=−V(St)+Rt+1+γRt+2+γ2V(St+2)

这说明:

两步 advantage 估计 = 两步真实奖励 + 末端 bootstrap 值 - 当前基线。

三步版本 ​

同理:

A^t(3)=δtV+γδt+1V+γ2δt+2V

展开后会得到:

A^t(3)=−V(St)+Rt+1+γRt+2+γ2Rt+3+γ3V(St+3)

一般的 k 步版本 ​

于是可以总结成:

A^t(k)=∑l=0k−1γlδt+lV

也等价于:

A^t(k)=−V(St)+Rt+1+γRt+2+⋯+γk−1Rt+k+γkV(St+k)

这说明 A^t(k) 本质上就是:

一个 k-step return,减去当前状态基线。

当 k→∞ 时会发生什么 ​

如果一直往后推到无限远,那么末端 bootstrap 项会消失在完整回报里,于是:

A^t(∞)=∑l=0∞γlδt+lV=−V(St)+∑l=0∞γlRt+1+l

也就是:

A^t(∞)=Gt−V(St)

这就回到了“完整回报减基线”的形式。

所以现在已经很清楚了:

  • k=1:最短视,更像一步 TD;
  • k 很大:看得更远,更像 Monte Carlo;
  • 中间的 k:在两者之间过渡。

GAE 的定义 ​

GAE 的核心做法不是只选某一个固定的 k,而是把所有 k-step advantage estimator 混起来。

定义:

A^tGAE(γ,λ)=(1−λ)(A^t(1)+λA^t(2)+λ2A^t(3)+⋯)

这就是 广义优势估计。

它的含义是:

  • 短步长估计权重大;
  • 长步长估计权重小;
  • 权重按 λ 指数衰减。

所以 λ 控制的是:

你愿意看多远。

从加权平均推到最常见公式 ​

上面的定义虽然直观,但实际实现更常用另一种写法。

先把前几项代进去:

A^t(1)=δtVA^t(2)=δtV+γδt+1VA^t(3)=δtV+γδt+1V+γ2δt+2V

代入 GAE 定义:

A^tGAE(γ,λ)=(1−λ)[δtV+λ(δtV+γδt+1V)+λ2(δtV+γδt+1V+γ2δt+2V)+⋯]

把相同的项收集起来:

A^tGAE(γ,λ)=(1−λ)[δtV(1+λ+λ2+⋯)+γδt+1V(λ+λ2+⋯)+γ2δt+2V(λ2+λ3+⋯)+⋯]

利用等比级数:

1+λ+λ2+⋯=11−λλ+λ2+⋯=λ1−λλ2+λ3+⋯=λ21−λ

于是前面的 (1−λ) 会和这些分母抵消,最终得到最常见的公式:

A^tGAE(γ,λ)=∑l=0∞(γλ)lδt+lV

这就是 GAE 最值得记住的一条式子。

这条公式该怎么理解 ​

A^tGAE(γ,λ)=δtV+γλδt+1V+(γλ)2δt+2V+⋯

它的直觉非常清楚:

  • 当前时刻的 TD residual 权重最大;
  • 越往后的 TD residual,权重越小;
  • 衰减速度由 γλ 决定。

所以可以把 GAE 看成:

把未来很多步的 TD residual 做折扣求和。

这也是为什么很多实现会直接把 GAE 叫做“discounted sum of TD residuals”。

两个最重要的特例 ​

当 λ=0 ​

此时:

A^tGAE(γ,0)=δtV

也就是只剩一步 TD residual。

这时:

  • 方差通常较小;
  • 但如果 V 不够准,偏差会更明显。

当 λ=1 ​

此时:

A^tGAE(γ,1)=∑l=0∞γlδt+lV=Gt−V(St)

也就是完整回报减基线。

这时:

  • 更接近 Monte Carlo advantage;
  • 但方差会更大。

所以一句话记忆就是:

  • λ=0:最短视;
  • λ=1:最远视;
  • 中间值:偏差—方差折中。

为什么 GAE 能降低方差 ​

优势估计的难点从来不是“能不能写出一个公式”,而是:

这个估计拿来更新策略时,方差会不会太大。

完整回报 Gt−V(St) 看得最远,但它把很久以后的随机性也都背在自己身上,因此方差通常很大。一步 TD residual 看得很近,方差更小,但它更依赖 V 的准确性。

GAE 的做法就是:

  • 不完全相信最远的完整回报;
  • 也不只相信最短的一步 TD;
  • 而是把不同步长的信息按指数权重混合。

这就是它能在实践里常常比纯 Monte Carlo advantage 更稳的原因。

γ 和 λ 分别控制什么 ​

这两个参数很容易混,但作用并不完全一样。

γ 负责折扣未来信息。

它越小,越远的 TD residual 衰减得越快;它越大,越愿意把远处的信息保留下来。

λ 负责混合不同步长的 advantage estimator。

它越小,就越偏向短步长、低方差;它越大,就越偏向长步长、低偏差。

一起看 ​

因为最终公式里出现的是 (γλ)l,所以它们共同决定“未来误差信息还能传多远”。

不过直觉上最好分开记:

  • γ 更像是“未来奖励折扣”;
  • λ 更像是“优势估计看多远”。

一个很实用的递推写法 ​

虽然定义式是:

A^tGAE(γ,λ)=∑l=0∞(γλ)lδt+lV

但实现时更常用从后往前递推:

A^t=δtV+γλA^t+1

这个式子直接由上面的求和展开得到。

因为:

A^t=δtV+γλδt+1V+(γλ)2δt+2V+⋯

而

A^t+1=δt+1V+γλδt+2V+⋯

所以自然有:

A^t=δtV+γλA^t+1

这就是代码里最常见的 backward recursion。

如果某一步是 episode 终止点,通常会把之后的那部分截断;实现时常写成带 done mask 的形式。

一个小例子 ​

假设某段轨迹上有三步 TD residual:

δtV=2,δt+1V=1,δt+2V=−0.5

并且取:

γ=0.9,λ=0.95

那么:

A^tGAE=2+(0.9×0.95)×1+(0.9×0.95)2×(−0.5)

因为:

0.9×0.95=0.855

所以:

A^tGAE≈2+0.855−0.3655=2.4895

这个例子能看出两件事:

  • 当前 TD residual 影响最大;
  • 更远处的信息仍然有影响,但会被逐步衰减。

GAE 和 TD(λ) 的关系 ​

GAE 和 TD(λ) 很像,但它们不是同一个东西。

最简单的区别是:

  • TD(λ) 是 值函数估计 的思路;
  • GAE 是 优势函数估计 的思路。

它们的结构非常相似:

  • 都在混合不同步长的目标;
  • 都体现偏差—方差折中;
  • 都会出现一个 λ 参数来控制“看多远”。

所以你可以把 GAE 理解成:

把 TD(λ) 的思想搬到了 advantage estimation 上。

论文里的一个细节提醒 ​

在 GAE 原论文里,作者强调他们讨论的是一个 undiscounted objective,而把 γ 当成一个用于方差控制的算法参数;因此论文里会区分“对 discounted policy gradient 的无偏”与“对原始 undiscounted objective 的偏差”这两个层次。

如果你现在主要是在读 PPO / actor-critic 的工程实现,那通常可以先用更直接的理解:

  • γ 是折扣因子;
  • λ 是 GAE 的折中参数;
  • GAE 主要负责把 advantage 估计得更稳。

等到后面更深入再回来看原论文里 γ-just estimator 的表述,会更容易懂。

总结 ​

GAE 的核心不是一条孤立公式,而是一条完整思路:

  1. 一步 TD residual δtV 太短视,方差小但可能有偏;
  2. 完整回报减基线 Gt−V(St) 看得最远,偏差小但方差大;
  3. 那就把不同步长的 advantage estimator 按指数权重混合;
  4. 最终得到一个兼顾偏差和方差的优势估计。

::; tip 重点

一步 TD residual:

δtV=Rt+1+γV(St+1)−V(St)

GAE 定义:

A^tGAE(γ,λ)=(1−λ)(A^t(1)+λA^t(2)+λ2A^t(3)+⋯)

最常见写法:

A^tGAE(γ,λ)=∑l=0∞(γλ)lδt+lV

:::

GAE = 把未来很多步 TD residual 做折扣求和,用来得到一个更稳的 advantage 估计。