近端策略优化 (PPO) 是一种旨在解决强化学习 (reinforcement learning)中常见实际复杂性的算法,例如信任区域策略优化 (TRPO) 中存在的复杂性。尽管TRPO通过限制KL散度为单调策略提升提供了有力的理论保证,但其实际应用可能具有挑战性。TRPO通常需要计算二阶导数,例如费舍尔信息矩阵,并解决带约束的优化问题,这通常使用共轭梯度法。PPO简化了这一过程,旨在仅利用一阶优化实现TRPO的数据效率和可靠性能,从而使其在实施和调整上简单得多。PPO已成为深度强化学习应用中的主要算法,因其在性能、简洁性和稳定性之间取得了平衡而备受推崇。
PPO属于策略梯度方法,并在Actor-Critic框架下运行。与TRPO类似,它旨在限制策略在每个更新步骤中的变化幅度,以避免性能崩溃。PPO不施加严格的KL散度约束,而是通常使用截断代理目标或自适应KL惩罚来避免过大的策略更新。
代理目标函数
回顾标准的策略梯度目标函数,它旨在最大化预期折扣回报。我们通常使用一个代理目标函数,该函数包含用于收集数据的新策略 πθ 和旧策略 πθold 之间的概率比:
rt(θ)=πθold(at∣st)πθ(at∣st)
标准代理目标函数,有时称为CPI(保守策略迭代)目标函数,为:
LCPI(θ)=E^t[rt(θ)A^t]
这里,E^t 表示对一批收集到的时间步的经验平均值,而 A^t 是时间步 t 处优势函数的一个估计(通常使用广义优势估计GAE计算,如前所述)。直接最大化 LCPI(θ) 可能导致策略更新过大,特别是当 rt(θ) 严重偏离1时。
PPO变体1:截断代理目标
这是PPO最常见的变体。它通过截断概率比 rt(θ) 来修改代理目标函数,使其保持在1附近的一个小区间内。截断操作取决于优势函数 A^t 的符号。
目标函数定义为:
LCLIP(θ)=E^t[min(rt(θ)A^t,clip(rt(θ),1−ϵ,1+ϵ)A^t)]
我们来分析一下 min 项:
- 第一项: rt(θ)A^t 是标准的CPI目标函数。
- 第二项: clip(rt(θ),1−ϵ,1+ϵ)A^t。
clip 函数将比率 rt(θ) 限制在 [1−ϵ,1+ϵ] 的范围内。超参数 (parameter) (hyperparameter) ϵ (epsilon) 定义了截断范围(例如,通常为0.1或0.2)。
min 操作确保最终的目标函数是未截断目标函数的一个下界(一个悲观估计)。
- 如果 A^t>0(优势为正): 目标函数变为 min(rt(θ)A^t,(1+ϵ)A^t)。这意味着如果策略更新会导致概率比 rt(θ) 超过 1+ϵ,则梯度会被截断,防止策略变化过大。我们仅能从将 rt(θ) 增加到 1+ϵ 中受益。
- 如果 A^t<0(优势为负): 目标函数变为 min(rt(θ)A^t,(1−ϵ)A^t)。由于 A^t 是负值,这相当于取 max(rt(θ)A^t,(1−ϵ)A^t)。这会阻止策略更新导致概率比 rt(θ) 降至 1−ϵ 以下。我们仅承担将 rt(θ) 减小到 1−ϵ 所带来的惩罚。
本质上,截断消除了策略在单次更新中变化过大的动力,间接限制了新旧策略之间的KL散度。
PPO中截断机制对正负优势(A^t)的影响。虚线显示了当概率比 rt(θ) 偏离1.0过远时,对目标函数的贡献是如何被限制的。
PPO变体2:自适应KL惩罚
PPO的另一种表述方式采用对KL散度的惩罚而非硬性截断。目标函数为:
LKLPEN(θ)=E^t[rt(θ)A^t−βKL[πθold(⋅∣st)∣∣πθ(⋅∣st)]]
这里,β 是一个系数,它根据新旧策略之间的KL散度来惩罚策略的较大偏差。β 通常不是固定值,而是在训练过程中动态调整:
- 计算策略更新后的实际KL散度 dKL=E^t[KL[πθold(⋅∣st)∣∣πθ(⋅∣st)]]。
- 如果 dKL 大于目标值 dtarg,则增加 β(以便未来更严重地惩罚KL散度)。
- 如果 dKL 小于 dtarg,则减小 β(以允许更大的更新)。
虽然这种方法在精神上更接近原始TRPO的约束,但 β 的自适应方案增加了复杂性,并且从经验上看,截断代理目标通常表现同样好,并且更容易实施和调整。
完整的PPO算法
PPO通常使用Actor-Critic架构实现。最终优化的目标函数通常将截断策略代理损失 (LCLIP) 与值函数损失 (LVF) 和熵奖励 (S) 结合起来,以鼓励策略的多样性:
LPPO(θ)=E^t[LCLIP(θ)−c1LVF(θ)+c2S[πθ](st)]
- LVF(θ)=(Vθ(st)−Vttarg)2 是值函数(critic)的平方误差损失。 Vθ(st) 是评论者(critic)的估计值,而 Vttarg 是目标值,通常是经验回报或GAE估计本身。
- S[πθ](st) 是策略 πθ 在状态 st 下的熵。最大化熵有助于策略的多样性。
- c1 和 c2 分别是用于加权值损失和熵奖励的超参数 (parameter) (hyperparameter)。
整个算法流程如下:
- 初始化: 初始化Actor策略网络 πθ 和Critic值网络 Vϕ(参数为 θ,ϕ)。通常,一些层是共享的。
- 循环: 重复多次迭代:
a. 收集数据: 在环境中运行当前策略 πθold(其中 θold 是更新前的参数),持续 T 个时间步(或 N 条轨迹),收集 (st,at,rt+1,st+1)。
b. 计算优势: 计算所有时间步 t 的优势估计 A^t,通常使用基于收集到的数据和当前值函数 Vϕ 的GAE。同时计算值目标 Vttarg。
c. 优化: 重复 K 个时期:
i. 从收集到的数据中采样小批量数据。
ii. 使用当前参数 θ,ϕ 计算PPO目标函数 LPPO。
iii. 使用梯度上升优化器(如Adam)对 LPPO 更新网络参数 θ,ϕ。
d. 设置 θold←θ。
在同一批数据上进行多轮(K>1)小批量更新,与仅进行单次梯度更新后就丢弃数据的方法相比,提高了样本效率。
PPO的优点与考量
优点:
- 简洁性: 比TRPO更容易实现,依赖于标准的一阶优化器。
- 性能: 在许多连续和离散控制基准上取得了优秀或接近最优的成果。
- 稳定性: 通常比简单的策略梯度方法更稳定,对超参数 (parameter) (hyperparameter)的敏感度也更低。
- 样本效率: 每批数据可用于多次梯度更新,提高了样本效率。
考量:
- 超参数敏感性: 虽然常被认为是可靠的,PPO仍有重要的超参数需要调整,包括截断因子 ϵ、学习率、GAE参数 (λ,γ)、系数 c1,c2、小批量数据大小以及优化时期数 K。
- 缺乏严格保证: 截断机制是一种启发式方法;与TRPO不同,它不提供单调改进的正式保证,尽管它在实践中表现非常出色。
- 实现细节很重要: 小的实现选择(例如,值函数截断、奖励缩放、观测归一化 (normalization)、网络初始化)能显著影响性能,正如许多PPO实际实现和库中强调的那样。
总而言之,PPO代表了策略梯度方法在实践中的一项重大进步。通过引入截断代理目标等机制,它提供了一种有效稳定策略更新的方法,且无需像TRPO那样增加实现开销,使其成为解决复杂强化学习 (reinforcement learning)问题的广泛应用和强大工具。