一、PPO介绍
Proximal Policy Optimization (PPO)算法是深度强化学习中的一种基于策略的方法。这种算法的优点在于其强大的学习能力、对样本数据的充分利用、以及耐受于超参数的初始值。
PPO算法为解决传统的策略梯度上的一些较为困难的问题提供了新的思路。PPO通过限制策略的更改幅度来实现受约束的优化。在此基础上,PPO创建了一个新技术,使用一个比更改幅度更广泛的概率比率约束去更新策略。这种更广泛的概率比率约束被称为投影点投影。
二、PPO工作原理
PPO的主要目的是优化策略,以最小化代理与环境的互动导致的累积奖励。这个过程包括从环境中收集经验并对其进行更新。下面分别从策略更新和投影点投影两个方面进行PPO工作原理的阐述。
策略更新
PPO的参数更改量需要控制在一个可接受的范围内,以确保策略的收敛性。此处,除了需要保证策略更改的小幅度性之外,还需要保持每个政策的动态更新。PPO使用一种剪切技术来实现这个目标。以下是PPO策略更新的算法实现:
def clipped_PPO_loss(old_policy_probs, new_policy_probs, actions, advantage, clip_ratio):
ratio = new_policy_probs / (old_policy_probs + 1e-5)
clipped_ratio = torch.clamp(ratio, min=1 - clip_ratio, max=1 + clip_ratio)
surrogate_loss = torch.min(ratio * advantage, clipped_ratio * advantage)
return -torch.mean(surrogate_loss)
其中,old_policy_probs是旧政策的动作概率,new_policy_probs是新政策的动作概率,actions是在状态s下所选择的动作,advantage是一个形式化的概念,用于度量每个动作的有效反馈。仿照交叉熵的损失函数设计出来的这个loss function完美的解决了PPO的策略更新的问题。
投影点投影
在策略更新过程中加入了投影点投影,使得训练过程更加稳定。这个方法可以将更新后的策略最优地投影到一个分布中,以获得更平滑的更新。这时有必要将另一种优化目标加入到训练目标中。
numpy的实现代码如下:
def surrogate_loss(policy, old_policy, adv, X, actions):
mean = policy(X)
sampler = Normal(mean, torch.ones_like(mean))
probs = sampler.log_prob(actions)
mean_old = old_policy(X)
sampler_old = Normal(mean_old, torch.ones_like(mean_old))
old_probs = sampler_old.log_prob(actions)
r = torch.exp(probs - old_probs)
L_clip = torch.clamp(r, 1 - eps, 1 + eps) * adv
L_clip = torch.min(r * adv, L_clip)
L_clip = -torch.mean(L_clip)
surr_diff = mean - mean_old
L_vf = torch.mean(torch.square(surr_diff))
total_loss = L_clip + c1 * L_vf - c2 * entropy_loss(policy, X)
return total_loss
三、PPO的应用场景
PPO算法应用广泛,其中包括:
- 论文中开发PPO的平台:Atari游戏
- 对抗性强化学习
- Robo-sumo和包括足球的多智能体竞技比赛
- 在自然语言处理等应用领域中训练基于文本的代理模型
四、总结
PPO是目前深度学习领域中比较先进的强化学习技术,其特点在于其强大的学习能力、对样本数据的充分利用、以及耐受于超参数的初始值。通过对PPO的详细阐述,我们希望可以为深度学习爱好者提供新的思路和工具,也期望PPO技术可以在更广泛的领域得到应用。