1. GAE (Generalized Advantage Estimation) 基础
为什么需要优势函数?
在强化学习中,我们想知道:在状态st采取动作at,比平均水平好多少?
A(st,at)=Q(st,at)−V(st)
- Q(st,at): 采取动作at后的期望回报
- V(st): 状态st的平均期望回报
- A>0: 这个动作比平均好,应该鼓励
- A<0: 这个动作比平均差,应该抑制
TD误差 (Temporal Difference Error)
δt=rt+γ⋅V(st+1)−V(st)
含义解释:
- rt+γ⋅V(st+1): 实际获得的奖励 + 下一个状态的估计价值
- V(st): 当前状态的估计价值
- δt: 实际比预期好/差多少
例子:
假设你在玩游戏:
- V(当前状态) = 100分 (模型预测)
- 你采取行动得到 r_t = 10分
- V(下一状态) = 120分 (模型预测)
- δ_t = 10 + 0.99×120 - 100 = 28.8
说明这个动作比预期好28.8分!
GAE的完整公式
单步TD误差方差大,多步回报偏差大,GAE通过λ参数平衡:
A^t=∑l=0T−t(γλ)l⋅δt+l
递归展开形式:
A^t=δt+(γλ)δt+1+(γλ)2δt+2+⋯+(γλ)T−tδT
参数含义:
- γ (gamma): 折扣因子,通常0.99,表示未来奖励的重要性
- λ (lambda): GAE参数,0到1之间
- λ=0: 只看一步 A^t=δt (高偏差,低方差)
- λ=1: 看到终点 A^t=∑l=0T−tγlrt+l−V(st) (低偏差,高方差)
- λ=0.95: 平衡选择
具体计算示例
假设一个长度为5的轨迹,γ=0.99, λ=0.95:
奖励 r: [10, 5, 8, 12, 20]
价值 V: [100, 105, 110, 115, 120]
步骤1: 计算每步的TD误差
δ0δ1δ2δ3δ4=10+0.99×105−100=13.95=5+0.99×110−105=8.9=8+0.99×115−110=11.85=12+0.99×120−115=15.8=20+0−120=−100(终止状态)
步骤2: 计算t=0的优势
γλ=0.99×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.14−78.35=−32.4
2. Decoupled-GAE (解耦GAE)
论文提到的关键创新!
问题背景
在长序列任务中(GUI操作可能几十步),标准GAE存在问题:
- 策略优化需要较大的λ来捕捉长期依赖
- 价值估计在长序列下会累积误差,需要较小的λ
解决方案:分别设置λ
策略的优势计算 (用于更新策略):
A^tpolicy=∑l=0T−t(γ⋅λpolicy)l⋅δt+l
价值函数的目标 (用于更新价值网络):
A^tcritic=∑l=0T−t(γ⋅λcritic)l⋅δt+l
典型设置:
- λpolicy=0.95 (较大,鼓励探索长期回报)
- λcritic=0.90 (较小,减少价值估计的累积误差)
为什么有效?
价值函数更新:
VtargetLvalue=V(st)+A^tcritic=(Vθ(st)−Vtarget)2
策略更新:
ratioLpolicy=πold(at∣st)πnew(at∣st)=−min(ratio×A^tpolicy,clip(ratio)×A^tpolicy)
论文发现(图10b):
- 没有解耦:价值估计与真实奖励负相关!
- 使用解耦:训练稳定,收敛更快
3. Length-Adaptive GAE (长度自适应GAE)
问题:序列长度差异大
GUI任务中:
使用固定λ会导致:
- 短序列:λ太大,过拟合噪声
- 长序列:λ太小,看不到长期回报
解决方案:动态调整λ
λpolicy(l)=1−α×l1
参数:
- l: 当前轨迹的长度
- α: 超参数,论文设置为 0.05
具体计算示例
对于不同长度的任务:
l=20l=50l=100l=200⇒λ=1−0.05×201=1−1.0=0.0⇒λ=1−0.05×501=1−0.4=0.6⇒λ=1−0.05×1001=1−0.2=0.8⇒λ=1−0.05×2001=1−0.1=0.9
实际使用:
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=20):
λ=0.0⇒A^t=δt
只看当前一步,因为任务简单,不需要长期规划
长轨迹 (l=200):
λ=0.9⇒A^t≈∑l=0T−t(0.9γ)l⋅δt+l
看很远的未来,因为任务复杂,需要长期规划
4. 完整的计算流程(UI-TARS-2)
算法伪代码
def compute_advantages_uitars2(trajectory, gamma=0.99, alpha=0.05):
"""
trajectory: {states, actions, rewards, values}
"""
T = len(trajectory)
lambda_policy = 1.0 - 1.0 / (alpha * T)
lambda_policy = clip(lambda_policy, 0.0, 0.99)
lambda_critic = 0.9
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)
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)
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,o≤t∼πθold[min(πθold(ot∣q,o<t)πθ(ot∣q,o<t)A^t,clip(πθold(ot∣q,o<t)πθ(ot∣q,o<t),1−εlow,1+εhigh)A^t)]
其中:
- εlow: 下限裁剪参数(较小,防止过早剔除token)
- εhigh: 上限裁剪参数(较大,鼓励探索)
5. 论文中的实验结果
Value Pretraining的重要性 (图10b)
没有预训练:
有预训练:
Decoupled-GAE的效果
标准GAE (λ=0.95):
Decoupled-GAE (λpolicy=0.95,λcritic=0.9):
- 价值估计稳定
- Explained Variance更高 (图15e)
总结表格
| 方法 | 公式 | 目的 |
|---|
| 标准GAE | A^t=∑l=0T−t(γλ)lδt+l, λ固定 | 平衡偏差-方差 |
| Decoupled-GAE | 策略用λpolicy,价值用λcritic | 分别优化策略和价值 |
| Length-Adaptive | λ=1−α⋅l1 | 根据任务长度自适应 |
UI-TARS-2的完整方案 = Decoupled + Length-Adaptive,这是应对长序列GUI任务的关键创新!