Press "Enter" to skip to content

近端策略优化(PPO)

深度强化学习课程第8单元,使用Hugging Face 🤗

⚠️ 这篇文章有更新的版本,请点击这里查看 👉 https://huggingface.co/deep-rl-course/unit1/introduction

本文章是深度强化学习课程的一部分,从入门到专家的免费课程。查看课程大纲请点击这里。 近端策略优化(PPO) 四海 第1张


⚠️ 这篇文章有更新的版本,请点击这里查看 👉 https://huggingface.co/deep-rl-course/unit1/introduction

本文章是深度强化学习课程的一部分,从入门到专家的免费课程。查看课程大纲请点击这里。

在上一单元中,我们学习了优势演员评论家(A2C),这是一种将基于值的方法和基于策略的方法相结合的混合架构,通过以下方式减少方差,帮助稳定训练:

  • 一个演员来控制我们的代理行为(基于策略的方法)。
  • 一个评论家来衡量采取的动作的好坏(基于值的方法)。

今天我们将学习Proximal Policy Optimization(PPO),这是一种通过避免过大的策略更新来改善代理训练稳定性的架构。为了做到这一点,我们使用一个比率来表示当前策略与旧策略之间的差异,并将该比率裁剪到特定范围内[ 1 − ϵ , 1 + ϵ ] [1 – \epsilon, 1 + \epsilon] [ 1 − ϵ , 1 + ϵ ]。

这样做可以确保我们的策略更新不会太大,训练更稳定。

接下来,在理论部分之后,我们将使用PyTorch从头开始编写一个PPO架构,并使用CartPole-v1和LunarLander-v2进行实现的鲁棒性测试。

听起来很激动人心吧?让我们开始吧!

  • PPO的直觉
  • 介绍裁剪的替代目标
    • 回顾:策略目标函数
    • 比率函数
    • 裁剪的替代目标函数的未裁剪部分
    • 裁剪的替代目标函数的裁剪部分
  • 可视化裁剪的替代目标
    • 情况1和2:比率在范围内
    • 情况3和4:比率低于范围
    • 情况5和6:比率高于范围
  • 让我们编写PPO代理

PPO的直觉

Proximal Policy Optimization(PPO)的思想是,我们希望通过限制每个训练时期对策略进行的更改来改善策略的训练稳定性:我们希望避免进行过大的策略更新。

有两个原因:

  • 经验上我们知道,在训练过程中较小的策略更新更有可能收敛到最优解。
  • 策略更新中的一次过大的步骤可能导致“掉下悬崖”(得到一个糟糕的策略)并且需要很长时间甚至没有恢复的可能性。
采取较小的策略更新可以提高训练稳定性

因此,使用PPO时我们保守地更新策略。为了做到这一点,我们需要测量当前策略相对于旧策略的变化程度,使用当前策略与旧策略之间的比率计算,并将该比率裁剪到范围[ 1 − ϵ , 1 + ϵ ] [1 – \epsilon, 1 + \epsilon] [ 1 − ϵ , 1 + ϵ ] 中,这意味着我们消除了当前策略过于偏离旧策略的动力(因此有“proximal policy”一词)。

介绍裁剪的替代目标

回顾:策略目标函数

让我们记住在Reinforce中要优化的目标是什么:近端策略优化(PPO) 四海 第3张

这个想法是通过在这个函数上进行梯度上升步骤(等同于对这个函数的负梯度进行梯度下降),我们会推动我们的智能体采取导致更高奖励并避免有害行为的行动。

然而,问题出现在步长上:

  • 太小,训练过程太慢
  • 太大,训练中的变异性太大

在这里,PPO的想法是使用一个称为Clipped surrogate objective function的新目标函数来限制我们的策略更新,通过剪辑将策略变化限制在一个小范围内。

这个新函数旨在避免破坏性的大权重更新

近端策略优化(PPO) 四海 第4张

让我们研究每个部分以了解其工作原理。

比率函数

近端策略优化(PPO) 四海 第5张

这个比率是这样计算的:

近端策略优化(PPO) 四海 第6张

它是当前策略中在状态s t s_t s t ​处采取行动a t a_t a t ​的概率与以前策略的比值。

