PPO(近端策略优化)是OpenAI于2017年提出的一种策略梯度类算法,以其高效性、稳定性和易实现性成为强化学习领域的主流算法。以下从核心原理、数学推导、代码实现到应用场景进行系统解析。
其中
PPO 的目标函数引入重要性采样比
其中
# PPO 算法伪代码(Actor-Critic 架构)
for epoch in 1, 2, ...:
# 1. 收集数据
for t in 1, 2, ..., T:
使用当前策略 π_θ_old 与环境交互,存储 {s_t, a_t, r_t, log_prob_t}
# 2. 计算优势与回报
计算每个时间步的优势值 A_t 和回报 G_t
# 3. 优化策略
for k in 1, 2, ..., K:
随机采样一个 batch 数据
计算重要性采样比 r_t(θ) = exp(log_prob_new - log_prob_old)
计算 clipped 目标函数 J^CLIP
更新策略网络参数 θ 以最大化 J^CLIP
更新价值网络参数 φ 以最小化 (V_φ(s_t) - G_t)^2
import torch
import torch.optim as optim
from torch.distributions import Categorical
class PPO:
def __init__(self, actor_critic, clip_param=0.2, lr=3e-4, ent_coef=0.01):
self.actor_critic = actor_critic
self.optimizer = optim.Adam(actor_critic.parameters(), lr=lr)
self.clip_param = clip_param
self.ent_coef = ent_coef # 熵正则化系数
def update(self, rollouts):
obs, actions, old_log_probs, returns, advantages = rollouts.sample()
# 计算新策略的概率和熵
dist, values = self.actor_critic(obs)
new_log_probs = dist.log_prob(actions)
entropy = dist.entropy().mean()
# 重要性采样比
ratio = (new_log_probs - old_log_probs).exp()
surr1 = ratio * advantages
surr2 = torch.clamp(ratio, 1 - self.clip_param, 1 + self.clip_param) * advantages
policy_loss = -torch.min(surr1, surr2).mean()
# 价值函数损失
value_loss = 0.5 * (returns - values).pow(2).mean()
# 总损失(含熵正则化)
loss = policy_loss + value_loss - self.ent_coef * entropy
# 梯度更新
self.optimizer.zero_grad()
loss.backward()
torch.nn.utils.clip_grad_norm_(self.actor_critic.parameters(), 0.5)
self.optimizer.step()
PPO 通过创新的目标函数设计和工程优化,在保持策略梯度方法理论优势的同时大幅提升实用价值。其核心在于平衡样本效率、训练稳定性与实现复杂度,成为工业级强化学习应用的首选算法。未来,与离线强化学习、多智能体系统的结合将拓展其应用边界。