前言

  • 上一期我们讲到了 DDPG 与 TD3 两种用于连续动作空间的强化学习算法。
    • DDPG 可以看作是 DQN + Policy Gradient + Actor-Critic 思想的一种融合,它让强化学习能够直接处理连续动作空间的问题。
    • TD3 则针对 DDPG 在训练过程中容易出现 Q值过估计和训练不稳定 的问题进行了改进,通过 双 Q 网络、延迟策略更新以及目标策略平滑 等技巧,使训练更加稳定。
  • 不过,上述算法它们有一个非常致命的问题:
    • 策略更新太猛,训练容易直接崩掉
  • 那么是否有一种方法,既能保持策略梯度的优点,又能让更新过程更稳定?
    • 那就是今天要介绍的PPO(Proximal Policy Optimization)
  • PPO是当前 强化学习中最常用、最稳定的算法之一,在很多实际项目中都有广泛应用。

1 PPO(Proximal Policy Optimization)

在这里插入图片描述

1-1 介绍
  • PPO(Proximal Policy Optimization) 是由 OpenAI 在 2017 年提出的一种强化学习策略优化算法,其论文为 “Proximal Policy Optimization Algorithms”。该算法属于 策略梯度(Policy Gradient)方法,同时通常结合 Actor-Critic 框架 进行训练。
  • 我们从其名字的组合来分析
    • Proximal(邻近、接近):每次策略更新都要保持与旧策略“接近”,而不是让策略发生大跳跃。
    • Policy(策略):智能体决定在每个状态该采取什么动作的策略。
    • Optimization(优化):不断改进策略参数,使智能体获得更高的长期奖励。
  • PPO 的核心思想是:
    • 在更新策略时 限制新策略与旧策略之间的差异,从而避免策略更新过大导致训练过程不稳定的问题。

1-2 为什么需要 PPO(Policy Gradient 的问题)
  • 我们在第四期讲到 Policy Gradient 时其实已经提到过,它虽然能够 直接学习策略,但仍然存在几个比较明显的问题:
  1. 方差很大(训练不稳定)
    由于策略梯度依赖采样数据进行更新,不同采样轨迹之间的差异可能非常大,因此梯度方差也会比较高,导致训练过程容易震荡。
  2. 策略崩塌(Policy Collapse)
    在策略更新时,如果更新步长过大,新策略可能会和旧策略产生巨大差异。例如原本概率较高的动作突然被大幅降低,这可能会导致性能突然下降。
  3. 样本利用率低
    Policy Gradient 属于 on-policy 方法,训练数据必须由当前策略生成,因此旧数据往往无法反复利用,训练效率较低。
  4. 容易陷入局部最优
    由于策略是通过梯度更新得到的,如果探索不足,很容易陷入某个局部最优策略。

  • 而我们在第五期中介绍的 Actor-Critic 方法,其实就是为了解决 Policy Gradient 中 方差过大 的问题。
    • Actor-Critic 通过引入 价值网络(Critic) 来估计状态价值或优势函数,从而减少策略梯度估计的方差,使训练过程更加稳定。
  • 但是即便如此,策略更新过大的问题仍然存在
  • 说人话就是:
    • 即使我们能够更准确地估计梯度,如果一次更新改变策略太多,训练仍然可能会崩掉。
  • 那么为了应对这个问题,研究人员提出了一种新的思路: 限制每一次策略更新的幅度。 限制每一次策略更新的幅度。 限制每一次策略更新的幅度。也就是说,新策略不能和旧策略差别太大。
  • 而这种思想正是 PPO(Proximal Policy Optimization) 的核心。

1-3 概率比率(Probability Ratio)
  • PPO 的核心思想其实非常简单: 限制策略更新的幅度。 限制策略更新的幅度。 限制策略更新的幅度。
  • 也就是:
    • 如果策略变化太大,就 阻止这次更新继续扩大
  • 那么如何判断策略变化的度量呢,PPO 引入了一个重要的概念:
  • 概率比率(Probability Ratio) r ( θ ) = π θ ( a ∣ s ) π θ o l d ( a ∣ s ) r(\theta) = \frac{\pi_\theta(a|s)}{\pi_{\theta_{old}}(a|s)} r(θ)=πθold(as)πθ(as)
  • 它表示:​
    • 新策略和旧策略在某个动作上的概率比例。
    • 如果r ≈ 1,说明新旧策略 差不多
    • 如果r >> 1 或 r << 1,说明策略 变化太大

1-4 Clip Trick(PPO 最关键公式)