正如我们所看到的,r t ( θ ) r_t(\theta) r t ​ ( θ )表示当前策略与旧策略之间的概率比率:

  • 如果 r t ( θ ) > 1 r_t(\theta) > 1 r t ​ ( θ ) > 1 ,在当前策略中,行动a t a_t a t ​在状态s t s_t s t ​中更可能发生。
  • 如果 r t ( θ ) r_t(\theta) r t ​ ( θ )介于0和1之间,在当前策略中,行动不太可能发生,而在旧策略中较可能发生。

因此,这个概率比率是一个估计旧策略和当前策略之间差异的简单方法。

Clipped surrogate objective function的未剪辑部分

近端策略优化(PPO) 四海 第7张

这个比率可以替代我们在策略目标函数中使用的对数概率 。这给我们带来了新目标函数的左侧部分:通过将比率乘以优势。

Proximal Policy Optimization Algorithms

然而,如果没有约束,如果当前策略中采取的行动比我们以前的策略更有可能,这将导致显著的策略梯度步长 ,从而导致过度的策略更新。

Clipped surrogate objective function的剪辑部分

近端策略优化(PPO) 四海 第9张

因此,我们需要通过惩罚导致比率偏离1的变化来限制这个目标函数(在论文中,比率只能在0.8到1.2之间变化)。

通过剪辑比率,我们确保策略更新不会太大,因为当前策略与旧策略不能太不同。

为了做到这一点,我们有两个解决方案:

  • TRPO(Trust Region Policy Optimization)使用目标函数之外的KL散度约束来约束策略更新。但这个方法实现起来复杂,并且需要更多计算时间。
  • PPO直接在目标函数中剪辑概率比率,使用其Clipped surrogate objective function。

近端策略优化(PPO) 四海 第9张

这部分被剪辑的版本中,rt(theta)被剪辑在[1-ϵ,1+ϵ]的范围内。

通过剪辑代理目标函数,我们有两个概率比率,一个是非剪辑的,一个是在[1-ϵ,1+ϵ]范围内的剪辑。

其中ϵ是一个超参数,用于定义剪辑范围(在论文中,ϵ=0.2)。

然后,我们取剪辑和非剪辑目标的最小值,因此最终目标是未剪辑目标的下界(悲观界)。

取剪辑和非剪辑目标的最小值意味着根据比率和优势情况选择剪辑或非剪辑目标。

可视化剪辑代理目标

别担心,如果现在处理起来似乎很复杂是正常的。但是我们将看看这个剪辑代理目标函数的样子,这将帮助您更好地理解发生了什么。

来自Daniel Bick的《Towards Delivering a Coherent Self-Contained Explanation of Proximal Policy Optimization》的表格

我们有六种不同的情况。首先请记住,我们取剪辑和非剪辑目标的最小值。

情况1和2:比率在范围之间

在情况1和2中,由于比率在[1-ϵ,1+ϵ]范围内,所以剪辑不适用。

在情况1中,我们有一个正优势:该动作比该状态下所有动作的平均值更好。因此,我们应该鼓励当前策略增加在该状态下采取该动作的概率。

由于比率在范围内,我们可以增加策略在该状态下采取该动作的概率。

在情况2中,我们有一个负优势:该动作比该状态下所有动作的平均值更差。因此,我们应该阻止当前策略在该状态下采取该动作。

由于比率在范围内,我们可以减少策略在该状态下采取该动作的概率。

情况3和4:比率低于范围

来自Daniel Bick的《Towards Delivering a Coherent Self-Contained Explanation of Proximal Policy Optimization》的表格

如果概率比率低于[1-ϵ],则在该状态下采取该动作的概率要比旧策略低得多。

如果,如情况3,优势估计为正(A>0),那么您希望增加在该状态下采取该动作的概率。

但是,如果,如情况4,优势估计为负,我们不希望进一步降低在该状态下采取该动作的概率。因此,梯度为0(因为我们在一条平线上),所以我们不更新权重。

情况5和6:比率高于范围

图表来源于"Towards Delivering a Coherent Self-Contained Explanation of Proximal Policy Optimization" by Daniel Bick

如果概率比率大于[ 1 + ϵ ],则当前策略在该状态下采取该动作的概率远高于之前的策略。

