4. PPO核心原理

在自动驾驶连续控制任务中,策略网络需要输出方向盘转角、油门、制动等连续量,动作空间维度高、时序耦合强。PPO(Proximal Policy Optimization)之所以成为工程首选,核心在于它用“信赖域”的思想约束每次策略更新的幅度,使训练在探索与稳定之间取得平衡。本节围绕重要性采样、裁剪目标函数、优势估计、GAE 以及完整策略更新流程展开。

一、从策略梯度到信赖域约束

最朴素的策略梯度估计为 ∇J = E[∇logπ(a|s)·A(s,a)],它要求数据来自当前策略。但采样一次代价高昂,我们希望同一批数据能多次更新,于是引入重要性采样:用旧策略 π_old 采样的数据,去估计新策略 π_θ 的期望。重要性权重为比值 r_t(θ)=π_θ(a_t|s_t)/π_old(a_t|s_t)。

问题在于,当 r_t 偏离 1 太远时,估计方差会急剧放大,一次更新就可能把策略推离“可信区域”,导致性能崩塌。TRPO 用 KL 散度硬约束解决该问题,但需要二阶优化,计算复杂。PPO 则用裁剪目标函数近似实现信赖域,既保留约束效果,又只需一阶梯度,工程上更易落地。

二、裁剪目标函数:PPO 的核心机制

PPO 的目标函数为:

L_clip(θ) = E[ min( r_t(θ)·A_t,
                    clip(r_t(θ), 1-ε, 1+ε)·A_t ) ]
ε 通常取 0.1 ~ 0.2

其含义是:当优势 A_t 为正时,鼓励增大 r_t,但一旦超过 1+ε 就停止奖励;当 A_t 为负时,鼓励减小 r_t,但低于 1-ε 后不再继续惩罚。min 操作取两者较小值,形成“悲观下界”,从而抑制过大的策略变化。这就是 PPO 用裁剪替代 KL 约束的巧妙之处。

裁剪并非完全禁止策略变化,而是让“越界”的样本不再贡献梯度,从而把更新限制在旧策略附近的可信区域内。

三、优势估计与 GAE

优势函数 A(s,a)=Q(s,a)-V(s) 衡量某动作相对平均水平好多少。直接用单步回报估计方差大,用完整回报又偏差大。GAE(Generalized Advantage Estimation)通过引入参数 λ 在偏差与方差之间折中:

δ_t = r_t + γ·V(s_{t+1}) - V(s_t)
A_t^GAE = δ_t + (γλ)·δ_{t+1} + (γλ)²·δ_{t+2} + ...
λ=0  → 单步TD,低方差高偏差
λ=1  → 蒙特卡洛,高方差低偏差
常用 λ=0.95, γ=0.99

在自动驾驶中,γ 决定智能体对长期行驶安全的重视程度,λ 则影响优势估计的平滑性。GAE 让 Critic 只需学习 V(s),而优势由 TD 残差递推得到,训练更稳定。

四、策略更新流程与工程参数

一次完整的 PPO 迭代包含:采样、优势计算、多轮裁剪更新、价值网络更新。下表给出关键参数与工程建议:

参数作用典型值工程建议
ε (clip)信赖域半径0.1~0.2连续控制常用0.2
γ折扣因子0.99长时任务可0.995
λ (GAE)偏差方差折中0.950.9~0.97
更新轮数同批数据复用次数3~10过多易过拟合旧数据
batch size小批量大小64~256与并行环境数匹配

下面给出核心更新伪代码:

for iteration in range(N):
    # 1. 用旧策略采样轨迹
    traj = rollout(policy_old, env)
    # 2. 计算GAE优势与回报
    adv, ret = compute_gae(traj, gamma, lam)
    # 3. 多轮裁剪更新
    for epoch in range(K):
        for batch in split(traj, batch_size):
            r = pi_theta(batch.a|batch.s) / pi_old(batch.a|batch.s)
            L_clip = min(r*adv, clip(r,1-eps,1+eps)*adv)
            loss = -L_clip.mean() + c1*value_loss - c2*entropy
            loss.backward(); optimizer.step()

五、自动驾驶场景案例

以车道保持任务为例:车辆状态包含横向偏差、航向角、速度,动作为前轮转角。若 ε 设置过大(如 0.5),一次更新可能让转角策略突变,车辆出现画龙甚至冲出车道;若 ε 过小(如 0.01),策略几乎不更新,学习停滞。实践表明 ε=0.2、λ=0.95、γ=0.99 在多数连续控制任务中表现稳健。同时,优势归一化(减均值除标准差)能显著提升训练稳定性。

在自动驾驶仿真中,建议先用小学习率(3e-4)配合 ε=0.2 跑通,再逐步调大并行环境数提升样本吞吐。

六、常见误区与复盘

  • 误区一:认为裁剪后策略完全不会越界。实际上裁剪只对越界样本停止梯度,策略仍可能缓慢漂移,需监控 KL 散度。
  • 误区二:忽略优势归一化。未归一化的优势会让梯度尺度不稳定,尤其在奖励量纲差异大时。
  • 误区三:同一批数据更新轮数过多。K 过大导致策略过拟合旧数据,重要性比值失控,训练震荡。
  • 误区四:GAE 的 λ 与 γ 混用。两者作用不同,γ 控制视野,λ 控制估计平滑度,需分别调参。
若训练中出现 KL 散度持续大于 0.02 或 clip fraction 长期高于 0.3,说明更新幅度过大,应减小学习率或 ε,并检查优势估计是否异常。

综上,PPO 通过重要性采样复用数据、裁剪目标函数约束更新幅度、GAE 平衡偏差方差,形成了一套稳定高效的策略优化流程。理解这四者的协同关系,是后续在自动驾驶连续控制中调参与排障的基础。

PPO 策略更新流程与核心机制 ① 旧策略采样 π_old 与环境交互 收集轨迹 (s,a,r,s') ② GAE 优势估计 δ_t = r + γV(s') - V(s) A = Σ(γλ)^k · δ_{t+k} λ=0.95, γ=0.99 ③ 裁剪目标更新 r = π_θ / π_old L = min(r·A, clip(r,1±ε)·A) ε = 0.2 ④ 更新 θ ← θ' 多轮迭代(K epochs) 裁剪目标函数示意(A>0 时) r_t L 1-ε 1+ε 1.0 未裁剪 r·A 裁剪后梯度为0 正常梯度区域 裁剪目标 L_clip 未裁剪 r·A