尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

第304篇 PPO——最流行的强化学习算法

第304篇 PPO——最流行的强化学习算法 上篇聊了Actor-Critic框架和各种变体。如果你只能学一个强化学习算法那一定是PPOProximal Policy Optimization近端策略优化。它是OpenAI在2017年提出的现在几乎是RL领域的默认选择——不管是学术研究还是工业应用PPO都是出场率最高的算法。为什么PPO这么流行因为它在性能和稳定性之间取得了非常好的平衡。不像DDPG那样容易崩溃不像A2C那样样本效率低也不像TRPO那样实现复杂。PPO的代码简洁超参数不敏感开箱即用。策略更新的核心问题在理解PPO之前先搞清楚为什么策略更新这么难。策略梯度方法用梯度上升来更新策略。问题是更新步幅多大合适步幅太小训练太慢步幅太大新策略可能跟旧策略差太远性能急剧下降甚至崩溃。这个问题在off-policy场景中更严重。如果你用旧策略采集的数据来更新新策略新旧策略差距越大数据的参考价值越低梯度估计越不准确。如果不加限制新策略可能在某次更新后变得很烂然后用这个烂策略采到的数据来继续更新越来越烂恶性循环。TRPOTrust Region Policy Optimization是PPO的前身它用KL散度约束来限制每次更新的策略变化量。效果很好但实现需要计算二阶优化Fisher信息矩阵的逆代码复杂计算开销大。PPO的核心思想截断重要性采样比率PPO的思路比TRPO简单得多。它用重要性采样比率importance sampling ratio来衡量新旧策略的差异r_t(θ) π_θ(a_t|s_t) / π_θ_old(a_t|s_t)如果新旧策略一样r_t1。如果新策略在某个动作上的概率比旧策略高r_t1反之r_t1。PPO的目标函数是L E[min(r_t · A_t, clip(r_t, 1-ε, 1ε) · A_t)]clip操作把r_t限制在[1-ε, 1ε]范围内ε通常取0.2。# PPO的核心loss计算 # ratio π_new(a|s) / π_old(a|s) # surr1 ratio * advantage # surr2 clip(ratio, 1-eps, 1eps) * advantage # loss_actor -min(surr1, surr2).mean() # loss_critic (V(s) - return).pow(2).mean()这个截断机制的直觉是当优势函数A0时好动作PPO增大该动作的概率但r_t超过1ε后就不再增大了当A0时坏动作PPO减小该动作的概率但r_t低于1-ε后就不再减小了。这相当于给每次策略更新设了一个安全范围。不管梯度怎么说策略的变化幅度被限制住了。这避免了策略一步走太远导致的崩溃问题。PPO的完整训练流程PPO的训练是迭代进行的。每一轮迭代分两步采样和更新。采样阶段用当前策略π_old在环境中跑N个episode或者固定步数收集所有的(s, a, r, s, log_prob, advantage)。这一步产生一批训练数据。更新阶段用这批数据做K个epoch的梯度更新。每个epoch中随机采样mini-batch的数据计算PPO的目标函数更新Actor和Critic的参数。注意这里的数据是重复使用的——同一批数据用K次这就是PPO能比纯策略梯度样本效率更高的原因。更新完成后π_old π_new丢弃旧数据开始下一轮采样。几个工程上的细节值得注意。价值函数也常用clip来稳定训练V_clipped V_old clip(V - V_old, -ε, ε)防止Critic的更新幅度过大。网络初始化也有讲究——很多实现用正交初始化Orthogonal Initialization而不是默认的Xavier初始化这对PPO的训练稳定性有帮助。学习率通常用线性衰减从初始值逐步降到零。Critic的loss可以加上价值函数的clip也可以不加。实验表明加了之后训练更稳定特别是在奖励尺度变化大的任务中。另外Critic的学习率通常比Actor大一些比如Actor 3e-4Critic 1e-3因为Critic需要更快地跟上策略的变化。# PPO训练循环伪代码 # for iteration in range(num_iterations): # data collect_trajectories(policy_old, env) # advantages compute_gae(data) # for epoch in range(K): # 通常K4-10 # for batch in mini_batches(data): # ratio policy(batch) / policy_old(batch) # loss ppo_loss(ratio, batch.advantages) # optimizer.step() # policy_old policy # 同步旧策略K和mini-batch大小是两个关键超参数。K太小数据利用不充分太大会导致过拟合到这一批数据上策略变化反而太大。实践中K4-10mini-batch大小64-256是比较常见的选择。PPO在机器人中的应用PPO在机器人领域有非常广泛的应用。OpenAI Five用PPO训练Dota2 AI达到了职业选手水平。OpenAI还用它训练机械臂做灵巧操作。在MuJoCo和Isaac Gym的各种机器人控制基准上PPO几乎都是baseline。PPO特别适合机器人的原因有几个。代码简单调试方便。超参数不敏感不需要花大量时间调参。训练稳定不容易崩溃。在仿真环境中PPO通常能在几小时内训练好一个行走或抓取策略。在Sim2Real仿真到真实迁移场景中PPO也是首选算法。配合域随机化Domain RandomizationPPO训练的策略可以直接部署到真实机器人上。这是因为PPO训练出的策略通常比较平滑——由于截断机制限制了策略的剧烈变化学到的策略对输入扰动有一定的鲁棒性。NVIDIA的Isaac Gym用PPO在几小时内就能训练出各种机器人的行走策略然后通过Sim2Real直接部署到真实硬件上整个过程不需要任何真实数据。面试要点PPO的面试考点非常明确。clip机制的原理和作用。面试官一定会问为什么PPO要用clip不用行不行。答案是不限制策略变化幅度的话策略更新可能一步走太远导致性能崩溃。clip提供了一个简单有效的约束实现成本低但效果好。跟TRPO的KL约束相比clip是工程上的简化效果接近但实现简单得多。PPO是on-policy还是off-policy。严格来说PPO是on-policy的因为它只用当前策略采集的数据。但它通过多epoch重复使用同一批数据在一定程度上提高了样本效率。有人把它叫准on-policy——不像纯策略梯度那样数据用一次就扔但也不像off-policy方法那样能用任意旧的数据。PPO和SAC的对比。PPO是on-policy样本效率低但训练稳定。SAC是off-policy样本效率高但训练更复杂。在机器人仿真中如果采样成本低仿真跑得快用PPO就好如果采样成本高真实机器人用SAC更合适。PPO的局限性也要知道。PPO的样本效率不如off-policy方法在真实机器人上训练时这是个很大的限制。另外PPO在非常复杂的任务中比如需要长时间规划和记忆的任务可能不如SAC或者基于Transformer的方法。还有一个常见问题PPO训练出的策略有时会在某个局部最优附近振荡不能稳定地执行最优行为。这通常需要通过增大熵系数或者调整网络结构来缓解。给你的建议PPO是必须动手实现的算法。建议从Stable-Baselines3的PPO实现入手先跑通几个经典环境Humanoid、Ant、HalfCheetah观察训练曲线。然后试着修改clip范围、学习率、GAE的λ等超参数观察它们对训练的影响。如果你想深入理解PPO推荐读John Schulman的原论文和他的演讲slides。代码方面CleanRL是一个很好的参考——它提供了单文件实现的PPO代码量只有几百行比Stable-Baselines3更容易读懂。上一篇第303篇 Actor-Critic方法详解下一篇预告第305篇 SAC——最大熵强化学习
返回列表