在这里插入图片描述

  • PPO 的核心创新就是:
    • Clip Trick(裁剪机制)
  • 为了防止新策略和旧策略差别太大,PPO通过 限制概率比率 r 的范围 来控制策略更新。
  • PPO 的目标函数是: L c l i p ( θ ) = E [ min ⁡ ( r ( θ ) A , c l i p ( r ( θ ) , 1 − ϵ , 1 + ϵ ) A ) ] L^{clip}(\theta)=\mathbb{E}[\min(r(\theta)A,\mathrm{clip}(r(\theta),1-\epsilon,1+\epsilon)A)] Lclip(θ)=E[min(r(θ)A,clip(r(θ),1ϵ,1+ϵ)A)]
  • 其中:
    • r ( θ ) r(\theta) r(θ):新旧策略概率比
    • A A A:Advantage(优势函数)
    • ϵ \epsilon ϵ:裁剪范围,一般取 0.1~0.2
  • 注:这里的Advantage(优势函数)就是 Actor-Critic 中的 Advantage。我们在第五期的2-4提到过。
  • 通过上述公式,PPO 会限制 r ( θ ) r(\theta) r(θ)的取值范围 [ 1 − ϵ , 1 + ϵ ] [1-\epsilon, 1+\epsilon] [1ϵ,1+ϵ]
  • 如果超过这个范围:
    • 梯度就会被裁剪,不再继续增大。
  • 简单点说就是:
    • 策略更新->概率变化过大?
      • 是 → 截断更新
      • 否 → 正常更新

1-5 训练流程
  • PPO 的整体训练流程其实和 Actor-Critic 非常相似,只是在 策略更新阶段加入了 Clip 机制
