强化学习:近端策略优化(PPO)算法详解
近端策略优化(Proximal Policy Optimization, PPO)是强化学习领域最具影响力和应用最广泛的算法之一。自2017年由OpenAI提出以来,它凭借其出色的稳定性、高效的性能和相对简单的实现,成为了许多复杂决策任务的首选算法。
1. 算法的由来:为什么我们需要PPO?
在PPO诞生之前,策略梯度(Policy Gradient, PG)方法是解决强化学习问题的主流选择。然而,传统的PG方法存在两个棘手的问题:
- 更新步长敏感性:策略网络的更新步长(即学习率)极难选择。如果步长太大,一次糟糕的更新就可能让策略性能急剧下降;如果步长太小,训练过程又会变得异常缓慢,难以收敛。
- 数据利用率低:大多数基础的PG算法(如REINFORCE)是On-policy的,这意味着它们只能使用当前策略采样的数据进行学习。一旦策略更新,所有旧数据都将被丢弃,导致采样效率极低。
为了解决这些问题,研究者们提出了信任区域策略优化(Trust Region Policy Optimization, TRPO)。TRPO通过在每次更新时施加一个KL散度的约束,确保新旧策略之间的差异不会过大,从而在数学上保证了策略性能的单调提升。
然而,TRPO的计算代价高昂。它需要计算复杂的二阶优化问题,这使得TRPO的实现和调试都非常困难。
正是在这样的背景下,PPO应运而生。它的核心目标是在实现TRPO稳定性的同时,使用更简单、计算成本更低的一阶优化方法。PPO通过一种巧妙的裁剪机制或自适应KL惩罚项,达到了与TRPO相媲美的性能,但其代码实现却异常简洁。
2. 数学建模与核心概念
PPO建立在马尔可夫决策过程(Markov Decision Process, MDP)的框架之上。
一个MDP由以下五元组定义:
- S (States): 所有可能状态的集合。
- A (Actions): 所有可能动作的集合。
- P(s' | s, a): 状态转移概率。
- R(s, a): 奖励函数。
- γ (Discount Factor): 折扣因子 (0 ≤ γ < 1)。
强化学习的目标是找到一个策略 π(a|s),以最大化期望累积折扣奖励,即价值函数 V(s):
$$V_\pi(s) = E\left[ \sum_{t=0}^{\infty} \gamma^t R(s_t, a_t) \mid s_0 = s, a_t \sim \pi(a_t|s_t) \right]$$
策略梯度方法通过直接参数化策略并使用梯度上升来优化参数。根据策略梯度定理,该目标函数的梯度为:
$$\nabla_\theta J(\theta) = E_{\tau \sim \pi_\theta}\left[ \left( \sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t|s_t) \right) \left( \sum_{t=0}^{T} R(s_t, a_t) \right) \right]$$
在实践中,为了减小梯度的方差,我们通常使用优势函数(Advantage Function)$A(s, a) = Q(s, a) - V(s)$。
3. PPO的核心公式与推导
3.1 前置数学知识
- 期望 (Expectation, E): 指在某个策略下,对所有可能轨迹的加权平均。
- 梯度 (Gradient, ∇): 表示函数增长最快的方向。
- 对数技巧 (Log-Derivative Trick): 利用 $\nabla_x \log f(x) = \frac{\nabla_x f(x)}{f(x)}$ 将梯度计算转化为对对数概率的梯度计算。
- KL散度: 衡量两个分布之间的差异,用于度量新旧策略的变化大小。
- 熵 (Entropy, H): 描述信息不确定性的度量。在PPO中加入熵正则化项可以鼓励智能体探索更多样的动作。
PPO定义了新旧策略之间动作概率的比率:
$$r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}$$
PPO最经典和常用的版本是 PPO-Clip,其目标函数如下:


