GAE (Generalized Advantage Estimation)
2025-12-24
深度学习
00

目录

1. GAE (Generalized Advantage Estimation) 基础
为什么需要优势函数?
TD误差 (Temporal Difference Error)
GAE的完整公式
具体计算示例
2. Decoupled-GAE (解耦GAE)
问题背景
解决方案:分别设置$\lambda$
为什么有效?
3. Length-Adaptive GAE (长度自适应GAE)
问题:序列长度差异大
解决方案:动态调整$\lambda$
具体计算示例
直观理解
4. 完整的计算流程(UI-TARS-2)
算法伪代码
PPO更新公式(论文公式4)
5. 论文中的实验结果
Value Pretraining的重要性 (图10b)
Decoupled-GAE的效果
总结表格

1. GAE (Generalized Advantage Estimation) 基础

为什么需要优势函数?

在强化学习中,我们想知道:在状态sts_t采取动作ata_t,比平均水平好多少?

A(st,at)=Q(st,at)V(st)A(s_t, a_t) = Q(s_t, a_t) - V(s_t)

  • Q(st,at)Q(s_t, a_t): 采取动作ata_t后的期望回报
  • V(st)V(s_t): 状态sts_t的平均期望回报
  • A>0A > 0: 这个动作比平均好,应该鼓励
  • A<0A < 0: 这个动作比平均差,应该抑制

TD误差 (Temporal Difference Error)

δt=rt+γV(st+1)V(st)\delta_t = r_t + \gamma \cdot V(s_{t+1}) - V(s_t)

含义解释

  • rt+γV(st+1)r_t + \gamma \cdot V(s_{t+1}): 实际获得的奖励 + 下一个状态的估计价值
  • V(st)V(s_t): 当前状态的估计价值
  • δt\delta_t: 实际比预期好/差多少

例子

展开代码
假设你在玩游戏: - V(当前状态) = 100分 (模型预测) - 你采取行动得到 r_t = 10分 - V(下一状态) = 120分 (模型预测) - δ_t = 10 + 0.99×120 - 100 = 28.8 说明这个动作比预期好28.8分!

GAE的完整公式

单步TD误差方差大,多步回报偏差大,GAE通过λ\lambda参数平衡:

A^t=l=0Tt(γλ)lδt+l\hat{A}_t = \sum_{l=0}^{T-t} (\gamma\lambda)^l \cdot \delta_{t+l}

递归展开形式

A^t=δt+(γλ)δt+1+(γλ)2δt+2++(γλ)TtδT\hat{A}_t = \delta_t + (\gamma\lambda)\delta_{t+1} + (\gamma\lambda)^2\delta_{t+2} + \cdots + (\gamma\lambda)^{T-t}\delta_T

参数含义

  • γ\gamma (gamma): 折扣因子,通常0.99,表示未来奖励的重要性
  • λ\lambda (lambda): GAE参数,0到1之间
    • λ=0\lambda=0: 只看一步 A^t=δt\hat{A}_t = \delta_t (高偏差,低方差)
    • λ=1\lambda=1: 看到终点 A^t=l=0Ttγlrt+lV(st)\hat{A}_t = \sum_{l=0}^{T-t} \gamma^l r_{t+l} - V(s_t) (低偏差,高方差)
    • λ=0.95\lambda=0.95: 平衡选择

具体计算示例

假设一个长度为5的轨迹,γ=0.99\gamma=0.99, λ=0.95\lambda=0.95

python
展开代码
# 时间步: t=0 t=1 t=2 t=3 t=4 奖励 r: [10, 5, 8, 12, 20] 价值 V: [100, 105, 110, 115, 120]

步骤1: 计算每步的TD误差

δ0=10+0.99×105100=13.95δ1=5+0.99×110105=8.9δ2=8+0.99×115110=11.85δ3=12+0.99×120115=15.8δ4=20+0120=100(终止状态)\begin{aligned} \delta_0 &= 10 + 0.99 \times 105 - 100 = 13.95 \\ \delta_1 &= 5 + 0.99 \times 110 - 105 = 8.9 \\ \delta_2 &= 8 + 0.99 \times 115 - 110 = 11.85 \\ \delta_3 &= 12 + 0.99 \times 120 - 115 = 15.8 \\ \delta_4 &= 20 + 0 - 120 = -100 \quad \text{(终止状态)} \end{aligned}

步骤2: 计算t=0t=0的优势