1-5-1 采样数据
  • 首先使用当前策略 πθold\pi_{\theta_{old}}πθold​​ 与环境进行交互,收集一批轨迹数据 ( s , a , r , s ′ ) (s,a,r,s') (s,a,r,s),这些数据通常会组成一个 trajectory 或 batch。

1-5-2 计算回报
  • 根据采样到的奖励序列计算累计回报: R t = r t + γ r t + 1 + γ 2 r t + 2 + . . . R_t = r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + ... Rt=rt+γrt+1+γ2rt+2+...用于后续训练价值网络。

1-5-3 计算 Advantage
  • 利用 Critic 网络 估计状态价值 V ( s ) V(s) V(s),然后计算优势函数: A ( s , a ) = R t − V ( s ) A(s,a) = R_t - V(s) A(s,a)=RtV(s)它表示:
    • 这个动作比平均水平好多少
  • 通过 Advantage 可以:
    • 降低策略梯度的方差
    • 提供更稳定的梯度方向
  • 在实际实现中,很多 PPO 会使用 GAE(Generalized Advantage Estimation) 来进一步降低方差。

1-5-4 计算概率比率
  • 根据新旧策略计算概率比率: r ( θ ) = π θ ( a ∣ s ) π θ o l d ( a ∣ s ) r(\theta) = \frac{\pi_\theta(a|s)}{\pi_{\theta_{old}}(a|s)} r(θ)=πθold(as)πθ(as)用于判断新策略相对于旧策略,在该动作上的概率变化。

1-5-5 使用 Clip Trick 更新策略
  • 将概率比率带入 PPO 的 Clip 目标函数 L c l i p ( θ ) L^{clip}(\theta) Lclip(θ)
  • 如果概率变化过大,就会被 clip 限制。这样可以防止策略发生剧烈变化。

1-5-6 更新 Actor 和 Critic
  • 最后分别更新两个网络:
    • Actor(策略网络)
      最大化 PPO 的目标函数
    • Critic(价值网络)
      最小化价值函数误差
  • 通常会对同一批数据 进行多轮 mini-batch 更新,以提高样本利用率。
采样一批 trajectory
↓
打乱数据
↓
划分 mini-batch
↓
多轮训练

1-6 Entropy Bonus(探索奖励)
  • 在强化学习中,还有一个常见的问题: 策略过早收敛 策略过早收敛 策略过早收敛
  • 举个例子假设一个智能体发现某个动作暂时收益较高,那么策略可能很快变成:
    • 动作A:0.99
    • 动作B:0.01
  • 这样虽然短期收益不错,但可能会导致探索能力下降从而错过更优策略。
  • 为了解决这个问题,PPO 在损失函数中加入了 Entropy Bonus(熵奖励)
  • 策略熵定义为: H ( π ) = − ∑ π ( a ∣ s ) log ⁡ π ( a ∣ s ) H(\pi) = -\sum \pi(a|s)\log \pi(a|s) H(π)=π(as)logπ(as)
  • 你可以这样理解:策略越随机,熵越大
  • 因此在训练时加入熵奖励,可以:
    • 鼓励策略保持一定随机性

2 损失函数与伪代码实现

  • 在实际实现中,PPO 的损失函数通常由 三部分组成
  1. Policy Loss(策略损失)
  2. Value Loss(价值损失)
  3. Entropy Bonus(探索奖励)
  • 完整损失函数为: L ( θ ) = E [ L c l i p ( θ ) − c 1 L V F ( θ ) + c 2 H ( π θ ) ] L(\theta)=\mathbb{E}[L^{clip}(\theta)-c_1L^{VF}(\theta)+c_2H(\pi_\theta)] L(θ)=E[Lclip(θ)c1LVF(θ)+c2H(πθ)]其中:
    • c 1 c1 c1:价值损失权重
    • c 2 c2 c2:熵奖励权重

1-7 GAE(Generalized Advantage Estimation)
  • 在前面我们计算 Advantage 时使用的是: A ( s , a ) = R t − V ( s ) A(s,a)=R_t-V(s) A(s,a)=RtV(s)

  • 这种方法虽然简单,但在实际强化学习中会有两个问题:

    1. 方差较大:如果直接使用完整回报 R R R,由于奖励可能跨越很长时间,计算出来的 Advantage 波动会比较大。
    2. 偏差与方差的权衡问题:如果只使用短期 TD 误差,方差会降低,但可能会引入偏差。
  • 为了解决这个问题,研究人员提出了 GAE(Generalized Advantage Estimation)。

  • GAE的核心思想是:

    • 在“低方差”和“低偏差”之间做一个平衡。
  • 它通过引入一个参数 λ(lambda),将 多步 TD 误差进行加权平均,从而得到更加稳定的 Advantage 估计。

  • 公式: A t G A E = ∑ l = 0 ∞ ( γ λ ) l δ t + l A_t^{GAE} = \sum_{l=0}^{\infty} (\gamma \lambda)^l \delta_{t+l} AtGAE=l=0(γλ)lδt+l其中: δ t = r t + γ V ( s t + 1 ) − V ( s t ) \delta_t = r_t + \gamma V(s_{t+1}) - V(s_t) δt=rt+γV(st+1)V(st)

  • 表示 TD 误差(Temporal Difference Error)

  • 参数 λ \lambda λ 控制了 偏差和方差之间的平衡

    • λ = 0 只使用 一步 TD 误差,方差小,偏差较大
    • λ = 1 接近 Monte Carlo 回报.偏差小.方差较大
  • 实际训练中一般取: λ = 0.95 λ=0.95 λ=0.95

  • 这样可以在 稳定性和准确性之间取得较好的平衡。


2-1 Policy Loss(策略损失)
  • 策略损失就是 PPO 的 核心 Clip 目标函数 L c l i p ( θ ) L^{clip}(\theta) Lclip(θ)其作用是:
    • 更新策略网络(Actor)
  • 在更新过程中:
    • 如果新旧策略变化不大 → 正常更新
    • 如果变化过大 → 被 clip 限制

2-2 Value Loss(价值损失)
  • 在 Actor-Critic 框架中,还需要训练 Critic 网络 来估计状态价值。
  • 价值损失通常采用 均方误差(MSE) L V F = ( V ( s ) − R ) 2 L^{VF} = (V(s)-R)^2 LVF=(V(s)R)2其中:
    • V ( s ) V(s) V(s) : Critic预测价值
    • R R R : 实际回报
  • 训练目标就是让: V ( s ) ≈ R V(s) ≈ R V(s)R这样 Critic 才能更准确地评估状态价值,从而为 Actor 提供更可靠的 Advantage。

2-3 Entropy Bonus(探索奖励)
  • 最后一部分是 策略熵奖励 H ( π ) H(\pi) H(π)它的作用是:鼓励策略保持一定随机性

2-4 常用算法对比表格
算法 类型 动作空间 核心思想 样本利用率 优势 劣势 稳定性
DQN Value-based 离散 用神经网络近似 Q 表,间接导出策略 高(Replay Buffer) 实现简单,训练效率高 只能处理离散动作,容易 Q 值过估计
A3C Actor-Critic 离散/连续 多线程 Actor-Critic,优势函数降低梯度方差 低(on-policy) 并行采样效率高,收敛速度快 更新不稳定,样本利用率低,线程管理复杂
DDPG Actor-Critic 连续 确定性策略梯度 + Critic Q 值评估 高(off-policy Replay Buffer) 适合连续动作,高样本利用率 易训练不稳定,探索能力弱,容易陷入局部最优 较低
PPO Policy Gradient 离散/连续 随机策略 + Clip Trick 限制更新 中(可多轮 mini-batch) 更新稳定,训练可靠,适用范围广 样本利用率不如 DDPG

2-4 PPO 伪代码
  • 我们可以简单实现一个PPO的伪代码
# 初始化策略网络 Actor(θ) 和价值网络 Critic(φ)
initialize_actor(theta)
initialize_critic(phi)

# 超参数
gamma = 0.99           # 折扣因子,折扣未来奖励的系数
epsilon = 0.2          # Clip范围,裁剪范围,限制策略更新幅度,避免策略崩塌。
K_epochs = 4           # 每批数据更新轮数
batch_size = 64        # mini-batch大小

while not converged:
    # 1. 使用旧策略与环境交互,收集轨迹数据
    trajectories = collect_trajectories(actor=theta, env, batch_size)
    states, actions, rewards = trajectories.states, trajectories.actions, trajectories.rewards

    # 2. 计算累计回报
    R = compute_returns(rewards, gamma)

    # 3. 计算优势函数,优势函数表示这个动作比平均水平好多少
    V = critic(phi).predict(states)
    A = R - V

    # 4. 保存旧策略概率,用于概率比率计算
    old_probs = actor(theta).probability(states, actions)

    # 5. 多轮 mini-batch 更新
    for epoch in range(K_epochs):
        for s_batch, a_batch, R_batch, A_batch, old_prob_batch in mini_batches(states, actions, R, A, old_probs, batch_size):
            
            # 5-1 计算新策略概率
            new_probs = actor(theta).probability(s_batch, a_batch)
            
            # 5-2 计算概率比率,反映新旧策略的变化幅度,用于 Clip 限制。
            r = new_probs / old_prob_batch

            # 5-3 Clip Trick 目标函数,如果策略变化幅度过大(超出 [1-ε,1+ε]),梯度被裁剪,避免策略崩塌。
            L_clip = mean( min(r * A_batch, clip(r, 1-epsilon, 1+epsilon) * A_batch) )

            # 5-4 价值网络损失
            L_value = mean((critic(phi).predict(s_batch) - R_batch)**2)

            # 5-5 熵奖励,策略越随机,熵越大,避免过早收敛。
            H = mean(actor(theta).entropy(s_batch))

            # 5-6 总损失(Actor最大化,Critic最小化)
            total_loss = -L_clip + 0.5 * L_value - 0.01 * H

            # 5-7 更新参数,lr_critic和lr_actor是学习率
            theta = theta - lr_actor * gradient(total_loss, theta)
            phi = phi - lr_critic * gradient(L_value, phi)

小结

  • 本节主要介绍了 PPO(Proximal Policy Optimization) 算法,它是在策略梯度和 Actor-Critic 基础上提出的一种稳定强化学习方法。通过 Clip Trick 限制新旧策略的变化幅度、结合优势函数降低梯度方差,并加入 Entropy Bonus 保持探索能力,PPO 能够在离散和连续动作空间中稳定训练。
  • 下一期我们讲DPPO
  • 希望文章对你有帮助,如有错误,欢迎指出。

总结

  • 自此,我们的系列以及讲了很多算法了,我们来回顾一下:
  • Value-based
    • Q-Learning
      • 最经典的强化学习算法,本质是 查表学习每个状态-动作的价值 Q(s,a)
    • Sarsa
      • 与 Q-Learning 类似,但属于 on-policy 学习,更新时使用 当前策略实际执行的动作
    • DQN
      • 使用 神经网络替代 Q 表,让 Q-Learning 可以处理 高维状态空间(如图像)。
  • Policy-based
    • Policy Gradient
      • 直接学习 策略函数 π(a|s),通过梯度优化策略,而不是学习 Q 值。
    • Actor-Critic
      • 结合 Policy Gradient 与 Value Function: Actor 负责决策,Critic 负责评价动作好坏。
    • A3C
      • 通过 多线程并行训练加速 Actor-Critic,提高训练效率和稳定性。
    • DDPG
      • Actor-Critic + DQN 技术结合,用于 连续动作空间控制问题
    • TD3
      • 在 DDPG 基础上通过 双Q网络、延迟更新、策略平滑提升训练稳定性。
    • PPO
      • Policy Gradient + Clip Trick,限制策略更新幅度,训练稳定。
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