如果,如情况5所示,优势是正的,我们不想太过贪婪。我们在该状态下采取该动作的概率已经比之前的策略高了。因此,梯度为0(因为我们处于平的线上),所以我们不更新权重。

如果,如情况6所示,优势是负的,我们希望降低在该状态下采取该动作的概率。

所以,如果我们回顾一下,我们只更新未经剪切的目标部分的策略。当剪切目标部分为最小值时,我们不更新策略权重,因为梯度将等于0。

所以,我们只在以下情况下更新策略:

  • 我们的比率在范围[ 1 − ϵ , 1 + ϵ ]内
  • 我们的比率超出范围,但优势导致接近范围
    • 比率低于范围但优势> 0
    • 比率高于范围但优势< 0

你可能想知道为什么当剪切比率为最小值时,梯度为0。当比率被剪切时,此时的导数将不是 r t ( θ ) ∗ A t 的导数,而是 (1−ϵ)∗A t 或 (1+ϵ)∗A t 的导数,它们都等于0。

总结一下,多亏了这个剪切的替代目标,我们限制了当前策略与旧策略之间的变化范围。因为我们消除了概率比率移出区间的动力,剪切对梯度有影响。如果比率> 1 + ϵ或< 1 − ϵ,则梯度将等于0。

PPO Actor-Critic风格的最终剪切替代目标损失如下,它是剪切替代目标函数、价值损失函数和熵奖励的组合:

近端策略优化(PPO) 四海 第14张

这很复杂。通过查看表格和图形,花时间理解这些情况。你必须理解这个为什么有意义。如果你想更深入了解,最好的资源是Daniel Bick的文章”Towards Delivering a Coherent Self-Contained Explanation of Proximal Policy Optimization”,特别是第3.4部分。

让我们编写我们的PPO智能体

既然我们已经学习了PPO背后的理论,了解它是如何工作的最好的方法就是从头开始实现它。

从头开始实现一个架构是理解它的最好方法,也是一个好习惯。我们已经用Q学习实现了基于值的方法和用Reinforce实现了基于策略的方法。

因此,为了能够编写它,我们将使用两个资源:

  • 由Costa Huang制作的教程。Costa是CleanRL背后的人,CleanRL是一个提供高质量单文件实现和研究友好特性的深度强化学习库。
  • 除了教程之外,为了更深入地了解,你可以阅读这13个核心实现细节:https://iclr-blog-track.github.io/2022/03/25/ppo-implementation-details/

接下来,为了测试其鲁棒性,我们将在两个不同的经典环境中进行训练:

  • Cartpole-v1
  • LunarLander-v2

最后,我们将推送训练好的模型到Hub以评估并可视化您的代理的运行。

LunarLander-v2是您在开始本课程时使用的第一个环境。那时,您不知道它是如何工作的,而现在,您可以从零开始编写代码并进行训练。多么不可思议啊 🤩。

通过GIPHY

从这里开始教程 👉 https://github.com/huggingface/deep-rl-class/blob/main/unit8/unit8.ipynb


恭喜您完成本章!这里包含了很多信息。同时恭喜您完成了教程 🥳,这是整个课程中最难的部分之一

不要犹豫,尝试在其他环境中训练您的代理。最好的学习方法就是自己动手尝试!

我希望您思考一下自己从第一单元开始以来的进步。通过这八个单元,您已经在深度强化学习方面建立了坚实的基础。恭喜!

但这并不是结束,虽然课程的基础部分已经完成,但这不是旅程的终点。我们正在努力开发新的内容:

  • 添加新的环境和教程。
  • 关于多智能体的部分(自我对弈、合作、竞争)。
  • 关于离线强化学习和决策转换器的部分。
  • 论文解读文章。
  • 还有更多内容即将推出。

保持联系的最佳方式是注册课程以便我们将您及时更新 👉 http://eepurl.com/h1pElX

别忘了与想学习的朋友分享 🤗!

最后,我们希望通过您的反馈不断改进和更新课程。如果您有任何意见,请填写这份表格 👉 https://forms.gle/3HgA7bEHwAmmLfwh9

下次见!

继续学习,保持卓越 🤗

Leave a Reply

Your email address will not be published. Required fields are marked *