γλ=0.99×0.95=0.9405\gamma\lambda = 0.99 \times 0.95 = 0.9405
A^0=δ0+(γλ)1δ1+(γλ)2δ2+(γλ)3δ3+(γλ)4δ4=13.95+0.9405×8.9+0.94052×11.85+0.94053×15.8+0.94054×(100)=13.95+8.37+10.49+13.1478.35=32.4\begin{aligned} \hat{A}_0 &= \delta_0 + (\gamma\lambda)^1\delta_1 + (\gamma\lambda)^2\delta_2 + (\gamma\lambda)^3\delta_3 + (\gamma\lambda)^4\delta_4 \\ &= 13.95 + 0.9405 \times 8.9 + 0.9405^2 \times 11.85 \\ &\quad + 0.9405^3 \times 15.8 + 0.9405^4 \times (-100) \\ &= 13.95 + 8.37 + 10.49 + 13.14 - 78.35 \\ &= -32.4 \end{aligned}

2. Decoupled-GAE (解耦GAE)

论文提到的关键创新!

问题背景

在长序列任务中(GUI操作可能几十步),标准GAE存在问题:

  • 策略优化需要较大的λ\lambda来捕捉长期依赖
  • 价值估计在长序列下会累积误差,需要较小的λ\lambda

解决方案:分别设置λ\lambda

策略的优势计算 (用于更新策略):

A^tpolicy=l=0Tt(γλpolicy)lδt+l\hat{A}_t^{\text{policy}} = \sum_{l=0}^{T-t} (\gamma \cdot \lambda_{\text{policy}})^l \cdot \delta_{t+l}

价值函数的目标 (用于更新价值网络):

A^tcritic=l=0Tt(γλcritic)lδt+l\hat{A}_t^{\text{critic}} = \sum_{l=0}^{T-t} (\gamma \cdot \lambda_{\text{critic}})^l \cdot \delta_{t+l}

典型设置

  • λpolicy=0.95\lambda_{\text{policy}} = 0.95 (较大,鼓励探索长期回报)
  • λcritic=0.90\lambda_{\text{critic}} = 0.90 (较小,减少价值估计的累积误差)

为什么有效?

价值函数更新

Vtarget=V(st)+A^tcriticLvalue=(Vθ(st)Vtarget)2\begin{aligned} V_{\text{target}} &= V(s_t) + \hat{A}_t^{\text{critic}} \\ \mathcal{L}_{\text{value}} &= \left(V_\theta(s_t) - V_{\text{target}}\right)^2 \end{aligned}

策略更新

ratio=πnew(atst)πold(atst)Lpolicy=min(ratio×A^tpolicy,clip(ratio)×A^tpolicy)\begin{aligned} \text{ratio} &= \frac{\pi_{\text{new}}(a_t|s_t)}{\pi_{\text{old}}(a_t|s_t)} \\ \mathcal{L}_{\text{policy}} &= -\min\left(\text{ratio} \times \hat{A}_t^{\text{policy}}, \text{clip}(\text{ratio}) \times \hat{A}_t^{\text{policy}}\right) \end{aligned}

论文发现(图10b):

  • 没有解耦:价值估计与真实奖励负相关
  • 使用解耦:训练稳定,收敛更快

3. Length-Adaptive GAE (长度自适应GAE)

问题:序列长度差异大

GUI任务中:

  • 简单任务:5步完成
  • 复杂任务:50步完成

使用固定λ\lambda会导致:

  • 短序列:λ\lambda太大,过拟合噪声
  • 长序列:λ\lambda太小,看不到长期回报

解决方案:动态调整λ\lambda

λpolicy(l)=11α×l\lambda_{\text{policy}}(l) = 1 - \frac{1}{\alpha \times l}

参数

  • ll: 当前轨迹的长度
  • α\alpha: 超参数,论文设置为 0.05

具体计算示例

对于不同长度的任务:

l=20λ=110.05×20=11.0=0.0l=50λ=110.05×50=10.4=0.6l=100λ=110.05×100=10.2=0.8l=200λ=110.05×200=10.1=0.9\begin{aligned} l = 20 \quad &\Rightarrow \quad \lambda = 1 - \frac{1}{0.05 \times 20} = 1 - 1.0 = 0.0 \\ l = 50 \quad &\Rightarrow \quad \lambda = 1 - \frac{1}{0.05 \times 50} = 1 - 0.4 = 0.6 \\ l = 100 \quad &\Rightarrow \quad \lambda = 1 - \frac{1}{0.05 \times 100} = 1 - 0.2 = 0.8 \\ l = 200 \quad &\Rightarrow \quad \lambda = 1 - \frac{1}{0.05 \times 200} = 1 - 0.1 = 0.9 \end{aligned}

实际使用

python
展开代码
def compute_adaptive_lambda(trajectory_length, alpha=0.05): lambda_policy = 1.0 - 1.0 / (alpha * trajectory_length) # 限制在合理范围 lambda_policy = max(0.0, min(0.99, lambda_policy)) return lambda_policy

直观理解

短轨迹 (l=20l=20):

λ=0.0A^t=δt\lambda = 0.0 \quad \Rightarrow \quad \hat{A}_t = \delta_t

只看当前一步,因为任务简单,不需要长期规划

长轨迹 (l=200l=200):

λ=0.9A^tl=0Tt(0.9γ)lδt+l\lambda = 0.9 \quad \Rightarrow \quad \hat{A}_t \approx \sum_{l=0}^{T-t} (0.9\gamma)^l \cdot \delta_{t+l}

看很远的未来,因为任务复杂,需要长期规划

4. 完整的计算流程(UI-TARS-2)

算法伪代码

python
展开代码
def compute_advantages_uitars2(trajectory, gamma=0.99, alpha=0.05): """ trajectory: {states, actions, rewards, values} """ T = len(trajectory) # 1. 计算自适应lambda lambda_policy = 1.0 - 1.0 / (alpha * T) lambda_policy = clip(lambda_policy, 0.0, 0.99) # 假设λ_critic固定为0.9 lambda_critic = 0.9 # 2. 计算TD误差 deltas = [] for t in range(T): if t == T - 1: delta = rewards[t] - values[t] else: delta = rewards[t] + gamma * values[t+1] - values[t] deltas.append(delta) # 3. 计算策略的优势 advantages_policy = [] for t in range(T): adv = 0 multiplier = 1.0 for l in range(T - t): adv += multiplier * deltas[t + l] multiplier *= gamma * lambda_policy advantages_policy.append(adv) # 4. 计算价值的优势 advantages_critic = [] for t in range(T): adv = 0 multiplier = 1.0 for l in range(T - t): adv += multiplier * deltas[t + l] multiplier *= gamma * lambda_critic advantages_critic.append(adv) return advantages_policy, advantages_critic

PPO更新公式(论文公式4)

JPPO(θ)=E(q,a)D,otπθold[min(πθ(otq,o<t)πθold(otq,o<t)A^t,clip(πθ(otq,o<t)πθold(otq,o<t),1εlow,1+εhigh)A^t)]J_{\text{PPO}}(\theta) = \mathbb{E}_{(q,a)\sim\mathcal{D}, o_{\leq t}\sim\pi_{\theta_{\text{old}}}}\left[\min\left(\frac{\pi_\theta(o_t|q,o_{<t})}{\pi_{\theta_{\text{old}}}(o_t|q,o_{<t})}\hat{A}_t, \text{clip}\left(\frac{\pi_\theta(o_t|q,o_{<t})}{\pi_{\theta_{\text{old}}}(o_t|q,o_{<t})}, 1-\varepsilon_{\text{low}}, 1+\varepsilon_{\text{high}}\right)\hat{A}_t\right)\right]

其中:

  • εlow\varepsilon_{\text{low}}: 下限裁剪参数(较小,防止过早剔除token)
  • εhigh\varepsilon_{\text{high}}: 上限裁剪参数(较大,鼓励探索)

5. 论文中的实验结果

Value Pretraining的重要性 (图10b)

没有预训练:

  • 价值估计与奖励负相关
  • 训练不稳定

有预训练:

  • 价值估计准确
  • 奖励曲线稳定上升

Decoupled-GAE的效果

标准GAE (λ=0.95\lambda=0.95):

  • 长序列任务中价值估计崩溃

Decoupled-GAE (λpolicy=0.95,λcritic=0.9\lambda_{\text{policy}}=0.95, \lambda_{\text{critic}}=0.9):

  • 价值估计稳定
  • Explained Variance更高 (图15e)

总结表格

方法公式目的
标准GAEA^t=l=0Tt(γλ)lδt+l\hat{A}_t = \sum_{l=0}^{T-t}(\gamma\lambda)^l\delta_{t+l}, λ\lambda固定平衡偏差-方差
Decoupled-GAE策略用λpolicy\lambda_{\text{policy}},价值用λcritic\lambda_{\text{critic}}分别优化策略和价值
Length-Adaptiveλ=11αl\lambda=1-\frac{1}{\alpha \cdot l}根据任务长度自适应

UI-TARS-2的完整方案 = Decoupled + Length-Adaptive,这是应对长序列GUI任务的关键创新!

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!